synabun 2.0.0 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -0
- package/NOTICE +5 -0
- package/README.md +2 -1
- package/THIRD-PARTY-LICENSES.md +59 -0
- package/benchmarks/fixtures/browser/README.md +1 -1
- package/benchmarks/fixtures/desktop/README.md +1 -1
- package/docs/whatsapp.md +153 -18
- package/hooks/claude-code/pre-compact.mjs +11 -0
- package/hooks/claude-code/prompt-submit.mjs +60 -184
- package/hooks/claude-code/session-start.mjs +73 -16
- package/hooks/claude-code/shared.mjs +26 -3
- package/hooks/claude-code/stop.mjs +5 -5
- package/lib/child-path.js +303 -0
- package/lib/claude-hooks.js +2 -1
- package/lib/data-home-migration.js +2 -0
- package/lib/desktop-app.js +265 -0
- package/lib/external-tools.js +7 -3
- package/lib/log-redact.js +102 -0
- package/lib/packaged-runtime.js +138 -11
- package/lib/start-launcher.js +88 -1
- package/mcp-server/dist/http.d.ts +3 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +15 -4
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +9 -6
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts +108 -0
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/budget-judgments.js +153 -0
- package/mcp-server/dist/services/budget-judgments.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +5 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +41 -4
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/identity.d.ts +11 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -1
- package/mcp-server/dist/services/identity.js +24 -0
- package/mcp-server/dist/services/identity.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +13 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +34 -2
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -1
- package/mcp-server/dist/services/typesafe-config.js +4 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +10 -7
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +34 -13
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts +17 -0
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js +44 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -0
- package/mcp-server/dist/tui.js +2 -1
- package/mcp-server/dist/tui.js.map +1 -1
- package/mcp-server/dist/version.d.ts +5 -0
- package/mcp-server/dist/version.d.ts.map +1 -0
- package/mcp-server/dist/version.js +21 -0
- package/mcp-server/dist/version.js.map +1 -0
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -3
- package/mcp-server/run.mjs +15 -9
- package/mcp-server/src/http.ts +18 -3
- package/mcp-server/src/index.ts +9 -6
- package/mcp-server/src/services/budget-judgments.ts +183 -0
- package/mcp-server/src/services/codex-config-heal.ts +35 -4
- package/mcp-server/src/services/identity.ts +27 -0
- package/mcp-server/src/services/neural-interface.ts +34 -2
- package/mcp-server/src/services/typesafe-config.ts +4 -1
- package/mcp-server/src/tools/agents.ts +33 -14
- package/mcp-server/src/tools/whatsapp-send-file.ts +51 -0
- package/mcp-server/src/tui.ts +2 -1
- package/mcp-server/src/version.ts +22 -0
- package/neural-interface/i18n/en.json +2126 -209
- package/neural-interface/i18n/pt-BR.json +2123 -207
- package/neural-interface/lib/account-usage.js +163 -0
- package/neural-interface/lib/assistant-api.js +316 -57
- package/neural-interface/lib/assistant-brains/claude.js +19 -2
- package/neural-interface/lib/assistant-brains/codex.js +3 -0
- package/neural-interface/lib/assistant-brains/opencode.js +17 -4
- package/neural-interface/lib/assistant-budget-planner.js +390 -0
- package/neural-interface/lib/assistant-budget-split.js +408 -0
- package/neural-interface/lib/assistant-budget.js +94 -95
- package/neural-interface/lib/assistant-catalog.js +179 -27
- package/neural-interface/lib/assistant-config.js +91 -14
- package/neural-interface/lib/assistant-dispatch.js +494 -138
- package/neural-interface/lib/assistant-hidden-models.js +393 -66
- package/neural-interface/lib/assistant-jev.js +26 -3
- package/neural-interface/lib/assistant-memory.js +24 -10
- package/neural-interface/lib/assistant-persona.js +73 -12
- package/neural-interface/lib/assistant-plan-permissions.js +8 -1
- package/neural-interface/lib/assistant-pricing.js +21 -6
- package/neural-interface/lib/assistant-route-accounts.js +14 -0
- package/neural-interface/lib/assistant-route-gate.js +19 -3
- package/neural-interface/lib/assistant-router.js +373 -42
- package/neural-interface/lib/assistant-runtime.js +488 -59
- package/neural-interface/lib/assistant-task-prompt.js +13 -3
- package/neural-interface/lib/assistant-test-density.js +142 -0
- package/neural-interface/lib/assistant-user-context-budgets.js +123 -0
- package/neural-interface/lib/assistant-user-context.js +908 -0
- package/neural-interface/lib/assistant-user-knowledge.js +328 -0
- package/neural-interface/lib/assistant-user-learn.js +404 -0
- package/neural-interface/lib/assistant-user-threads.js +226 -0
- package/neural-interface/lib/assistant-user-writer.js +183 -0
- package/neural-interface/lib/augmented-path.js +317 -53
- package/neural-interface/lib/browser-background-tab.js +134 -0
- package/neural-interface/lib/browser-screenshot.js +678 -61
- package/neural-interface/lib/claude-accounts.js +342 -31
- package/neural-interface/lib/claude-agent-bridge.js +123 -9
- package/neural-interface/lib/claude-executable.js +6 -1
- package/neural-interface/lib/claude-model-catalog.js +33 -5
- package/neural-interface/lib/claude-panel-auth.js +221 -0
- package/neural-interface/lib/claude-profile-api-key.js +62 -0
- package/neural-interface/lib/claude-temporary.js +46 -7
- package/neural-interface/lib/cli-install-api.js +137 -0
- package/neural-interface/lib/cli-install.js +797 -0
- package/neural-interface/lib/cli-path.js +130 -0
- package/neural-interface/lib/cli-resolver.js +744 -0
- package/neural-interface/lib/cli-update-planner.js +143 -7
- package/neural-interface/lib/cloudflared/install.js +533 -0
- package/neural-interface/lib/cloudflared/manager.js +545 -0
- package/neural-interface/lib/cloudflared/pins.js +115 -0
- package/neural-interface/lib/cloudflared/pins.json +63 -0
- package/neural-interface/lib/cloudflared/tunnel.js +265 -0
- package/neural-interface/lib/codex-account-auth.js +178 -0
- package/neural-interface/lib/codex-accounts.js +489 -0
- package/neural-interface/lib/codex-capabilities.js +2 -1
- package/neural-interface/lib/codex-compat-rpc.js +8 -2
- package/neural-interface/lib/codex-mcp-approvals.js +5 -1
- package/neural-interface/lib/codex-panel-auth.js +62 -0
- package/neural-interface/lib/codex-session-settings.js +1 -1
- package/neural-interface/lib/codex-settings-schema.js +120 -0
- package/neural-interface/lib/desktop/config.js +3 -0
- package/neural-interface/lib/editor-completion-endpoint.js +264 -0
- package/neural-interface/lib/editor-completion-opencode.js +436 -0
- package/neural-interface/lib/editor-completion.js +714 -0
- package/neural-interface/lib/editor-config.js +149 -0
- package/neural-interface/lib/editor-files-api.js +268 -0
- package/neural-interface/lib/editor-git-api.js +134 -0
- package/neural-interface/lib/file-explorer-api.js +1039 -0
- package/neural-interface/lib/file-explorer-system.js +355 -0
- package/neural-interface/lib/file-explorer-trash.ps1 +85 -0
- package/neural-interface/lib/file-explorer-watch.js +239 -0
- package/neural-interface/lib/git-bash/bzip2.js +339 -0
- package/neural-interface/lib/git-bash/claude-settings.js +73 -0
- package/neural-interface/lib/git-bash/extract-worker.js +34 -0
- package/neural-interface/lib/git-bash/install.js +529 -0
- package/neural-interface/lib/git-bash/licenses/COPYING +360 -0
- package/neural-interface/lib/git-bash/licenses/LGPL-2.1 +511 -0
- package/neural-interface/lib/git-bash/manager.js +268 -0
- package/neural-interface/lib/git-bash/pins.js +206 -0
- package/neural-interface/lib/git-bash/pins.json +34 -0
- package/neural-interface/lib/git-bash/resolver.js +194 -0
- package/neural-interface/lib/git-diff-api.js +103 -0
- package/neural-interface/lib/git-read.js +234 -0
- package/neural-interface/lib/greeting/api.js +89 -0
- package/neural-interface/lib/greeting/budgets.js +90 -0
- package/neural-interface/lib/greeting/engine.js +461 -0
- package/neural-interface/lib/greeting/facts.js +320 -0
- package/neural-interface/lib/greeting/sources.js +252 -0
- package/neural-interface/lib/greeting/writer.js +139 -0
- package/neural-interface/lib/http-guards.js +189 -13
- package/neural-interface/lib/install-details.js +145 -0
- package/neural-interface/lib/machine-names.js +88 -0
- package/neural-interface/lib/mcp-installer.js +14 -2
- package/neural-interface/lib/memory-api.js +31 -7
- package/neural-interface/lib/native-loop-providers.js +26 -8
- package/neural-interface/lib/native-loop-runtime.js +9 -4
- package/neural-interface/lib/os-path.js +319 -0
- package/neural-interface/lib/plugin-installer.js +4 -2
- package/neural-interface/lib/project-storage.js +5 -7
- package/neural-interface/lib/provider-panel-api-key-auth.js +92 -0
- package/neural-interface/lib/provider-panel-terminal-auth.js +95 -0
- package/neural-interface/lib/pty-host/core.js +2 -1
- package/neural-interface/lib/pty-host/manager.js +27 -2
- package/neural-interface/lib/remote-policy.js +20 -11
- package/neural-interface/lib/request-gate.js +589 -0
- package/neural-interface/lib/session-title-generator.js +4 -3
- package/neural-interface/lib/system-about.js +340 -0
- package/neural-interface/lib/system-activity.js +66 -0
- package/neural-interface/lib/terminal-env.js +11 -3
- package/neural-interface/lib/terminal-path.js +55 -0
- package/neural-interface/lib/ui-blob-api.js +108 -0
- package/neural-interface/lib/ui-blob-store.js +68 -0
- package/neural-interface/lib/virtual-socket.js +12 -1
- package/neural-interface/lib/whatsapp/baileys-adapter.js +165 -45
- package/neural-interface/lib/whatsapp/bridge.js +78 -34
- package/neural-interface/lib/whatsapp/commands.js +13 -14
- package/neural-interface/lib/whatsapp/config.js +134 -20
- package/neural-interface/lib/whatsapp/fake-baileys.js +99 -14
- package/neural-interface/lib/whatsapp/host-core.js +168 -35
- package/neural-interface/lib/whatsapp/inbound.js +5 -3
- package/neural-interface/lib/whatsapp/local-file.js +524 -0
- package/neural-interface/lib/whatsapp/manager.js +92 -32
- package/neural-interface/lib/whatsapp/paths.js +11 -1
- package/neural-interface/lib/whatsapp/protocol.js +65 -5
- package/neural-interface/lib/whatsapp/redact.js +63 -0
- package/neural-interface/lib/whatsapp/service.js +343 -91
- package/neural-interface/lib/whatsapp/transcription.js +463 -0
- package/neural-interface/package-lock.json +701 -2
- package/neural-interface/package.json +13 -2
- package/neural-interface/public/index.html +2 -0
- package/neural-interface/public/index2d.html +2 -0
- package/neural-interface/public/install-app.html +9 -6
- package/neural-interface/public/offline.html +19 -3
- package/neural-interface/public/onboarding.html +107 -2
- package/neural-interface/public/shared/account-i18n.js +7 -0
- package/neural-interface/public/shared/account-menu.js +539 -0
- package/neural-interface/public/shared/account-usage.js +19 -0
- package/neural-interface/public/shared/account-view.js +335 -0
- package/neural-interface/public/shared/agent-runtime-options.js +50 -14
- package/neural-interface/public/shared/assistant/asst-accounts.js +182 -184
- package/neural-interface/public/shared/assistant/asst-api.js +32 -2
- package/neural-interface/public/shared/assistant/asst-automation.js +286 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +430 -81
- package/neural-interface/public/shared/assistant/asst-budget.js +259 -303
- package/neural-interface/public/shared/assistant/asst-composer.js +11 -1
- package/neural-interface/public/shared/assistant/asst-mascot.js +140 -61
- package/neural-interface/public/shared/assistant/asst-menu.js +27 -11
- package/neural-interface/public/shared/assistant/asst-panel.js +198 -42
- package/neural-interface/public/shared/assistant/asst-render.js +197 -23
- package/neural-interface/public/shared/assistant/asst-route-models.js +108 -0
- package/neural-interface/public/shared/assistant/asst-route.js +95 -343
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +534 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +8 -1
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +31 -9
- package/neural-interface/public/shared/assistant/asst-slash.js +1 -1
- package/neural-interface/public/shared/assistant/asst-state.js +186 -2
- package/neural-interface/public/shared/assistant/asst-styles.js +247 -11
- package/neural-interface/public/shared/blob-store.js +111 -22
- package/neural-interface/public/shared/cdx/cdx-commands.js +4 -1
- package/neural-interface/public/shared/cdx/cdx-features.js +22 -14
- package/neural-interface/public/shared/cdx/cdx-icons.js +2 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +80 -118
- package/neural-interface/public/shared/cdx/cdx-render.js +25 -89
- package/neural-interface/public/shared/cdx/cdx-settings.js +231 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +164 -107
- package/neural-interface/public/shared/cdx/cdx-tabs.js +348 -668
- package/neural-interface/public/shared/cdx/cdx-ws.js +2 -0
- package/neural-interface/public/shared/claude-account-view.js +3 -0
- package/neural-interface/public/shared/cli-install-view.js +392 -0
- package/neural-interface/public/shared/cli-status.js +282 -22
- package/neural-interface/public/shared/constants.js +6 -1
- package/neural-interface/public/shared/cp/cp-events.js +2 -1
- package/neural-interface/public/shared/cp/cp-rehydrate.js +2 -1
- package/neural-interface/public/shared/cp/cp-styles.js +61 -0
- package/neural-interface/public/shared/desktop-bridge.js +39 -0
- package/neural-interface/public/shared/desktop-titlebar-page.js +59 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +122 -0
- package/neural-interface/public/shared/desktop-titlebar.js +153 -0
- package/neural-interface/public/shared/desktop-update-view.js +462 -0
- package/neural-interface/public/shared/editor/editor-ai-logic.js +409 -0
- package/neural-interface/public/shared/editor/editor-ai.js +619 -0
- package/neural-interface/public/shared/editor/editor-commands.js +212 -0
- package/neural-interface/public/shared/editor/editor-compare.js +103 -0
- package/neural-interface/public/shared/editor/editor-completion-list.js +172 -0
- package/neural-interface/public/shared/editor/editor-doc.js +257 -0
- package/neural-interface/public/shared/editor/editor-git-logic.js +131 -0
- package/neural-interface/public/shared/editor/editor-git.js +95 -0
- package/neural-interface/public/shared/editor/editor-languages.js +156 -0
- package/neural-interface/public/shared/editor/editor-lint.js +229 -0
- package/neural-interface/public/shared/editor/editor-loader.js +51 -0
- package/neural-interface/public/shared/editor/editor-markdown.js +90 -0
- package/neural-interface/public/shared/editor/editor-menu.js +233 -0
- package/neural-interface/public/shared/editor/editor-minimap.js +371 -0
- package/neural-interface/public/shared/editor/editor-palette-logic.js +192 -0
- package/neural-interface/public/shared/editor/editor-palette.js +125 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +288 -0
- package/neural-interface/public/shared/editor/editor-panel.js +2099 -0
- package/neural-interface/public/shared/editor/editor-prefs.js +224 -0
- package/neural-interface/public/shared/editor/editor-safety.js +500 -0
- package/neural-interface/public/shared/editor/editor-search.js +352 -0
- package/neural-interface/public/shared/editor/editor-statusbar.js +144 -0
- package/neural-interface/public/shared/editor/editor-tabs-logic.js +331 -0
- package/neural-interface/public/shared/editor/editor-tabs.js +233 -0
- package/neural-interface/public/shared/editor/editor-theme.js +244 -0
- package/neural-interface/public/shared/editor/editor-view.js +332 -0
- package/neural-interface/public/shared/explorer/fx-api.js +216 -0
- package/neural-interface/public/shared/explorer/fx-links.js +204 -0
- package/neural-interface/public/shared/explorer/fx-logic.js +537 -0
- package/neural-interface/public/shared/explorer/fx-main.js +865 -0
- package/neural-interface/public/shared/explorer/fx-names.js +87 -0
- package/neural-interface/public/shared/explorer/fx-ops.js +370 -0
- package/neural-interface/public/shared/explorer/fx-popups.js +490 -0
- package/neural-interface/public/shared/explorer/fx-tree.js +790 -0
- package/neural-interface/public/shared/file-links.js +339 -0
- package/neural-interface/public/shared/git-bash-view.js +145 -0
- package/neural-interface/public/shared/greeting/greeting-card.js +178 -0
- package/neural-interface/public/shared/greeting/greeting-view.js +148 -0
- package/neural-interface/public/shared/html-shell.js +161 -165
- package/neural-interface/public/shared/i18n.js +19 -1
- package/neural-interface/public/shared/install-details-view.js +86 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-greeting.js +47 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +131 -17
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -1
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +22 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +158 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +3 -2
- package/neural-interface/public/shared/pwa-install-page.js +32 -2
- package/neural-interface/public/shared/pwa-install.css +3 -3
- package/neural-interface/public/shared/pwa-install.js +100 -1
- package/neural-interface/public/shared/settings/settings-about-pane.js +271 -0
- package/neural-interface/public/shared/settings/settings-about.js +254 -0
- package/neural-interface/public/shared/settings/settings-code-editor-pane.js +412 -0
- package/neural-interface/public/shared/settings/settings-code-editor.js +328 -0
- package/neural-interface/public/shared/settings/settings-greeting.js +133 -0
- package/neural-interface/public/shared/settings/settings-ia.js +33 -4
- package/neural-interface/public/shared/settings/settings-user-context.js +154 -0
- package/neural-interface/public/shared/showcase-privacy.js +489 -0
- package/neural-interface/public/shared/start-bridge.js +238 -19
- package/neural-interface/public/shared/storage.js +30 -3
- package/neural-interface/public/shared/styles.css +1710 -770
- package/neural-interface/public/shared/synabun-mascot.js +68 -58
- package/neural-interface/public/shared/tunnel-view.js +167 -0
- package/neural-interface/public/shared/ui-claude-panel.js +369 -229
- package/neural-interface/public/shared/ui-cli-banner.js +355 -0
- package/neural-interface/public/shared/ui-detail.js +15 -0
- package/neural-interface/public/shared/ui-explorer.js +22 -0
- package/neural-interface/public/shared/ui-file-explorer.js +481 -2496
- package/neural-interface/public/shared/ui-file-links.js +103 -0
- package/neural-interface/public/shared/ui-git-bash.js +124 -0
- package/neural-interface/public/shared/ui-help.js +26 -0
- package/neural-interface/public/shared/ui-invite.js +126 -116
- package/neural-interface/public/shared/ui-judgments.js +10 -1
- package/neural-interface/public/shared/ui-keybinds.js +4 -0
- package/neural-interface/public/shared/ui-loading.js +187 -19
- package/neural-interface/public/shared/ui-menubar.js +25 -33
- package/neural-interface/public/shared/ui-native-loop-router-state.js +11 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +15 -2
- package/neural-interface/public/shared/ui-navbar.js +48 -22
- package/neural-interface/public/shared/ui-provider-auth.js +104 -0
- package/neural-interface/public/shared/ui-provider-terminal-auth.js +223 -0
- package/neural-interface/public/shared/ui-sessions.js +9 -3
- package/neural-interface/public/shared/ui-settings.js +509 -490
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +2 -1
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -1
- package/neural-interface/public/shared/ui-sync.js +22 -0
- package/neural-interface/public/shared/ui-terminal.js +40 -5
- package/neural-interface/public/shared/ui-tool-updates.js +5 -0
- package/neural-interface/public/shared/ui-tunnel.js +130 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +6 -2
- package/neural-interface/public/shared/ui-update.js +594 -5
- package/neural-interface/public/shared/ui-whatsapp.js +21 -6
- package/neural-interface/public/shared/ui-whiteboard.js +12 -0
- package/neural-interface/public/shared/ui-worker-end.js +245 -0
- package/neural-interface/public/shared/ui-workspaces.js +41 -27
- package/neural-interface/public/shared/whatsapp/wa-view.js +51 -8
- package/neural-interface/public/shared/worker-end.js +253 -0
- package/neural-interface/public/sw.js +2 -2
- package/neural-interface/public/variant/2d/main.js +10 -1
- package/neural-interface/public/variant/3d/main.js +10 -1
- package/neural-interface/public/vendor/codemirror/chunks/apl-CSDKT72Z.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asciiarmor-JYYPU5BM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asn1-NRWCZDA6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asterisk-5OU6D4ZQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/brainfuck-ID4N4SYC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-4RZWGCS2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-ACTJM3JR.js +11 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-S6BMAXLK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-TO2RDOHQ.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-US2GMZZQ.js +13 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-WYYO5ZAJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-XALZTDJC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-YRNUTRDV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-Z3QOKH62.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/clike-OWQBSOGL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/clojure-KV75UQWC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cmake-GTEP5Y3C.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cobol-WCZ7QEGJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/coffeescript-TGLBOT6B.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/commonlisp-WVVI432V.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/crystal-S6R6HLKQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/css-PDA2RINP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cypher-HL5QPL4C.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/d-HHJH2HAJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/diff-MN3A35BY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-25SQLBVS.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-27ZGGJJS.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-4E52OJIF.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-6FT73XDC.js +2 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-BE6YGRMW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CJSGKW2O.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CRPH2WLI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CTG7JEQN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-I3FEVELX.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-IM5BBSWZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-KERUKTIF.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-LXTMWZAM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MABASSET.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MJVBUZLL.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MNB3WZVU.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-QYWXOE3U.js +7 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-TEBOFWLZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-UNXFROM3.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-XL2SLQO6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-XO42Y3AP.js +6 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-Y2WWDWJK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-YFEZKWMU.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-ZY7SWQO6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dockerfile-3Y4R4NCH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dtd-5343GJ4P.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dylan-FI2CXSW2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ebnf-GNQ77YWA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ecl-MRPUAE2L.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/eiffel-DZROES27.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/elm-4KICRFKQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/erlang-3IHYC263.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/factor-C6D3E5UK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/fcl-VYTWUJMI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/forth-ZBO2EH5M.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/fortran-5NDCRWIK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/gas-SKRMOXFP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/gherkin-L45YXZLW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/groovy-GLPTLN44.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/haskell-E7NF7P4Y.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/haxe-K2NVDOB6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/http-Q6DRQIJB.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/idl-MZYNJVLN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/javascript-6YRYK2HR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/julia-HXEL2T5G.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/livescript-MV7CI2JZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/lua-E36NHOOD.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mathematica-3XOZZCMC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mbox-ODYGFKS7.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mirc-WB43AWF5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mllike-ZT6ET7ZH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/modelica-LLMZPFGA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mscgen-2OPNNYFH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mumps-6P3HWJH6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/nginx-TCGKQTRW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/nsis-ATIGIXTJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ntriples-5PLBI5OV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/octave-QF2S3NL6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/oz-JFIVFFH2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pascal-JG6SW76V.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/perl-4B3IWVVO.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pig-ABEBH4MI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/powershell-H32XE7TL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/properties-NN644MMA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/protobuf-YKWQK2J3.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pug-RIYXEKFW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/puppet-JZQ5WPEV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/python-EBCGGHAC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/q-5UMH2YQY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/r-7XMGG453.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/rpm-IEV7TSLR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ruby-T4SPFPNM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sas-GEDX67ET.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/scheme-FTLOWKPC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/shell-HUFRKFSJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sieve-P5QUDVYO.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/smalltalk-2SORJNQI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/solr-M22TGAR5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sparql-4M3KL752.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/spreadsheet-3K23LA4N.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sql-VHRFMUBI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/stex-QZDAQUY2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/stylus-7ZDKAKBD.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/swift-WCLCLGMR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tcl-JLMU6WOK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/textile-4CHDKZ4T.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tiddlywiki-DKMCZZQ4.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tiki-F4JIG36Q.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/toml-BHMHTIM2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/troff-YQ2KV5NT.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ttcn-ZHRCVFJY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ttcn-cfg-KJOVTY4X.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/turtle-535P5N6I.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vb-76UMQHOT.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vbscript-CGNDTK6Z.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/velocity-VSJDO5T5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/verilog-4T6ETXIP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vhdl-T7FNAXUN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/webidl-P6MJSJ6J.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/xquery-UOVILRGN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/yacas-CV2APROL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/z80-3KFNVM4M.js +1 -0
- package/neural-interface/public/vendor/codemirror/codemirror-6.43.14-75f05e67.min.js +2 -0
- package/neural-interface/public/vendor/codemirror/manifest.json +60 -0
- package/neural-interface/scripts/build-vendor.mjs +78 -2
- package/neural-interface/scripts/vendor-codemirror-entry.js +121 -0
- package/neural-interface/server.js +2085 -1629
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/package.json +5 -8
- package/setup.js +53 -15
- package/benchmarks/browser-live-results.json +0 -79
- package/benchmarks/browser-v2-results.json +0 -258
- package/neural-interface/lib/codex-capabilities.d.ts +0 -41
- package/neural-interface/public/category-logos/claude.svg +0 -1
- package/neural-interface/public/category-logos/gemini-color.svg +0 -1
- package/neural-interface/public/category-logos/openai.svg +0 -1
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +0 -1
- package/neural-interface/public/gallery.svg +0 -6
- package/neural-interface/public/leonardoai.svg +0 -1
- package/neural-interface/public/mcp.svg +0 -4
- package/neural-interface/public/opencode-logo-dark-square.svg +0 -1
- package/neural-interface/public/pin-svgrepo-com.svg +0 -25
- package/neural-interface/public/sessionicon.svg +0 -8
- package/neural-interface/public/toolbar-album.svg +0 -8
- package/neural-interface/public/toolbar-question.svg +0 -6
- package/neural-interface/public/toolbar-sessions.svg +0 -6
- package/neural-interface/scripts/codex-protocol-fixture.mjs +0 -83
- package/skills/synabun/synabunicon.png +0 -0
|
@@ -146,17 +146,19 @@
|
|
|
146
146
|
height: var(--fs-locked-height);
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
-
/* ── Window Controls Overlay (PWA standalone on macOS / Windows / Linux) ──
|
|
149
|
+
/* ── Window Controls Overlay (PWA standalone on macOS / Windows / Linux, and the SynaBun desktop app) ──
|
|
150
150
|
Uses body.wco-active (toggled by JS via navigator.windowControlsOverlay)
|
|
151
|
-
for higher specificity than base #title-bar rules.
|
|
151
|
+
for higher specificity than base #title-bar rules. The --desktop-titlebar-*
|
|
152
|
+
variables stand in for the env() ones only inside the desktop app when its
|
|
153
|
+
window has no overlay API (desktop-titlebar.js); the PWA never sets them.
|
|
152
154
|
── */
|
|
153
155
|
body.wco-active #title-bar {
|
|
154
156
|
-webkit-app-region: drag;
|
|
155
|
-
padding-left: calc(env(titlebar-area-x, 0px) + 10px);
|
|
156
|
-
padding-right: max(18px, calc(100vw - env(titlebar-area-x, 0px) - env(titlebar-area-width, 100vw) + 10px));
|
|
157
|
+
padding-left: calc(env(titlebar-area-x, var(--desktop-titlebar-x, 0px)) + 10px);
|
|
158
|
+
padding-right: max(18px, calc(100vw - env(titlebar-area-x, var(--desktop-titlebar-x, 0px)) - env(titlebar-area-width, var(--desktop-titlebar-width, 100vw)) + 10px));
|
|
157
159
|
padding-top: 0;
|
|
158
160
|
padding-bottom: 0;
|
|
159
|
-
height: env(titlebar-area-height, 48px);
|
|
161
|
+
height: env(titlebar-area-height, var(--desktop-titlebar-height, 48px));
|
|
160
162
|
transition: padding 0.2s ease;
|
|
161
163
|
}
|
|
162
164
|
body.wco-active #title-bar button,
|
|
@@ -167,7 +169,9 @@
|
|
|
167
169
|
body.wco-active #title-bar .bar-right {
|
|
168
170
|
-webkit-app-region: no-drag;
|
|
169
171
|
}
|
|
170
|
-
|
|
172
|
+
/* The installed PWA's overlay is thinner than the toolbar's pill: the pill's glass goes. The desktop app's bar is
|
|
173
|
+
the pill's height and keeps it (below). */
|
|
174
|
+
html:not(.desktop-titlebar) body.wco-active #title-bar .bar-right {
|
|
171
175
|
background: transparent;
|
|
172
176
|
backdrop-filter: none;
|
|
173
177
|
-webkit-backdrop-filter: none;
|
|
@@ -178,6 +182,19 @@
|
|
|
178
182
|
transform: translateY(1px);
|
|
179
183
|
}
|
|
180
184
|
|
|
185
|
+
/* ── The SynaBun desktop app (packaging/desktop): this bar is the window's title bar ──
|
|
186
|
+
html.desktop-titlebar comes from desktop-titlebar.js, only inside the app's main window, which also toggles
|
|
187
|
+
body.wco-active (off in full screen, where the system hides its buttons). Whatever in the bar takes a click
|
|
188
|
+
stays out of the drag region; the empty parts drag the window, and the system maximizes and restores it on
|
|
189
|
+
a double-click. While something is drawn over the bar (a dialog, the tour), the bar drags nothing, so that
|
|
190
|
+
thing gets its clicks. Windows and Linux: the app's menu opens from .desktop-app-menu-btn (a .bar-icon). */
|
|
191
|
+
html.desktop-titlebar body.wco-active #title-bar :is(#titlebar-logo, #search-container, select, label, [role="button"], [tabindex]:not([tabindex="-1"])) {
|
|
192
|
+
-webkit-app-region: no-drag;
|
|
193
|
+
}
|
|
194
|
+
html.desktop-titlebar body.wco-active.desktop-titlebar-covered #title-bar {
|
|
195
|
+
-webkit-app-region: no-drag;
|
|
196
|
+
}
|
|
197
|
+
|
|
181
198
|
::-webkit-scrollbar { width: 6px; }
|
|
182
199
|
::-webkit-scrollbar-track { background: rgba(255,255,255,0.03); }
|
|
183
200
|
::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 3px; }
|
|
@@ -457,12 +474,19 @@
|
|
|
457
474
|
user-select: none;
|
|
458
475
|
}
|
|
459
476
|
|
|
460
|
-
/* ── Toolbar (vertical, left side) ──
|
|
477
|
+
/* ── Toolbar (vertical, left side) ──
|
|
478
|
+
Centred on the board, but no higher than just below the top-right toolbar's row (navbar + 20px + its 40px +
|
|
479
|
+
12px) as long as the whole rail still fits under it: on a short window the rail would otherwise rise under
|
|
480
|
+
that row where the row reaches this far left. Where it cannot fit there, it sits as low as it can and still
|
|
481
|
+
ends 20px above the board's bottom. (In translateY, 50% and 100% are the rail's own height.) */
|
|
461
482
|
#wb-toolbar {
|
|
462
483
|
position: absolute;
|
|
463
|
-
top:
|
|
484
|
+
--wb-rail-top: calc(var(--navbar-height, 48px) + 72px);
|
|
485
|
+
--wb-board-h: calc(100dvh - var(--terminal-height, 0px));
|
|
486
|
+
--wb-rail-y: max(calc(var(--wb-board-h) / 2 - 50%), min(var(--wb-rail-top), calc(var(--wb-board-h) - 100% - 20px)));
|
|
487
|
+
top: 0;
|
|
464
488
|
left: calc(var(--sidebar-total-width, 0px) + 20px);
|
|
465
|
-
transform: translateY(-
|
|
489
|
+
transform: translateY(var(--wb-rail-y));
|
|
466
490
|
z-index: 10;
|
|
467
491
|
display: flex;
|
|
468
492
|
flex-direction: column;
|
|
@@ -470,21 +494,6 @@
|
|
|
470
494
|
gap: 2px;
|
|
471
495
|
padding: 8px 4px;
|
|
472
496
|
pointer-events: auto;
|
|
473
|
-
transition: opacity 0.3s ease,
|
|
474
|
-
transform 0.45s cubic-bezier(0.22, 1, 0.36, 1),
|
|
475
|
-
visibility 0s;
|
|
476
|
-
}
|
|
477
|
-
/* "Hide all toolbars" (top-right chevron) — body.toolbars-hidden is set by ui-navbar.js.
|
|
478
|
-
visibility (not display) keeps layout so whiteboard shortcuts and picker positioning
|
|
479
|
-
keep working while the rail is hidden. Same idiom as #terminal-panel.hidden. */
|
|
480
|
-
body.toolbars-hidden #wb-toolbar {
|
|
481
|
-
opacity: 0;
|
|
482
|
-
transform: translate(-12px, -50%);
|
|
483
|
-
visibility: hidden;
|
|
484
|
-
pointer-events: none;
|
|
485
|
-
transition: opacity 0.3s ease,
|
|
486
|
-
transform 0.45s cubic-bezier(0.22, 1, 0.36, 1),
|
|
487
|
-
visibility 0s 0.45s;
|
|
488
497
|
}
|
|
489
498
|
.wb-tool {
|
|
490
499
|
width: 32px;
|
|
@@ -543,6 +552,24 @@
|
|
|
543
552
|
}
|
|
544
553
|
.wb-tool-sm { width: 26px; height: 26px; }
|
|
545
554
|
.wb-tool-sm svg { width: 14px; height: 14px; }
|
|
555
|
+
/* A setting the rail switches (Snap to grid), not a tool: on, it keeps the accent mark it had in the top-right
|
|
556
|
+
bar, so it never reads as the tool in use. */
|
|
557
|
+
.wb-tool.wb-toggle { position: relative; }
|
|
558
|
+
.wb-tool.wb-toggle.active { background: transparent; color: var(--t-bright); }
|
|
559
|
+
.wb-tool.wb-toggle.active:hover { background: var(--s-hover); }
|
|
560
|
+
.wb-tool.wb-toggle.active::after {
|
|
561
|
+
content: '';
|
|
562
|
+
position: absolute;
|
|
563
|
+
bottom: 2px;
|
|
564
|
+
left: 50%;
|
|
565
|
+
transform: translateX(-50%);
|
|
566
|
+
width: 6px;
|
|
567
|
+
height: 2.5px;
|
|
568
|
+
border-radius: 2px;
|
|
569
|
+
background: var(--accent-blue);
|
|
570
|
+
opacity: 0.9;
|
|
571
|
+
box-shadow: 0 0 6px var(--accent-blue);
|
|
572
|
+
}
|
|
546
573
|
.wb-tool-sep {
|
|
547
574
|
width: 20px;
|
|
548
575
|
height: 1px;
|
|
@@ -1464,19 +1491,32 @@
|
|
|
1464
1491
|
z-index: 1;
|
|
1465
1492
|
}
|
|
1466
1493
|
|
|
1494
|
+
/* The memory search: a slot of its own between the menubar and the pill, centred in what the menu leaves (its auto
|
|
1495
|
+
margins) and up to 340px of it. It never lies under the menu, whatever the labels' language or the window's
|
|
1496
|
+
width: where the space runs short it shrinks, and below 200px the field is a search icon that opens over the
|
|
1497
|
+
menu while it has the focus ("SEARCH BAR"). Its box is the field's width only, so the empty bar beside it still
|
|
1498
|
+
drags the desktop app's window. With the visualization off it takes no room at all. */
|
|
1467
1499
|
#title-bar .bar-center {
|
|
1468
|
-
position:
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1500
|
+
position: relative;
|
|
1501
|
+
flex: 0 1 340px;
|
|
1502
|
+
min-width: 30px;
|
|
1503
|
+
margin-inline: auto;
|
|
1504
|
+
container-type: inline-size;
|
|
1473
1505
|
display: flex;
|
|
1474
1506
|
align-items: center;
|
|
1475
1507
|
justify-content: center;
|
|
1476
|
-
gap: 8px;
|
|
1477
|
-
min-width: 0;
|
|
1478
1508
|
pointer-events: auto;
|
|
1479
1509
|
}
|
|
1510
|
+
#title-bar .bar-center:has(> #search-wrapper.viz-hidden) {
|
|
1511
|
+
flex-basis: 0;
|
|
1512
|
+
min-width: 0;
|
|
1513
|
+
}
|
|
1514
|
+
#title-bar .bar-center:focus-within {
|
|
1515
|
+
z-index: 2; /* the opened field draws over the menubar (.bar-left, z-index 1) */
|
|
1516
|
+
}
|
|
1517
|
+
#title-bar .bar-center + .bar-right {
|
|
1518
|
+
margin-left: 0; /* the slot's auto margins push the pill to the right edge */
|
|
1519
|
+
}
|
|
1480
1520
|
|
|
1481
1521
|
/* ── Unified frosted glass pill ── */
|
|
1482
1522
|
#title-bar .bar-right {
|
|
@@ -3960,10 +4000,7 @@
|
|
|
3960
4000
|
background: rgba(255,82,82,0.08);
|
|
3961
4001
|
}
|
|
3962
4002
|
|
|
3963
|
-
/*
|
|
3964
|
-
.cc-greeting-field {
|
|
3965
|
-
margin-bottom: 10px;
|
|
3966
|
-
}
|
|
4003
|
+
/* A small uppercase row label (Settings → Setup uses it; the greeting editor it came from is gone) */
|
|
3967
4004
|
.cc-greeting-label {
|
|
3968
4005
|
font-size: 10.5px;
|
|
3969
4006
|
text-transform: uppercase;
|
|
@@ -3973,40 +4010,6 @@
|
|
|
3973
4010
|
margin-bottom: 5px;
|
|
3974
4011
|
display: block;
|
|
3975
4012
|
}
|
|
3976
|
-
.cc-greeting-textarea {
|
|
3977
|
-
width: 100%;
|
|
3978
|
-
min-height: 60px;
|
|
3979
|
-
max-height: 160px;
|
|
3980
|
-
resize: vertical;
|
|
3981
|
-
background: rgba(255,255,255,0.03);
|
|
3982
|
-
border: 1px solid var(--b-subtle);
|
|
3983
|
-
border-radius: 6px;
|
|
3984
|
-
padding: 8px 10px;
|
|
3985
|
-
font-family: 'JetBrains Mono', monospace;
|
|
3986
|
-
font-size: 11px;
|
|
3987
|
-
line-height: 1.5;
|
|
3988
|
-
color: var(--t-primary);
|
|
3989
|
-
box-sizing: border-box;
|
|
3990
|
-
transition: border-color 0.15s;
|
|
3991
|
-
}
|
|
3992
|
-
.cc-greeting-textarea:focus {
|
|
3993
|
-
outline: none;
|
|
3994
|
-
border-color: rgba(255,255,255,0.15);
|
|
3995
|
-
}
|
|
3996
|
-
.cc-greeting-textarea::placeholder { color: var(--t-faint); }
|
|
3997
|
-
.cc-greeting-project-select {
|
|
3998
|
-
background: rgba(255,255,255,0.04);
|
|
3999
|
-
border: 1px solid var(--b-subtle);
|
|
4000
|
-
border-radius: 6px;
|
|
4001
|
-
padding: 5px 8px;
|
|
4002
|
-
font-family: inherit;
|
|
4003
|
-
font-size: 12px;
|
|
4004
|
-
color: var(--t-primary);
|
|
4005
|
-
cursor: pointer;
|
|
4006
|
-
min-width: 120px;
|
|
4007
|
-
}
|
|
4008
|
-
.cc-greeting-project-select:focus { outline: none; border-color: rgba(255,255,255,0.15); }
|
|
4009
|
-
.cc-greeting-project-select option { background: #1a1a1a; color: var(--t-primary); }
|
|
4010
4013
|
|
|
4011
4014
|
/* Custom dropdown */
|
|
4012
4015
|
.cc-dropdown {
|
|
@@ -4634,93 +4637,6 @@
|
|
|
4634
4637
|
margin-top: 4px;
|
|
4635
4638
|
}
|
|
4636
4639
|
|
|
4637
|
-
.cc-greeting-reminder-list { display: flex; flex-direction: column; gap: 4px; }
|
|
4638
|
-
.cc-greeting-reminder-row {
|
|
4639
|
-
display: flex;
|
|
4640
|
-
align-items: center;
|
|
4641
|
-
gap: 6px;
|
|
4642
|
-
padding: 4px 0;
|
|
4643
|
-
border-radius: 4px;
|
|
4644
|
-
transition: background 0.1s;
|
|
4645
|
-
}
|
|
4646
|
-
.cc-greeting-reminder-row:hover { background: rgba(255,255,255,0.02); }
|
|
4647
|
-
.cc-greeting-drag-handle {
|
|
4648
|
-
cursor: grab;
|
|
4649
|
-
color: var(--t-faint);
|
|
4650
|
-
font-size: 11px;
|
|
4651
|
-
padding: 2px;
|
|
4652
|
-
user-select: none;
|
|
4653
|
-
opacity: 0.4;
|
|
4654
|
-
transition: opacity 0.15s;
|
|
4655
|
-
}
|
|
4656
|
-
.cc-greeting-reminder-row:hover .cc-greeting-drag-handle { opacity: 0.8; }
|
|
4657
|
-
.cc-greeting-reminder-input {
|
|
4658
|
-
flex: 1;
|
|
4659
|
-
background: transparent;
|
|
4660
|
-
border: 1px solid transparent;
|
|
4661
|
-
border-radius: 4px;
|
|
4662
|
-
padding: 4px 6px;
|
|
4663
|
-
font-family: inherit;
|
|
4664
|
-
font-size: 12px;
|
|
4665
|
-
color: var(--t-primary);
|
|
4666
|
-
transition: border-color 0.15s, background 0.15s;
|
|
4667
|
-
}
|
|
4668
|
-
.cc-greeting-reminder-input:hover { border-color: var(--b-subtle); }
|
|
4669
|
-
.cc-greeting-reminder-input:focus {
|
|
4670
|
-
outline: none;
|
|
4671
|
-
border-color: rgba(255,255,255,0.12);
|
|
4672
|
-
background: rgba(255,255,255,0.03);
|
|
4673
|
-
}
|
|
4674
|
-
.cc-greeting-reminder-input::placeholder { color: var(--t-faint); }
|
|
4675
|
-
.cc-greeting-reminder-input.cmd {
|
|
4676
|
-
font-family: 'JetBrains Mono', monospace;
|
|
4677
|
-
font-size: 11px;
|
|
4678
|
-
}
|
|
4679
|
-
.cc-greeting-reminder-remove {
|
|
4680
|
-
background: none;
|
|
4681
|
-
border: none;
|
|
4682
|
-
color: var(--t-faint);
|
|
4683
|
-
cursor: pointer;
|
|
4684
|
-
padding: 2px 4px;
|
|
4685
|
-
font-size: 14px;
|
|
4686
|
-
line-height: 1;
|
|
4687
|
-
opacity: 0;
|
|
4688
|
-
transition: opacity 0.15s, color 0.15s;
|
|
4689
|
-
}
|
|
4690
|
-
.cc-greeting-reminder-row:hover .cc-greeting-reminder-remove { opacity: 0.6; }
|
|
4691
|
-
.cc-greeting-reminder-remove:hover { opacity: 1 !important; color: var(--accent-red); }
|
|
4692
|
-
.cc-greeting-checkboxes {
|
|
4693
|
-
display: flex;
|
|
4694
|
-
gap: 16px;
|
|
4695
|
-
margin-bottom: 10px;
|
|
4696
|
-
}
|
|
4697
|
-
.cc-greeting-var-hint {
|
|
4698
|
-
font-size: 10px;
|
|
4699
|
-
color: var(--t-faint);
|
|
4700
|
-
margin-top: 3px;
|
|
4701
|
-
line-height: 1.4;
|
|
4702
|
-
}
|
|
4703
|
-
.cc-greeting-cheatsheet-toggle {
|
|
4704
|
-
font-size: 10px;
|
|
4705
|
-
color: var(--accent-blue);
|
|
4706
|
-
margin-top: 4px;
|
|
4707
|
-
cursor: pointer;
|
|
4708
|
-
user-select: none;
|
|
4709
|
-
display: inline-flex;
|
|
4710
|
-
align-items: center;
|
|
4711
|
-
gap: 4px;
|
|
4712
|
-
opacity: 0.7;
|
|
4713
|
-
transition: opacity 0.15s;
|
|
4714
|
-
}
|
|
4715
|
-
.cc-greeting-cheatsheet-toggle:hover { opacity: 1; }
|
|
4716
|
-
.cc-greeting-cheatsheet-toggle.open { opacity: 1; }
|
|
4717
|
-
.cc-greeting-cheatsheet {
|
|
4718
|
-
margin-top: 6px;
|
|
4719
|
-
border: 1px solid var(--b-subtle);
|
|
4720
|
-
border-radius: 6px;
|
|
4721
|
-
background: rgba(255,255,255,0.02);
|
|
4722
|
-
overflow: hidden;
|
|
4723
|
-
}
|
|
4724
4640
|
.cc-cheatsheet-table {
|
|
4725
4641
|
width: 100%;
|
|
4726
4642
|
border-collapse: collapse;
|
|
@@ -5219,6 +5135,54 @@
|
|
|
5219
5135
|
vertical-align: -2px;
|
|
5220
5136
|
margin-right: 6px;
|
|
5221
5137
|
}
|
|
5138
|
+
/* Inside the desktop app (ui-update.js openDesktopUpdateModal): the release notes, written as text, and the
|
|
5139
|
+
download's progress. The surfaces and the green of the rest of this dialog. */
|
|
5140
|
+
.update-notes-label {
|
|
5141
|
+
font-size: 11px;
|
|
5142
|
+
color: var(--t-muted);
|
|
5143
|
+
margin: 4px 0 6px;
|
|
5144
|
+
}
|
|
5145
|
+
.update-notes {
|
|
5146
|
+
max-height: 168px;
|
|
5147
|
+
overflow: auto;
|
|
5148
|
+
white-space: pre-wrap;
|
|
5149
|
+
overflow-wrap: anywhere;
|
|
5150
|
+
background: rgba(0,0,0,0.35);
|
|
5151
|
+
border: 1px solid rgba(255,255,255,0.06);
|
|
5152
|
+
border-radius: var(--r-card);
|
|
5153
|
+
padding: 10px 14px;
|
|
5154
|
+
font-size: 12px;
|
|
5155
|
+
line-height: 1.5;
|
|
5156
|
+
color: var(--t-secondary);
|
|
5157
|
+
}
|
|
5158
|
+
.update-notes:focus-visible {
|
|
5159
|
+
outline: 2px solid var(--stg-focus, #93c5fd);
|
|
5160
|
+
outline-offset: 2px;
|
|
5161
|
+
}
|
|
5162
|
+
.update-progress {
|
|
5163
|
+
height: 6px;
|
|
5164
|
+
margin: 16px 0 8px;
|
|
5165
|
+
border-radius: 999px;
|
|
5166
|
+
background: rgba(255,255,255,0.12);
|
|
5167
|
+
overflow: hidden;
|
|
5168
|
+
}
|
|
5169
|
+
.update-progress-bar {
|
|
5170
|
+
height: 100%;
|
|
5171
|
+
border-radius: inherit;
|
|
5172
|
+
background: #34c759;
|
|
5173
|
+
transition: width 0.2s ease;
|
|
5174
|
+
}
|
|
5175
|
+
/* The size is not known: the bar is full and quiet, the words say how much came. */
|
|
5176
|
+
.update-progress-bar--unknown { opacity: 0.45; }
|
|
5177
|
+
.update-progress-text {
|
|
5178
|
+
font-family: var(--ff-mono);
|
|
5179
|
+
font-size: 11px;
|
|
5180
|
+
font-variant-numeric: tabular-nums;
|
|
5181
|
+
color: var(--t-muted);
|
|
5182
|
+
}
|
|
5183
|
+
@media (prefers-reduced-motion: reduce) {
|
|
5184
|
+
.update-progress-bar { transition: none; }
|
|
5185
|
+
}
|
|
5222
5186
|
.tag-delete-overlay.closing {
|
|
5223
5187
|
opacity: 0;
|
|
5224
5188
|
transition: opacity 0.15s ease;
|
|
@@ -5934,9 +5898,19 @@
|
|
|
5934
5898
|
position: fixed;
|
|
5935
5899
|
top: calc(var(--navbar-height, 48px) + 20px);
|
|
5936
5900
|
right: calc(20px + var(--right-panel-width, var(--claude-panel-width, 0px)));
|
|
5901
|
+
/* One row in the band between the left panels (Memory Explorer, File Explorer) and the right one, 20px clear of
|
|
5902
|
+
each, never over a left panel: where the band is narrower than the row, the dock takes a line of its own under
|
|
5903
|
+
the buttons (wrap-reverse: the buttons' line stays on top; see "Fit" below). What still reaches left of the
|
|
5904
|
+
band (no band at all between wide panels, a dropdown that opens leftwards) is cut off at the band's edge:
|
|
5905
|
+
nothing of the toolbar is drawn, or takes a click, over a left panel. */
|
|
5906
|
+
max-width: var(--topright-band);
|
|
5907
|
+
min-height: 40px; /* the dock's height: the buttons and the pills stay where they are when it hides */
|
|
5908
|
+
justify-content: flex-end;
|
|
5909
|
+
clip-path: inset(-100vh -100vw -200vh calc(var(--sidebar-total-width, 0px) + var(--right-panel-width, var(--claude-panel-width, 0px)) + 40px + 100% - 100vw));
|
|
5937
5910
|
transition: right 0.3s cubic-bezier(0.22, 1, 0.36, 1);
|
|
5938
5911
|
z-index: 400;
|
|
5939
5912
|
display: flex;
|
|
5913
|
+
flex-wrap: wrap-reverse;
|
|
5940
5914
|
align-items: center;
|
|
5941
5915
|
gap: 6px;
|
|
5942
5916
|
font-family: inherit;
|
|
@@ -5957,25 +5931,26 @@
|
|
|
5957
5931
|
display: none;
|
|
5958
5932
|
}
|
|
5959
5933
|
|
|
5960
|
-
/* ── Unified frosted glass dock bar ──
|
|
5934
|
+
/* ── Unified frosted glass dock bar ──
|
|
5935
|
+
z-index: the session pills (#term-minimized-tray) hang right below the bar, and what the dock opens
|
|
5936
|
+
(workspaces, bookmarks, invite) drops over them. Its backdrop-filter makes it a stacking context, so those
|
|
5937
|
+
menus' own z-index stops at the dock's: the dock itself has to be above the tray. */
|
|
5961
5938
|
#topright-inner {
|
|
5939
|
+
position: relative;
|
|
5940
|
+
z-index: 1;
|
|
5962
5941
|
display: flex;
|
|
5963
5942
|
align-items: center;
|
|
5964
|
-
|
|
5943
|
+
flex-shrink: 0;
|
|
5944
|
+
gap: 2px;
|
|
5965
5945
|
overflow: visible;
|
|
5966
|
-
max-width: 2000px;
|
|
5967
|
-
opacity: 1;
|
|
5968
5946
|
background: rgba(18, 18, 22, 0.65);
|
|
5969
5947
|
backdrop-filter: blur(var(--blur-heavy)) saturate(1.3);
|
|
5970
5948
|
-webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.3);
|
|
5971
5949
|
border: 1px solid rgba(255, 255, 255, 0.06);
|
|
5972
5950
|
border-radius: 14px;
|
|
5973
|
-
padding: 4px
|
|
5951
|
+
padding: 4px;
|
|
5974
5952
|
box-shadow: var(--shadow-md), var(--shadow-highlight);
|
|
5975
|
-
transition:
|
|
5976
|
-
opacity 0.3s ease,
|
|
5977
|
-
gap 0.35s ease,
|
|
5978
|
-
border-color 0.3s ease,
|
|
5953
|
+
transition: border-color 0.3s ease,
|
|
5979
5954
|
box-shadow 0.3s ease;
|
|
5980
5955
|
}
|
|
5981
5956
|
#topright-inner:hover {
|
|
@@ -5983,14 +5958,84 @@
|
|
|
5983
5958
|
box-shadow: var(--shadow-lg), var(--shadow-highlight);
|
|
5984
5959
|
}
|
|
5985
5960
|
|
|
5986
|
-
|
|
5987
|
-
|
|
5988
|
-
|
|
5989
|
-
|
|
5990
|
-
|
|
5961
|
+
/* The tools toggle and the agent side panels: one row of their own that never wraps, at the bar's right edge. */
|
|
5962
|
+
#topright-buttons {
|
|
5963
|
+
display: flex;
|
|
5964
|
+
align-items: center;
|
|
5965
|
+
flex-shrink: 0;
|
|
5966
|
+
gap: 6px;
|
|
5967
|
+
min-height: 40px; /* the dock's height: a bar that wraps keeps its lines 40px apart, the buttons where they were */
|
|
5968
|
+
}
|
|
5969
|
+
|
|
5970
|
+
/* Hidden by the tools toggle (#topright-tools-btn, ui-navbar.js): the buttons and the pills stay where they are. */
|
|
5971
|
+
#topright-controls.tools-hidden > #topright-inner {
|
|
5972
|
+
display: none;
|
|
5973
|
+
}
|
|
5974
|
+
|
|
5975
|
+
/* ── Fit: the buttons one row in any band, nothing hidden, nothing over a left panel ──
|
|
5976
|
+
--topright-row is the row at its widest without the workspace name: the dock (the switcher with its save button,
|
|
5977
|
+
50px; seven tools of 30px and the update button; two dividers; the dock's gaps and edges: 298px in all, 266px
|
|
5978
|
+
while the update button is hidden), then --topright-buttons, the tools toggle and the four agent buttons with
|
|
5979
|
+
the gaps before them (190px). Below row + 45px of band the workspace name goes into the switcher's tooltip
|
|
5980
|
+
(--topright-compact; it shows from 40px on, up to 120px, and takes what the band leaves it). Below the row itself
|
|
5981
|
+
the bar wraps (#topright-controls: flex-wrap: wrap-reverse): the toggle and the agent buttons stay on top, in one
|
|
5982
|
+
row, and the dock takes a line of its own right under them, right-aligned, still one row. --topright-compact is
|
|
5983
|
+
1 below its width and 0 from it up (tan(atan2()) divides a length by a length); it lives on :root so that a
|
|
5984
|
+
style query reaches the name. Change --topright-row (or --topright-buttons) with the controls of the row. */
|
|
5985
|
+
@property --topright-compact {
|
|
5986
|
+
syntax: '<number>';
|
|
5987
|
+
inherits: true;
|
|
5988
|
+
initial-value: 0;
|
|
5989
|
+
}
|
|
5990
|
+
:root {
|
|
5991
|
+
--topright-band: calc(100vw - var(--sidebar-total-width, 0px) - var(--right-panel-width, var(--claude-panel-width, 0px)) - 40px);
|
|
5992
|
+
--topright-buttons: 190px;
|
|
5993
|
+
--topright-row: calc(298px + var(--topright-buttons));
|
|
5994
|
+
--topright-compact: clamp(0, tan(atan2(calc(var(--topright-row) + 45px - var(--topright-band)), 0.01px)), 1);
|
|
5995
|
+
}
|
|
5996
|
+
:root:has(#topright-update-btn[style*="none"]) {
|
|
5997
|
+
--topright-row: calc(266px + var(--topright-buttons));
|
|
5998
|
+
}
|
|
5999
|
+
@container style(--topright-compact: 1) {
|
|
6000
|
+
#ws-active-name {
|
|
6001
|
+
display: none;
|
|
6002
|
+
}
|
|
6003
|
+
}
|
|
6004
|
+
/* The session pills (#term-minimized-tray, a child of the row): a column under the bar, one pill per line,
|
|
6005
|
+
right-aligned with its right edge (the last agent button). The same
|
|
6006
|
+
place whether the tools show or not; under the dock's line where the bar wrapped. Never wider than the band, so
|
|
6007
|
+
nothing of them lies over a left panel (a pill gives its label up first); in Focus Mode they also keep clear of
|
|
6008
|
+
the whiteboard rail at the band's left edge (--topright-tray-inset: its 42px and 8px). The row slides left with
|
|
6009
|
+
a right side panel and takes them along. Nothing in the row hides them: the menus the dock opens draw over them
|
|
6010
|
+
(#topright-inner's z-index, an opaque menu). Only the code editor hides the whole row, pills included
|
|
6011
|
+
(body.fe-editor-open): it fills the band they hang in. The tray's own box takes no click: what lies beside the
|
|
6012
|
+
pills is the canvas's. */
|
|
6013
|
+
:root {
|
|
6014
|
+
--topright-tray-inset: 0px;
|
|
6015
|
+
}
|
|
6016
|
+
:root:has(#static-bg.visible) {
|
|
6017
|
+
--topright-tray-inset: 50px;
|
|
6018
|
+
}
|
|
6019
|
+
#topright-controls > #term-minimized-tray {
|
|
6020
|
+
right: 0;
|
|
6021
|
+
width: max-content;
|
|
6022
|
+
max-width: calc(var(--topright-band) - var(--topright-tray-inset));
|
|
6023
|
+
flex-direction: column;
|
|
6024
|
+
flex-wrap: nowrap;
|
|
6025
|
+
align-items: flex-end;
|
|
6026
|
+
gap: 6px;
|
|
5991
6027
|
pointer-events: none;
|
|
5992
|
-
|
|
5993
|
-
|
|
6028
|
+
}
|
|
6029
|
+
#topright-controls > #term-minimized-tray > * {
|
|
6030
|
+
pointer-events: auto;
|
|
6031
|
+
}
|
|
6032
|
+
/* A pill's label: 100px as everywhere, less in a narrow band, so that two pills share a line (the pill around its
|
|
6033
|
+
label is 60px, 62 with rounding, and 6px apart): a narrow band gets rows of two, not a stack of one, down to a
|
|
6034
|
+
band of 182px (two pills at the shortest label, 28px). It keeps that width on hover (widening, a pill would push the others onto another line under the pointer):
|
|
6035
|
+
its whole name is its tooltip (ui-navbar.js). */
|
|
6036
|
+
#topright-controls > #term-minimized-tray > .term-minimized-pill .term-minimized-pill-label,
|
|
6037
|
+
#topright-controls > #term-minimized-tray > .term-minimized-pill:hover .term-minimized-pill-label {
|
|
6038
|
+
max-width: clamp(28px, calc(var(--topright-band) - var(--topright-tray-inset) - 62px), 100px);
|
|
5994
6039
|
}
|
|
5995
6040
|
|
|
5996
6041
|
/* ── Thin divider between groups ── */
|
|
@@ -6003,148 +6048,42 @@
|
|
|
6003
6048
|
border-radius: 1px;
|
|
6004
6049
|
}
|
|
6005
6050
|
|
|
6006
|
-
/* ──
|
|
6007
|
-
.topright-
|
|
6008
|
-
width:
|
|
6009
|
-
height:
|
|
6051
|
+
/* ── Icon buttons inside unified dock (transparent, no individual glass) ── */
|
|
6052
|
+
.topright-icon-btn {
|
|
6053
|
+
width: 30px;
|
|
6054
|
+
height: 30px;
|
|
6010
6055
|
display: flex;
|
|
6011
6056
|
align-items: center;
|
|
6012
6057
|
justify-content: center;
|
|
6013
|
-
background:
|
|
6014
|
-
|
|
6015
|
-
-
|
|
6016
|
-
border: 1px solid rgba(255,255,255,0.06);
|
|
6017
|
-
border-radius: 10px;
|
|
6058
|
+
background: transparent;
|
|
6059
|
+
border: none;
|
|
6060
|
+
border-radius: 8px;
|
|
6018
6061
|
color: var(--t-muted);
|
|
6019
6062
|
cursor: pointer;
|
|
6020
|
-
transition:
|
|
6063
|
+
transition: color 0.2s ease,
|
|
6064
|
+
background 0.2s ease,
|
|
6065
|
+
transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
|
|
6066
|
+
box-shadow 0.3s ease;
|
|
6021
6067
|
position: relative;
|
|
6022
6068
|
padding: 0;
|
|
6023
6069
|
flex-shrink: 0;
|
|
6024
|
-
z-index: 2;
|
|
6025
|
-
overflow: hidden;
|
|
6026
|
-
box-shadow: var(--shadow-md), var(--shadow-highlight);
|
|
6027
6070
|
}
|
|
6028
6071
|
|
|
6029
|
-
.topright-
|
|
6030
|
-
background: rgba(
|
|
6031
|
-
|
|
6032
|
-
|
|
6072
|
+
.topright-icon-btn:hover {
|
|
6073
|
+
background: rgba(255, 255, 255, 0.1);
|
|
6074
|
+
color: var(--t-bright);
|
|
6075
|
+
transform: scale(1.06);
|
|
6076
|
+
box-shadow: 0 0 0 0.5px rgba(255, 255, 255, 0.06);
|
|
6033
6077
|
}
|
|
6034
|
-
|
|
6035
|
-
|
|
6036
|
-
|
|
6037
|
-
|
|
6038
|
-
stroke: currentColor;
|
|
6039
|
-
stroke-width: 2;
|
|
6040
|
-
fill: none;
|
|
6041
|
-
transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1),
|
|
6042
|
-
opacity 0.3s ease;
|
|
6043
|
-
flex-shrink: 0;
|
|
6078
|
+
.topright-icon-btn:active {
|
|
6079
|
+
background: rgba(255, 255, 255, 0.14);
|
|
6080
|
+
transform: scale(0.96);
|
|
6081
|
+
transition-duration: 0.06s;
|
|
6044
6082
|
}
|
|
6045
6083
|
|
|
6046
|
-
|
|
6047
|
-
|
|
6048
|
-
|
|
6049
|
-
display: flex;
|
|
6050
|
-
gap: 3px;
|
|
6051
|
-
align-items: center;
|
|
6052
|
-
opacity: 0;
|
|
6053
|
-
transition: opacity 0.3s ease;
|
|
6054
|
-
pointer-events: none;
|
|
6055
|
-
}
|
|
6056
|
-
|
|
6057
|
-
.topright-collapse-btn .collapse-dots span {
|
|
6058
|
-
width: 3px;
|
|
6059
|
-
height: 3px;
|
|
6060
|
-
border-radius: 50%;
|
|
6061
|
-
background: rgba(160, 200, 255, 0.45);
|
|
6062
|
-
transition: background 0.3s ease;
|
|
6063
|
-
}
|
|
6064
|
-
|
|
6065
|
-
/* ── Collapsed state — vertical pill with staggered dots ── */
|
|
6066
|
-
#topright-controls.collapsed .topright-collapse-btn {
|
|
6067
|
-
width: 32px;
|
|
6068
|
-
height: 32px;
|
|
6069
|
-
border-radius: 10px;
|
|
6070
|
-
background: rgba(16, 16, 20, 0.7);
|
|
6071
|
-
border-color: rgba(110, 181, 255, 0.08);
|
|
6072
|
-
box-shadow: 0 0 12px rgba(110, 181, 255, 0.04),
|
|
6073
|
-
inset 0 0 8px rgba(110, 181, 255, 0.02);
|
|
6074
|
-
}
|
|
6075
|
-
|
|
6076
|
-
#topright-controls.collapsed .topright-collapse-btn:hover {
|
|
6077
|
-
border-color: rgba(110, 181, 255, 0.2);
|
|
6078
|
-
background: rgba(22, 22, 28, 0.85);
|
|
6079
|
-
box-shadow: 0 0 16px rgba(110, 181, 255, 0.08);
|
|
6080
|
-
}
|
|
6081
|
-
|
|
6082
|
-
/* Chevron hides, dots show */
|
|
6083
|
-
#topright-controls.collapsed .collapse-chevron {
|
|
6084
|
-
opacity: 0;
|
|
6085
|
-
transform: scale(0.5);
|
|
6086
|
-
}
|
|
6087
|
-
|
|
6088
|
-
#topright-controls.collapsed .collapse-dots {
|
|
6089
|
-
opacity: 1;
|
|
6090
|
-
flex-direction: column;
|
|
6091
|
-
}
|
|
6092
|
-
|
|
6093
|
-
/* Staggered breathing on the dots */
|
|
6094
|
-
#topright-controls.collapsed .collapse-dots span {
|
|
6095
|
-
animation: dotPulse 2.4s ease-in-out infinite;
|
|
6096
|
-
}
|
|
6097
|
-
#topright-controls.collapsed .collapse-dots span:nth-child(1) { animation-delay: 0s; }
|
|
6098
|
-
#topright-controls.collapsed .collapse-dots span:nth-child(2) { animation-delay: 0.3s; }
|
|
6099
|
-
#topright-controls.collapsed .collapse-dots span:nth-child(3) { animation-delay: 0.6s; }
|
|
6100
|
-
|
|
6101
|
-
/* On hover, dots go solid */
|
|
6102
|
-
#topright-controls.collapsed .topright-collapse-btn:hover .collapse-dots span {
|
|
6103
|
-
animation: none;
|
|
6104
|
-
background: rgba(110, 181, 255, 0.7);
|
|
6105
|
-
}
|
|
6106
|
-
|
|
6107
|
-
@keyframes dotPulse {
|
|
6108
|
-
0%, 100% { opacity: 0.25; transform: scale(0.8); }
|
|
6109
|
-
50% { opacity: 0.85; transform: scale(1.15); }
|
|
6110
|
-
}
|
|
6111
|
-
|
|
6112
|
-
/* ── Icon buttons inside unified dock (transparent, no individual glass) ── */
|
|
6113
|
-
.topright-icon-btn {
|
|
6114
|
-
width: 30px;
|
|
6115
|
-
height: 30px;
|
|
6116
|
-
display: flex;
|
|
6117
|
-
align-items: center;
|
|
6118
|
-
justify-content: center;
|
|
6119
|
-
background: transparent;
|
|
6120
|
-
border: none;
|
|
6121
|
-
border-radius: 8px;
|
|
6122
|
-
color: var(--t-muted);
|
|
6123
|
-
cursor: pointer;
|
|
6124
|
-
transition: color 0.2s ease,
|
|
6125
|
-
background 0.2s ease,
|
|
6126
|
-
transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
|
|
6127
|
-
box-shadow 0.3s ease;
|
|
6128
|
-
position: relative;
|
|
6129
|
-
padding: 0;
|
|
6130
|
-
flex-shrink: 0;
|
|
6131
|
-
}
|
|
6132
|
-
|
|
6133
|
-
.topright-icon-btn:hover {
|
|
6134
|
-
background: rgba(255, 255, 255, 0.1);
|
|
6135
|
-
color: var(--t-bright);
|
|
6136
|
-
transform: scale(1.06);
|
|
6137
|
-
box-shadow: 0 0 0 0.5px rgba(255, 255, 255, 0.06);
|
|
6138
|
-
}
|
|
6139
|
-
.topright-icon-btn:active {
|
|
6140
|
-
background: rgba(255, 255, 255, 0.14);
|
|
6141
|
-
transform: scale(0.96);
|
|
6142
|
-
transition-duration: 0.06s;
|
|
6143
|
-
}
|
|
6144
|
-
|
|
6145
|
-
.topright-icon-btn.active {
|
|
6146
|
-
color: var(--t-bright);
|
|
6147
|
-
background: rgba(255, 255, 255, 0.08);
|
|
6084
|
+
.topright-icon-btn.active {
|
|
6085
|
+
color: var(--t-bright);
|
|
6086
|
+
background: rgba(255, 255, 255, 0.08);
|
|
6148
6087
|
}
|
|
6149
6088
|
.topright-icon-btn.active::after {
|
|
6150
6089
|
content: '';
|
|
@@ -6192,7 +6131,8 @@
|
|
|
6192
6131
|
font-weight: 600;
|
|
6193
6132
|
}
|
|
6194
6133
|
|
|
6195
|
-
/* ── Standalone buttons outside the unified bar (side panels) ── */
|
|
6134
|
+
/* ── Standalone buttons outside the unified bar (the tools toggle, the side panels) ── */
|
|
6135
|
+
#topright-tools-btn,
|
|
6196
6136
|
#topright-assistant-panel-btn,
|
|
6197
6137
|
#topright-claude-panel-btn,
|
|
6198
6138
|
#topright-codex-panel-btn,
|
|
@@ -6206,6 +6146,7 @@
|
|
|
6206
6146
|
width: 32px;
|
|
6207
6147
|
height: 32px;
|
|
6208
6148
|
}
|
|
6149
|
+
#topright-tools-btn:hover,
|
|
6209
6150
|
#topright-assistant-panel-btn:hover,
|
|
6210
6151
|
#topright-claude-panel-btn:hover,
|
|
6211
6152
|
#topright-codex-panel-btn:hover,
|
|
@@ -6213,39 +6154,85 @@
|
|
|
6213
6154
|
background: rgba(24, 24, 30, 0.8);
|
|
6214
6155
|
border-color: rgba(255, 255, 255, 0.1);
|
|
6215
6156
|
}
|
|
6157
|
+
/* The toggle's chevrons point the way the tools go: right to tuck them away, left to bring them back. */
|
|
6158
|
+
#topright-tools-btn svg {
|
|
6159
|
+
transition: transform 0.2s ease, filter 0.3s ease;
|
|
6160
|
+
}
|
|
6161
|
+
#topright-controls.tools-hidden #topright-tools-btn svg {
|
|
6162
|
+
transform: rotate(180deg);
|
|
6163
|
+
}
|
|
6164
|
+
@media (prefers-reduced-motion: reduce) {
|
|
6165
|
+
#topright-tools-btn svg {
|
|
6166
|
+
transition: none;
|
|
6167
|
+
}
|
|
6168
|
+
}
|
|
6169
|
+
/* An update waits behind the hidden tools: the update badge's green, as a dot on the toggle. */
|
|
6170
|
+
.topright-tools-dot {
|
|
6171
|
+
display: none;
|
|
6172
|
+
position: absolute;
|
|
6173
|
+
top: 5px;
|
|
6174
|
+
right: 5px;
|
|
6175
|
+
width: 6px;
|
|
6176
|
+
height: 6px;
|
|
6177
|
+
border-radius: 50%;
|
|
6178
|
+
background: #34c759;
|
|
6179
|
+
box-shadow: 0 0 0 2px rgba(18, 18, 22, 0.9);
|
|
6180
|
+
pointer-events: none;
|
|
6181
|
+
}
|
|
6182
|
+
#topright-controls.tools-hidden:has(#topright-update-btn:not([style*="none"])) .topright-tools-dot {
|
|
6183
|
+
display: block;
|
|
6184
|
+
}
|
|
6216
6185
|
|
|
6217
|
-
|
|
6218
|
-
|
|
6219
|
-
|
|
6220
|
-
|
|
6186
|
+
/* Keyboard focus on the bar's own controls (the Style Guide's focus ring). */
|
|
6187
|
+
#topright-controls :is(.topright-icon-btn, #ws-indicator, #ws-quick-save):focus-visible {
|
|
6188
|
+
outline: 2px solid var(--stg-focus, #93c5fd);
|
|
6189
|
+
outline-offset: 2px;
|
|
6221
6190
|
}
|
|
6222
6191
|
|
|
6223
|
-
|
|
6192
|
+
/* The workspace switcher opens the dock: the layers icon, the active workspace's name (only while one is
|
|
6193
|
+
loaded, truncated, full in the tooltip) and its save button, or a chevron while none is. */
|
|
6194
|
+
#workspace-overlay {
|
|
6195
|
+
position: relative;
|
|
6224
6196
|
display: flex;
|
|
6225
6197
|
align-items: center;
|
|
6226
|
-
|
|
6198
|
+
flex-shrink: 0;
|
|
6227
6199
|
height: 30px;
|
|
6228
|
-
padding: 0 10px;
|
|
6229
6200
|
border-radius: 8px;
|
|
6230
6201
|
background: rgba(255, 255, 255, 0.04);
|
|
6231
|
-
border:
|
|
6232
|
-
|
|
6233
|
-
transition: background 0.2s ease,
|
|
6234
|
-
|
|
6202
|
+
/* its edge is a ring, not a border: the switch inside keeps the whole 30px of height */
|
|
6203
|
+
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.04);
|
|
6204
|
+
transition: background 0.2s ease, box-shadow 0.2s ease;
|
|
6205
|
+
font-family: inherit;
|
|
6206
|
+
user-select: none;
|
|
6235
6207
|
}
|
|
6236
6208
|
|
|
6237
|
-
#ws-indicator:hover {
|
|
6209
|
+
#workspace-overlay:has(> #ws-indicator:hover, > .ws-quick-save:hover) {
|
|
6238
6210
|
background: rgba(255, 255, 255, 0.08);
|
|
6239
|
-
|
|
6211
|
+
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
|
|
6240
6212
|
}
|
|
6241
6213
|
|
|
6242
|
-
#ws-indicator.open {
|
|
6214
|
+
#workspace-overlay:has(> #ws-indicator.open) {
|
|
6243
6215
|
background: rgba(110, 181, 255, 0.08);
|
|
6244
|
-
|
|
6216
|
+
box-shadow: inset 0 0 0 1px rgba(110, 181, 255, 0.15);
|
|
6217
|
+
}
|
|
6218
|
+
|
|
6219
|
+
#ws-indicator {
|
|
6220
|
+
display: flex;
|
|
6221
|
+
align-items: center;
|
|
6222
|
+
gap: 5px;
|
|
6223
|
+
height: 100%;
|
|
6224
|
+
padding: 0 8px;
|
|
6225
|
+
background: none;
|
|
6226
|
+
border: 0;
|
|
6227
|
+
border-radius: inherit;
|
|
6228
|
+
color: inherit;
|
|
6229
|
+
font: inherit;
|
|
6230
|
+
cursor: pointer;
|
|
6231
|
+
white-space: nowrap;
|
|
6245
6232
|
}
|
|
6246
6233
|
|
|
6247
6234
|
.ws-icon {
|
|
6248
|
-
width:
|
|
6235
|
+
width: 14px; height: 14px;
|
|
6249
6236
|
stroke: var(--t-muted);
|
|
6250
6237
|
stroke-width: 1.7;
|
|
6251
6238
|
fill: none;
|
|
@@ -6259,18 +6246,22 @@
|
|
|
6259
6246
|
#ws-active-name {
|
|
6260
6247
|
font-size: 11.5px;
|
|
6261
6248
|
color: var(--t-secondary);
|
|
6262
|
-
max-width:
|
|
6249
|
+
max-width: clamp(40px, calc(var(--topright-band, 100vw) - var(--topright-row, 450px) - 5px), 120px);
|
|
6263
6250
|
overflow: hidden;
|
|
6264
6251
|
text-overflow: ellipsis;
|
|
6265
6252
|
}
|
|
6266
6253
|
|
|
6254
|
+
#ws-indicator:not(.has-workspace) #ws-active-name {
|
|
6255
|
+
display: none;
|
|
6256
|
+
}
|
|
6257
|
+
|
|
6267
6258
|
#ws-indicator.has-workspace #ws-active-name {
|
|
6268
6259
|
color: var(--t-primary);
|
|
6269
6260
|
}
|
|
6270
6261
|
|
|
6271
6262
|
.ws-chevron {
|
|
6272
6263
|
width: 11px; height: 11px;
|
|
6273
|
-
stroke: var(--t-
|
|
6264
|
+
stroke: var(--t-muted);
|
|
6274
6265
|
stroke-width: 2;
|
|
6275
6266
|
fill: none;
|
|
6276
6267
|
transition: transform 0.15s;
|
|
@@ -6295,8 +6286,7 @@
|
|
|
6295
6286
|
padding: 0;
|
|
6296
6287
|
transition: color 0.12s, background 0.12s;
|
|
6297
6288
|
flex-shrink: 0;
|
|
6298
|
-
margin-
|
|
6299
|
-
margin-right: -2px;
|
|
6289
|
+
margin-right: 4px;
|
|
6300
6290
|
}
|
|
6301
6291
|
|
|
6302
6292
|
.ws-quick-save svg {
|
|
@@ -6316,25 +6306,25 @@
|
|
|
6316
6306
|
color: var(--accent-blue);
|
|
6317
6307
|
}
|
|
6318
6308
|
|
|
6319
|
-
#ws-indicator.has-workspace .ws-quick-save {
|
|
6309
|
+
#ws-indicator.has-workspace ~ .ws-quick-save {
|
|
6320
6310
|
display: flex;
|
|
6321
6311
|
}
|
|
6322
6312
|
#ws-indicator.has-workspace .ws-chevron {
|
|
6323
6313
|
display: none;
|
|
6324
6314
|
}
|
|
6325
6315
|
#ws-indicator.has-workspace {
|
|
6326
|
-
padding-right:
|
|
6316
|
+
padding-right: 4px;
|
|
6327
6317
|
}
|
|
6328
6318
|
|
|
6329
6319
|
/* ── Dropdown (glassmorphic, matching topright-icon-btn style) ── */
|
|
6330
6320
|
#ws-dropdown {
|
|
6331
6321
|
position: absolute;
|
|
6332
6322
|
top: calc(100% + 12px);
|
|
6333
|
-
|
|
6323
|
+
left: -5px;
|
|
6334
6324
|
z-index: 100001;
|
|
6335
6325
|
width: 260px;
|
|
6336
6326
|
border-radius: 12px;
|
|
6337
|
-
background:
|
|
6327
|
+
background: rgb(18, 18, 22); /* opaque, as the bookmarks and invite menus: it drops over the session pills */
|
|
6338
6328
|
backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
|
|
6339
6329
|
-webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
|
|
6340
6330
|
border: 1px solid rgba(255,255,255,0.07);
|
|
@@ -6642,7 +6632,7 @@
|
|
|
6642
6632
|
max-height: 360px;
|
|
6643
6633
|
overflow-y: auto;
|
|
6644
6634
|
border-radius: 12px;
|
|
6645
|
-
background:
|
|
6635
|
+
background: rgb(18, 18, 22); /* opaque: it drops over the session pills (see #term-minimized-tray) */
|
|
6646
6636
|
backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
|
|
6647
6637
|
-webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
|
|
6648
6638
|
border: 1px solid rgba(255,255,255,0.07);
|
|
@@ -6676,7 +6666,7 @@
|
|
|
6676
6666
|
z-index: 100001;
|
|
6677
6667
|
width: 280px;
|
|
6678
6668
|
border-radius: 12px;
|
|
6679
|
-
background:
|
|
6669
|
+
background: rgb(18, 18, 22); /* opaque: it drops over the session pills (see #term-minimized-tray) */
|
|
6680
6670
|
backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
|
|
6681
6671
|
-webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
|
|
6682
6672
|
border: 1px solid rgba(255,255,255,0.07);
|
|
@@ -7019,6 +7009,66 @@
|
|
|
7019
7009
|
to { transform: rotate(360deg); }
|
|
7020
7010
|
}
|
|
7021
7011
|
|
|
7012
|
+
/* The tunnel block of the Connection section (ui-invite.js tunnelBlock): the state as a word, one sentence
|
|
7013
|
+
about it, and the progress of the tunnel program's download. */
|
|
7014
|
+
.invite-status-dot.error { background: var(--accent-red); }
|
|
7015
|
+
.invite-status-dot.warn { background: var(--accent-orange); }
|
|
7016
|
+
|
|
7017
|
+
.invite-tunnel-spinner {
|
|
7018
|
+
width: 11px;
|
|
7019
|
+
height: 11px;
|
|
7020
|
+
flex-shrink: 0;
|
|
7021
|
+
fill: none;
|
|
7022
|
+
stroke: var(--accent-blue);
|
|
7023
|
+
stroke-width: 2.5;
|
|
7024
|
+
stroke-linecap: round;
|
|
7025
|
+
}
|
|
7026
|
+
|
|
7027
|
+
.invite-tunnel-state {
|
|
7028
|
+
flex: 1;
|
|
7029
|
+
min-width: 0;
|
|
7030
|
+
font-size: 11px;
|
|
7031
|
+
font-weight: 500;
|
|
7032
|
+
color: var(--t-primary);
|
|
7033
|
+
}
|
|
7034
|
+
|
|
7035
|
+
.invite-tunnel-state.error { color: var(--accent-red); }
|
|
7036
|
+
|
|
7037
|
+
.invite-tunnel-percent {
|
|
7038
|
+
font-size: 10px;
|
|
7039
|
+
font-family: 'JetBrains Mono', monospace;
|
|
7040
|
+
font-variant-numeric: tabular-nums;
|
|
7041
|
+
color: var(--t-secondary);
|
|
7042
|
+
}
|
|
7043
|
+
|
|
7044
|
+
.invite-progress {
|
|
7045
|
+
height: 3px;
|
|
7046
|
+
margin: 2px 0 6px;
|
|
7047
|
+
border-radius: 2px;
|
|
7048
|
+
background: var(--s-light);
|
|
7049
|
+
overflow: hidden;
|
|
7050
|
+
}
|
|
7051
|
+
|
|
7052
|
+
.invite-progress > span {
|
|
7053
|
+
display: block;
|
|
7054
|
+
height: 100%;
|
|
7055
|
+
border-radius: 2px;
|
|
7056
|
+
background: var(--accent-blue);
|
|
7057
|
+
transition: width 0.3s ease;
|
|
7058
|
+
}
|
|
7059
|
+
|
|
7060
|
+
.invite-tunnel-detail {
|
|
7061
|
+
font-size: 11px;
|
|
7062
|
+
line-height: 1.45;
|
|
7063
|
+
color: var(--t-secondary);
|
|
7064
|
+
overflow-wrap: anywhere;
|
|
7065
|
+
}
|
|
7066
|
+
|
|
7067
|
+
.invite-tunnel-copy {
|
|
7068
|
+
margin-top: 2px;
|
|
7069
|
+
font-size: 10px;
|
|
7070
|
+
}
|
|
7071
|
+
|
|
7022
7072
|
.count-badge--blue {
|
|
7023
7073
|
background: var(--accent-blue);
|
|
7024
7074
|
color: #000;
|
|
@@ -7140,25 +7190,22 @@
|
|
|
7140
7190
|
/* ═══════════════════════════════════════════
|
|
7141
7191
|
SEARCH BAR (inline in top bar)
|
|
7142
7192
|
═══════════════════════════════════════════ */
|
|
7143
|
-
#search-container
|
|
7144
|
-
display: contents;
|
|
7145
|
-
}
|
|
7146
|
-
|
|
7193
|
+
/* #search-container is the navbar slot (#title-bar .bar-center, "TOP MENU BAR"); the field fills it up to 340px. */
|
|
7147
7194
|
#search-wrapper {
|
|
7148
7195
|
position: relative;
|
|
7149
7196
|
width: 340px;
|
|
7150
|
-
max-width:
|
|
7197
|
+
max-width: 100%;
|
|
7151
7198
|
border-radius: 8px;
|
|
7152
7199
|
padding: 1px;
|
|
7153
|
-
background:
|
|
7200
|
+
background: var(--s-light); /* the 1px edge around the field */
|
|
7154
7201
|
overflow: hidden;
|
|
7155
7202
|
opacity: 1;
|
|
7156
7203
|
transition: width 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
7157
7204
|
max-width 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
7158
7205
|
padding 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
7159
7206
|
opacity 0.25s ease,
|
|
7160
|
-
background 0.
|
|
7161
|
-
box-shadow 0.
|
|
7207
|
+
background 0.2s ease,
|
|
7208
|
+
box-shadow 0.2s ease;
|
|
7162
7209
|
}
|
|
7163
7210
|
|
|
7164
7211
|
#search-wrapper.viz-hidden {
|
|
@@ -7169,36 +7216,88 @@
|
|
|
7169
7216
|
pointer-events: none;
|
|
7170
7217
|
}
|
|
7171
7218
|
|
|
7219
|
+
#search-wrapper:hover {
|
|
7220
|
+
background: var(--s-medium);
|
|
7221
|
+
}
|
|
7222
|
+
|
|
7172
7223
|
#search-wrapper.focused {
|
|
7173
|
-
background:
|
|
7174
|
-
box-shadow: 0 0 0
|
|
7175
|
-
animation: searchGlow 2.5s ease-in-out infinite;
|
|
7224
|
+
background: var(--b-hover);
|
|
7225
|
+
box-shadow: 0 0 0 3px var(--s-subtle);
|
|
7176
7226
|
}
|
|
7177
7227
|
|
|
7178
|
-
|
|
7179
|
-
|
|
7180
|
-
|
|
7228
|
+
#search-wrapper .search-icon {
|
|
7229
|
+
position: absolute;
|
|
7230
|
+
left: 9px;
|
|
7231
|
+
top: 50%;
|
|
7232
|
+
width: 13px;
|
|
7233
|
+
height: 13px;
|
|
7234
|
+
transform: translateY(-50%);
|
|
7235
|
+
color: var(--t-secondary);
|
|
7236
|
+
pointer-events: none;
|
|
7237
|
+
transition: color 0.2s ease;
|
|
7181
7238
|
}
|
|
7239
|
+
#search-wrapper:hover .search-icon { color: var(--t-primary); }
|
|
7240
|
+
#search-wrapper.focused .search-icon { color: var(--t-bright); }
|
|
7182
7241
|
|
|
7183
7242
|
#search-input {
|
|
7184
7243
|
width: 100%;
|
|
7185
|
-
padding: 6px 36px 6px
|
|
7244
|
+
padding: 6px 36px 6px 30px;
|
|
7186
7245
|
background: rgba(28, 28, 30, 0.7);
|
|
7187
7246
|
border: none;
|
|
7188
7247
|
border-radius: 7px;
|
|
7189
|
-
color:
|
|
7248
|
+
color: var(--t-bright);
|
|
7249
|
+
font-family: inherit;
|
|
7190
7250
|
font-size: 12px;
|
|
7191
7251
|
font-weight: 400;
|
|
7192
7252
|
outline: none;
|
|
7193
7253
|
letter-spacing: 0.01em;
|
|
7254
|
+
text-overflow: ellipsis;
|
|
7194
7255
|
}
|
|
7195
7256
|
|
|
7196
7257
|
#search-input::placeholder {
|
|
7197
|
-
color:
|
|
7198
|
-
letter-spacing: 0.
|
|
7258
|
+
color: var(--t-secondary);
|
|
7259
|
+
letter-spacing: 0.01em;
|
|
7199
7260
|
font-weight: 400;
|
|
7200
7261
|
}
|
|
7201
7262
|
|
|
7263
|
+
/* ── Not enough room in the bar: a search icon, opened over the menubar while it has the focus ── */
|
|
7264
|
+
@container (max-width: 199px) {
|
|
7265
|
+
#search-wrapper {
|
|
7266
|
+
width: 30px;
|
|
7267
|
+
transition: opacity 0.25s ease, background 0.2s ease, box-shadow 0.2s ease; /* opens and closes at once */
|
|
7268
|
+
}
|
|
7269
|
+
#search-wrapper:not(:focus-within) #search-input {
|
|
7270
|
+
padding-right: 0;
|
|
7271
|
+
color: transparent;
|
|
7272
|
+
cursor: pointer;
|
|
7273
|
+
}
|
|
7274
|
+
#search-wrapper:not(:focus-within) #search-input::placeholder {
|
|
7275
|
+
color: transparent;
|
|
7276
|
+
}
|
|
7277
|
+
#search-wrapper:not(:focus-within) :is(#search-badge, #search-clear) {
|
|
7278
|
+
visibility: hidden; /* ui-search.js shows and hides them with inline display */
|
|
7279
|
+
}
|
|
7280
|
+
/* A search is on: the icon says so. */
|
|
7281
|
+
#search-wrapper:not(:focus-within):has(#search-input:not(:placeholder-shown)) {
|
|
7282
|
+
background: var(--b-visible);
|
|
7283
|
+
}
|
|
7284
|
+
#search-wrapper:not(:focus-within):has(#search-input:not(:placeholder-shown)) .search-icon {
|
|
7285
|
+
color: var(--t-bright);
|
|
7286
|
+
}
|
|
7287
|
+
#search-wrapper:focus-within:not(.viz-hidden) {
|
|
7288
|
+
position: absolute;
|
|
7289
|
+
right: 0;
|
|
7290
|
+
top: 50%;
|
|
7291
|
+
transform: translateY(-50%);
|
|
7292
|
+
width: min(340px, 60vw);
|
|
7293
|
+
max-width: none;
|
|
7294
|
+
box-shadow: 0 0 0 3px var(--s-subtle), var(--shadow-md);
|
|
7295
|
+
}
|
|
7296
|
+
#search-wrapper:focus-within:not(.viz-hidden) #search-input {
|
|
7297
|
+
background: rgb(28, 28, 30); /* opaque: the menu labels under it don't show through */
|
|
7298
|
+
}
|
|
7299
|
+
}
|
|
7300
|
+
|
|
7202
7301
|
#search-badge {
|
|
7203
7302
|
position: absolute;
|
|
7204
7303
|
right: 8px;
|
|
@@ -12903,8 +13002,7 @@
|
|
|
12903
13002
|
letter-spacing: 0.08em;
|
|
12904
13003
|
color: rgba(255,255,255,0.4);
|
|
12905
13004
|
}
|
|
12906
|
-
.settings-tab-body .cc-cheatsheet-table td:last-child
|
|
12907
|
-
.settings-tab-body .cc-greeting-cheatsheet-toggle {
|
|
13005
|
+
.settings-tab-body .cc-cheatsheet-table td:last-child {
|
|
12908
13006
|
color: rgba(255,255,255,0.42);
|
|
12909
13007
|
}
|
|
12910
13008
|
.settings-tab-body .cc-cheatsheet-table code,
|
|
@@ -13599,6 +13697,7 @@
|
|
|
13599
13697
|
.settings-nav-item[data-tab="browser"] { --stg-tile: #d9772b; }
|
|
13600
13698
|
.settings-nav-item[data-tab="connected-tools"] { --stg-tile: #a07a52; }
|
|
13601
13699
|
.settings-nav-item[data-tab="tool-access"] { --stg-tile: #c2577a; }
|
|
13700
|
+
.settings-nav-item[data-tab="code-editor"] { --stg-tile: #7da136; }
|
|
13602
13701
|
.settings-nav-item[data-tab="automations"] { --stg-tile: #c99a1e; }
|
|
13603
13702
|
.settings-nav-item[data-tab="messages"] { --stg-tile: #2fa84f; }
|
|
13604
13703
|
.settings-nav-item[data-tab="notifications"] { --stg-tile: #d9483f; }
|
|
@@ -13833,6 +13932,17 @@
|
|
|
13833
13932
|
.settings-panel .stg-pill[data-state="busy"]::before { background: var(--stg-help); animation: stgPulse 1s ease-in-out infinite; }
|
|
13834
13933
|
@keyframes stgPulse { 50% { opacity: 0.2; } }
|
|
13835
13934
|
|
|
13935
|
+
/* Online access → Public address (ui-settings.js tunnelRowHtml / tunnelExtraHtml): what sits under the tunnel's
|
|
13936
|
+
row belongs to it: the download's progress, the sentence about the state, the retry or copy button. */
|
|
13937
|
+
.settings-panel .stg-card-body > .stg-tunnel-extra { margin-top: calc(var(--stg-row-y) * -0.5); margin-bottom: var(--stg-row-y); }
|
|
13938
|
+
.settings-panel .stg-tunnel-extra:empty { display: none; }
|
|
13939
|
+
.settings-panel .stg-tunnel-extra > * + * { margin-top: 6px; }
|
|
13940
|
+
.settings-panel .stg-tunnel-extra > .stg-help { margin-top: 0; }
|
|
13941
|
+
.settings-panel .stg-tunnel-extra > * + .stg-help { margin-top: 6px; }
|
|
13942
|
+
.settings-panel .stg-tunnel-extra > * + .cc-copy-btn { margin-top: 8px; }
|
|
13943
|
+
.settings-panel .stg-tunnel-progress { height: 4px; max-width: 72ch; border-radius: 2px; background: var(--stg-control); overflow: hidden; }
|
|
13944
|
+
.settings-panel .stg-tunnel-progress > span { display: block; height: 100%; border-radius: 2px; background: var(--stg-accent-fill); transition: width 0.3s ease; }
|
|
13945
|
+
|
|
13836
13946
|
/* Switches: the macOS capsule, accent when on, a visible edge when off, and a focus ring (the input itself is 0×0) */
|
|
13837
13947
|
.settings-panel .recall-toggle-track { width: 32px; height: 18px; border-radius: 999px; background: rgba(255,255,255,0.16); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.22); }
|
|
13838
13948
|
.settings-panel .recall-toggle-track::after { top: 2px; left: 2px; width: 14px; height: 14px; background: #e8e8ea; box-shadow: 0 1px 2px rgba(0,0,0,0.35); }
|
|
@@ -14021,11 +14131,8 @@
|
|
|
14021
14131
|
.settings-panel .stg-card .cc-integration-label { font-size: 13px; color: var(--stg-text); white-space: normal; }
|
|
14022
14132
|
.settings-panel .stg-card .cc-integration-path { font-size: 12px; color: var(--stg-help); white-space: normal; overflow: visible; text-overflow: clip; }
|
|
14023
14133
|
.settings-panel .stg-card .cc-greeting-label { font-size: 13px; font-weight: 600; color: var(--stg-text); text-transform: none; letter-spacing: 0; }
|
|
14024
|
-
.settings-panel .stg-card .cc-greeting-cheatsheet-toggle { font-size: 12px; color: var(--stg-body); }
|
|
14025
14134
|
.settings-panel .stg-card .cc-cheatsheet-table :is(th, td),
|
|
14026
|
-
.settings-panel .stg-card .cc-cheatsheet-preview
|
|
14027
|
-
.settings-panel .stg-card .cc-greeting-reminder-input { font-size: 12px; }
|
|
14028
|
-
.settings-panel .stg-card .cc-greeting-checkboxes { display: block; }
|
|
14135
|
+
.settings-panel .stg-card .cc-cheatsheet-preview { font-size: 12px; }
|
|
14029
14136
|
.settings-panel .stg-mini-number {
|
|
14030
14137
|
width: 52px; padding: 2px 4px; font: inherit; font-size: 12px; text-align: center;
|
|
14031
14138
|
color: var(--stg-text); background: rgba(255,255,255,0.04); border: 1px solid var(--stg-line); border-radius: 4px;
|
|
@@ -14079,7 +14186,7 @@
|
|
|
14079
14186
|
.cc-dropdown-item, .browser-cfg-range-val, .bc-profile-name, .bc-profile-divider, .stg-mcp-note strong, .stg-mcp-note span,
|
|
14080
14187
|
.stg-mx-corner-head, .stg-mx-profile-name, .stg-mx-profile-del, .stg-mx-grp-name, .stg-mx-grp-count, .stg-mcp-section-header, .stg-mx-always-chip,
|
|
14081
14188
|
.stg-mx-ext-name, .stg-mx-ext-type, .stg-mx-ext-sub, .stg-mx-ext-toggle-name, .stg-mx-ext-cli-badge, .stg-mcp-empty-note, .stg-mcp-source-tab,
|
|
14082
|
-
.stg-mcp-page-tab, .cc-
|
|
14189
|
+
.stg-mcp-page-tab, .cc-cheatsheet-table code, .wa-mode-notes li, .recall-control-scale span,
|
|
14083
14190
|
select option
|
|
14084
14191
|
) { font-size: 12px; }
|
|
14085
14192
|
/* the capability chips grow with their letter */
|
|
@@ -14099,11 +14206,11 @@
|
|
|
14099
14206
|
.stg-mcp-note span, .stg-ocp-oauth-wait, .stg-cap-filter, .stg-provider-status-disconnected, .ocp-config-footer, .ocp-config-link, .ocp-danger-meta,
|
|
14100
14207
|
.stg-callout-note, .project-storage-path, .project-storage-item-meta, .project-storage-protection, .project-storage-group-path, .project-storage-group-total,
|
|
14101
14208
|
.project-storage-group-empty, .project-storage-stat span, .project-storage-safety-note, .cc-cheatsheet-table th, .cc-tool-category-count, .cc-panel-row-label,
|
|
14102
|
-
.cc-
|
|
14209
|
+
.cc-compat-note, .recall-control-scale span, .bc-profile-divider, .browser-cfg-range-val
|
|
14103
14210
|
) { color: var(--stg-help); opacity: 1; }
|
|
14104
14211
|
.settings-panel .settings-content :is(
|
|
14105
14212
|
.cc-dropdown-item, .cc-dropdown-value, .stg-code, .gfx-reset-btn, .stg-ocp-toggle-all, .project-storage-item-size, .project-storage-item-title-row strong,
|
|
14106
|
-
.wa-btn:not(.wa-btn-accent):not(.wa-btn-danger)
|
|
14213
|
+
.wa-btn:not(.wa-btn-accent):not(.wa-btn-danger)
|
|
14107
14214
|
) { color: var(--stg-body); }
|
|
14108
14215
|
.settings-panel .settings-content .cc-dropdown-item.active { color: var(--stg-text); }
|
|
14109
14216
|
.settings-panel .settings-content :is(.project-storage-risk.safe) { color: var(--stg-ok); }
|
|
@@ -14111,8 +14218,7 @@
|
|
|
14111
14218
|
.settings-panel .settings-content :is(.project-storage-risk.blocked, .ocp-srv-btn-stop, .wa-btn-danger) { color: var(--stg-err); }
|
|
14112
14219
|
.settings-panel .settings-content .project-storage-risk.protected { color: var(--stg-focus); }
|
|
14113
14220
|
/* Controls that only showed on hover stay visible: an action nobody can see is an action nobody finds. */
|
|
14114
|
-
.settings-panel .settings-content :is(.stg-ocp-remove-btn, .stg-model-all-btn, .stg-model-none-btn, .stg-ocp-apikey-btn, .stg-ocp-oauth-btn
|
|
14115
|
-
.cc-greeting-reminder-remove) { opacity: 1; }
|
|
14221
|
+
.settings-panel .settings-content :is(.stg-ocp-remove-btn, .stg-model-all-btn, .stg-model-none-btn, .stg-ocp-apikey-btn, .stg-ocp-oauth-btn) { opacity: 1; }
|
|
14116
14222
|
.settings-panel .settings-content :is(.stg-cap, .stg-cap-filter-letter) { color: var(--cap-c, var(--stg-body)); }
|
|
14117
14223
|
|
|
14118
14224
|
/* ── Reflow, phase 2b: nothing scrolls sideways in a 320–560px panel (a data table scrolls inside its own box) ── */
|
|
@@ -14963,8 +15069,7 @@
|
|
|
14963
15069
|
.settings-panel .settings-content .project-storage-icon-btn svg { width: 12px; height: 12px; }
|
|
14964
15070
|
|
|
14965
15071
|
/* ── Text-weight action: the default for secondary and in-row actions ── */
|
|
14966
|
-
.settings-panel .settings-content :is(.stg-text-btn, .ocp-config-link, .ocp-history-clear-btn, .
|
|
14967
|
-
.cc-greeting-reminder-remove),
|
|
15072
|
+
.settings-panel .settings-content :is(.stg-text-btn, .ocp-config-link, .ocp-history-clear-btn, .stg-mcp-env-add, .wa-link-btn),
|
|
14968
15073
|
.settings-panel .settings-content .stg-card :is(.stg-text-btn, .cc-copy-btn.stg-text-btn),
|
|
14969
15074
|
.settings-panel .settings-content .stg-provider-card .stg-action-btn.compact.stg-text-btn,
|
|
14970
15075
|
.settings-panel .settings-content #stg-ocp-providers > .stg-ocp-toggle-all {
|
|
@@ -14975,19 +15080,19 @@
|
|
|
14975
15080
|
color: var(--stg-link); background: none; border: 0; border-radius: 4px; box-shadow: none; opacity: 1;
|
|
14976
15081
|
cursor: pointer; transition: color 0.15s ease;
|
|
14977
15082
|
}
|
|
14978
|
-
.settings-panel .settings-content :is(.stg-text-btn, .ocp-config-link, .
|
|
15083
|
+
.settings-panel .settings-content :is(.stg-text-btn, .ocp-config-link, .stg-mcp-env-add, .wa-link-btn),
|
|
14979
15084
|
.settings-panel .settings-content #stg-ocp-providers > .stg-ocp-toggle-all { color: var(--stg-link); }
|
|
14980
|
-
.settings-panel .settings-content :is(.stg-text-btn, .ocp-config-link, .
|
|
15085
|
+
.settings-panel .settings-content :is(.stg-text-btn, .ocp-config-link, .stg-mcp-env-add, .wa-link-btn):hover:not(:disabled),
|
|
14981
15086
|
.settings-panel .settings-content .stg-card .stg-text-btn:hover:not(:disabled),
|
|
14982
15087
|
.settings-panel .settings-content #stg-ocp-providers > .stg-ocp-toggle-all:hover { color: var(--accent-blue); background: none; border: 0; text-decoration: none; }
|
|
14983
15088
|
.settings-panel .settings-content .stg-provider-card .stg-action-btn.compact.stg-text-btn:hover:not(:disabled) { color: var(--accent-blue); background: none; border: 0; }
|
|
14984
15089
|
.settings-panel .settings-content .stg-provider-card .stg-action-btn.compact.stg-text-btn.stg-text-btn-danger:hover:not(:disabled) { color: var(--stg-err); }
|
|
14985
15090
|
.settings-panel .settings-content :is(.stg-text-btn, .ocp-config-link, .wa-link-btn) svg { width: 11px; height: 11px; opacity: 0.9; fill: none; stroke: currentColor; stroke-width: 2; }
|
|
14986
15091
|
/* destructive text actions: grey at rest, red on hover */
|
|
14987
|
-
.settings-panel .settings-content :is(.stg-text-btn-danger, .ocp-history-clear-btn
|
|
15092
|
+
.settings-panel .settings-content :is(.stg-text-btn-danger, .ocp-history-clear-btn),
|
|
14988
15093
|
.settings-panel .settings-content .stg-card .stg-text-btn.stg-text-btn-danger,
|
|
14989
15094
|
.settings-panel .settings-content .stg-provider-card .stg-action-btn.compact.stg-text-btn-danger { color: rgba(255,255,255,0.6); }
|
|
14990
|
-
.settings-panel .settings-content :is(.stg-text-btn-danger, .ocp-history-clear-btn
|
|
15095
|
+
.settings-panel .settings-content :is(.stg-text-btn-danger, .ocp-history-clear-btn):hover:not(:disabled),
|
|
14991
15096
|
.settings-panel .settings-content .stg-card .stg-text-btn.stg-text-btn-danger:hover:not(:disabled),
|
|
14992
15097
|
.settings-panel .settings-content .stg-provider-side .stg-ocp-remove-btn:hover:not(:disabled),
|
|
14993
15098
|
.settings-panel .settings-content .ocp-danger-row .ocp-history-clear-btn:hover:not(:disabled) { color: var(--stg-err); background: none; }
|
|
@@ -15215,6 +15320,45 @@
|
|
|
15215
15320
|
.settings-panel .settings-content .stg-mcp-note svg { display: none; }
|
|
15216
15321
|
.settings-panel .settings-content .wa-callout-err { color: var(--stg-err); }
|
|
15217
15322
|
.settings-panel .settings-content .wa-callout-warn { color: var(--stg-warn); }
|
|
15323
|
+
/* Automation behavior: the Assistant's user context (three layers, the digest a new conversation starts with) */
|
|
15324
|
+
/* the line above the switches when they cannot be used: an older server, an engine that did not start, no answer */
|
|
15325
|
+
.settings-panel .settings-content .uc-status-note { margin: 0 0 10px; max-width: none; color: var(--stg-warn); }
|
|
15326
|
+
.settings-panel .settings-content .cc-integration-item.uc-disabled :is(.cc-integration-label, .cc-integration-path) { opacity: 0.7; }
|
|
15327
|
+
/* what stands in the way of a layer, under its help: a caption, amber when something is not happening */
|
|
15328
|
+
.settings-panel .settings-content .uc-layer-notes:empty { display: none; }
|
|
15329
|
+
.settings-panel .settings-content .uc-layer-note { margin: 3px 0 0; font-size: 12px; line-height: 1.45; color: var(--stg-help); overflow-wrap: anywhere; }
|
|
15330
|
+
.settings-panel .settings-content .uc-layer-note[data-tone="warn"] { color: var(--stg-warn); }
|
|
15331
|
+
.settings-panel .settings-content .uc-layer-note .uc-note-link { display: inline; width: auto; min-height: 0; margin: 0 0 0 2px; padding: 0; vertical-align: baseline; }
|
|
15332
|
+
.settings-panel .settings-content .uc-save-status { margin: 0 0 8px; max-width: none; color: var(--stg-err); }
|
|
15333
|
+
.settings-panel .settings-content .uc-applies { margin: 0 0 2px; max-width: none; }
|
|
15334
|
+
.settings-panel .settings-content :is(.uc-status-note, .uc-save-status, .uc-applies)[hidden] { display: none; }
|
|
15335
|
+
.settings-panel .settings-content .uc-digest { margin: 14px 0 16px; }
|
|
15336
|
+
/* Settings → Automations → Greeting: the preview is the card every panel shows (shared/greeting/), set left in the section. */
|
|
15337
|
+
.settings-panel .settings-content .gr-preview { margin-bottom: 4px; }
|
|
15338
|
+
.settings-panel .settings-content :is(.gr-preview-lead, .gr-preview-spend) { margin: 8px 0 0; max-width: none; }
|
|
15339
|
+
.settings-panel .settings-content :is(.gr-preview-lead, .gr-preview-spend, #gr-write)[hidden] { display: none; }
|
|
15340
|
+
.settings-panel .settings-content .gr-preview-card .sb-greet { --sbg-text: var(--stg-text); --sbg-2: var(--stg-body); --sbg-3: var(--stg-help); align-items: flex-start; max-width: none; margin: 8px 0 0; padding: 10px 12px; text-align: left; border: 1px solid var(--stg-line); border-radius: var(--r-card); }
|
|
15341
|
+
.settings-panel .settings-content .gr-preview-card:empty { display: none; }
|
|
15342
|
+
.settings-panel .settings-content #gr-write { margin-top: 10px !important; }
|
|
15343
|
+
.settings-panel .settings-content .uc-digest-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
|
|
15344
|
+
.settings-panel .settings-content .uc-digest-title { font-size: 13px; font-weight: 500; color: var(--stg-text); }
|
|
15345
|
+
.settings-panel .settings-content .uc-digest-count { flex-shrink: 0; font-size: 12px; color: var(--stg-help); font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
15346
|
+
.settings-panel .settings-content .uc-digest-rows { display: flex; flex-direction: column; margin: 8px 0; border: 1px solid var(--stg-line); border-radius: var(--r-small); overflow: hidden; }
|
|
15347
|
+
.settings-panel .settings-content .uc-digest-rows:empty { display: none; }
|
|
15348
|
+
.settings-panel .settings-content .uc-digest-row {
|
|
15349
|
+
display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
|
|
15350
|
+
width: 100%; min-height: 0; margin: 0; padding: 7px 10px; border: 0; border-radius: 0; background: transparent;
|
|
15351
|
+
color: var(--stg-body); font: inherit; font-size: 13px; line-height: 1.4; text-align: left; cursor: pointer;
|
|
15352
|
+
}
|
|
15353
|
+
.settings-panel .settings-content .uc-digest-row + .uc-digest-row { border-top: 1px solid var(--stg-sep); }
|
|
15354
|
+
.settings-panel .settings-content .uc-digest-row:hover { background: var(--stg-group); color: var(--stg-text); }
|
|
15355
|
+
.settings-panel .settings-content .uc-digest-row:focus-visible { outline: 2px solid var(--stg-focus); outline-offset: -2px; }
|
|
15356
|
+
.settings-panel .settings-content .uc-digest-statement { min-width: 0; overflow-wrap: anywhere; }
|
|
15357
|
+
.settings-panel .settings-content .uc-digest-facet { flex-shrink: 0; font-size: 12px; color: var(--stg-help); white-space: nowrap; }
|
|
15358
|
+
.settings-panel .settings-content .uc-digest-rows > .stg-help { margin: 0; padding: 8px 10px; max-width: none; }
|
|
15359
|
+
/* "Knowledge of you" is off: no digest is sent, so none is listed */
|
|
15360
|
+
.settings-panel .settings-content .uc-digest[data-uc-digest-state="off"] .uc-digest-title { color: var(--stg-body); }
|
|
15361
|
+
.settings-panel .settings-content .uc-digest[data-uc-digest-state="off"] .uc-digest-help { display: none; }
|
|
15218
15362
|
/* a status bar above a page's groups: a 12px line of secondary text */
|
|
15219
15363
|
.settings-panel .settings-content .stg-pane > .settings-status,
|
|
15220
15364
|
.settings-panel .settings-content .stg-card .settings-status {
|
|
@@ -15582,11 +15726,152 @@
|
|
|
15582
15726
|
.settings-nav-item[data-tab="browser"] { --stg-tile: #c07b48; }
|
|
15583
15727
|
.settings-nav-item[data-tab="connected-tools"] { --stg-tile: #9a7e60; }
|
|
15584
15728
|
.settings-nav-item[data-tab="tool-access"] { --stg-tile: #b4607e; }
|
|
15729
|
+
.settings-nav-item[data-tab="code-editor"] { --stg-tile: #7e9948; }
|
|
15730
|
+
|
|
15731
|
+
/* Code editor → AI autocomplete (shared/settings/settings-code-editor-pane.js): the model list, a test's
|
|
15732
|
+
result, the list of files that are never sent. Settings tokens only. */
|
|
15733
|
+
.settings-panel .edt-engine[hidden], .settings-panel .edt-note[hidden], .settings-panel .edt-save-status[hidden] { display: none; }
|
|
15734
|
+
.settings-panel .edt-note, .settings-panel .edt-save-status { margin: 0 0 8px; color: var(--stg-warn); }
|
|
15735
|
+
.settings-panel .edt-save-status { margin: 8px 0 0; color: var(--stg-err); }
|
|
15736
|
+
.settings-panel .edt-models-field, .settings-panel .edt-exclude-field, .settings-panel .edt-usage-field { display: block; margin-top: 12px; }
|
|
15737
|
+
.settings-panel .edt-models-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
|
|
15738
|
+
.settings-panel .edt-models {
|
|
15739
|
+
margin-top: 6px; max-height: 232px; overflow-y: auto;
|
|
15740
|
+
border: 1px solid var(--stg-field-line); border-radius: 5px; background: var(--stg-field-bg);
|
|
15741
|
+
}
|
|
15742
|
+
.settings-panel .edt-models:empty { display: none; }
|
|
15743
|
+
.settings-panel .edt-model {
|
|
15744
|
+
display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 0 10px;
|
|
15745
|
+
padding: 4px 10px; border-top: 1px solid var(--stg-sep);
|
|
15746
|
+
}
|
|
15747
|
+
.settings-panel .edt-model:first-child { border-top: 0; }
|
|
15748
|
+
.settings-panel .edt-model.selected { background: rgba(255,255,255,0.04); }
|
|
15749
|
+
.settings-panel .edt-model-pick { display: flex; align-items: center; gap: 8px; min-width: 0; min-height: 22px; margin: 0; cursor: pointer; }
|
|
15750
|
+
.settings-panel .edt-model-pick input { flex-shrink: 0; margin: 0; }
|
|
15751
|
+
.settings-panel .edt-model-name { flex-shrink: 0; max-width: 60%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--stg-text); font-size: 12.5px; }
|
|
15752
|
+
.settings-panel .edt-model-meta { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--stg-help); font-size: 12px; }
|
|
15753
|
+
.settings-panel .edt-model-result { grid-column: 1 / -1; margin: 0 0 3px 22px; overflow-wrap: anywhere; }
|
|
15754
|
+
.settings-panel .edt-model-result[hidden], .settings-panel .edt-result[hidden] { display: none; }
|
|
15755
|
+
.settings-panel .edt-models-message { margin: 0; padding: 8px 10px; }
|
|
15756
|
+
.settings-panel [data-edt-tone="ok"] { color: var(--stg-ok); }
|
|
15757
|
+
.settings-panel [data-edt-tone="warn"] { color: var(--stg-warn); }
|
|
15758
|
+
.settings-panel [data-edt-tone="err"] { color: var(--stg-err); }
|
|
15759
|
+
.settings-panel .edt-note[data-edt-tone="neutral"] { color: var(--stg-help); }
|
|
15760
|
+
/* A model's own result reads as a note; only a failure is coloured. */
|
|
15761
|
+
.settings-panel .edt-model-result[data-edt-tone="ok"] { color: var(--stg-help); }
|
|
15762
|
+
.settings-panel .edt-result { overflow-wrap: anywhere; }
|
|
15763
|
+
.settings-panel .edt-key-row { align-items: center; gap: 8px; }
|
|
15764
|
+
.settings-panel .edt-key-state { margin-top: 4px; }
|
|
15765
|
+
/* File name patterns are code: the Settings code type (12px mono on 1.5). Named through its field, so that the
|
|
15766
|
+
panel's rule for text fields (13px, of the same weight as a plain textarea rule) does not take it over. */
|
|
15767
|
+
.settings-panel .settings-content .edt-exclude-field textarea.edt-exclude {
|
|
15768
|
+
display: block; width: 100%; box-sizing: border-box; min-height: 96px; margin: 6px 0; padding: 8px; resize: vertical;
|
|
15769
|
+
background: var(--stg-field-bg); color: var(--stg-text);
|
|
15770
|
+
border: 1px solid var(--stg-field-line); border-radius: 5px;
|
|
15771
|
+
font-family: var(--stg-mono); font-size: 12px; line-height: 1.5;
|
|
15772
|
+
}
|
|
15773
|
+
.settings-panel .settings-content .edt-exclude-field textarea.edt-exclude:disabled { opacity: 0.45; }
|
|
15585
15774
|
.settings-nav-item[data-tab="automations"] { --stg-tile: #b4953f; }
|
|
15586
15775
|
.settings-nav-item[data-tab="messages"] { --stg-tile: #4f9b63; }
|
|
15587
15776
|
.settings-nav-item[data-tab="notifications"] { --stg-tile: #bd5a52; }
|
|
15588
15777
|
.settings-nav-item[data-tab="appearance"] { --stg-tile: #6c717a; }
|
|
15589
15778
|
/* <<< settings-redesign:nav-polish */
|
|
15779
|
+
/* >>> settings-redesign:spacing */
|
|
15780
|
+
/* ═══════════════════════════════════════════
|
|
15781
|
+
SETTINGS — room between the rows of the right column, on every page
|
|
15782
|
+
The elegance pass packed the rows at 8px. This loosens the whole rhythm one step and touches no size, weight or wiring:
|
|
15783
|
+
the row padding is the one lever (--stg-row-y), the gaps around it keep their proportions.
|
|
15784
|
+
Scoped to the settings panel; the command runner and the style guide keep the elegance values.
|
|
15785
|
+
═══════════════════════════════════════════ */
|
|
15786
|
+
.settings-panel { --stg-row-y: 13px; }
|
|
15787
|
+
/* page head, product headings, sections */
|
|
15788
|
+
.stg-page-head { margin-bottom: 26px; }
|
|
15789
|
+
.settings-panel .stg-pane-title { margin: 32px 0 14px; }
|
|
15790
|
+
.settings-panel .stg-card { margin-bottom: 22px; }
|
|
15791
|
+
.settings-panel .stg-card.stg-acc[data-collapsible] { margin-bottom: 14px; }
|
|
15792
|
+
.settings-panel .stg-card.stg-acc[data-collapsible] > .stg-card-head { min-height: 44px; padding-top: 10px; padding-bottom: 10px; }
|
|
15793
|
+
/* what a group holds that is not a row of its own (a note, a list, a preview) */
|
|
15794
|
+
.settings-panel .stg-card-body > * { margin-top: 14px; margin-bottom: 14px; }
|
|
15795
|
+
/* a row that opens (an assistant, a model) was fixed at 7px */
|
|
15796
|
+
.settings-panel .stg-card-body > .stg-card[data-collapsible] { padding-top: var(--stg-row-y); padding-bottom: var(--stg-row-y); }
|
|
15797
|
+
/* the Browser fields kept a margin of their own under the row, which doubled the gap next to the row padding */
|
|
15798
|
+
.settings-panel .stg-card-body > .stg-field.bc-card-row { margin-bottom: 0; }
|
|
15799
|
+
/* label, control, help */
|
|
15800
|
+
.settings-panel .stg-field > label { margin-bottom: 8px; }
|
|
15801
|
+
.settings-panel .stg-help { margin-top: 5px; }
|
|
15802
|
+
.settings-panel .stg-toggle-text .stg-help { margin-top: 4px; }
|
|
15803
|
+
/* <<< settings-redesign:spacing */
|
|
15804
|
+
/* >>> settings-about */
|
|
15805
|
+
/* Settings → About (shared/settings/settings-about-pane.js): the header (icon, name, version, the two buttons),
|
|
15806
|
+
the links, the facts of System and the dependency lists. Text weight and the panel's --stg-* roles; every row
|
|
15807
|
+
wraps instead of widening the panel, down to the 320px panel. Its tile is the palette's neutral graphite. */
|
|
15808
|
+
.settings-nav-item[data-tab="about"] { --stg-tile: #6b7078; }
|
|
15809
|
+
.settings-panel .stg-about-hero {
|
|
15810
|
+
display: flex; flex-direction: column; align-items: center; text-align: center;
|
|
15811
|
+
margin: 0 0 18px; padding: 20px 16px 16px; border-radius: 9px; background: var(--stg-group);
|
|
15812
|
+
}
|
|
15813
|
+
.settings-panel .stg-about-hero [hidden] { display: none; }
|
|
15814
|
+
.settings-panel .stg-about-logo { display: block; width: 64px; height: 64px; margin: 0 0 10px; border-radius: 14px; box-shadow: 0 1px 3px rgba(0,0,0,0.35); }
|
|
15815
|
+
.settings-panel .stg-about-name { margin: 0; font-size: 20px; font-weight: 600; line-height: 1.25; color: var(--stg-text); }
|
|
15816
|
+
.settings-panel .stg-about-version { margin: 2px 0 0; font-size: 12.5px; color: var(--stg-body); }
|
|
15817
|
+
.settings-panel .stg-about-line { margin: 2px 0 0; max-width: 52ch; font-size: 12px; color: var(--stg-help); overflow-wrap: anywhere; }
|
|
15818
|
+
.settings-panel .stg-about-desc { margin-top: 8px; }
|
|
15819
|
+
.settings-panel .stg-about-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin: 14px 0 0; }
|
|
15820
|
+
.settings-panel .stg-about-note { max-width: 52ch; margin: 10px 0 0; }
|
|
15821
|
+
|
|
15822
|
+
/* Links: the name on the left, the address on the right; the address gives way first */
|
|
15823
|
+
.settings-panel .stg-about-links { margin: 0; padding: 0; list-style: none; }
|
|
15824
|
+
.settings-panel .stg-about-links > li + li { border-top: 1px solid var(--stg-sep); }
|
|
15825
|
+
.settings-panel .stg-about-link { display: flex; align-items: center; gap: 10px; min-height: 32px; padding: 6px 0; box-sizing: border-box; font-size: 13px; color: var(--stg-text); text-decoration: none; }
|
|
15826
|
+
.settings-panel .stg-about-link:hover .stg-about-link-label { color: var(--stg-link); }
|
|
15827
|
+
.settings-panel .stg-about-link:focus-visible { outline: 2px solid var(--stg-focus); outline-offset: 2px; border-radius: 4px; }
|
|
15828
|
+
.settings-panel .stg-about-link-label { flex: 0 0 auto; }
|
|
15829
|
+
.settings-panel .stg-about-link-url { flex: 1 1 auto; min-width: 0; overflow: hidden; text-align: right; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--stg-help); }
|
|
15830
|
+
.settings-panel .stg-about-arrow { flex: 0 0 auto; width: 10px; height: 10px; fill: none; stroke: var(--stg-help); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
|
|
15831
|
+
|
|
15832
|
+
/* System: label and value on one row; a long value (the data folder) wraps under its label */
|
|
15833
|
+
.settings-panel .stg-about-facts { margin: 0; }
|
|
15834
|
+
.settings-panel .stg-about-fact { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 2px 16px; min-height: 32px; padding: 7px 0; box-sizing: border-box; }
|
|
15835
|
+
.settings-panel .stg-about-fact + .stg-about-fact { border-top: 1px solid var(--stg-sep); }
|
|
15836
|
+
.settings-panel .stg-about-fact dt { flex: 0 0 auto; font-size: 13px; color: var(--stg-text); }
|
|
15837
|
+
.settings-panel .stg-about-fact dd { flex: 1 1 12em; min-width: 0; margin: 0; text-align: right; font-size: 12.5px; color: var(--stg-body); overflow-wrap: anywhere; user-select: text; }
|
|
15838
|
+
.settings-panel .stg-about-fact dd.stg-about-mono { font-family: var(--stg-mono); font-size: 12px; }
|
|
15839
|
+
.settings-panel .stg-about-empty { margin: 8px 0; list-style: none; }
|
|
15840
|
+
|
|
15841
|
+
/* Dependencies: a heading per package, then one row per dependency: name, version, then range and license,
|
|
15842
|
+
which move under the name when the row is narrow */
|
|
15843
|
+
.settings-panel .stg-about-filter { display: flex; }
|
|
15844
|
+
.settings-panel .stg-about-filter[hidden] { display: none; }
|
|
15845
|
+
.settings-panel .settings-content .stg-about-filter-input { width: 100%; max-width: 240px; }
|
|
15846
|
+
.settings-panel .stg-about-group + .stg-about-group,
|
|
15847
|
+
.settings-panel .stg-about-bundled { margin-top: 12px; }
|
|
15848
|
+
.settings-panel .stg-card-body .stg-about-group-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; min-height: 0; margin: 0; padding: 8px 0 4px; font-size: 13px; color: var(--stg-text); }
|
|
15849
|
+
.settings-panel .stg-about-group-sub { min-width: 0; overflow-wrap: anywhere; font-family: var(--stg-mono); font-size: 11.5px; font-weight: 400; color: var(--stg-help); }
|
|
15850
|
+
.settings-panel .stg-about-count { margin-left: auto; font-size: 12px; font-weight: 400; color: var(--stg-help); font-variant-numeric: tabular-nums; }
|
|
15851
|
+
.settings-panel .stg-about-group-note { margin: 0 0 4px; }
|
|
15852
|
+
.settings-panel .stg-about-dep-list { margin: 0; padding: 0; list-style: none; }
|
|
15853
|
+
.settings-panel .stg-about-dep { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 10px; padding: 5px 0; border-top: 1px solid var(--stg-sep); font-size: 12.5px; }
|
|
15854
|
+
.settings-panel .stg-about-dep-name { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; color: var(--stg-text); text-decoration: none; }
|
|
15855
|
+
.settings-panel a.stg-about-dep-name:hover { color: var(--stg-link); text-decoration: underline; }
|
|
15856
|
+
.settings-panel a.stg-about-dep-name:focus-visible { outline: 2px solid var(--stg-focus); outline-offset: 2px; border-radius: 3px; }
|
|
15857
|
+
.settings-panel .stg-about-dep-version { flex: 0 0 auto; font-family: var(--stg-mono); font-size: 12px; color: var(--stg-body); font-variant-numeric: tabular-nums; }
|
|
15858
|
+
.settings-panel .stg-about-dep-version[data-state="missing"] { color: var(--stg-warn); }
|
|
15859
|
+
.settings-panel .stg-about-dep-meta { flex: 1 0 100%; min-width: 0; overflow-wrap: anywhere; font-size: 11.5px; color: var(--stg-help); }
|
|
15860
|
+
.settings-panel .stg-about-dev { margin-top: 12px; }
|
|
15861
|
+
|
|
15862
|
+
/* The foot of the page: the license and the copyright, quiet and centred */
|
|
15863
|
+
.settings-panel .stg-about-footer { margin: 8px 0 4px; text-align: center; font-size: 11.5px; color: var(--stg-help); }
|
|
15864
|
+
.settings-panel .stg-about-footer p { margin: 2px 0; }
|
|
15865
|
+
.settings-panel .stg-about-builtwith { margin: 0; padding: 0; border: 0; background: none; font: inherit; color: var(--stg-link); cursor: pointer; }
|
|
15866
|
+
.settings-panel .stg-about-builtwith:hover { text-decoration: underline; }
|
|
15867
|
+
.settings-panel .stg-about-builtwith:focus-visible { outline: 2px solid var(--stg-focus); outline-offset: 2px; border-radius: 3px; }
|
|
15868
|
+
@container stg (max-width: 480px) {
|
|
15869
|
+
.settings-panel .stg-about-hero { padding: 16px 12px 14px; }
|
|
15870
|
+
.settings-panel .stg-about-link-url { display: none; }
|
|
15871
|
+
.settings-panel .stg-about-arrow { margin-left: auto; }
|
|
15872
|
+
.settings-panel .stg-about-fact dd { text-align: left; flex-basis: 100%; }
|
|
15873
|
+
}
|
|
15874
|
+
/* <<< settings-about */
|
|
15590
15875
|
.tag-add-input {
|
|
15591
15876
|
font-size: var(--fs-sm);
|
|
15592
15877
|
font-weight: 500;
|
|
@@ -16118,18 +16403,35 @@
|
|
|
16118
16403
|
100% { transform: scale(1); opacity: 1; }
|
|
16119
16404
|
}
|
|
16120
16405
|
|
|
16121
|
-
/* ── File Explorer (docked sidebar) ──
|
|
16406
|
+
/* ── File Explorer (docked sidebar) ──
|
|
16407
|
+
The tree and what it does are shared/explorer/ (docs/file-explorer.md).
|
|
16408
|
+
Its colours are the app's tokens; the git marks take the colours the code
|
|
16409
|
+
editor gives the same states (--ed-warn, --ed-add, --ed-del), so tree and
|
|
16410
|
+
editor read as one. The variables are declared for the panel and for what it
|
|
16411
|
+
opens over the page (menu, preview, questions, the branch popover). */
|
|
16412
|
+
#file-explorer-panel, .fe-ctx-flyout, .fe-modal-overlay, .fe-git-popover, .fe-jump-layer {
|
|
16413
|
+
--fe-bg: rgb(18, 18, 20);
|
|
16414
|
+
--fe-focus: var(--accent-blue);
|
|
16415
|
+
--fe-git-modified: #fbbf24;
|
|
16416
|
+
--fe-git-new: #9fe3b4;
|
|
16417
|
+
--fe-git-deleted: #f0a3a3;
|
|
16418
|
+
--fe-git-conflict: var(--accent-red);
|
|
16419
|
+
--fe-menu-bg: #16161a;
|
|
16420
|
+
--fe-menu-border: var(--b-light);
|
|
16421
|
+
--fe-menu-shadow: 0 12px 32px rgba(0,0,0,0.4);
|
|
16422
|
+
}
|
|
16122
16423
|
#file-explorer-panel {
|
|
16123
16424
|
position: fixed;
|
|
16124
16425
|
top: 0;
|
|
16125
16426
|
left: var(--explorer-width, 0px);
|
|
16126
16427
|
width: var(--file-explorer-width, 280px);
|
|
16127
16428
|
min-width: 240px;
|
|
16429
|
+
max-width: 100vw;
|
|
16128
16430
|
height: 100dvh;
|
|
16129
16431
|
z-index: 199;
|
|
16130
16432
|
display: flex;
|
|
16131
16433
|
flex-direction: column;
|
|
16132
|
-
background:
|
|
16434
|
+
background: var(--fe-bg);
|
|
16133
16435
|
border-right: none;
|
|
16134
16436
|
box-shadow: var(--shadow-sm);
|
|
16135
16437
|
transform: translateX(-100%);
|
|
@@ -16140,6 +16442,16 @@
|
|
|
16140
16442
|
transform: translateX(0);
|
|
16141
16443
|
padding-top: var(--navbar-height, 48px);
|
|
16142
16444
|
}
|
|
16445
|
+
/* An invited guest's page: the panel is the owner's and is not there. */
|
|
16446
|
+
#file-explorer-panel[hidden] { display: none; }
|
|
16447
|
+
#file-explorer-panel button:focus-visible,
|
|
16448
|
+
.fe-ctx-flyout button:focus-visible,
|
|
16449
|
+
.fe-modal button:focus-visible,
|
|
16450
|
+
.fe-git-popover button:focus-visible,
|
|
16451
|
+
.fe-git-popover select:focus-visible {
|
|
16452
|
+
outline: 2px solid var(--fe-focus);
|
|
16453
|
+
outline-offset: 1px;
|
|
16454
|
+
}
|
|
16143
16455
|
|
|
16144
16456
|
/* Filter bar */
|
|
16145
16457
|
.fe-filter {
|
|
@@ -16153,58 +16465,52 @@
|
|
|
16153
16465
|
width: 13px;
|
|
16154
16466
|
height: 13px;
|
|
16155
16467
|
fill: none;
|
|
16156
|
-
stroke:
|
|
16468
|
+
stroke: var(--t-secondary);
|
|
16157
16469
|
stroke-width: 2;
|
|
16158
16470
|
stroke-linecap: round;
|
|
16471
|
+
stroke-linejoin: round;
|
|
16159
16472
|
flex-shrink: 0;
|
|
16160
|
-
transition:
|
|
16473
|
+
transition: stroke 0.2s;
|
|
16161
16474
|
position: absolute;
|
|
16162
16475
|
left: 18px;
|
|
16163
16476
|
pointer-events: none;
|
|
16164
16477
|
}
|
|
16165
|
-
.fe-filter:focus-within .fe-filter-icon {
|
|
16166
|
-
stroke: rgba(255,255,255,0.5);
|
|
16167
|
-
}
|
|
16478
|
+
.fe-filter:focus-within .fe-filter-icon { stroke: var(--t-primary); }
|
|
16168
16479
|
.fe-filter input {
|
|
16169
16480
|
flex: 1;
|
|
16170
|
-
|
|
16171
|
-
|
|
16172
|
-
border
|
|
16173
|
-
|
|
16481
|
+
min-width: 0;
|
|
16482
|
+
background: var(--s-subtle);
|
|
16483
|
+
border: 1px solid var(--b-subtle);
|
|
16484
|
+
border-radius: var(--r-small);
|
|
16485
|
+
color: var(--t-bright);
|
|
16174
16486
|
font-size: 11.5px;
|
|
16175
|
-
padding: 7px
|
|
16487
|
+
padding: 7px 26px 7px 28px;
|
|
16176
16488
|
outline: none;
|
|
16177
16489
|
font-family: var(--ff-mono);
|
|
16178
16490
|
text-align: left;
|
|
16179
16491
|
transition: border-color 0.2s, background 0.2s;
|
|
16180
16492
|
}
|
|
16181
16493
|
.fe-filter input:focus {
|
|
16182
|
-
background:
|
|
16183
|
-
border-color:
|
|
16184
|
-
}
|
|
16185
|
-
.fe-filter input::placeholder {
|
|
16186
|
-
color: var(--t-dimmed);
|
|
16494
|
+
background: var(--s-light);
|
|
16495
|
+
border-color: var(--b-hover);
|
|
16187
16496
|
}
|
|
16497
|
+
.fe-filter input:focus-visible { outline: 2px solid var(--fe-focus); outline-offset: -1px; }
|
|
16498
|
+
.fe-filter input::placeholder { color: var(--t-secondary); }
|
|
16188
16499
|
#fe-filter-clear {
|
|
16189
16500
|
position: absolute;
|
|
16190
16501
|
right: 14px;
|
|
16191
16502
|
background: none;
|
|
16192
16503
|
border: none;
|
|
16193
|
-
color: var(--t-
|
|
16504
|
+
color: var(--t-secondary);
|
|
16194
16505
|
cursor: pointer;
|
|
16195
16506
|
font-size: 13px;
|
|
16196
|
-
padding: 2px
|
|
16507
|
+
padding: 2px 5px;
|
|
16197
16508
|
line-height: 1;
|
|
16198
|
-
opacity: 0;
|
|
16199
|
-
transition: opacity 0.15s;
|
|
16200
16509
|
border-radius: 3px;
|
|
16201
16510
|
z-index: 1;
|
|
16202
16511
|
}
|
|
16203
|
-
#fe-filter-clear
|
|
16204
|
-
|
|
16205
|
-
.fe-filter:has(input:not(:placeholder-shown)) .fe-filter-icon {
|
|
16206
|
-
stroke: rgba(255,255,255,0.45);
|
|
16207
|
-
}
|
|
16512
|
+
#fe-filter-clear[hidden] { display: none; }
|
|
16513
|
+
#fe-filter-clear:hover { color: var(--t-bright); background: var(--s-light); }
|
|
16208
16514
|
|
|
16209
16515
|
/* Project row — selector + branch button side by side */
|
|
16210
16516
|
.fe-project-row {
|
|
@@ -16225,10 +16531,10 @@
|
|
|
16225
16531
|
display: flex;
|
|
16226
16532
|
align-items: center;
|
|
16227
16533
|
gap: 7px;
|
|
16228
|
-
background:
|
|
16229
|
-
border: 1px solid
|
|
16230
|
-
border-radius:
|
|
16231
|
-
color: var(--t-
|
|
16534
|
+
background: var(--s-subtle);
|
|
16535
|
+
border: 1px solid var(--b-subtle);
|
|
16536
|
+
border-radius: var(--r-small);
|
|
16537
|
+
color: var(--t-bright);
|
|
16232
16538
|
font-size: 11.5px;
|
|
16233
16539
|
font-family: var(--ff-mono);
|
|
16234
16540
|
padding: 7px 10px;
|
|
@@ -16237,14 +16543,14 @@
|
|
|
16237
16543
|
transition: border-color 0.2s, background 0.2s;
|
|
16238
16544
|
text-align: left;
|
|
16239
16545
|
}
|
|
16240
|
-
.fe-project-btn:hover { border-color:
|
|
16546
|
+
.fe-project-btn:hover { border-color: var(--b-hover); }
|
|
16241
16547
|
.fe-project-selector.open .fe-project-btn {
|
|
16242
|
-
background:
|
|
16243
|
-
border-color:
|
|
16548
|
+
background: var(--s-light);
|
|
16549
|
+
border-color: var(--b-hover);
|
|
16244
16550
|
}
|
|
16245
16551
|
.fe-project-icon {
|
|
16246
16552
|
width: 13px; height: 13px;
|
|
16247
|
-
fill:
|
|
16553
|
+
fill: var(--t-secondary);
|
|
16248
16554
|
flex-shrink: 0;
|
|
16249
16555
|
}
|
|
16250
16556
|
.fe-project-label {
|
|
@@ -16256,7 +16562,7 @@
|
|
|
16256
16562
|
.fe-project-chevron {
|
|
16257
16563
|
width: 12px; height: 12px;
|
|
16258
16564
|
fill: none;
|
|
16259
|
-
stroke:
|
|
16565
|
+
stroke: var(--t-secondary);
|
|
16260
16566
|
stroke-width: 2;
|
|
16261
16567
|
stroke-linecap: round;
|
|
16262
16568
|
stroke-linejoin: round;
|
|
@@ -16270,11 +16576,11 @@
|
|
|
16270
16576
|
display: flex;
|
|
16271
16577
|
align-items: center;
|
|
16272
16578
|
gap: 4px;
|
|
16273
|
-
background:
|
|
16274
|
-
border: 1px solid
|
|
16275
|
-
border-radius:
|
|
16276
|
-
color:
|
|
16277
|
-
font-size:
|
|
16579
|
+
background: var(--s-subtle);
|
|
16580
|
+
border: 1px solid var(--b-subtle);
|
|
16581
|
+
border-radius: var(--r-small);
|
|
16582
|
+
color: var(--t-secondary);
|
|
16583
|
+
font-size: 10.5px;
|
|
16278
16584
|
font-family: var(--ff-mono);
|
|
16279
16585
|
padding: 0 8px;
|
|
16280
16586
|
cursor: pointer;
|
|
@@ -16288,31 +16594,26 @@
|
|
|
16288
16594
|
.fe-branch-btn svg {
|
|
16289
16595
|
width: 11px; height: 11px;
|
|
16290
16596
|
fill: none;
|
|
16291
|
-
stroke:
|
|
16597
|
+
stroke: currentColor;
|
|
16292
16598
|
stroke-width: 2;
|
|
16293
16599
|
stroke-linecap: round;
|
|
16294
16600
|
stroke-linejoin: round;
|
|
16295
16601
|
flex-shrink: 0;
|
|
16296
16602
|
}
|
|
16297
|
-
.fe-branch-btn:hover
|
|
16298
|
-
border-color: rgba(255,255,255,0.18);
|
|
16299
|
-
color: var(--t-primary);
|
|
16300
|
-
background: rgba(255,255,255,0.06);
|
|
16301
|
-
}
|
|
16302
|
-
.fe-branch-btn:hover svg { stroke: rgba(255,255,255,0.5); }
|
|
16603
|
+
.fe-branch-btn:hover,
|
|
16303
16604
|
.fe-branch-btn.active {
|
|
16304
|
-
border-color:
|
|
16305
|
-
|
|
16306
|
-
|
|
16605
|
+
border-color: var(--b-hover);
|
|
16606
|
+
color: var(--t-bright);
|
|
16607
|
+
background: var(--s-light);
|
|
16307
16608
|
}
|
|
16308
16609
|
.fe-branch-btn-name {
|
|
16309
16610
|
overflow: hidden;
|
|
16310
16611
|
text-overflow: ellipsis;
|
|
16311
16612
|
}
|
|
16312
16613
|
.fe-branch-btn-badge {
|
|
16313
|
-
font-size:
|
|
16614
|
+
font-size: 10px;
|
|
16314
16615
|
font-weight: 600;
|
|
16315
|
-
color:
|
|
16616
|
+
color: var(--fe-git-modified);
|
|
16316
16617
|
flex-shrink: 0;
|
|
16317
16618
|
}
|
|
16318
16619
|
.fe-branch-btn-badge:empty { display: none; }
|
|
@@ -16321,10 +16622,11 @@
|
|
|
16321
16622
|
.fe-git-popover {
|
|
16322
16623
|
position: fixed;
|
|
16323
16624
|
width: 240px;
|
|
16324
|
-
|
|
16325
|
-
|
|
16326
|
-
border
|
|
16327
|
-
|
|
16625
|
+
max-width: calc(100vw - 16px);
|
|
16626
|
+
background: var(--fe-menu-bg);
|
|
16627
|
+
border: 1px solid var(--fe-menu-border);
|
|
16628
|
+
border-radius: var(--r-card);
|
|
16629
|
+
box-shadow: var(--fe-menu-shadow);
|
|
16328
16630
|
z-index: 300;
|
|
16329
16631
|
padding: 10px;
|
|
16330
16632
|
opacity: 0;
|
|
@@ -16343,36 +16645,42 @@
|
|
|
16343
16645
|
top: 12px;
|
|
16344
16646
|
width: 10px;
|
|
16345
16647
|
height: 10px;
|
|
16346
|
-
background:
|
|
16347
|
-
border-left: 1px solid
|
|
16348
|
-
border-bottom: 1px solid
|
|
16648
|
+
background: var(--fe-menu-bg);
|
|
16649
|
+
border-left: 1px solid var(--fe-menu-border);
|
|
16650
|
+
border-bottom: 1px solid var(--fe-menu-border);
|
|
16349
16651
|
transform: rotate(45deg);
|
|
16350
16652
|
}
|
|
16653
|
+
.fe-git-popover-arrow.flipped {
|
|
16654
|
+
left: auto;
|
|
16655
|
+
right: -5px;
|
|
16656
|
+
border-left: none;
|
|
16657
|
+
border-bottom: none;
|
|
16658
|
+
border-right: 1px solid var(--fe-menu-border);
|
|
16659
|
+
border-top: 1px solid var(--fe-menu-border);
|
|
16660
|
+
}
|
|
16351
16661
|
.fe-git-pop-label {
|
|
16352
16662
|
display: block;
|
|
16353
|
-
font-size:
|
|
16663
|
+
font-size: 10px;
|
|
16354
16664
|
font-family: var(--ff-mono);
|
|
16355
|
-
color:
|
|
16665
|
+
color: var(--t-secondary);
|
|
16356
16666
|
text-transform: uppercase;
|
|
16357
16667
|
letter-spacing: 0.05em;
|
|
16358
16668
|
margin-bottom: 4px;
|
|
16359
16669
|
}
|
|
16360
|
-
.fe-git-pop-section {
|
|
16361
|
-
padding: 2px 0;
|
|
16362
|
-
}
|
|
16670
|
+
.fe-git-pop-section { padding: 2px 0; }
|
|
16363
16671
|
.fe-git-pop-sep {
|
|
16364
16672
|
height: 1px;
|
|
16365
|
-
background:
|
|
16673
|
+
background: var(--b-subtle);
|
|
16366
16674
|
margin: 6px 0;
|
|
16367
16675
|
}
|
|
16368
16676
|
|
|
16369
16677
|
/* Branch select */
|
|
16370
16678
|
.fe-git-branch-select {
|
|
16371
16679
|
width: 100%;
|
|
16372
|
-
background:
|
|
16373
|
-
border: 1px solid
|
|
16680
|
+
background-color: var(--s-light);
|
|
16681
|
+
border: 1px solid var(--b-light);
|
|
16374
16682
|
border-radius: 5px;
|
|
16375
|
-
color: var(--t-
|
|
16683
|
+
color: var(--t-bright);
|
|
16376
16684
|
font-size: 11px;
|
|
16377
16685
|
font-family: var(--ff-mono);
|
|
16378
16686
|
padding: 5px 22px 5px 8px;
|
|
@@ -16380,16 +16688,16 @@
|
|
|
16380
16688
|
cursor: pointer;
|
|
16381
16689
|
appearance: none;
|
|
16382
16690
|
-webkit-appearance: none;
|
|
16383
|
-
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.
|
|
16691
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.5)' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
|
|
16384
16692
|
background-repeat: no-repeat;
|
|
16385
16693
|
background-position: right 7px center;
|
|
16386
16694
|
transition: border-color 0.15s;
|
|
16387
16695
|
}
|
|
16388
|
-
.fe-git-branch-select:hover { border-color:
|
|
16389
|
-
.fe-git-branch-select:focus { border-color:
|
|
16696
|
+
.fe-git-branch-select:hover { border-color: var(--b-hover); }
|
|
16697
|
+
.fe-git-branch-select:focus { border-color: var(--b-visible); }
|
|
16390
16698
|
.fe-git-branch-select option {
|
|
16391
|
-
background:
|
|
16392
|
-
color: var(--t-
|
|
16699
|
+
background: var(--fe-menu-bg);
|
|
16700
|
+
color: var(--t-bright);
|
|
16393
16701
|
}
|
|
16394
16702
|
|
|
16395
16703
|
/* Commit area */
|
|
@@ -16400,114 +16708,106 @@
|
|
|
16400
16708
|
.fe-git-commit-input {
|
|
16401
16709
|
flex: 1;
|
|
16402
16710
|
min-width: 0;
|
|
16403
|
-
background:
|
|
16404
|
-
border: 1px solid
|
|
16711
|
+
background: var(--s-light);
|
|
16712
|
+
border: 1px solid var(--b-light);
|
|
16405
16713
|
border-radius: 5px;
|
|
16406
|
-
color: var(--t-
|
|
16714
|
+
color: var(--t-bright);
|
|
16407
16715
|
font-size: 11px;
|
|
16408
16716
|
font-family: var(--ff-mono);
|
|
16409
16717
|
padding: 5px 8px;
|
|
16410
16718
|
outline: none;
|
|
16411
16719
|
transition: border-color 0.15s;
|
|
16412
16720
|
}
|
|
16413
|
-
.fe-git-commit-input::placeholder { color:
|
|
16414
|
-
.fe-git-commit-input:focus { border-color:
|
|
16415
|
-
.fe-git-commit-
|
|
16721
|
+
.fe-git-commit-input::placeholder { color: var(--t-secondary); }
|
|
16722
|
+
.fe-git-commit-input:focus { border-color: var(--b-visible); }
|
|
16723
|
+
.fe-git-commit-input:focus-visible { outline: 2px solid var(--fe-focus); outline-offset: -1px; }
|
|
16724
|
+
.fe-git-commit-btn,
|
|
16725
|
+
.fe-git-gen-btn {
|
|
16416
16726
|
flex-shrink: 0;
|
|
16417
16727
|
width: 28px; height: 28px;
|
|
16418
16728
|
display: flex;
|
|
16419
16729
|
align-items: center;
|
|
16420
16730
|
justify-content: center;
|
|
16421
|
-
background:
|
|
16422
|
-
border: 1px solid
|
|
16731
|
+
background: var(--s-light);
|
|
16732
|
+
border: 1px solid var(--b-light);
|
|
16423
16733
|
border-radius: 5px;
|
|
16734
|
+
color: var(--t-secondary);
|
|
16424
16735
|
cursor: pointer;
|
|
16425
|
-
transition: background 0.15s, border-color 0.15s;
|
|
16736
|
+
transition: background 0.15s, border-color 0.15s, color 0.15s;
|
|
16426
16737
|
outline: none;
|
|
16427
16738
|
}
|
|
16428
16739
|
.fe-git-commit-btn svg {
|
|
16429
16740
|
width: 13px; height: 13px;
|
|
16430
16741
|
fill: none;
|
|
16431
|
-
stroke:
|
|
16742
|
+
stroke: currentColor;
|
|
16432
16743
|
stroke-width: 2.5;
|
|
16433
16744
|
stroke-linecap: round;
|
|
16434
16745
|
stroke-linejoin: round;
|
|
16435
16746
|
}
|
|
16436
16747
|
.fe-git-commit-btn:hover {
|
|
16437
|
-
|
|
16438
|
-
|
|
16748
|
+
border-color: var(--b-hover);
|
|
16749
|
+
color: var(--fe-git-new);
|
|
16439
16750
|
}
|
|
16440
|
-
.fe-git-commit-btn:hover svg { stroke: #66bb6a; }
|
|
16441
|
-
.fe-git-commit-btn:active { background: rgba(102,187,106,0.2); }
|
|
16442
16751
|
.fe-git-commit-btn.loading,
|
|
16443
16752
|
.fe-git-gen-btn.loading {
|
|
16444
16753
|
pointer-events: none;
|
|
16445
16754
|
opacity: 0.5;
|
|
16446
16755
|
}
|
|
16447
|
-
|
|
16448
|
-
/* Generate message button */
|
|
16449
|
-
.fe-git-gen-btn {
|
|
16450
|
-
flex-shrink: 0;
|
|
16451
|
-
width: 28px; height: 28px;
|
|
16452
|
-
display: flex;
|
|
16453
|
-
align-items: center;
|
|
16454
|
-
justify-content: center;
|
|
16455
|
-
background: rgba(255,255,255,0.05);
|
|
16456
|
-
border: 1px solid rgba(255,255,255,0.08);
|
|
16457
|
-
border-radius: 5px;
|
|
16458
|
-
cursor: pointer;
|
|
16459
|
-
transition: background 0.15s, border-color 0.15s;
|
|
16460
|
-
outline: none;
|
|
16461
|
-
}
|
|
16462
16756
|
.fe-git-gen-btn svg {
|
|
16463
16757
|
width: 12px; height: 12px;
|
|
16464
|
-
fill:
|
|
16758
|
+
fill: currentColor;
|
|
16465
16759
|
stroke: none;
|
|
16466
16760
|
}
|
|
16467
16761
|
.fe-git-gen-btn:hover {
|
|
16468
|
-
|
|
16469
|
-
|
|
16762
|
+
border-color: var(--b-hover);
|
|
16763
|
+
color: var(--accent-orange);
|
|
16470
16764
|
}
|
|
16471
|
-
.fe-git-gen-btn:hover svg { fill: #ffb74d; }
|
|
16472
|
-
.fe-git-gen-btn:active { background: rgba(255,183,77,0.2); }
|
|
16473
16765
|
|
|
16474
16766
|
/* Summary line */
|
|
16475
16767
|
.fe-git-summary {
|
|
16476
|
-
font-size:
|
|
16768
|
+
font-size: 10.5px;
|
|
16477
16769
|
font-family: var(--ff-mono);
|
|
16478
|
-
color: var(--t-
|
|
16770
|
+
color: var(--t-secondary);
|
|
16479
16771
|
line-height: 1.5;
|
|
16480
16772
|
}
|
|
16481
16773
|
.fe-git-summary:empty { display: none; }
|
|
16482
|
-
.fe-git-summary .gs-m { color:
|
|
16483
|
-
.fe-git-summary .gs-a { color:
|
|
16484
|
-
.fe-git-summary .gs-d { color:
|
|
16485
|
-
.fe-git-summary .gs-u { color:
|
|
16774
|
+
.fe-git-summary .gs-m { color: var(--fe-git-modified); }
|
|
16775
|
+
.fe-git-summary .gs-a { color: var(--fe-git-new); }
|
|
16776
|
+
.fe-git-summary .gs-d { color: var(--fe-git-deleted); }
|
|
16777
|
+
.fe-git-summary .gs-u { color: var(--t-primary); }
|
|
16486
16778
|
|
|
16487
16779
|
/* Git commit output */
|
|
16488
16780
|
.fe-git-popover.fe-git-output-mode {
|
|
16489
16781
|
width: 300px;
|
|
16490
16782
|
transition: opacity 0.18s ease, transform 0.18s ease, width 0.18s ease;
|
|
16491
16783
|
}
|
|
16492
|
-
.fe-git-output {
|
|
16493
|
-
display: none;
|
|
16494
|
-
}
|
|
16784
|
+
.fe-git-output { display: none; }
|
|
16495
16785
|
.fe-git-output-header {
|
|
16496
|
-
font-size:
|
|
16786
|
+
font-size: 10px;
|
|
16497
16787
|
font-family: var(--ff-mono);
|
|
16498
|
-
color:
|
|
16788
|
+
color: var(--t-primary);
|
|
16499
16789
|
text-transform: uppercase;
|
|
16500
16790
|
letter-spacing: 0.05em;
|
|
16501
16791
|
margin-bottom: 6px;
|
|
16502
16792
|
}
|
|
16793
|
+
.fe-git-output-icon {
|
|
16794
|
+
width: 11px; height: 11px;
|
|
16795
|
+
stroke: var(--fe-git-deleted);
|
|
16796
|
+
fill: none;
|
|
16797
|
+
stroke-width: 2.5;
|
|
16798
|
+
stroke-linecap: round;
|
|
16799
|
+
stroke-linejoin: round;
|
|
16800
|
+
vertical-align: -1px;
|
|
16801
|
+
}
|
|
16802
|
+
.fe-git-output-icon.ok { stroke: var(--fe-git-new); }
|
|
16503
16803
|
.fe-git-output-pre {
|
|
16504
|
-
background: rgba(0,0,0,0.
|
|
16505
|
-
border: 1px solid
|
|
16804
|
+
background: rgba(0,0,0,0.25);
|
|
16805
|
+
border: 1px solid var(--b-subtle);
|
|
16506
16806
|
border-radius: 5px;
|
|
16507
16807
|
padding: 8px 10px;
|
|
16508
16808
|
font-family: var(--ff-mono);
|
|
16509
|
-
font-size:
|
|
16510
|
-
color:
|
|
16809
|
+
font-size: 10.5px;
|
|
16810
|
+
color: var(--t-primary);
|
|
16511
16811
|
line-height: 1.5;
|
|
16512
16812
|
white-space: pre-wrap;
|
|
16513
16813
|
word-break: break-all;
|
|
@@ -16516,9 +16816,9 @@
|
|
|
16516
16816
|
margin: 0;
|
|
16517
16817
|
}
|
|
16518
16818
|
.fe-git-output-pre.error {
|
|
16519
|
-
background:
|
|
16520
|
-
border-color:
|
|
16521
|
-
color:
|
|
16819
|
+
background: var(--accent-red-bg);
|
|
16820
|
+
border-color: var(--accent-red-hover);
|
|
16821
|
+
color: var(--fe-git-deleted);
|
|
16522
16822
|
}
|
|
16523
16823
|
|
|
16524
16824
|
/* Dropdown panel */
|
|
@@ -16527,11 +16827,12 @@
|
|
|
16527
16827
|
position: absolute;
|
|
16528
16828
|
left: 0; right: 0;
|
|
16529
16829
|
top: calc(100% + 2px);
|
|
16530
|
-
|
|
16531
|
-
|
|
16532
|
-
|
|
16830
|
+
max-height: min(320px, 60vh);
|
|
16831
|
+
overflow-y: auto;
|
|
16832
|
+
background: var(--fe-menu-bg);
|
|
16833
|
+
border: 1px solid var(--fe-menu-border);
|
|
16834
|
+
border-radius: var(--r-small);
|
|
16533
16835
|
z-index: 200;
|
|
16534
|
-
overflow: hidden;
|
|
16535
16836
|
box-shadow: var(--shadow-md);
|
|
16536
16837
|
}
|
|
16537
16838
|
.fe-project-selector.open .fe-project-dropdown { display: block; }
|
|
@@ -16542,7 +16843,7 @@
|
|
|
16542
16843
|
padding: 7px 10px;
|
|
16543
16844
|
font-size: 11.5px;
|
|
16544
16845
|
font-family: var(--ff-mono);
|
|
16545
|
-
color: var(--t-
|
|
16846
|
+
color: var(--t-primary);
|
|
16546
16847
|
cursor: pointer;
|
|
16547
16848
|
transition: background 0.1s;
|
|
16548
16849
|
border: none;
|
|
@@ -16550,14 +16851,16 @@
|
|
|
16550
16851
|
width: 100%;
|
|
16551
16852
|
text-align: left;
|
|
16552
16853
|
}
|
|
16553
|
-
.fe-project-option:hover
|
|
16554
|
-
.fe-project-option
|
|
16854
|
+
.fe-project-option:hover,
|
|
16855
|
+
.fe-project-option:focus-visible { background: var(--s-hover); color: var(--t-bright); }
|
|
16856
|
+
#file-explorer-panel .fe-project-option:focus-visible { outline-offset: -2px; }
|
|
16857
|
+
.fe-project-option.active { color: var(--t-bright); background: var(--s-light); }
|
|
16555
16858
|
.fe-project-option svg {
|
|
16556
16859
|
width: 12px; height: 12px;
|
|
16557
|
-
fill:
|
|
16860
|
+
fill: var(--t-secondary);
|
|
16558
16861
|
flex-shrink: 0;
|
|
16559
16862
|
}
|
|
16560
|
-
.fe-project-option.active svg { fill:
|
|
16863
|
+
.fe-project-option.active svg { fill: var(--t-primary); }
|
|
16561
16864
|
.fe-project-option .fe-opt-label {
|
|
16562
16865
|
flex: 1;
|
|
16563
16866
|
overflow: hidden;
|
|
@@ -16566,16 +16869,15 @@
|
|
|
16566
16869
|
}
|
|
16567
16870
|
.fe-project-sep {
|
|
16568
16871
|
height: 1px;
|
|
16569
|
-
background:
|
|
16872
|
+
background: var(--b-subtle);
|
|
16570
16873
|
margin: 2px 0;
|
|
16571
16874
|
}
|
|
16572
16875
|
.fe-project-option.fe-add-project svg {
|
|
16573
16876
|
fill: none;
|
|
16574
|
-
stroke:
|
|
16877
|
+
stroke: currentColor;
|
|
16575
16878
|
stroke-width: 2;
|
|
16576
16879
|
stroke-linecap: round;
|
|
16577
16880
|
}
|
|
16578
|
-
.fe-project-option.fe-add-project:hover svg { stroke: rgba(255,255,255,0.5); }
|
|
16579
16881
|
|
|
16580
16882
|
/* Toolbar */
|
|
16581
16883
|
.fe-toolbar {
|
|
@@ -16584,11 +16886,23 @@
|
|
|
16584
16886
|
justify-content: center;
|
|
16585
16887
|
gap: 2px;
|
|
16586
16888
|
padding: 4px 8px 6px;
|
|
16587
|
-
border-bottom: 1px solid
|
|
16889
|
+
border-bottom: 1px solid var(--b-subtle);
|
|
16588
16890
|
white-space: nowrap;
|
|
16589
16891
|
flex-wrap: nowrap;
|
|
16590
16892
|
flex-shrink: 0;
|
|
16591
16893
|
}
|
|
16894
|
+
.fe-toolbar .detail-action-btn { color: var(--t-secondary); }
|
|
16895
|
+
.fe-toolbar .detail-action-btn:hover { color: var(--t-bright); }
|
|
16896
|
+
.fe-toolbar .detail-action-btn[aria-pressed="true"] {
|
|
16897
|
+
color: var(--t-bright);
|
|
16898
|
+
background: var(--s-medium);
|
|
16899
|
+
border-color: var(--b-hover);
|
|
16900
|
+
}
|
|
16901
|
+
.fe-toolbar .detail-action-btn:disabled {
|
|
16902
|
+
opacity: 0.4;
|
|
16903
|
+
cursor: default;
|
|
16904
|
+
pointer-events: none;
|
|
16905
|
+
}
|
|
16592
16906
|
|
|
16593
16907
|
/* Tree container */
|
|
16594
16908
|
.fe-tree {
|
|
@@ -16597,68 +16911,99 @@
|
|
|
16597
16911
|
overflow-x: hidden;
|
|
16598
16912
|
padding: 4px 0;
|
|
16599
16913
|
min-height: 0;
|
|
16600
|
-
|
|
16601
|
-
|
|
16602
|
-
|
|
16914
|
+
outline: none;
|
|
16915
|
+
/* Isolate the tree's layout/style recalc (see .explorer-tree). Safe: what the
|
|
16916
|
+
explorer opens over the page (menu, preview, questions) is added to the
|
|
16917
|
+
body, not to the tree. Not `paint` — would clip and isn't needed. */
|
|
16603
16918
|
contain: layout style;
|
|
16604
16919
|
scrollbar-width: thin;
|
|
16605
16920
|
scrollbar-color: transparent transparent;
|
|
16606
16921
|
}
|
|
16607
|
-
.fe-tree:hover {
|
|
16608
|
-
scrollbar-color: rgba(255,255,255,0.1) transparent;
|
|
16609
|
-
}
|
|
16922
|
+
.fe-tree:hover { scrollbar-color: var(--b-light) transparent; }
|
|
16610
16923
|
.fe-tree::-webkit-scrollbar { width: 6px; }
|
|
16611
16924
|
.fe-tree::-webkit-scrollbar-track { background: transparent; }
|
|
16612
16925
|
.fe-tree::-webkit-scrollbar-thumb {
|
|
16613
16926
|
background: transparent;
|
|
16614
16927
|
border-radius: 3px;
|
|
16615
16928
|
}
|
|
16616
|
-
.fe-tree:hover::-webkit-scrollbar-thumb {
|
|
16617
|
-
|
|
16618
|
-
|
|
16619
|
-
.fe-tree
|
|
16620
|
-
background: rgba(255,255,255,0.2);
|
|
16621
|
-
}
|
|
16929
|
+
.fe-tree:hover::-webkit-scrollbar-thumb { background: var(--b-light); }
|
|
16930
|
+
.fe-tree:hover::-webkit-scrollbar-thumb:hover { background: var(--b-visible); }
|
|
16931
|
+
/* Rows may be dropped on the project itself. */
|
|
16932
|
+
.fe-tree.fe-drop { box-shadow: inset 0 0 0 1px var(--fe-focus); background: var(--accent-blue-bg); }
|
|
16622
16933
|
|
|
16623
16934
|
/* Tree rows */
|
|
16624
16935
|
.fe-row {
|
|
16625
16936
|
display: flex;
|
|
16626
16937
|
align-items: center;
|
|
16627
16938
|
gap: 6px;
|
|
16628
|
-
padding:
|
|
16939
|
+
padding: 0 8px;
|
|
16629
16940
|
cursor: pointer;
|
|
16630
16941
|
border-radius: 4px;
|
|
16631
16942
|
font-size: 12px;
|
|
16632
16943
|
white-space: nowrap;
|
|
16633
16944
|
transition: background 0.12s;
|
|
16634
16945
|
margin: 0 4px;
|
|
16635
|
-
|
|
16636
|
-
|
|
16637
|
-
|
|
16638
|
-
|
|
16946
|
+
height: 24px;
|
|
16947
|
+
user-select: none;
|
|
16948
|
+
-webkit-user-select: none;
|
|
16949
|
+
}
|
|
16950
|
+
.fe-row:hover { background: var(--s-subtle); }
|
|
16951
|
+
.fe-row--ctx-active { background: var(--s-hover); }
|
|
16952
|
+
.fe-node--selected > .fe-row { background: var(--s-medium); }
|
|
16953
|
+
.fe-node--selected > .fe-row:hover { background: var(--s-active); }
|
|
16954
|
+
/* The keyboard's row, while the tree has the keyboard. */
|
|
16955
|
+
.fe-tree:focus-visible .fe-node--focus > .fe-row {
|
|
16956
|
+
outline: 2px solid var(--fe-focus);
|
|
16957
|
+
outline-offset: -2px;
|
|
16639
16958
|
}
|
|
16640
|
-
.
|
|
16641
|
-
|
|
16959
|
+
/* The file that is showing in the editor. */
|
|
16960
|
+
.fe-node--active > .fe-row { box-shadow: inset 2px 0 0 var(--fe-focus); }
|
|
16961
|
+
.fe-node--active > .fe-row > .fe-name { color: var(--t-bright); }
|
|
16962
|
+
/* A folder rows are about to be dropped into: the folder and what it shows. */
|
|
16963
|
+
.fe-node.fe-drop {
|
|
16964
|
+
background: var(--accent-blue-bg);
|
|
16965
|
+
outline: 1px dashed var(--fe-focus);
|
|
16966
|
+
outline-offset: -1px;
|
|
16967
|
+
border-radius: 4px;
|
|
16642
16968
|
}
|
|
16969
|
+
.fe-tree--dragging .fe-row { cursor: grabbing; }
|
|
16643
16970
|
|
|
16644
16971
|
/* Chevron */
|
|
16645
16972
|
.fe-chevron {
|
|
16646
|
-
font-size: 7px;
|
|
16647
16973
|
width: 12px;
|
|
16648
|
-
|
|
16649
|
-
|
|
16650
|
-
|
|
16974
|
+
height: 12px;
|
|
16975
|
+
display: inline-flex;
|
|
16976
|
+
align-items: center;
|
|
16977
|
+
justify-content: center;
|
|
16978
|
+
color: var(--t-secondary);
|
|
16651
16979
|
flex-shrink: 0;
|
|
16652
|
-
user-select: none;
|
|
16653
16980
|
}
|
|
16654
|
-
.fe-
|
|
16655
|
-
|
|
16981
|
+
.fe-chevron svg {
|
|
16982
|
+
width: 10px;
|
|
16983
|
+
height: 10px;
|
|
16984
|
+
fill: none;
|
|
16985
|
+
stroke: currentColor;
|
|
16986
|
+
stroke-width: 2.5;
|
|
16987
|
+
stroke-linecap: round;
|
|
16988
|
+
stroke-linejoin: round;
|
|
16989
|
+
transition: transform 0.15s ease;
|
|
16656
16990
|
}
|
|
16991
|
+
.fe-node[data-expanded="true"] > .fe-row > .fe-chevron svg { transform: rotate(90deg); }
|
|
16657
16992
|
|
|
16658
|
-
/* Collapsed children hidden */
|
|
16659
|
-
.fe-
|
|
16660
|
-
|
|
16993
|
+
/* Collapsed children hidden; an open folder draws the line its rows hang from. */
|
|
16994
|
+
.fe-children { position: relative; }
|
|
16995
|
+
.fe-node[data-expanded="false"] > .fe-children { display: none; }
|
|
16996
|
+
.fe-children::before {
|
|
16997
|
+
content: '';
|
|
16998
|
+
position: absolute;
|
|
16999
|
+
top: 0;
|
|
17000
|
+
bottom: 0;
|
|
17001
|
+
left: calc(var(--fe-guide, 14px) + 4px);
|
|
17002
|
+
width: 1px;
|
|
17003
|
+
background: var(--b-subtle);
|
|
17004
|
+
pointer-events: none;
|
|
16661
17005
|
}
|
|
17006
|
+
.fe-children:hover::before { background: var(--b-hover); }
|
|
16662
17007
|
|
|
16663
17008
|
/* File/folder icon */
|
|
16664
17009
|
.fe-icon {
|
|
@@ -16668,6 +17013,7 @@
|
|
|
16668
17013
|
display: flex;
|
|
16669
17014
|
align-items: center;
|
|
16670
17015
|
justify-content: center;
|
|
17016
|
+
position: relative;
|
|
16671
17017
|
}
|
|
16672
17018
|
.fe-icon svg {
|
|
16673
17019
|
width: 14px;
|
|
@@ -16678,9 +17024,22 @@
|
|
|
16678
17024
|
stroke-linecap: round;
|
|
16679
17025
|
stroke-linejoin: round;
|
|
16680
17026
|
}
|
|
16681
|
-
.fe-icon--dir { color:
|
|
16682
|
-
.fe-icon--file { color:
|
|
17027
|
+
.fe-icon--dir { color: var(--accent-orange); }
|
|
17028
|
+
.fe-icon--file { color: var(--t-secondary); }
|
|
16683
17029
|
.fe-icon-img { width: 14px; height: 14px; object-fit: contain; }
|
|
17030
|
+
/* A link: a small arrow on its icon. */
|
|
17031
|
+
.fe-link-glyph {
|
|
17032
|
+
position: absolute;
|
|
17033
|
+
right: -4px;
|
|
17034
|
+
bottom: -3px;
|
|
17035
|
+
width: 8px;
|
|
17036
|
+
height: 8px;
|
|
17037
|
+
border-radius: 2px;
|
|
17038
|
+
background: var(--fe-bg);
|
|
17039
|
+
color: var(--t-primary);
|
|
17040
|
+
display: flex;
|
|
17041
|
+
}
|
|
17042
|
+
.fe-icon .fe-link-glyph svg { width: 8px; height: 8px; stroke-width: 3; }
|
|
16684
17043
|
|
|
16685
17044
|
/* File name */
|
|
16686
17045
|
.fe-name {
|
|
@@ -16688,45 +17047,210 @@
|
|
|
16688
17047
|
text-overflow: ellipsis;
|
|
16689
17048
|
flex: 1;
|
|
16690
17049
|
min-width: 0;
|
|
16691
|
-
color: var(--t-
|
|
17050
|
+
color: var(--t-primary);
|
|
16692
17051
|
font-family: var(--ff-mono);
|
|
16693
17052
|
font-size: 12px;
|
|
16694
17053
|
}
|
|
16695
|
-
.fe-node[data-type="dir"] > .fe-row > .fe-name {
|
|
16696
|
-
|
|
16697
|
-
|
|
17054
|
+
.fe-node[data-type="dir"] > .fe-row > .fe-name { font-weight: 500; }
|
|
17055
|
+
/* What git ignores is dimmed, and still text that reads. */
|
|
17056
|
+
.fe-node--ignored > .fe-row > .fe-name { color: var(--t-secondary); }
|
|
17057
|
+
.fe-node--ignored > .fe-row > .fe-icon { opacity: 0.6; }
|
|
17058
|
+
/* Cut: on its way somewhere else. */
|
|
17059
|
+
.fe-node--cut > .fe-row > .fe-name { color: var(--t-secondary); font-style: italic; }
|
|
17060
|
+
.fe-node--cut > .fe-row > .fe-icon { opacity: 0.5; }
|
|
17061
|
+
/* A file git lists as deleted, and a link that cannot be opened from here. */
|
|
17062
|
+
.fe-node--missing > .fe-row > .fe-name { color: var(--t-secondary); text-decoration: line-through; }
|
|
17063
|
+
.fe-node--faint > .fe-row > .fe-name { color: var(--t-secondary); font-style: italic; }
|
|
17064
|
+
/* A selected row under the pointer has the lightest ground of the tree: the dimmed names would read at 4.4:1
|
|
17065
|
+
there, so they take the next text token up (7:1) and stay italic or struck through. */
|
|
17066
|
+
.fe-node--selected.fe-node--ignored > .fe-row:hover > .fe-name,
|
|
17067
|
+
.fe-node--selected.fe-node--cut > .fe-row:hover > .fe-name,
|
|
17068
|
+
.fe-node--selected.fe-node--missing > .fe-row:hover > .fe-name,
|
|
17069
|
+
.fe-node--selected.fe-node--faint > .fe-row:hover > .fe-name { color: var(--t-primary); }
|
|
17070
|
+
.fe-match {
|
|
17071
|
+
background: var(--s-active);
|
|
17072
|
+
color: var(--t-bright);
|
|
17073
|
+
border-radius: 2px;
|
|
16698
17074
|
}
|
|
16699
17075
|
|
|
16700
|
-
/*
|
|
17076
|
+
/* Open in the editor (a ring), unsaved there (a dot) */
|
|
17077
|
+
.fe-open-dot {
|
|
17078
|
+
display: none;
|
|
17079
|
+
width: 6px;
|
|
17080
|
+
height: 6px;
|
|
17081
|
+
border-radius: 50%;
|
|
17082
|
+
flex-shrink: 0;
|
|
17083
|
+
box-sizing: border-box;
|
|
17084
|
+
}
|
|
17085
|
+
.fe-open-dot--open { display: block; border: 1px solid var(--t-secondary); }
|
|
17086
|
+
.fe-open-dot--dirty { display: block; background: var(--t-bright); }
|
|
17087
|
+
|
|
17088
|
+
/* Git state: a letter on a file, a dot on a folder that holds changes */
|
|
16701
17089
|
.fe-git-badge {
|
|
16702
|
-
font-size:
|
|
17090
|
+
font-size: 10px;
|
|
16703
17091
|
font-family: var(--ff-mono);
|
|
16704
|
-
font-weight:
|
|
16705
|
-
|
|
16706
|
-
|
|
17092
|
+
font-weight: 600;
|
|
17093
|
+
width: 12px;
|
|
17094
|
+
text-align: center;
|
|
16707
17095
|
flex-shrink: 0;
|
|
16708
17096
|
line-height: 16px;
|
|
16709
17097
|
}
|
|
16710
|
-
.fe-git-
|
|
16711
|
-
.fe-git-
|
|
16712
|
-
|
|
16713
|
-
|
|
16714
|
-
|
|
16715
|
-
|
|
16716
|
-
|
|
17098
|
+
.fe-git-badge[hidden] { display: none; }
|
|
17099
|
+
.fe-git-badge--dot::before {
|
|
17100
|
+
content: '';
|
|
17101
|
+
display: inline-block;
|
|
17102
|
+
width: 5px;
|
|
17103
|
+
height: 5px;
|
|
17104
|
+
border-radius: 50%;
|
|
17105
|
+
background: currentColor;
|
|
17106
|
+
vertical-align: 1px;
|
|
17107
|
+
}
|
|
17108
|
+
.fe-git-modified { color: var(--fe-git-modified); }
|
|
17109
|
+
.fe-git-new { color: var(--fe-git-new); }
|
|
17110
|
+
.fe-git-deleted { color: var(--fe-git-deleted); }
|
|
17111
|
+
.fe-git-conflict { color: var(--fe-git-conflict); }
|
|
17112
|
+
|
|
17113
|
+
/* A line among the rows that is not a row: loading, empty, an error, more to show */
|
|
17114
|
+
.fe-note {
|
|
17115
|
+
display: flex;
|
|
17116
|
+
align-items: center;
|
|
17117
|
+
flex-wrap: wrap;
|
|
17118
|
+
gap: 2px 8px;
|
|
17119
|
+
min-height: 22px;
|
|
17120
|
+
padding-right: 10px;
|
|
17121
|
+
font-size: 11px;
|
|
17122
|
+
line-height: 1.4;
|
|
17123
|
+
font-family: var(--ff-mono);
|
|
17124
|
+
color: var(--t-secondary);
|
|
17125
|
+
}
|
|
17126
|
+
.fe-note--error { color: var(--fe-git-deleted); padding-top: 3px; padding-bottom: 3px; }
|
|
17127
|
+
/* A line that offers something ("Show more", "Retry") while the keyboard is on it: its offer has the ring a row has. */
|
|
17128
|
+
.fe-tree:focus-visible .fe-note--focus > .fe-note-action {
|
|
17129
|
+
outline: 2px solid var(--fe-focus);
|
|
17130
|
+
outline-offset: 2px;
|
|
17131
|
+
border-radius: 2px;
|
|
17132
|
+
}
|
|
17133
|
+
.fe-note-action,
|
|
17134
|
+
.fe-notice-action {
|
|
17135
|
+
background: none;
|
|
17136
|
+
border: none;
|
|
17137
|
+
padding: 0;
|
|
17138
|
+
font: inherit;
|
|
17139
|
+
color: var(--t-bright);
|
|
17140
|
+
text-decoration: underline;
|
|
17141
|
+
text-underline-offset: 2px;
|
|
17142
|
+
cursor: pointer;
|
|
17143
|
+
flex-shrink: 0;
|
|
17144
|
+
}
|
|
17145
|
+
.fe-empty {
|
|
17146
|
+
display: flex;
|
|
17147
|
+
flex-direction: column;
|
|
17148
|
+
align-items: flex-start;
|
|
17149
|
+
gap: 12px;
|
|
17150
|
+
padding: 16px;
|
|
17151
|
+
font-size: 12px;
|
|
17152
|
+
line-height: 1.45;
|
|
17153
|
+
color: var(--t-primary);
|
|
17154
|
+
}
|
|
17155
|
+
.fe-empty p { margin: 0; }
|
|
17156
|
+
|
|
17157
|
+
/* A name typed in place */
|
|
17158
|
+
.fe-rename-input {
|
|
17159
|
+
width: 100%;
|
|
17160
|
+
height: 20px;
|
|
17161
|
+
box-sizing: border-box;
|
|
17162
|
+
background: var(--fe-bg);
|
|
17163
|
+
border: 1px solid var(--fe-focus);
|
|
17164
|
+
border-radius: 3px;
|
|
17165
|
+
color: var(--t-bright);
|
|
17166
|
+
font-family: var(--ff-mono);
|
|
17167
|
+
font-size: 12px;
|
|
17168
|
+
padding: 0 4px;
|
|
17169
|
+
outline: none;
|
|
17170
|
+
}
|
|
17171
|
+
.fe-rename-input[aria-invalid="true"] { border-color: var(--fe-git-deleted); }
|
|
17172
|
+
.fe-rename-tip {
|
|
17173
|
+
margin: 2px 8px 4px 30px;
|
|
17174
|
+
padding: 4px 8px;
|
|
17175
|
+
border-radius: 4px;
|
|
17176
|
+
background: var(--accent-red-bg);
|
|
17177
|
+
color: var(--fe-git-deleted);
|
|
17178
|
+
font-size: 11px;
|
|
17179
|
+
line-height: 1.4;
|
|
17180
|
+
white-space: normal;
|
|
17181
|
+
}
|
|
17182
|
+
.fe-rename-tip[hidden] { display: none; }
|
|
17183
|
+
|
|
17184
|
+
/* What happened, at the foot of the panel */
|
|
17185
|
+
.fe-notice {
|
|
17186
|
+
display: flex;
|
|
17187
|
+
align-items: flex-start;
|
|
17188
|
+
gap: 8px;
|
|
17189
|
+
padding: 6px 6px 6px 12px;
|
|
17190
|
+
border-top: 1px solid var(--b-subtle);
|
|
17191
|
+
background: var(--s-subtle);
|
|
17192
|
+
font-size: 11.5px;
|
|
17193
|
+
line-height: 1.4;
|
|
17194
|
+
color: var(--t-bright);
|
|
17195
|
+
flex-shrink: 0;
|
|
17196
|
+
}
|
|
17197
|
+
.fe-notice[hidden] { display: none; }
|
|
17198
|
+
.fe-notice[data-tone="error"] { color: var(--fe-git-deleted); }
|
|
17199
|
+
.fe-notice-text {
|
|
17200
|
+
flex: 1;
|
|
17201
|
+
min-width: 0;
|
|
17202
|
+
overflow-wrap: anywhere;
|
|
17203
|
+
display: -webkit-box;
|
|
17204
|
+
-webkit-line-clamp: 4;
|
|
17205
|
+
-webkit-box-orient: vertical;
|
|
17206
|
+
overflow: hidden;
|
|
17207
|
+
}
|
|
17208
|
+
.fe-notice-action[hidden] { display: none; }
|
|
17209
|
+
.fe-notice-close {
|
|
17210
|
+
background: none;
|
|
17211
|
+
border: none;
|
|
17212
|
+
color: var(--t-secondary);
|
|
17213
|
+
cursor: pointer;
|
|
17214
|
+
font-size: 13px;
|
|
17215
|
+
line-height: 1;
|
|
17216
|
+
padding: 1px 5px;
|
|
17217
|
+
border-radius: 3px;
|
|
17218
|
+
flex-shrink: 0;
|
|
17219
|
+
}
|
|
17220
|
+
.fe-notice-close:hover { color: var(--t-bright); background: var(--s-light); }
|
|
16717
17221
|
|
|
16718
17222
|
/* Footer */
|
|
16719
17223
|
.fe-footer {
|
|
16720
17224
|
display: flex;
|
|
16721
17225
|
align-items: center;
|
|
17226
|
+
justify-content: space-between;
|
|
17227
|
+
gap: 8px;
|
|
16722
17228
|
height: 28px;
|
|
16723
17229
|
padding: 0 12px;
|
|
16724
|
-
font-size:
|
|
16725
|
-
color: var(--t-
|
|
17230
|
+
font-size: 10.5px;
|
|
17231
|
+
color: var(--t-secondary);
|
|
16726
17232
|
border-top: 1px solid var(--b-subtle);
|
|
16727
17233
|
flex-shrink: 0;
|
|
16728
17234
|
font-family: var(--ff-mono);
|
|
16729
17235
|
}
|
|
17236
|
+
.fe-restart-hint {
|
|
17237
|
+
display: inline-flex;
|
|
17238
|
+
width: 14px;
|
|
17239
|
+
height: 14px;
|
|
17240
|
+
color: var(--accent-orange);
|
|
17241
|
+
border-radius: 50%;
|
|
17242
|
+
cursor: help;
|
|
17243
|
+
}
|
|
17244
|
+
.fe-restart-hint[hidden] { display: none; }
|
|
17245
|
+
.fe-restart-hint:focus-visible { outline: 2px solid var(--fe-focus); outline-offset: 1px; }
|
|
17246
|
+
.fe-restart-hint svg {
|
|
17247
|
+
width: 14px;
|
|
17248
|
+
height: 14px;
|
|
17249
|
+
fill: none;
|
|
17250
|
+
stroke: currentColor;
|
|
17251
|
+
stroke-width: 2;
|
|
17252
|
+
stroke-linecap: round;
|
|
17253
|
+
}
|
|
16730
17254
|
|
|
16731
17255
|
/* Right-edge resize handle */
|
|
16732
17256
|
.fe-resize-handle {
|
|
@@ -16738,13 +17262,14 @@
|
|
|
16738
17262
|
cursor: col-resize;
|
|
16739
17263
|
z-index: 10;
|
|
16740
17264
|
transition: background 0.15s;
|
|
17265
|
+
touch-action: none;
|
|
17266
|
+
outline: none;
|
|
16741
17267
|
}
|
|
16742
17268
|
.fe-resize-handle:hover,
|
|
16743
|
-
.fe-resize-handle.active {
|
|
16744
|
-
|
|
16745
|
-
}
|
|
17269
|
+
.fe-resize-handle.active { background: var(--b-visible); }
|
|
17270
|
+
.fe-resize-handle:focus-visible { background: var(--fe-focus); }
|
|
16746
17271
|
|
|
16747
|
-
/* ──
|
|
17272
|
+
/* ── Context menu and preview (flyouts docked to the right of the panel) ── */
|
|
16748
17273
|
.fe-ctx-flyout {
|
|
16749
17274
|
position: fixed;
|
|
16750
17275
|
z-index: 100010;
|
|
@@ -16771,70 +17296,179 @@
|
|
|
16771
17296
|
width: 0; height: 0;
|
|
16772
17297
|
border-top: 6px solid transparent;
|
|
16773
17298
|
border-bottom: 6px solid transparent;
|
|
16774
|
-
border-right: 6px solid
|
|
17299
|
+
border-right: 6px solid var(--fe-menu-border);
|
|
16775
17300
|
transform: translateY(-6px);
|
|
16776
|
-
filter: drop-shadow(-2px 0 2px rgba(0,0,0,0.25));
|
|
16777
17301
|
z-index: 1;
|
|
16778
17302
|
}
|
|
17303
|
+
/* No room beside the panel: the flyout lies over it, and points at nothing. */
|
|
17304
|
+
.fe-ctx-flyout--over .fe-ctx-arrow { display: none; }
|
|
16779
17305
|
.fe-ctx-menu {
|
|
16780
|
-
background:
|
|
16781
|
-
|
|
16782
|
-
-
|
|
16783
|
-
|
|
16784
|
-
|
|
16785
|
-
|
|
16786
|
-
|
|
16787
|
-
|
|
17306
|
+
background: var(--fe-menu-bg);
|
|
17307
|
+
border: 1px solid var(--fe-menu-border);
|
|
17308
|
+
border-radius: var(--r-card);
|
|
17309
|
+
padding: 6px;
|
|
17310
|
+
min-width: 196px;
|
|
17311
|
+
max-width: min(300px, calc(100vw - 16px));
|
|
17312
|
+
max-height: calc(100dvh - 16px);
|
|
17313
|
+
overflow-y: auto;
|
|
17314
|
+
box-sizing: border-box;
|
|
17315
|
+
box-shadow: var(--fe-menu-shadow);
|
|
17316
|
+
outline: none;
|
|
16788
17317
|
}
|
|
16789
17318
|
.fe-ctx-item {
|
|
16790
17319
|
display: flex;
|
|
16791
17320
|
align-items: center;
|
|
16792
17321
|
gap: 8px;
|
|
16793
17322
|
width: 100%;
|
|
16794
|
-
padding:
|
|
17323
|
+
padding: 5px 8px;
|
|
16795
17324
|
border: none;
|
|
16796
17325
|
background: none;
|
|
16797
|
-
color:
|
|
17326
|
+
color: var(--t-primary);
|
|
16798
17327
|
font-size: 11px;
|
|
16799
|
-
font-family:
|
|
17328
|
+
font-family: var(--ff-mono);
|
|
16800
17329
|
cursor: pointer;
|
|
16801
|
-
border-radius:
|
|
17330
|
+
border-radius: 4px;
|
|
16802
17331
|
text-align: left;
|
|
16803
|
-
transition: background 0.1s, color 0.1s;
|
|
16804
17332
|
}
|
|
16805
|
-
.fe-ctx-item:hover
|
|
16806
|
-
|
|
16807
|
-
|
|
17333
|
+
.fe-ctx-item:hover,
|
|
17334
|
+
.fe-ctx-item:focus { background: var(--s-hover); color: var(--t-bright); outline: none; }
|
|
17335
|
+
.fe-ctx-flyout .fe-ctx-item:focus-visible { outline: 2px solid var(--fe-focus); outline-offset: -2px; }
|
|
17336
|
+
.fe-ctx-item[aria-disabled="true"] {
|
|
17337
|
+
opacity: 0.45;
|
|
17338
|
+
cursor: default;
|
|
17339
|
+
background: none;
|
|
17340
|
+
color: var(--t-primary);
|
|
16808
17341
|
}
|
|
16809
|
-
.fe-ctx-
|
|
16810
|
-
width: 13px;
|
|
16811
|
-
|
|
16812
|
-
|
|
16813
|
-
|
|
17342
|
+
.fe-ctx-icon {
|
|
17343
|
+
width: 13px;
|
|
17344
|
+
height: 13px;
|
|
17345
|
+
flex-shrink: 0;
|
|
17346
|
+
display: inline-flex;
|
|
17347
|
+
}
|
|
17348
|
+
.fe-ctx-icon svg {
|
|
17349
|
+
width: 13px; height: 13px;
|
|
17350
|
+
fill: none; stroke: currentColor;
|
|
17351
|
+
stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
|
|
16814
17352
|
}
|
|
16815
|
-
.fe-ctx-
|
|
16816
|
-
|
|
17353
|
+
.fe-ctx-label {
|
|
17354
|
+
flex: 1;
|
|
17355
|
+
min-width: 0;
|
|
17356
|
+
overflow: hidden;
|
|
17357
|
+
text-overflow: ellipsis;
|
|
17358
|
+
white-space: nowrap;
|
|
17359
|
+
}
|
|
17360
|
+
.fe-ctx-key {
|
|
17361
|
+
flex-shrink: 0;
|
|
17362
|
+
padding-left: 12px;
|
|
17363
|
+
color: var(--t-secondary);
|
|
17364
|
+
font-size: 10.5px;
|
|
16817
17365
|
}
|
|
16818
17366
|
.fe-ctx-separator {
|
|
16819
17367
|
height: 1px;
|
|
16820
|
-
margin:
|
|
16821
|
-
background:
|
|
17368
|
+
margin: 4px 2px;
|
|
17369
|
+
background: var(--b-subtle);
|
|
17370
|
+
}
|
|
17371
|
+
.fe-ctx-item--danger { color: var(--fe-git-deleted); }
|
|
17372
|
+
.fe-ctx-item--danger:hover,
|
|
17373
|
+
.fe-ctx-item--danger:focus { background: var(--accent-red-bg); color: var(--fe-git-deleted); }
|
|
17374
|
+
|
|
17375
|
+
/* Folder colours: a row of swatches on a page of the menu */
|
|
17376
|
+
.fe-ctx-swatches {
|
|
17377
|
+
display: grid;
|
|
17378
|
+
grid-template-columns: repeat(5, 22px);
|
|
17379
|
+
gap: 7px;
|
|
17380
|
+
padding: 6px 8px 8px;
|
|
17381
|
+
}
|
|
17382
|
+
.fe-color-swatch {
|
|
17383
|
+
width: 22px;
|
|
17384
|
+
height: 22px;
|
|
17385
|
+
border-radius: 50%;
|
|
17386
|
+
border: 2px solid transparent;
|
|
17387
|
+
cursor: pointer;
|
|
17388
|
+
transition: transform 0.12s, border-color 0.12s;
|
|
17389
|
+
padding: 0;
|
|
17390
|
+
}
|
|
17391
|
+
.fe-color-swatch:hover { transform: scale(1.15); border-color: var(--b-visible); }
|
|
17392
|
+
.fe-color-swatch--active { border-color: var(--t-bright); }
|
|
17393
|
+
.fe-ctx-flyout .fe-color-swatch:focus-visible { outline: 2px solid var(--fe-focus); outline-offset: 2px; }
|
|
17394
|
+
|
|
17395
|
+
/* The card of a file that is not text. It lies over the editor: it slides in at full strength (a menu fades
|
|
17396
|
+
in), so nothing under it reads through while it arrives. */
|
|
17397
|
+
.fe-preview:not(.fe-ctx-flyout--out) { opacity: 1; }
|
|
17398
|
+
.fe-preview-card {
|
|
17399
|
+
width: 280px;
|
|
17400
|
+
padding: 10px;
|
|
17401
|
+
display: flex;
|
|
17402
|
+
flex-direction: column;
|
|
17403
|
+
gap: 8px;
|
|
17404
|
+
}
|
|
17405
|
+
.fe-preview-name {
|
|
17406
|
+
font-family: var(--ff-mono);
|
|
17407
|
+
font-size: 12px;
|
|
17408
|
+
color: var(--t-bright);
|
|
17409
|
+
overflow: hidden;
|
|
17410
|
+
text-overflow: ellipsis;
|
|
17411
|
+
white-space: nowrap;
|
|
17412
|
+
}
|
|
17413
|
+
.fe-preview-frame {
|
|
17414
|
+
display: flex;
|
|
17415
|
+
align-items: center;
|
|
17416
|
+
justify-content: center;
|
|
17417
|
+
min-height: 72px;
|
|
17418
|
+
background: var(--s-subtle);
|
|
17419
|
+
border: 1px solid var(--b-subtle);
|
|
17420
|
+
border-radius: var(--r-small);
|
|
17421
|
+
overflow: hidden;
|
|
16822
17422
|
}
|
|
16823
|
-
.fe-
|
|
16824
|
-
|
|
17423
|
+
.fe-preview-frame img {
|
|
17424
|
+
display: block;
|
|
17425
|
+
max-width: 100%;
|
|
17426
|
+
max-height: min(280px, 50vh);
|
|
17427
|
+
object-fit: contain;
|
|
17428
|
+
}
|
|
17429
|
+
.fe-preview-frame--failed {
|
|
17430
|
+
padding: 12px;
|
|
17431
|
+
font-size: 11px;
|
|
17432
|
+
color: var(--t-secondary);
|
|
17433
|
+
}
|
|
17434
|
+
.fe-preview-detail {
|
|
17435
|
+
font-size: 11px;
|
|
17436
|
+
line-height: 1.45;
|
|
17437
|
+
color: var(--t-secondary);
|
|
17438
|
+
white-space: pre-line;
|
|
17439
|
+
}
|
|
17440
|
+
.fe-preview-actions {
|
|
17441
|
+
display: flex;
|
|
17442
|
+
flex-wrap: wrap;
|
|
17443
|
+
gap: 6px;
|
|
16825
17444
|
}
|
|
16826
|
-
.fe-
|
|
16827
|
-
.fe-ctx-item--danger:hover { background: rgba(229,115,115,0.1); color: #ff8a80; }
|
|
16828
|
-
.fe-ctx-item--danger svg { stroke: #e57373; }
|
|
16829
|
-
.fe-ctx-item--danger:hover svg { stroke: #ff8a80; }
|
|
17445
|
+
.fe-preview-actions .fe-modal-btn { padding: 5px 10px; }
|
|
16830
17446
|
|
|
16831
|
-
/*
|
|
16832
|
-
.fe-
|
|
16833
|
-
|
|
17447
|
+
/* Where go-to-file opens: the editor's own list, beside the panel */
|
|
17448
|
+
.fe-jump-layer {
|
|
17449
|
+
position: fixed;
|
|
17450
|
+
inset: 0;
|
|
17451
|
+
z-index: 100020;
|
|
16834
17452
|
pointer-events: none;
|
|
17453
|
+
--ed-menu-bg: var(--fe-menu-bg);
|
|
17454
|
+
--ed-menu-fg: var(--t-primary);
|
|
17455
|
+
--ed-menu-fg-active: var(--t-bright);
|
|
17456
|
+
--ed-menu-border: var(--fe-menu-border);
|
|
17457
|
+
--ed-menu-hover: var(--s-hover);
|
|
17458
|
+
--ed-menu-radius: var(--r-card);
|
|
17459
|
+
--ed-menu-shadow: var(--fe-menu-shadow);
|
|
17460
|
+
--fw-focus: var(--fe-focus);
|
|
17461
|
+
}
|
|
17462
|
+
.fe-jump-layer > .fe-editor-menu { pointer-events: auto; }
|
|
17463
|
+
.fe-jump-layer .fe-editor-menu:focus-visible { outline: none; }
|
|
17464
|
+
|
|
17465
|
+
/* A side panel that rows are being dragged onto */
|
|
17466
|
+
.fe-drop-agent {
|
|
17467
|
+
outline: 2px dashed var(--accent-blue);
|
|
17468
|
+
outline-offset: -6px;
|
|
16835
17469
|
}
|
|
16836
17470
|
|
|
16837
|
-
/* ──
|
|
17471
|
+
/* ── Questions (delete, replace, save first) ── */
|
|
16838
17472
|
.fe-modal-overlay {
|
|
16839
17473
|
position: fixed;
|
|
16840
17474
|
inset: 0;
|
|
@@ -16843,17 +17477,20 @@
|
|
|
16843
17477
|
display: flex;
|
|
16844
17478
|
align-items: center;
|
|
16845
17479
|
justify-content: center;
|
|
17480
|
+
padding: 16px;
|
|
17481
|
+
box-sizing: border-box;
|
|
16846
17482
|
opacity: 0;
|
|
16847
17483
|
transition: opacity 0.15s ease;
|
|
16848
17484
|
}
|
|
16849
17485
|
.fe-modal-overlay--in { opacity: 1; }
|
|
16850
17486
|
.fe-modal {
|
|
16851
|
-
background:
|
|
16852
|
-
border: 1px solid
|
|
16853
|
-
border-radius:
|
|
17487
|
+
background: var(--fe-menu-bg);
|
|
17488
|
+
border: 1px solid var(--fe-menu-border);
|
|
17489
|
+
border-radius: var(--r-button);
|
|
16854
17490
|
padding: 20px 24px;
|
|
16855
|
-
min-width: 280px;
|
|
16856
|
-
max-width:
|
|
17491
|
+
min-width: min(280px, 100%);
|
|
17492
|
+
max-width: 380px;
|
|
17493
|
+
box-sizing: border-box;
|
|
16857
17494
|
box-shadow: var(--shadow-xl);
|
|
16858
17495
|
transform: scale(0.95);
|
|
16859
17496
|
transition: transform 0.15s cubic-bezier(0.22,1,0.36,1);
|
|
@@ -16862,100 +17499,139 @@
|
|
|
16862
17499
|
.fe-modal-title {
|
|
16863
17500
|
font-size: 13px;
|
|
16864
17501
|
font-weight: 600;
|
|
16865
|
-
color:
|
|
17502
|
+
color: var(--t-bright);
|
|
16866
17503
|
margin-bottom: 8px;
|
|
17504
|
+
overflow-wrap: anywhere;
|
|
16867
17505
|
}
|
|
16868
17506
|
.fe-modal-body {
|
|
16869
17507
|
font-size: 12px;
|
|
16870
|
-
color:
|
|
17508
|
+
color: var(--t-primary);
|
|
16871
17509
|
line-height: 1.5;
|
|
16872
17510
|
margin-bottom: 18px;
|
|
17511
|
+
overflow-wrap: anywhere;
|
|
16873
17512
|
}
|
|
16874
|
-
.fe-modal-body
|
|
17513
|
+
.fe-modal-body p { margin: 0 0 6px; }
|
|
17514
|
+
.fe-modal-body p:last-child { margin-bottom: 0; }
|
|
17515
|
+
.fe-modal-body code { font-family: var(--ff-mono); color: var(--t-bright); }
|
|
16875
17516
|
.fe-modal-actions {
|
|
16876
17517
|
display: flex;
|
|
16877
17518
|
justify-content: flex-end;
|
|
17519
|
+
flex-wrap: wrap;
|
|
16878
17520
|
gap: 8px;
|
|
16879
17521
|
}
|
|
16880
17522
|
.fe-modal-btn {
|
|
16881
17523
|
padding: 6px 14px;
|
|
16882
|
-
font-size:
|
|
17524
|
+
font-size: 12px;
|
|
16883
17525
|
font-family: inherit;
|
|
16884
17526
|
border: none;
|
|
16885
|
-
border-radius:
|
|
17527
|
+
border-radius: var(--r-small);
|
|
16886
17528
|
cursor: pointer;
|
|
16887
17529
|
transition: background 0.12s, color 0.12s;
|
|
16888
17530
|
}
|
|
16889
17531
|
.fe-modal-cancel {
|
|
16890
|
-
background:
|
|
16891
|
-
color:
|
|
17532
|
+
background: var(--s-light);
|
|
17533
|
+
color: var(--t-primary);
|
|
16892
17534
|
}
|
|
16893
|
-
.fe-modal-cancel:hover { background:
|
|
17535
|
+
.fe-modal-cancel:hover { background: var(--s-medium); color: var(--t-bright); }
|
|
16894
17536
|
.fe-modal-confirm {
|
|
16895
|
-
background:
|
|
16896
|
-
color:
|
|
17537
|
+
background: var(--accent-red-bg);
|
|
17538
|
+
color: var(--fe-git-deleted);
|
|
16897
17539
|
}
|
|
16898
|
-
.fe-modal-confirm:hover { background:
|
|
17540
|
+
.fe-modal-confirm:hover { background: var(--accent-red-hover); color: var(--t-bright); }
|
|
17541
|
+
/* A question that removes nothing: its answer is not a warning. */
|
|
17542
|
+
.fe-modal--plain .fe-modal-confirm { background: var(--s-medium); color: var(--t-bright); }
|
|
17543
|
+
.fe-modal--plain .fe-modal-confirm:hover { background: var(--s-active); }
|
|
16899
17544
|
|
|
16900
17545
|
/* ── Trust-workspace modal (amber accent, different from destructive red) ── */
|
|
16901
|
-
.fe-trust-modal .fe-modal-title { color:
|
|
16902
|
-
.fe-trust-modal .fe-modal-confirm { background:
|
|
16903
|
-
.fe-trust-modal .fe-modal-confirm:hover { background:
|
|
17546
|
+
.fe-trust-modal .fe-modal-title { color: var(--accent-orange); }
|
|
17547
|
+
.fe-trust-modal .fe-modal-confirm { background: var(--accent-orange-bg); color: var(--accent-orange); }
|
|
17548
|
+
.fe-trust-modal .fe-modal-confirm:hover { background: var(--s-medium); }
|
|
16904
17549
|
.fe-trust-modal .fe-modal-confirm:disabled { opacity: 0.5; cursor: default; }
|
|
16905
17550
|
.fe-trust-path {
|
|
16906
17551
|
margin-top: 10px;
|
|
16907
17552
|
padding: 8px 10px;
|
|
16908
|
-
background: rgba(0,0,0,0.
|
|
16909
|
-
border: 1px solid
|
|
16910
|
-
border-radius:
|
|
16911
|
-
font-family: var(--
|
|
17553
|
+
background: rgba(0,0,0,0.25);
|
|
17554
|
+
border: 1px solid var(--b-subtle);
|
|
17555
|
+
border-radius: var(--r-small);
|
|
17556
|
+
font-family: var(--ff-mono);
|
|
16912
17557
|
font-size: 11px;
|
|
16913
|
-
color:
|
|
17558
|
+
color: var(--t-primary);
|
|
16914
17559
|
word-break: break-all;
|
|
16915
17560
|
}
|
|
16916
17561
|
|
|
16917
|
-
/*
|
|
16918
|
-
|
|
16919
|
-
|
|
16920
|
-
|
|
16921
|
-
|
|
16922
|
-
|
|
16923
|
-
-
|
|
16924
|
-
|
|
16925
|
-
|
|
16926
|
-
|
|
16927
|
-
|
|
16928
|
-
|
|
16929
|
-
|
|
16930
|
-
|
|
16931
|
-
|
|
16932
|
-
|
|
16933
|
-
width: 22px;
|
|
16934
|
-
height: 22px;
|
|
16935
|
-
border-radius: 50%;
|
|
16936
|
-
border: 2px solid transparent;
|
|
16937
|
-
cursor: pointer;
|
|
16938
|
-
transition: transform 0.12s, border-color 0.12s;
|
|
16939
|
-
padding: 0;
|
|
16940
|
-
}
|
|
16941
|
-
.fe-color-swatch:hover {
|
|
16942
|
-
transform: scale(1.2);
|
|
16943
|
-
border-color: rgba(255,255,255,0.3);
|
|
16944
|
-
}
|
|
16945
|
-
.fe-color-swatch--active {
|
|
16946
|
-
border-color: rgba(255,255,255,0.7);
|
|
16947
|
-
box-shadow: 0 0 0 1px rgba(255,255,255,0.2);
|
|
17562
|
+
/* A finger needs more room than a pointer: rows, buttons and menu items grow. */
|
|
17563
|
+
@media (pointer: coarse) {
|
|
17564
|
+
.fe-row { height: 40px; }
|
|
17565
|
+
.fe-toolbar { gap: 0; justify-content: flex-start; overflow-x: auto; scrollbar-width: none; }
|
|
17566
|
+
.fe-toolbar .detail-action-btn { width: 44px; height: 44px; }
|
|
17567
|
+
.fe-toolbar .detail-action-btn svg { width: 16px; height: 16px; }
|
|
17568
|
+
.fe-filter input, .fe-project-btn { min-height: 44px; font-size: 13px; }
|
|
17569
|
+
#fe-filter-clear { padding: 12px; right: 8px; }
|
|
17570
|
+
.fe-ctx-item { padding: 13px 10px; font-size: 13px; }
|
|
17571
|
+
.fe-ctx-swatches { grid-template-columns: repeat(5, 36px); gap: 10px; }
|
|
17572
|
+
.fe-color-swatch { width: 36px; height: 36px; }
|
|
17573
|
+
.fe-modal-btn { min-height: 44px; padding: 10px 16px; }
|
|
17574
|
+
.fe-note-action, .fe-notice-action, .fe-notice-close { min-height: 44px; min-width: 44px; }
|
|
17575
|
+
.fe-project-option { min-height: 44px; }
|
|
17576
|
+
.fe-resize-handle { width: 16px; }
|
|
17577
|
+
.fe-rename-input { height: 32px; font-size: 14px; }
|
|
16948
17578
|
}
|
|
16949
|
-
|
|
16950
|
-
|
|
16951
|
-
|
|
16952
|
-
|
|
16953
|
-
justify-content: center;
|
|
16954
|
-
padding: 4px 0;
|
|
17579
|
+
@media (prefers-reduced-motion: reduce) {
|
|
17580
|
+
#file-explorer-panel, .fe-ctx-flyout, .fe-ctx-flyout--out, .fe-modal-overlay, .fe-modal, .fe-git-popover, .fe-git-popover.fe-git-output-mode,
|
|
17581
|
+
.fe-row, .fe-chevron svg, .fe-color-swatch, .fe-project-chevron { transition: none; }
|
|
17582
|
+
.fe-ctx-flyout, .fe-git-popover, .fe-modal, .fe-color-swatch:hover { transform: none; }
|
|
16955
17583
|
}
|
|
16956
17584
|
|
|
16957
|
-
/* ── File Editor (standalone panel, slides from file explorer's right edge) ──
|
|
17585
|
+
/* ── File Editor (standalone panel, slides from file explorer's right edge) ──
|
|
17586
|
+
The editor inside it is CodeMirror (shared/editor/). Its colours are the
|
|
17587
|
+
--ed-* variables below, read by shared/editor/editor-theme.js: a skin
|
|
17588
|
+
restyles the editor by overriding them. */
|
|
16958
17589
|
.fe-editor-panel {
|
|
17590
|
+
--ed-bg: rgb(16, 16, 18);
|
|
17591
|
+
--ed-fg: #8a8ea0;
|
|
17592
|
+
--ed-caret: var(--t-bright);
|
|
17593
|
+
--ed-selection: rgba(99,102,241,0.25);
|
|
17594
|
+
--ed-line-active: rgba(255,255,255,0.03);
|
|
17595
|
+
--ed-gutter-bg: rgba(0,0,0,0.1);
|
|
17596
|
+
--ed-gutter-fg: rgba(255,255,255,0.15);
|
|
17597
|
+
--ed-gutter-fg-active: rgba(255,255,255,0.5);
|
|
17598
|
+
--ed-gutter-border: rgba(255,255,255,0.04);
|
|
17599
|
+
/* Mono syntax tokens — cool gray palette */
|
|
17600
|
+
--ed-kw: #cccdd6;
|
|
17601
|
+
--ed-str: #6e7a86;
|
|
17602
|
+
--ed-cm: #5a6a5a;
|
|
17603
|
+
--ed-num: #8c94a8;
|
|
17604
|
+
--ed-fn: #b0b4c4;
|
|
17605
|
+
--ed-op: #585c6c;
|
|
17606
|
+
--ed-tag: #a0a4b4;
|
|
17607
|
+
--ed-attr: #787c8c;
|
|
17608
|
+
--ed-prop: #9498a8;
|
|
17609
|
+
--ed-br: #8a7a50;
|
|
17610
|
+
--ed-match: rgba(255,255,255,0.10);
|
|
17611
|
+
--ed-match-current: rgba(99,102,241,0.35);
|
|
17612
|
+
--ed-ghost: rgba(255,255,255,0.28);
|
|
17613
|
+
--ed-add: #9fe3b4;
|
|
17614
|
+
--ed-add-bg: rgba(95,207,131,0.10);
|
|
17615
|
+
--ed-del: #f0a3a3;
|
|
17616
|
+
--ed-del-bg: rgba(239,112,112,0.10);
|
|
17617
|
+
--ed-error: var(--stg-err, #fca5a5);
|
|
17618
|
+
--ed-warn: #fbbf24;
|
|
17619
|
+
/* Spaces and tabs made visible, and the minimap's box over the part in view */
|
|
17620
|
+
--ed-whitespace: rgba(255,255,255,0.2);
|
|
17621
|
+
--ed-minimap-box: rgba(255,255,255,0.06);
|
|
17622
|
+
--ed-minimap-box-active: rgba(255,255,255,0.1);
|
|
17623
|
+
--ed-minimap-edge: var(--b-hover);
|
|
17624
|
+
--ed-minimap-match: var(--fw-focus);
|
|
17625
|
+
/* Indent guides and the completion list take existing tokens. */
|
|
17626
|
+
--ed-guide: var(--b-light);
|
|
17627
|
+
--ed-guide-active: var(--b-visible);
|
|
17628
|
+
--ed-menu-bg: #16161a;
|
|
17629
|
+
--ed-menu-fg: var(--t-primary);
|
|
17630
|
+
--ed-menu-fg-active: var(--t-bright);
|
|
17631
|
+
--ed-menu-border: rgba(255,255,255,0.10);
|
|
17632
|
+
--ed-menu-hover: var(--s-hover);
|
|
17633
|
+
--ed-menu-radius: 8px;
|
|
17634
|
+
--ed-menu-shadow: 0 12px 32px rgba(0,0,0,0.4);
|
|
16959
17635
|
position: fixed;
|
|
16960
17636
|
top: var(--navbar-height, 48px);
|
|
16961
17637
|
left: calc(var(--sidebar-total-width, 0px));
|
|
@@ -16965,7 +17641,7 @@
|
|
|
16965
17641
|
z-index: 198;
|
|
16966
17642
|
display: flex;
|
|
16967
17643
|
flex-direction: column;
|
|
16968
|
-
background:
|
|
17644
|
+
background: var(--ed-bg);
|
|
16969
17645
|
border-left: 1px solid rgba(255,255,255,0.04);
|
|
16970
17646
|
box-shadow: var(--shadow-md);
|
|
16971
17647
|
transform: translateX(40px);
|
|
@@ -16995,6 +17671,110 @@
|
|
|
16995
17671
|
flex-shrink: 0;
|
|
16996
17672
|
}
|
|
16997
17673
|
|
|
17674
|
+
/* Bars under the header (the file changed on disk…): the banner's geometry, neutral */
|
|
17675
|
+
.fe-editor-bar {
|
|
17676
|
+
display: flex;
|
|
17677
|
+
align-items: center;
|
|
17678
|
+
justify-content: center;
|
|
17679
|
+
flex-wrap: wrap;
|
|
17680
|
+
gap: 4px 14px;
|
|
17681
|
+
padding: 6px 12px;
|
|
17682
|
+
font-size: 12px;
|
|
17683
|
+
color: var(--t-primary);
|
|
17684
|
+
background: rgba(255,255,255,0.04);
|
|
17685
|
+
border-bottom: 1px solid var(--b-subtle);
|
|
17686
|
+
flex-shrink: 0;
|
|
17687
|
+
}
|
|
17688
|
+
.fe-editor-bar-action {
|
|
17689
|
+
background: none; border: none; padding: 0; cursor: pointer;
|
|
17690
|
+
font: inherit; font-weight: 600; color: var(--t-bright);
|
|
17691
|
+
text-decoration: underline; text-underline-offset: 2px;
|
|
17692
|
+
transition: color 0.15s;
|
|
17693
|
+
}
|
|
17694
|
+
.fe-editor-bar-action:hover { color: #fff; }
|
|
17695
|
+
|
|
17696
|
+
/* Tab strip (shared/editor/editor-tabs.js): a 28px row under the header, there while two or more files are open */
|
|
17697
|
+
.fe-editor-tabs {
|
|
17698
|
+
display: flex;
|
|
17699
|
+
align-items: stretch;
|
|
17700
|
+
height: 28px;
|
|
17701
|
+
flex-shrink: 0;
|
|
17702
|
+
overflow-x: auto;
|
|
17703
|
+
overflow-y: hidden;
|
|
17704
|
+
scrollbar-width: none;
|
|
17705
|
+
border-bottom: 1px solid rgba(255,255,255,0.04);
|
|
17706
|
+
background: rgba(0,0,0,0.1);
|
|
17707
|
+
}
|
|
17708
|
+
.fe-editor-tabs[hidden] { display: none; }
|
|
17709
|
+
.fe-editor-tabs::-webkit-scrollbar { display: none; }
|
|
17710
|
+
.fe-editor-tab {
|
|
17711
|
+
position: relative;
|
|
17712
|
+
display: flex;
|
|
17713
|
+
align-items: center;
|
|
17714
|
+
gap: 6px;
|
|
17715
|
+
flex: 0 0 auto;
|
|
17716
|
+
max-width: 240px;
|
|
17717
|
+
padding: 0 6px 0 10px;
|
|
17718
|
+
font-size: 11px;
|
|
17719
|
+
font-family: var(--ff-mono);
|
|
17720
|
+
color: var(--t-secondary);
|
|
17721
|
+
border-right: 1px solid rgba(255,255,255,0.04);
|
|
17722
|
+
cursor: pointer;
|
|
17723
|
+
user-select: none;
|
|
17724
|
+
transition: color 0.15s, background-color 0.15s;
|
|
17725
|
+
}
|
|
17726
|
+
.fe-editor-tab:hover { color: var(--t-primary); background: rgba(255,255,255,0.03); }
|
|
17727
|
+
.fe-editor-tab.active { color: var(--t-bright); }
|
|
17728
|
+
.fe-editor-tab.active::after {
|
|
17729
|
+
content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
|
|
17730
|
+
background: var(--fw-focus);
|
|
17731
|
+
}
|
|
17732
|
+
.fe-editor-tab.dragging { opacity: 0.5; }
|
|
17733
|
+
/* A tab the next file may take says so in italics */
|
|
17734
|
+
.fe-editor-tab.preview .fe-editor-tab-name { font-style: italic; }
|
|
17735
|
+
.fe-editor-tab-icon { display: flex; flex-shrink: 0; }
|
|
17736
|
+
.fe-editor-tab-icon svg {
|
|
17737
|
+
width: 12px; height: 12px; fill: none;
|
|
17738
|
+
stroke: currentColor; stroke-width: 2;
|
|
17739
|
+
stroke-linecap: round; stroke-linejoin: round;
|
|
17740
|
+
}
|
|
17741
|
+
.fe-editor-tab-icon img { width: 12px; height: 12px; }
|
|
17742
|
+
.fe-editor-tab:not(.active) .fe-editor-tab-icon { opacity: 0.6; }
|
|
17743
|
+
/* A plan or a changelog: the banner's accent on its icon, and its kind after the name */
|
|
17744
|
+
.fe-editor-tab.marked .fe-editor-tab-icon { color: var(--accent, #06d6a0); }
|
|
17745
|
+
.fe-editor-tab-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
17746
|
+
.fe-editor-tab-hint,
|
|
17747
|
+
.fe-editor-tab-mark {
|
|
17748
|
+
flex-shrink: 2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
17749
|
+
font-size: 10px; color: var(--t-secondary);
|
|
17750
|
+
}
|
|
17751
|
+
.fe-editor-tab-close {
|
|
17752
|
+
position: relative; display: flex; align-items: center; justify-content: center;
|
|
17753
|
+
width: 16px; height: 16px; flex-shrink: 0; padding: 0;
|
|
17754
|
+
background: none; border: none; border-radius: 3px; cursor: pointer; color: inherit;
|
|
17755
|
+
}
|
|
17756
|
+
.fe-editor-tab-close svg {
|
|
17757
|
+
width: 10px; height: 10px; fill: none;
|
|
17758
|
+
stroke: currentColor; stroke-width: 2; stroke-linecap: round;
|
|
17759
|
+
opacity: 0; transition: opacity 0.12s;
|
|
17760
|
+
}
|
|
17761
|
+
.fe-editor-tab:hover .fe-editor-tab-close svg,
|
|
17762
|
+
.fe-editor-tab.active .fe-editor-tab-close svg,
|
|
17763
|
+
.fe-editor-tab-close:focus-visible svg { opacity: 0.7; }
|
|
17764
|
+
.fe-editor-tab-close:hover { background: rgba(255,255,255,0.08); }
|
|
17765
|
+
.fe-editor-tab .fe-editor-tab-close:hover svg { opacity: 1; }
|
|
17766
|
+
/* Unsaved: the header's dot in place of the close mark, which comes back under the pointer */
|
|
17767
|
+
.fe-editor-tab-dot {
|
|
17768
|
+
position: absolute; width: 7px; height: 7px; border-radius: 50%;
|
|
17769
|
+
background: #ffca28; opacity: 0; transition: opacity 0.12s;
|
|
17770
|
+
}
|
|
17771
|
+
.fe-editor-tab.dirty .fe-editor-tab-dot { opacity: 1; }
|
|
17772
|
+
.fe-editor-tab.dirty .fe-editor-tab-close svg { opacity: 0; }
|
|
17773
|
+
.fe-editor-tab.dirty .fe-editor-tab-close:hover .fe-editor-tab-dot { opacity: 0; }
|
|
17774
|
+
.fe-editor-tab.dirty .fe-editor-tab-close:hover svg { opacity: 1; }
|
|
17775
|
+
/* The strip clips: the focus ring is drawn inside the tab */
|
|
17776
|
+
body .fe-editor-panel .fe-editor-tabs .fe-editor-tab.fe-editor-tab:focus-visible { outline-offset: -2px; }
|
|
17777
|
+
|
|
16998
17778
|
/* Header */
|
|
16999
17779
|
.fe-editor-header {
|
|
17000
17780
|
display: flex;
|
|
@@ -17028,7 +17808,7 @@
|
|
|
17028
17808
|
.fe-editor-dot.dirty { background: #ffca28; }
|
|
17029
17809
|
.fe-editor-filepath {
|
|
17030
17810
|
font-size: 11px; font-family: var(--ff-mono);
|
|
17031
|
-
color: var(--t-
|
|
17811
|
+
color: var(--t-secondary); overflow: hidden;
|
|
17032
17812
|
text-overflow: ellipsis; white-space: nowrap;
|
|
17033
17813
|
direction: rtl; text-align: left;
|
|
17034
17814
|
}
|
|
@@ -17045,6 +17825,7 @@
|
|
|
17045
17825
|
.fe-editor-action:hover { background: rgba(255,255,255,0.05); }
|
|
17046
17826
|
.fe-editor-action:hover svg { stroke: var(--t-bright); }
|
|
17047
17827
|
.fe-editor-action.active svg { stroke: var(--accent-blue, #6366f1); }
|
|
17828
|
+
.fe-editor-action[hidden] { display: none; }
|
|
17048
17829
|
.fe-editor-help-wrap { position: relative; display: flex; }
|
|
17049
17830
|
.fe-editor-help-btn svg circle,
|
|
17050
17831
|
.fe-editor-help-btn svg path,
|
|
@@ -17066,6 +17847,8 @@
|
|
|
17066
17847
|
border-radius: 8px;
|
|
17067
17848
|
padding: 10px 14px;
|
|
17068
17849
|
min-width: 200px;
|
|
17850
|
+
max-height: min(60vh, 440px);
|
|
17851
|
+
overflow-y: auto;
|
|
17069
17852
|
z-index: 100;
|
|
17070
17853
|
backdrop-filter: blur(12px);
|
|
17071
17854
|
box-shadow: var(--shadow-md);
|
|
@@ -17103,6 +17886,7 @@
|
|
|
17103
17886
|
.fe-editor-kb span {
|
|
17104
17887
|
color: var(--t-muted);
|
|
17105
17888
|
margin-left: 12px;
|
|
17889
|
+
white-space: nowrap;
|
|
17106
17890
|
}
|
|
17107
17891
|
.fe-editor-sep {
|
|
17108
17892
|
width: 1px; height: 14px;
|
|
@@ -17123,7 +17907,7 @@
|
|
|
17123
17907
|
#fe-editor-close { border-color: rgba(255,82,82,0.35); color: var(--accent-red); }
|
|
17124
17908
|
#fe-editor-close:hover:not(:disabled) { border-color: rgba(255,82,82,0.55); color: var(--accent-red); background: var(--accent-red-bg); }
|
|
17125
17909
|
|
|
17126
|
-
/* Editor body —
|
|
17910
|
+
/* Editor body — CodeMirror, the Markdown preview, or a message in their place */
|
|
17127
17911
|
.fe-editor-body {
|
|
17128
17912
|
flex: 1;
|
|
17129
17913
|
display: flex;
|
|
@@ -17131,89 +17915,44 @@
|
|
|
17131
17915
|
position: relative;
|
|
17132
17916
|
overflow: hidden;
|
|
17133
17917
|
}
|
|
17134
|
-
.fe-editor-
|
|
17135
|
-
|
|
17136
|
-
|
|
17137
|
-
|
|
17138
|
-
text-align: right;
|
|
17139
|
-
font-family: 'JetBrains Mono', 'SF Mono', 'Consolas', monospace;
|
|
17140
|
-
font-size: 12px;
|
|
17141
|
-
line-height: 20px;
|
|
17142
|
-
color: rgba(255,255,255,0.15);
|
|
17143
|
-
background: rgba(0,0,0,0.1);
|
|
17144
|
-
border-right: 1px solid rgba(255,255,255,0.04);
|
|
17145
|
-
overflow: hidden;
|
|
17146
|
-
user-select: none;
|
|
17147
|
-
pointer-events: none;
|
|
17148
|
-
}
|
|
17149
|
-
.fe-editor-gutter div {
|
|
17150
|
-
padding-right: 10px;
|
|
17151
|
-
height: 20px;
|
|
17152
|
-
}
|
|
17153
|
-
.fe-editor-highlight {
|
|
17154
|
-
position: absolute;
|
|
17155
|
-
top: 0;
|
|
17156
|
-
left: 48px;
|
|
17157
|
-
right: 0;
|
|
17158
|
-
bottom: 0;
|
|
17159
|
-
margin: 0;
|
|
17160
|
-
padding: 10px 16px;
|
|
17161
|
-
font-family: 'JetBrains Mono', 'SF Mono', 'Consolas', monospace;
|
|
17162
|
-
font-size: 12px;
|
|
17163
|
-
line-height: 20px;
|
|
17164
|
-
white-space: pre-wrap;
|
|
17165
|
-
overflow-wrap: break-word;
|
|
17166
|
-
overflow: hidden;
|
|
17167
|
-
pointer-events: none;
|
|
17168
|
-
color: #8a8ea0;
|
|
17169
|
-
tab-size: 2;
|
|
17170
|
-
z-index: 1;
|
|
17171
|
-
border: none;
|
|
17172
|
-
background: transparent;
|
|
17918
|
+
.fe-editor-host {
|
|
17919
|
+
flex: 1;
|
|
17920
|
+
min-width: 0;
|
|
17921
|
+
min-height: 0;
|
|
17173
17922
|
}
|
|
17174
|
-
.fe-editor-
|
|
17175
|
-
|
|
17176
|
-
|
|
17177
|
-
|
|
17178
|
-
|
|
17923
|
+
.fe-editor-host[hidden],
|
|
17924
|
+
.fe-editor-message[hidden] { display: none; }
|
|
17925
|
+
/* The scroll bar the editor always had: 6px, a darker track */
|
|
17926
|
+
.fe-editor-host .cm-scroller::-webkit-scrollbar { width: 6px; height: 6px; }
|
|
17927
|
+
.fe-editor-host .cm-scroller::-webkit-scrollbar-track { background: rgba(0,0,0,0.15); }
|
|
17928
|
+
.fe-editor-host .cm-scroller::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.2); border-radius: 3px; }
|
|
17929
|
+
.fe-editor-host .cm-scroller::-webkit-scrollbar-corner { background: transparent; }
|
|
17930
|
+
/* Fold arrows: the folded ones always, the rest while the pointer is over the gutter */
|
|
17931
|
+
.fe-editor-fold { display: inline-flex; align-items: center; justify-content: center; height: 100%; }
|
|
17932
|
+
.fe-editor-fold svg {
|
|
17933
|
+
width: 9px; height: 9px; fill: none;
|
|
17934
|
+
stroke: currentColor; stroke-width: 2.5;
|
|
17935
|
+
stroke-linecap: round; stroke-linejoin: round;
|
|
17179
17936
|
}
|
|
17180
|
-
.fe-editor-
|
|
17181
|
-
|
|
17182
|
-
|
|
17183
|
-
.fe-editor-
|
|
17184
|
-
background: rgba(99,102,241,0.25);
|
|
17185
|
-
}
|
|
17186
|
-
/* Mono syntax tokens — cool gray palette */
|
|
17187
|
-
.sh-kw { color: #cccdd6; }
|
|
17188
|
-
.sh-str { color: #6e7a86; }
|
|
17189
|
-
.sh-cm { color: #5a6a5a; font-style: italic; }
|
|
17190
|
-
.sh-num { color: #8c94a8; }
|
|
17191
|
-
.sh-fn { color: #b0b4c4; }
|
|
17192
|
-
.sh-op { color: #585c6c; }
|
|
17193
|
-
.sh-tag { color: #a0a4b4; }
|
|
17194
|
-
.sh-attr { color: #787c8c; }
|
|
17195
|
-
.sh-prop { color: #9498a8; }
|
|
17196
|
-
.sh-br { color: #8a7a50; }
|
|
17197
|
-
.fe-editor-textarea {
|
|
17937
|
+
.fe-editor-fold--open { opacity: 0; transition: opacity 0.12s; }
|
|
17938
|
+
.fe-editor-host .cm-gutters:hover .fe-editor-fold--open { opacity: 1; }
|
|
17939
|
+
/* A file the editor does not open, or an editor that did not load */
|
|
17940
|
+
.fe-editor-message {
|
|
17198
17941
|
flex: 1;
|
|
17199
|
-
|
|
17200
|
-
|
|
17201
|
-
|
|
17202
|
-
|
|
17942
|
+
display: flex;
|
|
17943
|
+
flex-direction: column;
|
|
17944
|
+
align-items: center;
|
|
17945
|
+
justify-content: center;
|
|
17946
|
+
gap: 12px;
|
|
17947
|
+
padding: 24px;
|
|
17948
|
+
text-align: center;
|
|
17949
|
+
}
|
|
17950
|
+
.fe-editor-message-text {
|
|
17951
|
+
max-width: 68ch;
|
|
17203
17952
|
font-size: 12px;
|
|
17204
|
-
line-height:
|
|
17205
|
-
color:
|
|
17206
|
-
|
|
17207
|
-
resize: none;
|
|
17208
|
-
outline: none;
|
|
17209
|
-
tab-size: 2;
|
|
17210
|
-
white-space: pre-wrap;
|
|
17211
|
-
overflow-wrap: break-word;
|
|
17212
|
-
overflow-x: auto;
|
|
17213
|
-
overflow-y: auto;
|
|
17214
|
-
min-height: 0;
|
|
17215
|
-
position: relative;
|
|
17216
|
-
z-index: 2;
|
|
17953
|
+
line-height: 1.45;
|
|
17954
|
+
color: var(--t-muted);
|
|
17955
|
+
overflow-wrap: anywhere;
|
|
17217
17956
|
}
|
|
17218
17957
|
|
|
17219
17958
|
/* Status bar */
|
|
@@ -17232,6 +17971,183 @@
|
|
|
17232
17971
|
.fe-editor-statusbar .fe-editor-sep {
|
|
17233
17972
|
height: 10px;
|
|
17234
17973
|
}
|
|
17974
|
+
.fe-editor-statusbar.is-empty > * { visibility: hidden; }
|
|
17975
|
+
|
|
17976
|
+
/* Status items that open a list (shared/editor/editor-statusbar.js): the bar's own text,
|
|
17977
|
+
with the hover of the AI chip. The negative margin keeps the bar's geometry. */
|
|
17978
|
+
.fe-editor-status-btn {
|
|
17979
|
+
margin: -2px -5px; padding: 2px 5px;
|
|
17980
|
+
background: none; border: none; border-radius: 3px; cursor: pointer;
|
|
17981
|
+
font: inherit; color: var(--t-secondary); white-space: nowrap;
|
|
17982
|
+
transition: color 0.15s, background-color 0.15s;
|
|
17983
|
+
}
|
|
17984
|
+
.fe-editor-status-btn:hover,
|
|
17985
|
+
.fe-editor-status-btn[aria-expanded="true"] { background: rgba(255,255,255,0.05); color: var(--t-primary); }
|
|
17986
|
+
|
|
17987
|
+
/* Menus of the editor panel (shared/editor/editor-menu.js): a tab's menu and the status bar's
|
|
17988
|
+
lists, in the menu treatment of the completion list and the AI popover. */
|
|
17989
|
+
.fe-editor-menu {
|
|
17990
|
+
position: absolute; z-index: 120;
|
|
17991
|
+
min-width: 168px; max-width: min(320px, calc(100% - 16px));
|
|
17992
|
+
padding: 6px;
|
|
17993
|
+
background: var(--ed-menu-bg); color: var(--ed-menu-fg);
|
|
17994
|
+
border: 1px solid var(--ed-menu-border); border-radius: var(--ed-menu-radius);
|
|
17995
|
+
box-shadow: var(--ed-menu-shadow);
|
|
17996
|
+
font-family: var(--ff-mono); font-size: 11px; line-height: 1.45;
|
|
17997
|
+
text-align: left; cursor: default;
|
|
17998
|
+
}
|
|
17999
|
+
body .fe-editor-panel .fe-editor-menu.fe-editor-menu.fe-editor-menu:focus-visible { outline: none; }
|
|
18000
|
+
.fe-editor-menu-search {
|
|
18001
|
+
display: block; width: 100%; box-sizing: border-box; margin-bottom: 6px;
|
|
18002
|
+
background: rgba(0,0,0,0.2);
|
|
18003
|
+
border: 1px solid rgba(255,255,255,0.08);
|
|
18004
|
+
border-radius: 4px;
|
|
18005
|
+
padding: 4px 8px;
|
|
18006
|
+
font-family: var(--ff-mono);
|
|
18007
|
+
font-size: 11px;
|
|
18008
|
+
color: var(--t-bright);
|
|
18009
|
+
outline: none;
|
|
18010
|
+
}
|
|
18011
|
+
.fe-editor-menu-search:focus { border-color: rgba(99,102,241,0.4); }
|
|
18012
|
+
.fe-editor-menu-list { max-height: min(264px, 50vh); overflow-y: auto; }
|
|
18013
|
+
.fe-editor-menu-list::-webkit-scrollbar { width: 6px; }
|
|
18014
|
+
.fe-editor-menu-list::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.2); border-radius: 3px; }
|
|
18015
|
+
.fe-editor-menu-item {
|
|
18016
|
+
display: flex; align-items: center; gap: 6px;
|
|
18017
|
+
padding: 3px 8px; border-radius: 4px;
|
|
18018
|
+
white-space: nowrap; cursor: pointer;
|
|
18019
|
+
}
|
|
18020
|
+
.fe-editor-menu-item.active { background: var(--ed-menu-hover); color: var(--ed-menu-fg-active); }
|
|
18021
|
+
/* The menu itself shows no focus ring: the row the keyboard is on does, while the menu has the keyboard. */
|
|
18022
|
+
.fe-editor-menu:focus-within .fe-editor-menu-item.active { outline: 2px solid var(--fw-focus); outline-offset: -2px; }
|
|
18023
|
+
.fe-editor-menu-item[aria-disabled="true"] { opacity: 0.4; cursor: default; }
|
|
18024
|
+
.fe-editor-menu-check { width: 10px; flex-shrink: 0; color: var(--t-secondary); }
|
|
18025
|
+
.fe-editor-menu-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
18026
|
+
.fe-editor-menu-hint { flex-shrink: 0; color: var(--t-secondary); }
|
|
18027
|
+
.fe-editor-menu-sep { height: 1px; margin: 4px 2px; background: rgba(255,255,255,0.06); }
|
|
18028
|
+
.fe-editor-menu-empty { padding: 6px 8px; color: var(--t-secondary); }
|
|
18029
|
+
/* The command palette and go-to-file (shared/editor/editor-palette.js): the same menu, wider, at the top of the panel */
|
|
18030
|
+
.fe-editor-menu.fe-editor-palette { width: min(460px, calc(100% - 16px)); max-width: none; }
|
|
18031
|
+
.fe-editor-palette .fe-editor-menu-list { max-height: min(308px, 50vh); }
|
|
18032
|
+
.fe-editor-palette .fe-editor-menu-check { display: none; }
|
|
18033
|
+
.fe-editor-palette .fe-editor-menu-label { flex: 0 1 auto; }
|
|
18034
|
+
.fe-editor-palette .fe-editor-menu-hint { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; text-align: right; }
|
|
18035
|
+
|
|
18036
|
+
/* A comparison's button that puts one difference back (shared/editor/editor-compare.js):
|
|
18037
|
+
the find bar's Replace button */
|
|
18038
|
+
.fe-editor-host .cm-deletedChunk .fe-editor-compare-revert {
|
|
18039
|
+
margin: 2px 0; padding: 0 8px;
|
|
18040
|
+
background: rgba(255,255,255,0.04);
|
|
18041
|
+
border: 1px solid rgba(255,255,255,0.08);
|
|
18042
|
+
border-radius: 4px;
|
|
18043
|
+
font-family: var(--ff-mono); font-size: 10px; line-height: 14px;
|
|
18044
|
+
color: var(--t-primary);
|
|
18045
|
+
cursor: pointer;
|
|
18046
|
+
transition: all 0.12s;
|
|
18047
|
+
}
|
|
18048
|
+
.fe-editor-host .cm-deletedChunk .fe-editor-compare-revert:hover {
|
|
18049
|
+
background: rgba(255,255,255,0.08);
|
|
18050
|
+
color: var(--t-primary);
|
|
18051
|
+
border-color: rgba(255,255,255,0.14);
|
|
18052
|
+
}
|
|
18053
|
+
|
|
18054
|
+
@media (prefers-reduced-motion: reduce) {
|
|
18055
|
+
.fe-editor-tab, .fe-editor-tab-close svg, .fe-editor-tab-dot, .fe-editor-status-btn,
|
|
18056
|
+
.fe-editor-host .cm-deletedChunk .fe-editor-compare-revert { transition: none; }
|
|
18057
|
+
}
|
|
18058
|
+
/* Touch: the strip and the status items keep the 44px target of the panel's header controls */
|
|
18059
|
+
@media (pointer: coarse) {
|
|
18060
|
+
.fe-editor-tabs { height: 44px; }
|
|
18061
|
+
.fe-editor-tab-close { width: 28px; height: 28px; }
|
|
18062
|
+
.fe-editor-status-btn { margin: -12px -5px; padding: 12px 5px; }
|
|
18063
|
+
}
|
|
18064
|
+
|
|
18065
|
+
/* AI autocomplete: the status-bar chip and its popover (shared/editor/editor-ai.js).
|
|
18066
|
+
Built only when the server has the feature. The dot says the state, the tooltip names it:
|
|
18067
|
+
hollow = off, filled = ready, pulsing = asking the model, amber = a problem. */
|
|
18068
|
+
.fe-editor-ai { position: relative; display: inline-flex; align-items: center; }
|
|
18069
|
+
.fe-editor-ai[hidden], .fe-editor-statusbar .fe-editor-sep[hidden], .fe-editor-ai-popover[hidden], .fe-editor-ai-popover [hidden] { display: none; }
|
|
18070
|
+
.fe-editor-ai-chip {
|
|
18071
|
+
display: inline-flex; align-items: center; gap: 5px;
|
|
18072
|
+
margin: -2px -5px; padding: 2px 5px;
|
|
18073
|
+
background: none; border: none; border-radius: 3px; cursor: pointer;
|
|
18074
|
+
font: inherit; color: var(--t-secondary);
|
|
18075
|
+
transition: color 0.15s, background-color 0.15s;
|
|
18076
|
+
}
|
|
18077
|
+
.fe-editor-ai-chip:hover, .fe-editor-ai-chip[aria-expanded="true"] { background: rgba(255,255,255,0.05); color: var(--t-primary); }
|
|
18078
|
+
.fe-editor-ai-dot {
|
|
18079
|
+
width: 5px; height: 5px; border-radius: 50%; flex-shrink: 0;
|
|
18080
|
+
background: transparent; box-shadow: inset 0 0 0 1px var(--t-secondary);
|
|
18081
|
+
transition: background-color 0.15s;
|
|
18082
|
+
}
|
|
18083
|
+
.fe-editor-ai-chip[data-state="ready"] .fe-editor-ai-dot,
|
|
18084
|
+
.fe-editor-ai-chip[data-state="thinking"] .fe-editor-ai-dot { background: var(--t-primary); box-shadow: none; }
|
|
18085
|
+
.fe-editor-ai-chip[data-state="thinking"] .fe-editor-ai-dot { animation: fe-editor-ai-pulse 1s ease-in-out infinite; }
|
|
18086
|
+
.fe-editor-ai-chip[data-state="problem"] .fe-editor-ai-dot { background: var(--ed-warn); box-shadow: none; }
|
|
18087
|
+
@keyframes fe-editor-ai-pulse {
|
|
18088
|
+
0%, 100% { opacity: 0.5; }
|
|
18089
|
+
50% { opacity: 1; }
|
|
18090
|
+
}
|
|
18091
|
+
body.ui-interacting .fe-editor-ai-dot { animation-play-state: paused; }
|
|
18092
|
+
.fe-editor-ai-popover {
|
|
18093
|
+
/* The accent as a fill white reads on (Settings' recipe for a checked control): the raw accent can be as light as the knob. */
|
|
18094
|
+
--stg-accent-fill: hsl(var(--accent-hue, 199), var(--accent-saturation, 92%), 36%);
|
|
18095
|
+
position: absolute; right: -6px; bottom: calc(100% + 8px);
|
|
18096
|
+
width: 292px; max-width: calc(100vw - 32px);
|
|
18097
|
+
padding: 10px 12px 8px;
|
|
18098
|
+
background: var(--ed-menu-bg); color: var(--ed-menu-fg);
|
|
18099
|
+
border: 1px solid var(--ed-menu-border); border-radius: var(--ed-menu-radius);
|
|
18100
|
+
box-shadow: var(--ed-menu-shadow);
|
|
18101
|
+
z-index: 100;
|
|
18102
|
+
font-family: inherit; font-size: 12px; line-height: 1.45; letter-spacing: 0;
|
|
18103
|
+
text-align: left; cursor: default;
|
|
18104
|
+
}
|
|
18105
|
+
.fe-editor-ai-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
|
|
18106
|
+
.fe-editor-ai-title { font-weight: 600; color: var(--ed-menu-fg-active); }
|
|
18107
|
+
.fe-editor-ai-switch {
|
|
18108
|
+
position: relative; width: 26px; height: 15px; min-width: 26px; padding: 0; flex-shrink: 0;
|
|
18109
|
+
border: 0; border-radius: 999px; cursor: pointer;
|
|
18110
|
+
background: rgba(255,255,255,0.16); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.22);
|
|
18111
|
+
transition: background-color 0.15s ease;
|
|
18112
|
+
}
|
|
18113
|
+
.fe-editor-ai-switch::after {
|
|
18114
|
+
content: ''; position: absolute; top: 1px; left: 1px; width: 13px; height: 13px; border-radius: 50%;
|
|
18115
|
+
background: #e8e8ea; box-shadow: 0 1px 2px rgba(0,0,0,0.35);
|
|
18116
|
+
transition: left 0.15s ease;
|
|
18117
|
+
}
|
|
18118
|
+
@supports (color: oklch(from red l c h)) {
|
|
18119
|
+
.fe-editor-ai-popover { --stg-accent-fill: oklch(from var(--accent-blue) 0.5 c h); }
|
|
18120
|
+
}
|
|
18121
|
+
.fe-editor-ai-switch[aria-checked="true"] { background: var(--stg-accent-fill); box-shadow: none; }
|
|
18122
|
+
.fe-editor-ai-switch[aria-checked="true"]::after { left: 12px; background: #fff; }
|
|
18123
|
+
.fe-editor-ai-note, .fe-editor-ai-status { margin: 6px 0 0; color: var(--t-secondary); overflow-wrap: anywhere; }
|
|
18124
|
+
.fe-editor-ai-status { color: var(--t-secondary); }
|
|
18125
|
+
.fe-editor-ai-status[data-state="problem"] { color: var(--ed-warn); }
|
|
18126
|
+
.fe-editor-ai-row { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
|
|
18127
|
+
.fe-editor-ai-row label { flex-shrink: 0; color: var(--t-secondary); }
|
|
18128
|
+
.fe-editor-ai-row .fe-editor-btn { flex-shrink: 0; white-space: nowrap; color: var(--t-secondary); }
|
|
18129
|
+
.fe-editor-ai-row .fe-editor-btn:hover:not(:disabled) { color: var(--t-primary); }
|
|
18130
|
+
.fe-editor-ai-select {
|
|
18131
|
+
flex: 1; min-width: 0; height: 22px; padding: 0 6px;
|
|
18132
|
+
background: rgba(0,0,0,0.2); color: var(--t-bright);
|
|
18133
|
+
border: 1px solid rgba(255,255,255,0.08); border-radius: 4px;
|
|
18134
|
+
font-family: var(--ff-mono); font-size: 11px;
|
|
18135
|
+
}
|
|
18136
|
+
.fe-editor-ai-result { min-width: 0; color: var(--t-secondary); overflow-wrap: anywhere; }
|
|
18137
|
+
.fe-editor-ai-keys { margin-top: 8px; padding-top: 6px; border-top: 1px solid rgba(255,255,255,0.06); }
|
|
18138
|
+
.fe-editor-ai-keys .fe-editor-kb span { color: var(--t-secondary); }
|
|
18139
|
+
.fe-editor-ai-link {
|
|
18140
|
+
display: inline-block; margin-top: 6px; padding: 2px 0;
|
|
18141
|
+
background: none; border: none; cursor: pointer;
|
|
18142
|
+
font: inherit; color: var(--t-secondary);
|
|
18143
|
+
text-decoration: underline; text-underline-offset: 2px;
|
|
18144
|
+
transition: color 0.15s;
|
|
18145
|
+
}
|
|
18146
|
+
.fe-editor-ai-link:hover { color: var(--t-bright); }
|
|
18147
|
+
@media (prefers-reduced-motion: reduce) {
|
|
18148
|
+
.fe-editor-ai-dot { animation: none !important; }
|
|
18149
|
+
.fe-editor-ai-chip, .fe-editor-ai-dot, .fe-editor-ai-switch, .fe-editor-ai-switch::after, .fe-editor-ai-link { transition: none; }
|
|
18150
|
+
}
|
|
17235
18151
|
|
|
17236
18152
|
/* View toggle (Raw/Preview) */
|
|
17237
18153
|
.fe-editor-view-toggle {
|
|
@@ -17332,10 +18248,23 @@
|
|
|
17332
18248
|
.fe-editor-find-input:focus {
|
|
17333
18249
|
border-color: rgba(99,102,241,0.4);
|
|
17334
18250
|
}
|
|
18251
|
+
.fe-editor-find-input.invalid,
|
|
18252
|
+
.fe-editor-goto-input.invalid { border-color: var(--ed-error); }
|
|
18253
|
+
.fe-editor-find-toggle {
|
|
18254
|
+
background: none; border: 1px solid transparent; cursor: pointer;
|
|
18255
|
+
min-width: 22px; padding: 2px 4px; border-radius: 3px;
|
|
18256
|
+
font-family: var(--ff-mono); font-size: 10px; line-height: 14px;
|
|
18257
|
+
color: var(--t-secondary);
|
|
18258
|
+
transition: color 0.12s, background-color 0.12s, border-color 0.12s;
|
|
18259
|
+
}
|
|
18260
|
+
.fe-editor-find-toggle:hover { background: rgba(255,255,255,0.05); color: var(--t-bright); }
|
|
18261
|
+
.fe-editor-find-toggle[aria-pressed="true"] {
|
|
18262
|
+
background: rgba(99,102,241,0.12); border-color: rgba(99,102,241,0.35); color: #a5b4fc;
|
|
18263
|
+
}
|
|
17335
18264
|
.fe-editor-find-count {
|
|
17336
18265
|
font-size: 10px;
|
|
17337
18266
|
font-family: var(--ff-mono);
|
|
17338
|
-
color: var(--t-
|
|
18267
|
+
color: var(--t-secondary);
|
|
17339
18268
|
min-width: 50px;
|
|
17340
18269
|
text-align: center;
|
|
17341
18270
|
}
|
|
@@ -17400,11 +18329,13 @@
|
|
|
17400
18329
|
.fe-editor-goto.open {
|
|
17401
18330
|
display: flex;
|
|
17402
18331
|
}
|
|
17403
|
-
.fe-editor-goto-label
|
|
18332
|
+
.fe-editor-goto-label,
|
|
18333
|
+
.fe-editor-goto-hint {
|
|
17404
18334
|
font-size: 11px;
|
|
17405
18335
|
font-family: var(--ff-mono);
|
|
17406
18336
|
color: var(--t-muted);
|
|
17407
18337
|
}
|
|
18338
|
+
.fe-editor-goto-hint { font-size: 10px; }
|
|
17408
18339
|
.fe-editor-goto-input {
|
|
17409
18340
|
width: 80px;
|
|
17410
18341
|
background: rgba(0,0,0,0.2);
|
|
@@ -17426,36 +18357,9 @@
|
|
|
17426
18357
|
border-color: rgba(99,102,241,0.4);
|
|
17427
18358
|
}
|
|
17428
18359
|
|
|
17429
|
-
|
|
17430
|
-
|
|
17431
|
-
|
|
17432
|
-
left: 48px;
|
|
17433
|
-
right: 0;
|
|
17434
|
-
height: 20px;
|
|
17435
|
-
background: rgba(255,255,255,0.03);
|
|
17436
|
-
pointer-events: none;
|
|
17437
|
-
z-index: 0;
|
|
17438
|
-
transition: top 0.05s;
|
|
17439
|
-
}
|
|
17440
|
-
|
|
17441
|
-
/* Scroll indicator */
|
|
17442
|
-
.fe-editor-scrollmap {
|
|
17443
|
-
position: absolute;
|
|
17444
|
-
top: 0;
|
|
17445
|
-
right: 0;
|
|
17446
|
-
width: 6px;
|
|
17447
|
-
height: 100%;
|
|
17448
|
-
background: rgba(0,0,0,0.15);
|
|
17449
|
-
z-index: 2;
|
|
17450
|
-
pointer-events: none;
|
|
17451
|
-
}
|
|
17452
|
-
.fe-editor-scrollmap-thumb {
|
|
17453
|
-
position: absolute;
|
|
17454
|
-
width: 100%;
|
|
17455
|
-
min-height: 12px;
|
|
17456
|
-
background: rgba(255,255,255,0.1);
|
|
17457
|
-
border-radius: 3px;
|
|
17458
|
-
transition: top 0.08s, height 0.08s;
|
|
18360
|
+
@media (prefers-reduced-motion: reduce) {
|
|
18361
|
+
.fe-editor-panel,
|
|
18362
|
+
.fe-editor-fold--open { transition: none; }
|
|
17459
18363
|
}
|
|
17460
18364
|
|
|
17461
18365
|
/* ── Multi-select bar (shared) ── */
|
|
@@ -17713,6 +18617,15 @@
|
|
|
17713
18617
|
text-align: center;
|
|
17714
18618
|
}
|
|
17715
18619
|
#loading-overlay.server-offline #loading-server-cmd { display: block; }
|
|
18620
|
+
/* A restart the user asked for (ui-loading.js beginRestart). The overlay goes
|
|
18621
|
+
over the running app: there in the frame of the click, so no fade-in, and
|
|
18622
|
+
above every panel and dialog that is open (at boot nothing else is). While
|
|
18623
|
+
the restart runs there is nothing to press and no command to type; refused,
|
|
18624
|
+
the server is still there. */
|
|
18625
|
+
#loading-overlay.over-app { transition: none; z-index: 2147483647; }
|
|
18626
|
+
#loading-overlay.restart-busy #loading-action-btn,
|
|
18627
|
+
#loading-overlay.restart-busy #loading-server-cmd,
|
|
18628
|
+
#loading-overlay.restart-refused #loading-server-cmd { display: none; }
|
|
17716
18629
|
#loading-server-cmd-hint {
|
|
17717
18630
|
font-size: 12px;
|
|
17718
18631
|
color: rgba(255,255,255,0.25);
|
|
@@ -23706,9 +24619,12 @@
|
|
|
23706
24619
|
gap: 4px;
|
|
23707
24620
|
}
|
|
23708
24621
|
#term-minimized-tray:empty { display: none; }
|
|
23709
|
-
/*
|
|
23710
|
-
|
|
23711
|
-
|
|
24622
|
+
/* In the top-right row it is a row under the bar: placed with the row ("Fit"). The menus of the dock (workspaces,
|
|
24623
|
+
bookmarks, invite) draw over it, opaque: their blur lives inside the dock's own backdrop root and cannot reach
|
|
24624
|
+
the pills, and through 95% glass their labels still read. */
|
|
24625
|
+
#term-minimized-tray > .term-minimized-pill {
|
|
24626
|
+
max-width: 100%;
|
|
24627
|
+
}
|
|
23712
24628
|
|
|
23713
24629
|
.term-minimized-pill {
|
|
23714
24630
|
display: flex;
|
|
@@ -27947,6 +28863,30 @@
|
|
|
27947
28863
|
}
|
|
27948
28864
|
.update-check-toast .utc-sub { color: var(--t-muted); }
|
|
27949
28865
|
.update-check-toast .utc-hint { color: var(--t-muted); opacity: 0.7; margin-top: 6px; font-size: 11px; }
|
|
28866
|
+
/* The desktop app's update notice (ui-update.js renderDesktopNotice): the same toast, with its own answers. */
|
|
28867
|
+
.update-notice .utc-sub { overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
|
|
28868
|
+
.update-notice-actions {
|
|
28869
|
+
display: flex;
|
|
28870
|
+
flex-wrap: wrap;
|
|
28871
|
+
align-items: center;
|
|
28872
|
+
justify-content: flex-end;
|
|
28873
|
+
gap: 8px;
|
|
28874
|
+
margin-top: 10px;
|
|
28875
|
+
}
|
|
28876
|
+
.update-notice-actions .action-btn { padding: 4px 12px; }
|
|
28877
|
+
.update-notice-link {
|
|
28878
|
+
color: var(--t-primary);
|
|
28879
|
+
font-size: 11px;
|
|
28880
|
+
text-decoration: underline;
|
|
28881
|
+
text-underline-offset: 2px;
|
|
28882
|
+
margin-right: auto;
|
|
28883
|
+
}
|
|
28884
|
+
.update-notice-link:hover { color: var(--t-bright); }
|
|
28885
|
+
.update-notice-link:focus-visible,
|
|
28886
|
+
.update-notice .action-btn:focus-visible {
|
|
28887
|
+
outline: 2px solid var(--stg-focus, #93c5fd);
|
|
28888
|
+
outline-offset: 2px;
|
|
28889
|
+
}
|
|
27950
28890
|
|
|
27951
28891
|
.update-channel-pill {
|
|
27952
28892
|
display: inline-block;
|