@songsid/agend 2.2.1 → 2.2.6
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/dist/agent-cli-instructions.md +5 -2
- package/dist/agent-cli.js +284 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +2 -0
- package/dist/agent-endpoint.js +29 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +38 -0
- package/dist/agent-file-read.js +317 -0
- package/dist/agent-file-read.js.map +1 -0
- package/dist/agent-whats-new.d.ts +11 -0
- package/dist/agent-whats-new.js +34 -2
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/atomic-write.js +9 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +30 -1
- package/dist/auth-api.js +61 -12
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +38 -0
- package/dist/authority/authority-state.js +114 -0
- package/dist/authority/authority-state.js.map +1 -0
- package/dist/authority/session-authorizations.d.ts +43 -0
- package/dist/authority/session-authorizations.js +102 -0
- package/dist/authority/session-authorizations.js.map +1 -0
- package/dist/authority/web-authority.d.ts +120 -0
- package/dist/authority/web-authority.js +157 -0
- package/dist/authority/web-authority.js.map +1 -0
- package/dist/backend/antigravity.js +3 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +2 -2
- package/dist/backend/claude-code.js +10 -5
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/launch-effort.js +1 -1
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/muse.js +10 -2
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +14 -0
- package/dist/backend/types.js +25 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +120 -0
- package/dist/backend-availability.js +396 -0
- package/dist/backend-availability.js.map +1 -0
- package/dist/backend-command.d.ts +21 -3
- package/dist/backend-command.js +23 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/bundled-skills.d.ts +14 -0
- package/dist/bundled-skills.js +29 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-analysis.d.ts +47 -1
- package/dist/cache-analysis.js +68 -8
- package/dist/cache-analysis.js.map +1 -1
- package/dist/cache-ledger.d.ts +16 -3
- package/dist/cache-ledger.js +33 -13
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-report-tool.d.ts +17 -0
- package/dist/cache-report-tool.js +40 -0
- package/dist/cache-report-tool.js.map +1 -0
- package/dist/cache-service.d.ts +70 -3
- package/dist/cache-service.js +178 -17
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
- package/dist/channel/adapters/discord-client-retirement.js +57 -0
- package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +11 -0
- package/dist/channel/adapters/discord.js +66 -6
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +8 -1
- package/dist/channel/adapters/telegram.js +74 -4
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +48 -2
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +21 -0
- package/dist/classic-channel-manager.d.ts +10 -5
- package/dist/classic-channel-manager.js +12 -9
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +142 -110
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +119 -4
- package/dist/config-validator.js.map +1 -1
- package/dist/daemon.d.ts +8 -0
- package/dist/daemon.js +298 -22
- package/dist/daemon.js.map +1 -1
- package/dist/decision-list.d.ts +25 -0
- package/dist/decision-list.js +30 -0
- package/dist/decision-list.js.map +1 -0
- package/dist/delivery-outbox.d.ts +10 -0
- package/dist/delivery-outbox.js +12 -1
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/fleet-context.d.ts +15 -0
- package/dist/fleet-manager.d.ts +514 -12
- package/dist/fleet-manager.js +1885 -163
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +69 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-traffic.d.ts +74 -0
- package/dist/fleet-traffic.js +196 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +20 -5
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +492 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +482 -0
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/human-delivery-receipts.d.ts +24 -1
- package/dist/human-delivery-receipts.js +64 -11
- package/dist/human-delivery-receipts.js.map +1 -1
- package/dist/instance-avatar.js +3 -0
- package/dist/instance-avatar.js.map +1 -1
- package/dist/instance-config-impact.js +6 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +2 -0
- package/dist/instance-lifecycle.js +20 -10
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-names.d.ts +4 -0
- package/dist/instance-names.js +12 -0
- package/dist/instance-names.js.map +1 -0
- package/dist/instructions.d.ts +12 -1
- package/dist/instructions.js +13 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +118 -10
- package/dist/locale.js.map +1 -1
- package/dist/login-controller.js +35 -2
- package/dist/login-controller.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +95 -0
- package/dist/ls-attach-resolve.js +174 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/memory-hogs.d.ts +27 -0
- package/dist/memory-hogs.js +124 -0
- package/dist/memory-hogs.js.map +1 -0
- package/dist/needs-you-hub.d.ts +4 -0
- package/dist/needs-you-hub.js +31 -6
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +1 -13
- package/dist/needs-you.js +3 -37
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +15 -0
- package/dist/outbound-handlers.js +152 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +228 -4
- package/dist/outbound-schemas.js +147 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +21 -1
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +9 -0
- package/dist/public-web-link.js +8 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +10 -1
- package/dist/quickstart-api.js +12 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +4 -0
- package/dist/reply-buttons-controller.js +2 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/repo-worktree-guard.d.ts +36 -0
- package/dist/repo-worktree-guard.js +143 -0
- package/dist/repo-worktree-guard.js.map +1 -0
- package/dist/restart-progress.d.ts +65 -1
- package/dist/restart-progress.js +236 -10
- package/dist/restart-progress.js.map +1 -1
- package/dist/rollout-index.d.ts +5 -0
- package/dist/rollout-index.js +26 -5
- package/dist/rollout-index.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +70 -1
- package/dist/scheduler/scheduler.js +256 -17
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/service-installer.d.ts +2 -1
- package/dist/service-installer.js +18 -3
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +23 -0
- package/dist/settings-api.js +233 -2
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +112 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +32 -2
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +5 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +16 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +4 -6
- package/dist/tool-permissions.js +100 -2
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +17 -7
- package/dist/topic-commands.js +39 -21
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.d.ts +128 -0
- package/dist/topic-link.js +269 -0
- package/dist/topic-link.js.map +1 -0
- package/dist/tunnel/cloudflared.js +37 -2
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/types.d.ts +3 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/types.d.ts +61 -1
- package/dist/ui/app-effects.js +245 -0
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +42 -0
- package/dist/ui/chat-effects.js +160 -0
- package/dist/ui/chat-live-replies.js +58 -0
- package/dist/ui/chat-render.js +25 -7
- package/dist/ui/chat-store.js +41 -13
- package/dist/ui/chat-strings.js +86 -2
- package/dist/ui/chat-thread.js +204 -37
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/effect-trial-controller.js +124 -0
- package/dist/ui/effect-trial-offer.js +31 -0
- package/dist/ui/effect-trial-panel.js +40 -0
- package/dist/ui/fleet-cache.js +23 -1
- package/dist/ui/fleet-canvas-layout.js +111 -0
- package/dist/ui/fleet-canvas.js +525 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-traffic.js +343 -0
- package/dist/ui/fleet-usage.js +401 -0
- package/dist/ui/image-lightbox.js +1 -1
- package/dist/ui/panel-chat.js +252 -58
- package/dist/ui/panel-details.js +20 -6
- package/dist/ui/panel-fleet.js +45 -19
- package/dist/ui/panel-log.js +6 -6
- package/dist/ui/panel-needs.js +3 -3
- package/dist/ui/panel-settings.js +58 -13
- package/dist/ui/preview-panel.js +25 -9
- package/dist/ui/preview.js +3 -2
- package/dist/ui/settings-appearance.js +349 -0
- package/dist/ui/settings-catalog.js +92 -0
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +202 -0
- package/dist/ui/settings-guests.js +117 -0
- package/dist/ui/settings-learn.js +25 -0
- package/dist/ui/settings-model.js +15 -6
- package/dist/ui/settings-mods.js +271 -0
- package/dist/ui/settings-owner-effects.js +80 -0
- package/dist/ui/settings-strings.js +335 -10
- package/dist/ui/settings-web-authority.js +91 -0
- package/dist/ui/shared/agend-auth.js +28 -4
- package/dist/ui/shared/agent-widget.js +248 -0
- package/dist/ui/shared/app-i18n.js +6 -2
- package/dist/ui/shared/app-prefs.js +34 -13
- package/dist/ui/shared/app-route.js +42 -2
- package/dist/ui/shared/app-session.js +3 -1
- package/dist/ui/shared/app-shell.js +119 -41
- package/dist/ui/shared/app-store.js +28 -1
- package/dist/ui/shared/app-stream.js +14 -7
- package/dist/ui/shared/app-themes.js +206 -0
- package/dist/ui/shared/app.css +566 -5
- package/dist/ui/shared/app.js +23 -10
- package/dist/ui/shared/card-strings.js +32 -0
- package/dist/ui/shared/effect-app-runtime.js +297 -0
- package/dist/ui/shared/effect-baseline.js +64 -0
- package/dist/ui/shared/effect-chat-runtime.js +167 -0
- package/dist/ui/shared/effect-cursor.js +125 -0
- package/dist/ui/shared/effect-frame.js +146 -0
- package/dist/ui/shared/effect-geometry.js +137 -0
- package/dist/ui/shared/effect-host-style.js +10 -0
- package/dist/ui/shared/effect-owner-regions.js +74 -0
- package/dist/ui/shared/effect-owner-source.js +122 -0
- package/dist/ui/shared/effect-policy.js +151 -0
- package/dist/ui/shared/effect-poster-reader.js +98 -0
- package/dist/ui/shared/effect-posters.js +117 -0
- package/dist/ui/shared/effect-profiler.js +184 -0
- package/dist/ui/shared/effect-profiles.js +65 -0
- package/dist/ui/shared/effect-registry.js +543 -0
- package/dist/ui/shared/effect-runtime-loader.js +234 -0
- package/dist/ui/shared/effect-safety.js +153 -0
- package/dist/ui/shared/effect-stock-snapshot.js +43 -0
- package/dist/ui/shared/effect-stock-trust.js +217 -0
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-source.js +103 -0
- package/dist/ui/shared/effect-trial-stage.js +170 -0
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/fx-motion.js +67 -0
- package/dist/ui/shared/header-tools.js +1 -1
- package/dist/ui/shared/identity-card.js +273 -0
- package/dist/ui/shared/identity-color.js +261 -0
- package/dist/ui/shared/instance-nav.js +215 -41
- package/dist/ui/shared/owner-css.js +250 -0
- package/dist/ui/shared/owner-effect-prefs.js +117 -0
- package/dist/ui/shared/panel-view.js +103 -10
- package/dist/ui/shared/signin.js +2 -0
- package/dist/ui/shared/tokens.css +9 -3
- package/dist/ui/shared/ui-dialog.js +1 -1
- package/dist/ui/shared/ui-icons.js +3 -0
- package/dist/ui/shared/ui-menu.js +1 -1
- package/dist/ui/shared/ui-toast.js +1 -1
- package/dist/ui/shared/usage-dialog.js +22 -2
- package/dist/ui/shared/view-strings.js +98 -2
- package/dist/ui/shared/web-authorize.js +151 -0
- package/dist/ui/signin.html +1 -0
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/usage/providers.d.ts +28 -0
- package/dist/usage/providers.js +126 -36
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage-report.d.ts +158 -0
- package/dist/usage-report.js +226 -0
- package/dist/usage-report.js.map +1 -0
- package/dist/usage-rollup.d.ts +51 -0
- package/dist/usage-rollup.js +168 -0
- package/dist/usage-rollup.js.map +1 -0
- package/dist/view-api.d.ts +68 -0
- package/dist/view-api.js +249 -8
- package/dist/view-api.js.map +1 -1
- package/dist/web-ambient.d.ts +72 -0
- package/dist/web-ambient.js +161 -0
- package/dist/web-ambient.js.map +1 -0
- package/dist/web-api.d.ts +117 -7
- package/dist/web-api.js +1283 -70
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-limits.d.ts +82 -0
- package/dist/web-appearance-limits.js +83 -0
- package/dist/web-appearance-limits.js.map +1 -0
- package/dist/web-appearance-policy.d.ts +64 -0
- package/dist/web-appearance-policy.js +87 -0
- package/dist/web-appearance-policy.js.map +1 -0
- package/dist/web-appearance-tools.d.ts +53 -0
- package/dist/web-appearance-tools.js +124 -0
- package/dist/web-appearance-tools.js.map +1 -0
- package/dist/web-appearance-view.d.ts +124 -0
- package/dist/web-appearance-view.js +278 -0
- package/dist/web-appearance-view.js.map +1 -0
- package/dist/web-appearance.d.ts +93 -0
- package/dist/web-appearance.js +373 -0
- package/dist/web-appearance.js.map +1 -0
- package/dist/web-asset-parts.d.ts +93 -0
- package/dist/web-asset-parts.js +133 -0
- package/dist/web-asset-parts.js.map +1 -0
- package/dist/web-auth.js +20 -2
- package/dist/web-auth.js.map +1 -1
- package/dist/web-card.d.ts +110 -0
- package/dist/web-card.js +266 -0
- package/dist/web-card.js.map +1 -0
- package/dist/web-channel-echo.d.ts +7 -1
- package/dist/web-channel-echo.js +6 -2
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +63 -0
- package/dist/web-chat-history.js +109 -6
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +1 -0
- package/dist/web-effect-bootstrap.d.ts +12 -0
- package/dist/web-effect-bootstrap.js +49 -0
- package/dist/web-effect-bootstrap.js.map +1 -0
- package/dist/web-effect-bundle.d.ts +28 -0
- package/dist/web-effect-bundle.js +171 -0
- package/dist/web-effect-bundle.js.map +1 -0
- package/dist/web-effect-canonical.d.ts +8 -0
- package/dist/web-effect-canonical.js +27 -0
- package/dist/web-effect-canonical.js.map +1 -0
- package/dist/web-effect-library.d.ts +114 -0
- package/dist/web-effect-library.js +530 -0
- package/dist/web-effect-library.js.map +1 -0
- package/dist/web-effect-playback.d.ts +30 -0
- package/dist/web-effect-playback.js +71 -0
- package/dist/web-effect-playback.js.map +1 -0
- package/dist/web-effect-poster.d.ts +8 -0
- package/dist/web-effect-poster.js +52 -0
- package/dist/web-effect-poster.js.map +1 -0
- package/dist/web-effect-profiles.d.ts +118 -0
- package/dist/web-effect-profiles.js +180 -0
- package/dist/web-effect-profiles.js.map +1 -0
- package/dist/web-effect-service.d.ts +93 -0
- package/dist/web-effect-service.js +335 -0
- package/dist/web-effect-service.js.map +1 -0
- package/dist/web-effect-tools.d.ts +48 -0
- package/dist/web-effect-tools.js +129 -0
- package/dist/web-effect-tools.js.map +1 -0
- package/dist/web-effect-trials.d.ts +86 -0
- package/dist/web-effect-trials.js +204 -0
- package/dist/web-effect-trials.js.map +1 -0
- package/dist/web-effect-upload.d.ts +27 -0
- package/dist/web-effect-upload.js +185 -0
- package/dist/web-effect-upload.js.map +1 -0
- package/dist/web-effect-worker.d.ts +8 -0
- package/dist/web-effect-worker.js +170 -0
- package/dist/web-effect-worker.js.map +1 -0
- package/dist/web-effect.d.ts +103 -0
- package/dist/web-effect.js +153 -0
- package/dist/web-effect.js.map +1 -0
- package/dist/web-guest-access.d.ts +125 -0
- package/dist/web-guest-access.js +234 -0
- package/dist/web-guest-access.js.map +1 -0
- package/dist/web-guest-rooms.d.ts +82 -0
- package/dist/web-guest-rooms.js +135 -0
- package/dist/web-guest-rooms.js.map +1 -0
- package/dist/web-identity-color.d.ts +87 -0
- package/dist/web-identity-color.js +209 -0
- package/dist/web-identity-color.js.map +1 -0
- package/dist/web-identity-palette.d.ts +113 -0
- package/dist/web-identity-palette.js +84 -0
- package/dist/web-identity-palette.js.map +1 -0
- package/dist/web-image-meta.d.ts +38 -0
- package/dist/web-image-meta.js +262 -0
- package/dist/web-image-meta.js.map +1 -0
- package/dist/web-login.d.ts +47 -0
- package/dist/web-login.js +115 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +50 -0
- package/dist/web-mod-agent.js +207 -0
- package/dist/web-mod-agent.js.map +1 -0
- package/dist/web-mod-bundle.d.ts +157 -0
- package/dist/web-mod-bundle.js +529 -0
- package/dist/web-mod-bundle.js.map +1 -0
- package/dist/web-mod-export.d.ts +68 -0
- package/dist/web-mod-export.js +100 -0
- package/dist/web-mod-export.js.map +1 -0
- package/dist/web-mod-store.d.ts +289 -0
- package/dist/web-mod-store.js +638 -0
- package/dist/web-mod-store.js.map +1 -0
- package/dist/web-org.d.ts +3 -3
- package/dist/web-org.js +11 -17
- package/dist/web-org.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +222 -0
- package/dist/web-owner-css-store.js +440 -0
- package/dist/web-owner-css-store.js.map +1 -0
- package/dist/web-owner-css.d.ts +58 -0
- package/dist/web-owner-css.js +552 -0
- package/dist/web-owner-css.js.map +1 -0
- package/dist/web-prefs.d.ts +62 -0
- package/dist/web-prefs.js +232 -36
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +15 -3
- package/dist/web-preview.js +28 -9
- package/dist/web-preview.js.map +1 -1
- package/dist/web-returning-device.d.ts +41 -0
- package/dist/web-returning-device.js +57 -5
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-session-authorization.d.ts +132 -0
- package/dist/web-session-authorization.js +193 -0
- package/dist/web-session-authorization.js.map +1 -0
- package/dist/web-session.d.ts +70 -10
- package/dist/web-session.js +137 -22
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +67 -2
- package/dist/web-settings-patch.js +196 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +89 -0
- package/dist/web-settings-tools.js +273 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-shell-routes.d.ts +2 -2
- package/dist/web-shell-routes.js +2 -2
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-terminal-http.js +15 -2
- package/dist/web-terminal-http.js.map +1 -1
- package/dist/web-theme-store.d.ts +257 -0
- package/dist/web-theme-store.js +627 -0
- package/dist/web-theme-store.js.map +1 -0
- package/dist/web-theme.d.ts +123 -0
- package/dist/web-theme.js +416 -0
- package/dist/web-theme.js.map +1 -0
- package/dist/web-upload.d.ts +13 -0
- package/dist/web-upload.js +39 -3
- package/dist/web-upload.js.map +1 -1
- package/dist/web-widget.d.ts +72 -0
- package/dist/web-widget.js +245 -0
- package/dist/web-widget.js.map +1 -0
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/systemd.service.ejs +8 -0
package/dist/ui/shared/app.css
CHANGED
|
@@ -112,7 +112,43 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
112
112
|
.av img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; }
|
|
113
113
|
.av.av-emoji { background: transparent; font-size: 18px; font-weight: normal; }
|
|
114
114
|
.av.av-emoji img { width: 22px; height: 22px; border-radius: 0; object-fit: contain; }
|
|
115
|
-
|
|
115
|
+
/* #1958: an instance's identity colour — both modes' values set on the row through the CSSOM (identity-color.js), the
|
|
116
|
+
page's mode picks one (the same selectors as tokens.css). Places: .id-ring (the avatar's ring, every face), .id-bar (a
|
|
117
|
+
bar at the row's left edge), .id-name (the name, in a shade readable on the page and the sidebar). */
|
|
118
|
+
.idc { --id: var(--id-dark); --id-name: var(--id-name-dark); }
|
|
119
|
+
@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .idc { --id: var(--id-light); --id-name: var(--id-name-light); } }
|
|
120
|
+
:root[data-theme="light"] .idc { --id: var(--id-light); --id-name: var(--id-name-light); }
|
|
121
|
+
.idc.id-ring .av { box-shadow: 0 0 0 2px var(--id); }
|
|
122
|
+
/* #2056: the bar is a plain straight line inside the row: no caps following the row's rounded corners (an inset shadow
|
|
123
|
+
did), and short of the corners, so the hover and selected highlight's radius is never crossed. */
|
|
124
|
+
.idc.id-bar { position: relative; }
|
|
125
|
+
.idc.id-bar::before { content: ""; position: absolute; left: 0; top: var(--s-2); bottom: var(--s-2); width: 3px; background: var(--id); pointer-events: none; }
|
|
126
|
+
.idc.id-name .inst-name { color: var(--id-name); }
|
|
127
|
+
.idc-swatches, .idc-places { border: 0; padding: 0; margin: 0 0 var(--s-3); display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
128
|
+
.idc-swatches legend, .idc-places legend { font-weight: var(--fw-semibold); margin-bottom: 6px; width: 100%; }
|
|
129
|
+
.idc-swatch { --sw: var(--sw-dark); width: 28px; height: 28px; border-radius: 50%; border: 2px solid transparent; background: var(--sw); cursor: pointer; padding: 0; }
|
|
130
|
+
@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .idc-swatch { --sw: var(--sw-light); } }
|
|
131
|
+
:root[data-theme="light"] .idc-swatch { --sw: var(--sw-light); }
|
|
132
|
+
.idc-swatch.on { border-color: var(--text); box-shadow: 0 0 0 2px var(--bg); }
|
|
133
|
+
.idc-custom { display: inline-flex; gap: 6px; align-items: center; }
|
|
134
|
+
.idc-custom input[type="color"] { width: 32px; height: 28px; padding: 0; border: 0; background: none; }
|
|
135
|
+
.idc-hex { width: 9ch; font-family: var(--font-mono, monospace); }
|
|
136
|
+
.dlg-actions .dlg-spacer { flex: 1 1 auto; }
|
|
137
|
+
.idc-preview { padding: 6px; border-radius: 10px; background: var(--bg-sidebar); max-width: 260px; }
|
|
138
|
+
/* #2056 B: Settings → Web appearance — plain group headings, a "?" per card to its docs section, and the colour card's sample row. */
|
|
139
|
+
.s-ap-group { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text); margin: var(--s-4) 0 var(--s-2); }
|
|
140
|
+
.s-ap-group:first-child { margin-top: 0; }
|
|
141
|
+
.s-ap-title { display: flex; align-items: center; gap: var(--s-2); }
|
|
142
|
+
/* The fields' placeholders show the defaults: readable, not the browser's faint grey (dark mode). */
|
|
143
|
+
.s-appearance input::placeholder { color: var(--text-3); opacity: 1; }
|
|
144
|
+
/* A card title in Chinese is never upper-cased ("AGENT 的主題"): the small caps are a Latin convention. */
|
|
145
|
+
:lang(zh-Hant) .card h3 { text-transform: none; letter-spacing: 0; }
|
|
146
|
+
.s-learn { display: inline-grid; place-items: center; width: 18px; height: 18px; border-radius: var(--r-full); border: 1px solid var(--border);
|
|
147
|
+
color: var(--text-3); font-size: 11px; text-decoration: none; text-transform: none; letter-spacing: 0; line-height: 1; }
|
|
148
|
+
.s-learn:hover, .s-learn:focus-visible { color: var(--text); border-color: var(--text-3); }
|
|
149
|
+
.s-colors-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-3); margin-bottom: var(--s-2); }
|
|
150
|
+
.s-colors-row .idc-places { margin-bottom: 0; flex: 1 1 220px; }
|
|
151
|
+
.s-colors-sample { flex: 0 1 220px; min-width: 0; }
|
|
116
152
|
.av-text { overflow: hidden; }
|
|
117
153
|
.av .av-dot { position: absolute; right: -2px; bottom: -2px; margin: 0; box-shadow: 0 0 0 2px var(--bg-sidebar); }
|
|
118
154
|
/* #1722: the CLI as a letter on the avatar's top-left corner — monochrome (the #1630 ring keeps the colour), cut out like the dot */
|
|
@@ -138,11 +174,20 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
138
174
|
}
|
|
139
175
|
/* #1604: one row — Settings and Session (the anonymous View reader: Sign in and the theme/language popover). Their
|
|
140
176
|
pop-ups open over the whole footer's width. */
|
|
141
|
-
|
|
177
|
+
/* #1922: a divider above the footer, with the filter block's bottom padding and the footer's top padding trimmed to
|
|
178
|
+
--s-1: the gap reads as a section break, not an empty ~20 px band (the two --s-2 paddings used to stack). */
|
|
179
|
+
.side-foot { display: flex; align-items: center; gap: var(--s-1); padding: var(--s-1) var(--s-2) var(--s-2); border-top: 1px solid var(--border); position: relative; }
|
|
142
180
|
.side-foot > .side-row, .side-foot > .session { flex: 1; min-width: 0; }
|
|
143
181
|
.side-foot > .session { position: static; }
|
|
144
182
|
.side-foot .side-row span:not(.dot):not(.meta) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
145
183
|
.side-foot .session .meta { display: none; }
|
|
184
|
+
/* #1920 phase 3: a guest's page says who it is signed in as, beside its session. */
|
|
185
|
+
.guest-chip { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--s-1); margin: 0; padding: 6px var(--s-2); border-radius: var(--r-sm);
|
|
186
|
+
background: var(--surface-2); color: var(--text-2); font-size: var(--fs-sm); }
|
|
187
|
+
.guest-chip .grow { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
188
|
+
/* Its own row: a name and a platform do not fit beside the session at sidebar widths. */
|
|
189
|
+
.guest .side-foot { flex-wrap: wrap; }
|
|
190
|
+
.guest .side-foot > .guest-chip { flex-basis: 100%; }
|
|
146
191
|
.prefs-pop > summary { list-style: none; cursor: pointer; }
|
|
147
192
|
.prefs-pop > summary::-webkit-details-marker { display: none; }
|
|
148
193
|
.prefs.labelled { flex-direction: column; gap: var(--s-2); padding: 0; }
|
|
@@ -201,11 +246,15 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
201
246
|
}
|
|
202
247
|
.panel-head .sb-open { display: none; }
|
|
203
248
|
.sb-collapsed .panel-head .sb-open { display: inline-flex; }
|
|
249
|
+
/* #2074: a collapsed sidebar's "New agent", beside its ☰ (a phone opens the drawer, which has the row). */
|
|
250
|
+
.panel-head .sb-new { margin-left: calc(-1 * var(--s-1)); }
|
|
204
251
|
/* One row of --header-h on every page (a phone's instance tabs wrap below it): the title, its status and badges on one centre line. */
|
|
205
252
|
.panel-title { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--s-3); min-height: calc(var(--header-h) - 2 * var(--s-1)); }
|
|
206
253
|
.panel-title h1 { font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; outline: none; }
|
|
207
254
|
.panel-sub { color: var(--text-2); font-size: var(--fs-sm); white-space: nowrap; }
|
|
208
255
|
.status { display: inline-flex; align-items: center; gap: 6px; }
|
|
256
|
+
/* #2015: the largest processes, after the host memory chip's text. */
|
|
257
|
+
.host-mem-top { margin-left: var(--s-2); opacity: 0.8; overflow-wrap: anywhere; }
|
|
209
258
|
.panel-actions { display: flex; align-items: center; gap: var(--s-1); }
|
|
210
259
|
/* #1523 N2: the instance view switch — beside the title on a wide screen; on a phone, a row of tabs under the header. */
|
|
211
260
|
.inst-switch.seg { padding: 0; margin: 0; width: auto; max-width: none; flex-shrink: 0; }
|
|
@@ -324,6 +373,9 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
324
373
|
.field input:focus, .field select:focus, .field textarea:focus, .field-row input:focus { border-color: var(--focus); box-shadow: 0 0 0 3px var(--accent-dim); }
|
|
325
374
|
.field input:disabled { opacity: 0.6; }
|
|
326
375
|
.field-row { display: flex; gap: var(--s-1); align-items: center; }
|
|
376
|
+
/* #2072: a model field — the list, and the text box "Other…" opens under it. */
|
|
377
|
+
.model-pick { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
|
|
378
|
+
.model-pick > select, .model-pick > input { width: 100%; }
|
|
327
379
|
.note { font-size: var(--fs-xs); color: var(--text-3); }
|
|
328
380
|
.checks { display: flex; flex-direction: column; gap: var(--s-1); max-height: 180px; overflow-y: auto; }
|
|
329
381
|
.check { display: flex; gap: var(--s-2); align-items: center; font-size: var(--fs-sm); }
|
|
@@ -346,6 +398,8 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
346
398
|
.seg-item { display: inline-flex; align-items: center; gap: var(--s-2); min-height: 34px; padding: 0 var(--s-3); border-radius: var(--r-full); color: var(--text-2); font-size: var(--fs-sm); white-space: nowrap; }
|
|
347
399
|
.seg-item:hover { background: var(--surface); color: var(--text); }
|
|
348
400
|
.seg-item.active { background: var(--surface-2); color: var(--text); font-weight: var(--fw-semibold); }
|
|
401
|
+
/* #1629: Settings has eight sections (Appearance added): they wrap to a second row rather than hide behind a scroll. */
|
|
402
|
+
.p-settings .seg { flex-wrap: wrap; row-gap: var(--s-1); overflow-x: visible; }
|
|
349
403
|
.list-head { display: flex; justify-content: space-between; align-items: center; gap: var(--s-3); margin: var(--s-2) 0 var(--s-3); color: var(--text-2); font-size: var(--fs-sm); }
|
|
350
404
|
.rows { display: flex; flex-direction: column; gap: var(--s-1); }
|
|
351
405
|
.row-item { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; padding: var(--s-3) var(--s-4); border-radius: var(--r-md); background: var(--surface); font-size: var(--fs-sm); }
|
|
@@ -369,7 +423,7 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
369
423
|
|
|
370
424
|
/* ── Chat ── */
|
|
371
425
|
.p-chat .scroller { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; position: relative; }
|
|
372
|
-
.thread { max-width: var(--col); margin:
|
|
426
|
+
.thread { max-width: var(--col); margin: var(--thread-snap, 0px) auto 0; padding: var(--s-4) var(--s-5) var(--s-3); display: flex; flex-direction: column; gap: var(--s-6); }
|
|
373
427
|
.msg { font-size: var(--fs-md); line-height: var(--lh-md); overflow-wrap: anywhere; min-width: 0; }
|
|
374
428
|
.msg .meta { display: flex; align-items: baseline; gap: var(--s-2); font-size: var(--fs-xs); color: var(--text-3); margin-bottom: var(--s-1); }
|
|
375
429
|
.msg .sender { font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
@@ -399,6 +453,9 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
399
453
|
.msg.status-line .st-more { border: 0; background: none; color: var(--text-2); cursor: pointer; font-size: var(--fs-xs); padding: var(--s-1) 0 0 var(--s-3); }
|
|
400
454
|
.msg.status-line .st-more:hover { color: var(--text); }
|
|
401
455
|
.msg-tools { display: flex; gap: var(--s-1); margin-top: var(--s-1); opacity: 0; transition: opacity var(--t-fast); }
|
|
456
|
+
/* #2147: bounded stock toolbar paint, including fixed descendants. Padding preserves focus outlines. */
|
|
457
|
+
.shell .thread .msg-tools { contain: paint; overflow: clip; overflow-clip-margin: 0px; padding: 4px; margin: 0 -4px -4px; }
|
|
458
|
+
.shell .thread .codeblock > .cb-head { contain: paint; overflow: clip; overflow-clip-margin: 0px; }
|
|
402
459
|
.msg:hover .msg-tools, .msg:focus-within .msg-tools { opacity: 1; }
|
|
403
460
|
@media (hover: none) { .msg-tools { opacity: 1; } }
|
|
404
461
|
/* Delivery ticks: always visible, in colour, with their label on hover and for screen readers (rough edge 10). */
|
|
@@ -501,6 +558,34 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
501
558
|
CSSOM), a full-screen sheet on a narrow one. The frame is the card's (preview.js), sized by the panel here. */
|
|
502
559
|
.chat-split { flex: 1; min-height: 0; display: flex; }
|
|
503
560
|
.chat-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
561
|
+
/* #1629: an agent's theme on its own chat surface — custom properties set on .p-chat through the CSSOM, choices as
|
|
562
|
+
these tokens. The surface paints its own background (the page's body is not its). */
|
|
563
|
+
.p-chat.th { background: var(--bg); color: var(--text); }
|
|
564
|
+
.p-chat.th .msg.user .body { border-radius: var(--bubble-radius, var(--r-xl)); }
|
|
565
|
+
.p-chat.th-font-system .thread, .p-chat.th-font-system .composer textarea { font-family: system-ui, -apple-system, "Segoe UI", sans-serif, var(--font-emoji); }
|
|
566
|
+
.p-chat.th-font-mono .thread, .p-chat.th-font-mono .composer textarea { font-family: var(--font-mono); }
|
|
567
|
+
.p-chat.th-bubble-thin .msg.user .body { box-shadow: inset 0 0 0 1px var(--border); }
|
|
568
|
+
.p-chat.th-bubble-accent .msg.user .body { box-shadow: inset 0 0 0 1px var(--accent); }
|
|
569
|
+
.p-chat.th-agent-bubble .msg.agent .body { background: var(--agent-bubble); border-radius: var(--bubble-radius, var(--r-xl)); padding: 10px var(--s-4); }
|
|
570
|
+
.chat-main.has-th-bg { position: relative; }
|
|
571
|
+
.chat-main.has-th-bg > :not(.th-bg) { position: relative; z-index: 1; }
|
|
572
|
+
.th-bg { position: absolute; inset: 0; width: 100%; height: 100%; opacity: var(--th-bg-opacity, 1); pointer-events: none; z-index: 0; user-select: none; }
|
|
573
|
+
.th-bg-cover { object-fit: cover; }
|
|
574
|
+
.th-bg-contain { object-fit: contain; }
|
|
575
|
+
/* #2117: an agent's ambient effect (chat-ambient.js). The loop sits behind the thread (z 0, under the scroller and the
|
|
576
|
+
dock at z 1); a burst follows the dock in the tree at z 1, so it shows over the messages and under the header (z 2).
|
|
577
|
+
Neither ever takes a pointer, focus or selection; positions and sizes are set through the CSSOM. */
|
|
578
|
+
.chat-main.has-amb { position: relative; }
|
|
579
|
+
.chat-main.has-amb > .amb-layer, .chat-main.has-amb > .amb-burst { position: absolute; inset: 0; overflow: hidden; pointer-events: none; user-select: none; contain: strict; }
|
|
580
|
+
.chat-main.has-amb > .amb-layer { z-index: 0; }
|
|
581
|
+
.chat-main.has-amb > .amb-burst { z-index: 1; }
|
|
582
|
+
.amb-p { position: absolute; left: 0; top: 0; line-height: 1; color: var(--accent); pointer-events: none; will-change: transform, opacity; }
|
|
583
|
+
img.amb-p { object-fit: contain; }
|
|
584
|
+
.s-mod-glyph { width: 24px; height: 24px; object-fit: contain; }
|
|
585
|
+
/* #2117: the one-time "reduced motion; effects are on" note, a strip above the thread. */
|
|
586
|
+
.chat-main > .amb-note { position: relative; z-index: 1; display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; margin: var(--s-2) var(--s-3) 0; padding: var(--s-1) var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); color: var(--text-2); font-size: 13px; }
|
|
587
|
+
.chat-main > .amb-note .amb-note-off { border: 0; background: none; padding: 0; color: var(--accent); text-decoration: underline; cursor: pointer; font: inherit; min-height: 32px; }
|
|
588
|
+
.chat-main > .amb-note .amb-note-x { margin-left: auto; min-width: 32px; min-height: 32px; border: 0; background: none; color: var(--text-2); cursor: pointer; }
|
|
504
589
|
.pv-divider { flex: 0 0 8px; cursor: col-resize; background: var(--bg); border-left: 1px solid var(--border); touch-action: none; position: relative; }
|
|
505
590
|
.pv-divider::after { content: ""; position: absolute; top: 50%; left: 2px; width: 3px; height: 32px; margin-top: -16px; border-radius: 2px; background: var(--border-strong); }
|
|
506
591
|
.pv-divider:hover::after, .pv-divider:focus-visible::after, .chat-split.resizing .pv-divider::after { background: var(--accent); }
|
|
@@ -556,8 +641,12 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
556
641
|
.pv-menu[open] { z-index: 6; background: var(--surface); border-radius: var(--r-sm); padding: var(--s-1); box-shadow: var(--shadow-2); }
|
|
557
642
|
.pv-menu[open] > .chip-btn { display: block; text-align: left; width: max-content; max-width: 260px; white-space: normal; }
|
|
558
643
|
|
|
644
|
+
/* #2087: the pill takes no room in the thread — it was a sticky box in the flow, 38 px at the end of the scroll, so
|
|
645
|
+
hiding it 48 px from the bottom took that room away under a reader still scrolling — the wheel's last step was cut
|
|
646
|
+
short, or the view clamped back. Its dock is sticky and 0 px tall; the pill floats above it. */
|
|
647
|
+
.jump-dock { position: sticky; bottom: 0; height: 0; z-index: 5; }
|
|
559
648
|
.jump-latest {
|
|
560
|
-
position:
|
|
649
|
+
position: absolute; bottom: var(--s-3); left: 50%; transform: translateX(-50%); white-space: nowrap; display: inline-flex; align-items: center; gap: var(--s-1);
|
|
561
650
|
background: var(--bg); color: var(--text); border: 1px solid var(--border); border-radius: var(--r-full); box-shadow: var(--shadow-2);
|
|
562
651
|
padding: 6px var(--s-4); font-size: var(--fs-xs); font-weight: var(--fw-semibold); cursor: pointer;
|
|
563
652
|
}
|
|
@@ -567,6 +656,9 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
567
656
|
.prompt { padding: var(--s-3) var(--s-4); border-radius: var(--r-md); font-size: var(--fs-sm); background: var(--warn-bg); border: 1px solid var(--warn-line); }
|
|
568
657
|
.prompt.done { background: transparent; border-style: dashed; color: var(--text-2); }
|
|
569
658
|
.prompt .txt { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
659
|
+
/* #1990: a name in a status line or a prompt that opens that instance in the app. */
|
|
660
|
+
.st-link { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
|
|
661
|
+
.st-link:hover { text-decoration-thickness: 2px; }
|
|
570
662
|
.prompt .acts { display: flex; gap: var(--s-2); margin-top: var(--s-2); align-items: center; flex-wrap: wrap; }
|
|
571
663
|
.prompt .wait { font-size: var(--fs-xs); color: var(--text-3); }
|
|
572
664
|
.work-bar { display: flex; gap: var(--s-2); align-items: center; padding: 0 var(--s-2); font-size: var(--fs-sm); color: var(--text-2); }
|
|
@@ -593,6 +685,26 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
593
685
|
@media (max-width: 479px) { .btn-stop .stop-label { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; } }
|
|
594
686
|
.btn-stop { background: var(--bg); }
|
|
595
687
|
.hint { font-size: var(--fs-xs); color: var(--text-3); text-align: center; }
|
|
688
|
+
/* #1920 phase 3: Settings → Web → Guests. */
|
|
689
|
+
.s-guests .guest-names { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 2px var(--s-3); max-height: 220px; overflow: auto;
|
|
690
|
+
padding: var(--s-1) var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); }
|
|
691
|
+
.s-guests .guest-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
692
|
+
.s-guests .guest-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
693
|
+
.s-guests .guest-row { padding: var(--s-2) var(--s-3); border: 1px solid var(--border); border-radius: var(--r-sm); }
|
|
694
|
+
.s-guests .guest-actions { display: flex; flex-wrap: wrap; gap: var(--s-1); margin-top: var(--s-1); }
|
|
695
|
+
.s-guests .guest-narrow-edit { margin-top: var(--s-2); }
|
|
696
|
+
.s-guests .guest-away { color: var(--text-3); }
|
|
697
|
+
/* #1939 S2b: this browser's authorization, under the composer and in the session menu (one compact line). */
|
|
698
|
+
.webauth-chip { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-2); margin: var(--s-1) 0 0; font-size: var(--fs-xs); }
|
|
699
|
+
.webauth-chip .webauth-ok { color: var(--ok); }
|
|
700
|
+
.webauth-chip .btn-sm { min-height: 24px; }
|
|
701
|
+
/* #1939 S2a: Settings → Web → Web authority. */
|
|
702
|
+
.s-web-authority .s-va-sessions { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
703
|
+
.s-web-authority .s-va-sessions li { padding: var(--s-2) var(--s-3); border: 1px solid var(--border); border-radius: var(--r-sm); overflow-wrap: anywhere; }
|
|
704
|
+
.s-web-authority .s-va-warn { background: var(--warn-bg); color: var(--warn); border: 1px solid var(--warn-line); border-radius: var(--r-sm); padding: var(--s-1) var(--s-2); }
|
|
705
|
+
.s-web-authority .save-row { flex-wrap: wrap; }
|
|
706
|
+
/* #1920: a guest's note under the composer — on a phone too, where the key hints are hidden. */
|
|
707
|
+
.guest-note { margin: 2px 0 0; font-size: var(--fs-xs); color: var(--text-3); text-align: center; }
|
|
596
708
|
.pending-files { display: flex; flex-wrap: wrap; gap: var(--s-2); padding: var(--s-2) var(--s-2) 0; }
|
|
597
709
|
.file-chip { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); padding: 4px var(--s-2); border-radius: var(--r-md); background: var(--bg); max-width: 320px; }
|
|
598
710
|
.file-chip img { width: 28px; height: 28px; object-fit: cover; border-radius: 4px; }
|
|
@@ -610,6 +722,58 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
610
722
|
.drop-card { display: flex; flex-direction: column; align-items: center; gap: var(--s-2); color: var(--accent); font-weight: var(--fw-semibold); }
|
|
611
723
|
|
|
612
724
|
/* ── Toasts ── */
|
|
725
|
+
/* #1629 r4 §3: Settings → Appearance (owner CSS). */
|
|
726
|
+
.s-css-text, .s-widget-text { font-family: var(--font-mono); font-size: var(--fs-sm); width: 100%; min-height: 12rem; resize: vertical; tab-size: 2; }
|
|
727
|
+
.s-widget-preview { max-width: 320px; }
|
|
728
|
+
/* #1629 r4-5: Settings → Appearance → Mods — the plan is shown in full before anything is applied. */
|
|
729
|
+
.s-mod-plan { display: flex; flex-direction: column; gap: var(--s-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--s-3); }
|
|
730
|
+
.s-mod-plan h4 { font-size: var(--fs-lg); font-weight: var(--fw-semibold); overflow-wrap: anywhere; }
|
|
731
|
+
.s-mod-plan h4 .muted { font-size: var(--fs-sm); font-weight: var(--fw-regular); }
|
|
732
|
+
.s-mod-items { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-3); }
|
|
733
|
+
.s-mod-item { display: flex; flex-direction: column; gap: var(--s-1); }
|
|
734
|
+
.s-mod-detail { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); padding-left: 1.75rem; color: var(--text-2); font-size: var(--fs-sm); min-width: 0; }
|
|
735
|
+
.s-mod-widget { display: block; max-width: min(360px, 100%); }
|
|
736
|
+
.s-mod-theme { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; width: 100%; }
|
|
737
|
+
.s-mod-kv { display: flex; gap: var(--s-2); align-items: baseline; flex-wrap: wrap; min-width: 0; }
|
|
738
|
+
.s-mod-kv .k { color: var(--text-3); font-size: var(--fs-xs); min-width: 9em; }
|
|
739
|
+
.s-mod-kv .v { color: var(--text); min-width: 0; overflow-wrap: anywhere; }
|
|
740
|
+
.s-mod-sws { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); }
|
|
741
|
+
.s-mod-sw { display: inline-flex; align-items: center; gap: var(--s-1); }
|
|
742
|
+
.s-mod-sw-chip { display: inline-block; width: 12px; height: 12px; border-radius: 3px; border: 1px solid var(--border-strong); background: var(--sw, transparent); }
|
|
743
|
+
.s-mod-pic { display: inline-flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
744
|
+
.s-mod-pic img { width: 64px; height: 40px; object-fit: cover; border-radius: var(--r-sm); border: 1px solid var(--border); }
|
|
745
|
+
.s-mod-raw summary { cursor: pointer; font-size: var(--fs-xs); color: var(--text-2); }
|
|
746
|
+
.s-mod-widget .aw-chat_header { border-width: 1px; border-radius: var(--r-md); }
|
|
747
|
+
.s-mod-text { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
748
|
+
.s-mod-warn { color: var(--warn); font-size: var(--fs-sm); padding-left: 1.75rem; }
|
|
749
|
+
.s-mod-css-text { margin: 0 0 0 1.75rem; max-height: 240px; overflow: auto; padding: var(--s-2); border-radius: var(--r-sm); background: var(--code-bg); font-family: var(--font-mono); font-size: var(--fs-xs); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
750
|
+
.s-mod-err { white-space: pre-line; }
|
|
751
|
+
.s-mod-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
752
|
+
.s-mod-list li { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; min-width: 0; }
|
|
753
|
+
.s-mod-list .grow { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
754
|
+
.s-mod-proposals { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
755
|
+
.s-mod-proposals h4 { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
756
|
+
.s-mod-export summary { cursor: pointer; font-weight: var(--fw-medium); }
|
|
757
|
+
.s-mod-export[open] { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
758
|
+
.s-mod-boxes { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-4); }
|
|
759
|
+
.s-css-actions, .s-widget-actions { display: flex; gap: var(--s-2); flex-wrap: wrap; }
|
|
760
|
+
.s-css-status { margin: 0; font-size: var(--fs-sm); color: var(--text-2); }
|
|
761
|
+
.s-css-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
762
|
+
.s-css-list li { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; min-width: 0; }
|
|
763
|
+
.s-css-list code { overflow-wrap: anywhere; }
|
|
764
|
+
.s-owner-css h4 { margin: var(--s-2) 0 0; font-size: var(--fs-sm); }
|
|
765
|
+
/* #1629 r4 §3: keep-or-revert after saving custom CSS — on every page, above everything but dialogs' scrim. */
|
|
766
|
+
.oc-keep { position: fixed; top: var(--s-3); left: 50%; transform: translateX(-50%); z-index: 120; display: flex; align-items: center; gap: var(--s-2);
|
|
767
|
+
flex-wrap: wrap; max-width: calc(100vw - 32px); padding: var(--s-2) var(--s-3); border-radius: var(--r-md); background: var(--surface);
|
|
768
|
+
color: var(--text-1); border: 1px solid var(--border); box-shadow: var(--shadow-2); font-size: var(--fs-sm); }
|
|
769
|
+
.oc-keep-text { display: inline-flex; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
770
|
+
.oc-keep-q { font-weight: var(--fw-medium); }
|
|
771
|
+
.oc-keep-left { color: var(--text-3); font-variant-numeric: tabular-nums; }
|
|
772
|
+
/* A phone: one row across the top — the question over the seconds left, then Keep and Revert. */
|
|
773
|
+
@media (max-width: 479px) {
|
|
774
|
+
.oc-keep { left: var(--s-2); right: var(--s-2); transform: none; max-width: none; flex-wrap: nowrap; }
|
|
775
|
+
.oc-keep-text { flex: 1; flex-direction: column; align-items: flex-start; gap: 0; }
|
|
776
|
+
}
|
|
613
777
|
.toasts { position: fixed; bottom: var(--s-6); right: var(--s-6); z-index: 100; display: flex; flex-direction: column; align-items: flex-end; gap: var(--s-2); pointer-events: none; }
|
|
614
778
|
.toast { padding: 10px var(--s-4); max-width: min(420px, calc(100vw - 32px)); border-radius: var(--r-md); font-size: var(--fs-sm); font-weight: var(--fw-medium); box-shadow: var(--shadow-2); background: var(--accent-fill); color: var(--on-accent); animation: toast-in var(--t-med) var(--ease); }
|
|
615
779
|
.toast.err { background: var(--danger-fill); color: var(--on-danger); }
|
|
@@ -633,6 +797,7 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
633
797
|
.sb-open .sidebar { transform: none; visibility: visible; }
|
|
634
798
|
.sb-open .scrim { display: block; position: fixed; inset: 0; background: var(--scrim); z-index: 39; }
|
|
635
799
|
.panel-head .sb-open { display: inline-flex; }
|
|
800
|
+
.panel-head .sb-new { display: none; }
|
|
636
801
|
.only-narrow { display: inline-flex; }
|
|
637
802
|
.thread { padding: var(--s-3) var(--s-3) var(--s-2); gap: var(--s-5); }
|
|
638
803
|
.col { padding: var(--s-3) var(--s-3) var(--s-8); }
|
|
@@ -675,6 +840,9 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
675
840
|
color: var(--text-3); font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: 0.04em; cursor: pointer; text-align: left;
|
|
676
841
|
}
|
|
677
842
|
.v-group-head:hover { color: var(--text); }
|
|
843
|
+
/* #2172: what a group is — a team's icon, or "#" before a tag — muted, before its name (sidebar and Settings). */
|
|
844
|
+
.v-group-kind { display: inline-flex; align-items: center; flex: none; color: var(--text-3); font-weight: var(--fw-medium); }
|
|
845
|
+
.v-group-kind.tag { min-width: 0.7em; justify-content: center; }
|
|
678
846
|
.v-group-head .grow { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
679
847
|
.v-group-head .count { font-weight: var(--fw-medium); letter-spacing: 0; text-transform: none; padding: 0 var(--s-2); border-radius: var(--r-full); background: var(--surface-2); }
|
|
680
848
|
.caret { transition: transform var(--t-fast) var(--ease); }
|
|
@@ -691,6 +859,9 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
691
859
|
.inst-star.on { color: var(--warn); }
|
|
692
860
|
.inst-star.on svg, .fav-mark { fill: currentColor; }
|
|
693
861
|
.fav-head { cursor: default; }
|
|
862
|
+
/* #1936: the open instance, pinned on top while a filter is on — its header reads "Current", a line under it. */
|
|
863
|
+
.pinned-head { cursor: default; }
|
|
864
|
+
.v-pinned { border-bottom: 1px solid var(--border); padding-bottom: var(--s-2); margin-bottom: var(--s-1); }
|
|
694
865
|
.fav-mark { color: var(--warn); }
|
|
695
866
|
.inst-nav:not(.fav-editing) .inst-star:not(.on) { visibility: hidden; }
|
|
696
867
|
/* As specific as the rule that hides it (and later), so hover and focus win. */
|
|
@@ -701,6 +872,35 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
701
872
|
@media (max-width: 899px) { .fav-editing .inst-star, .fav-editing .inst-move { width: 36px; height: 36px; } }
|
|
702
873
|
.v-inst .dot { margin-top: 0; }
|
|
703
874
|
.v-meta { color: var(--text-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
875
|
+
.v-meta { flex: none; }
|
|
876
|
+
/* #2179 (B5, the user's pick): the name and its % on the first line; the other name and the last reply's time on the
|
|
877
|
+
second, the time at its end — one column of times down the list. The ★ beside a two-line row sits on the first line. */
|
|
878
|
+
.inst-line { display: flex; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
879
|
+
.inst-line > .inst-name, .inst-line2 > .inst-alt { flex: 1; min-width: 0; }
|
|
880
|
+
.inst-when { flex: none; font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
881
|
+
.inst-when.fresh { color: var(--accent); font-weight: var(--fw-semibold); }
|
|
882
|
+
.v-li.two-line > .inst-star, .v-li.two-line > .inst-move { align-self: flex-start; margin-top: 6px; }
|
|
883
|
+
/* A fresh reply: an accent tint that fades with --reply-a (1 → 0 over ten minutes, set on the row), never over the open
|
|
884
|
+
or a hovered row; one under a minute old pulses once — not under reduced motion. Nothing to click or clear. */
|
|
885
|
+
.inst.replied:not(.active):not(:hover) { background: color-mix(in srgb, var(--accent) calc(var(--reply-a, 0) * 22%), transparent); }
|
|
886
|
+
.inst.just:not(.active) { animation: inst-just 2.4s ease-out 1; }
|
|
887
|
+
@keyframes inst-just { from { box-shadow: inset 0 0 0 1.5px var(--accent); } to { box-shadow: inset 0 0 0 1.5px transparent; } }
|
|
888
|
+
@media (prefers-reduced-motion: reduce) { .inst.just:not(.active) { animation: none; } } /* as specific as the rule it stops */
|
|
889
|
+
/* #2179: how the list sorts — the button says it (the accent while "Recent replies" is on); its menu under it. */
|
|
890
|
+
.inst-head { position: relative; }
|
|
891
|
+
.nav-sort { position: static; flex: none; } /* the menu spans the header's width, under it — never past the sidebar's edge */
|
|
892
|
+
.nav-sort-btn { display: inline-flex; align-items: center; gap: 4px; }
|
|
893
|
+
.nav-sort-btn.on { color: var(--accent); }
|
|
894
|
+
.nav-sort-static { cursor: default; }
|
|
895
|
+
.nav-sort-menu { position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 30; padding: var(--s-3);
|
|
896
|
+
border-radius: var(--r-md); background: var(--surface); border: 1px solid var(--border); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);
|
|
897
|
+
display: flex; flex-direction: column; gap: var(--s-3); }
|
|
898
|
+
.nav-sort-menu fieldset { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
899
|
+
.nav-sort-menu legend { padding: 0 0 4px; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
900
|
+
.nav-sort-opt { display: flex; align-items: flex-start; gap: var(--s-2); min-height: 36px; padding: 4px 2px; font-size: var(--fs-sm); cursor: pointer; }
|
|
901
|
+
.nav-sort-opt input { margin-top: 3px; flex: none; }
|
|
902
|
+
.nav-sort-hint { display: block; font-size: var(--fs-xs); color: var(--text-3); }
|
|
903
|
+
.recent-head { cursor: default; }
|
|
704
904
|
/* #1722: the sidebar's width — a separator on its right edge (drag, arrows, Home/End, double-click resets); not on a phone */
|
|
705
905
|
.side-resize { position: absolute; top: 0; right: -3px; width: 6px; height: 100%; z-index: 5; cursor: col-resize; touch-action: none; }
|
|
706
906
|
.side-resize:hover, .side-resize:focus-visible, .side-resize.dragging { background: var(--accent-dim, var(--border-strong)); }
|
|
@@ -710,7 +910,7 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
710
910
|
.dragging { opacity: 0.4; }
|
|
711
911
|
.drop-before { box-shadow: inset 0 2px 0 var(--accent); }
|
|
712
912
|
.drop-after { box-shadow: inset 0 -2px 0 var(--accent); }
|
|
713
|
-
.v-filter { flex: none; padding: var(--s-2) var(--s-3) var(--s-
|
|
913
|
+
.v-filter { flex: none; padding: var(--s-2) var(--s-3) var(--s-1); border-top: 1px solid var(--border); }
|
|
714
914
|
.v-filter-box { display: flex; align-items: center; gap: var(--s-2); padding: 0 var(--s-1) 0 var(--s-3); border-radius: var(--r-sm); background: var(--surface); color: var(--text-3); }
|
|
715
915
|
.v-filter-box:focus-within { box-shadow: 0 0 0 2px var(--focus); }
|
|
716
916
|
.v-filter-box input { flex: 1; min-width: 0; height: 34px; border: 0; background: transparent; color: var(--text); font-size: var(--fs-sm); outline: none; }
|
|
@@ -773,6 +973,10 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
773
973
|
/* #1749: one line beside ↑↓ — the name gives way first, then the plan badge (each with an ellipsis); ↑↓ never wrap. */
|
|
774
974
|
.u-head strong { min-width: 0; flex: 0 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
775
975
|
.u-plan { min-width: 0; flex: none; max-width: 55%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
976
|
+
/* #2014: a credential profile's row — the provider name beside the plan badge, and the profile on its own full-width
|
|
977
|
+
muted line under the head (one line in the rail, whole in the dialog). */
|
|
978
|
+
.u-profile { margin-top: calc(-1 * var(--s-2) + 2px); color: var(--text-3); font-size: var(--fs-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
979
|
+
.dlg .u-profile { white-space: normal; overflow-wrap: anywhere; }
|
|
776
980
|
.u-order { margin-left: auto; display: flex; gap: 2px; flex: none; }
|
|
777
981
|
.u-order .icon-btn { width: 28px; height: 28px; }
|
|
778
982
|
.u-order .icon-btn:disabled { opacity: 0.3; }
|
|
@@ -1023,6 +1227,123 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1023
1227
|
content: ""; position: absolute; top: var(--s-5); left: calc(-1 * var(--s-4) - 2px); width: var(--s-4); height: 2px; background: var(--border-strong); }
|
|
1024
1228
|
.org-link { min-height: var(--tap); }
|
|
1025
1229
|
}
|
|
1230
|
+
/* ── #1918: the org chart as a canvas (fleet-canvas.js). SVG with classes only: per-card values are SVG attributes, the
|
|
1231
|
+
view's transform one attribute on .oc-world (#1300). The stage fills the panel's height; touch gestures are the
|
|
1232
|
+
canvas's own (touch-action: none on it only), the page around it still scrolls. ── */
|
|
1233
|
+
.oc-bar { flex-wrap: wrap; row-gap: var(--s-2); }
|
|
1234
|
+
.oc-tools { margin-left: auto; display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
|
|
1235
|
+
.oc-find { flex: 0 1 260px; min-width: 150px; position: relative; }
|
|
1236
|
+
.oc-find input { height: 32px; padding-right: 72px; }
|
|
1237
|
+
.oc-found { position: absolute; right: var(--s-3); top: 50%; transform: translateY(-50%); font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; pointer-events: none; }
|
|
1238
|
+
.oc-stage { position: relative; height: clamp(420px, calc(100dvh - 240px), 960px); border: 1px solid var(--border); border-radius: var(--r-lg); overflow: hidden; background: var(--bg); }
|
|
1239
|
+
.oc-svg { display: block; width: 100%; height: 100%; touch-action: none; cursor: grab; user-select: none; -webkit-user-select: none; }
|
|
1240
|
+
.oc-svg:active { cursor: grabbing; }
|
|
1241
|
+
.oc-svg:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
|
|
1242
|
+
.oc-tree path { fill: none; stroke: var(--border-strong); stroke-width: 1.25; }
|
|
1243
|
+
.oc-box { fill: var(--surface); stroke: var(--border); stroke-width: 1; }
|
|
1244
|
+
.oc-team.loose .oc-box { stroke-dasharray: 5 4; }
|
|
1245
|
+
.oc-box.match { stroke: var(--focus); stroke-width: 2.5; }
|
|
1246
|
+
.oc-head { fill: var(--surface-2); }
|
|
1247
|
+
.oc-hit { fill: transparent; }
|
|
1248
|
+
.oc-toggle:not(.empty) { cursor: pointer; }
|
|
1249
|
+
.oc-toggle:focus { outline: none; }
|
|
1250
|
+
.oc-toggle:focus-visible .oc-hit { stroke: var(--focus); stroke-width: 2; }
|
|
1251
|
+
.oc-caret { fill: var(--text-2); font-size: 12px; }
|
|
1252
|
+
.oc-team-name { fill: var(--text); font-size: 13px; font-weight: 600; }
|
|
1253
|
+
.oc-team-meta { fill: var(--text-3); font-size: 11px; }
|
|
1254
|
+
.oc-team-sum { fill: var(--text-2); font-size: 11.5px; }
|
|
1255
|
+
.oc-team.dim, .oc-team-head.dim { opacity: 0.55; }
|
|
1256
|
+
.oc-node.dim { opacity: 0.4; }
|
|
1257
|
+
.oc-node { cursor: pointer; }
|
|
1258
|
+
.oc-node[role="img"] { cursor: default; }
|
|
1259
|
+
.oc-node:focus { outline: none; }
|
|
1260
|
+
.oc-card { fill: var(--bg); stroke: var(--border); stroke-width: 1; }
|
|
1261
|
+
.oc-node.lead .oc-card { fill: var(--surface); stroke: var(--accent); stroke-width: 1.5; }
|
|
1262
|
+
.oc-node:hover .oc-card { stroke: var(--border-strong); }
|
|
1263
|
+
.oc-node:focus-visible .oc-card, .oc-node.match .oc-card, .oc-node.match:hover .oc-card { stroke: var(--focus); stroke-width: 2.5; }
|
|
1264
|
+
.oc-node.st-missing { opacity: 0.7; }
|
|
1265
|
+
.oc-av { fill: var(--surface-2); stroke: var(--surface); stroke-width: 2; }
|
|
1266
|
+
.oc-node.idc.id-ring .oc-av { stroke: var(--id); stroke-width: 2.5; }
|
|
1267
|
+
.oc-idbar { display: none; }
|
|
1268
|
+
.oc-node.idc.id-bar .oc-idbar { display: inline; fill: var(--id); }
|
|
1269
|
+
.oc-face.emoji .oc-av { fill: transparent; }
|
|
1270
|
+
.oc-av-t { fill: var(--text-2); font-size: 12px; font-weight: 600; }
|
|
1271
|
+
.oc-face.emoji .oc-av-t { font-size: 18px; font-weight: normal; }
|
|
1272
|
+
.oc-name { fill: var(--text); font-size: 13.5px; font-weight: 600; }
|
|
1273
|
+
.oc-node.lead .oc-name { font-size: 15px; }
|
|
1274
|
+
.oc-node.idc.id-name .oc-name { fill: var(--id-name); }
|
|
1275
|
+
.oc-sub { font-size: 12px; }
|
|
1276
|
+
.oc-st { fill: var(--text-2); }
|
|
1277
|
+
.oc-st.st-working { fill: var(--ok); } .oc-st.st-needs, .oc-st.st-stuck { fill: var(--warn); } .oc-st.st-crashed { fill: var(--danger); }
|
|
1278
|
+
.oc-dot { fill: var(--text-3); stroke: var(--bg); stroke-width: 2; }
|
|
1279
|
+
.oc-dot.st-working, .oc-dot.st-idle { fill: var(--ok); } .oc-dot.st-needs, .oc-dot.st-stuck { fill: var(--warn); } .oc-dot.st-crashed { fill: var(--danger); }
|
|
1280
|
+
.oc-dot.st-paused { fill: var(--bg); stroke: var(--text-3); stroke-width: 1.5; }
|
|
1281
|
+
.oc-zoom { position: absolute; right: var(--s-3); top: var(--s-3); display: flex; flex-direction: column; border: 1px solid var(--border); border-radius: var(--r-md); overflow: hidden; background: var(--surface); }
|
|
1282
|
+
.oc-zoom .icon-btn { width: 36px; height: 34px; border-radius: 0; font-size: 18px; }
|
|
1283
|
+
.oc-zoom .icon-btn + .icon-btn { border-top: 1px solid var(--border); }
|
|
1284
|
+
.oc-mini { position: absolute; right: var(--s-3); bottom: var(--s-3); width: 180px; height: 120px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); cursor: pointer; }
|
|
1285
|
+
.oc-mini-team { fill: var(--surface-2); stroke: var(--border-strong); stroke-width: 6; }
|
|
1286
|
+
.oc-mini-team.needs { fill: var(--warn-bg); stroke: var(--warn); }
|
|
1287
|
+
.oc-mini-top { fill: var(--accent-dim); stroke: var(--accent); stroke-width: 6; }
|
|
1288
|
+
.oc-mini-team.match { stroke: var(--focus); stroke-width: 14; }
|
|
1289
|
+
.oc-mini-hit { fill: var(--focus); }
|
|
1290
|
+
.oc-mini-view { fill: none; stroke: var(--focus); stroke-width: 10; }
|
|
1291
|
+
/* #1918 phase 3: live traffic. Kind hues kept apart from the state colours (ok = working/idle, warn = needs you, danger). */
|
|
1292
|
+
.oc { --fx-task: #b794f6; --fx-send: #2dd4bf; --fx-report: #f472b6; --fx-broadcast: #fb923c; --fx-team: #cbd5e1; }
|
|
1293
|
+
@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .oc { --fx-task: #7c3aed; --fx-send: #0f766e; --fx-report: #be185d; --fx-broadcast: #c2410c; --fx-team: #475569; } }
|
|
1294
|
+
:root[data-theme="light"] .oc { --fx-task: #7c3aed; --fx-send: #0f766e; --fx-report: #be185d; --fx-broadcast: #c2410c; --fx-team: #475569; }
|
|
1295
|
+
.oc-flow { fill: none; stroke-width: 2.5; stroke-linecap: round; }
|
|
1296
|
+
.oc-flow-halo { fill: none; stroke: var(--bg); stroke-width: 6; stroke-linecap: round; opacity: 0.85; }
|
|
1297
|
+
.oc-flow.h-task { stroke: var(--fx-task); } .oc-flow.h-send { stroke: var(--fx-send); } .oc-flow.h-report { stroke: var(--fx-report); }
|
|
1298
|
+
.oc-flow.h-broadcast { stroke: var(--fx-broadcast); } .oc-flow.h-team { stroke: var(--fx-team); stroke-width: 3.5; }
|
|
1299
|
+
.oc-flow.ph-live { stroke-dasharray: 7 6; animation: oc-dash 0.9s linear infinite; }
|
|
1300
|
+
.oc-flow.ph-queued { stroke-dasharray: 2 5; opacity: 0.8; }
|
|
1301
|
+
.oc-flow.ph-fading { stroke: var(--text-3); animation: oc-fade 12s ease-out forwards; }
|
|
1302
|
+
/* #1918 review: the work — a delegation in progress (a slow dash, kept until its report), its report coming back, none. */
|
|
1303
|
+
.oc-flow.ph-work { stroke-dasharray: 10 7; stroke-width: 3; animation: oc-dash 2.4s linear infinite; }
|
|
1304
|
+
.oc-flow.ph-return { stroke-width: 3; animation: oc-fade 2.4s ease-out forwards; }
|
|
1305
|
+
.oc-flow.ph-stale { stroke: var(--text-3); stroke-dasharray: 3 6; animation: oc-fade 12s ease-out forwards; }
|
|
1306
|
+
.oc-ah.h-task { fill: var(--fx-task); } .oc-ah.h-send { fill: var(--fx-send); } .oc-ah.h-report { fill: var(--fx-report); }
|
|
1307
|
+
.oc-ah.h-broadcast { fill: var(--fx-broadcast); } .oc-ah.h-team { fill: var(--fx-team); } .oc-ah.h-fading { fill: var(--text-3); }
|
|
1308
|
+
.oc-pulse.h-task { fill: var(--fx-task); } .oc-pulse.h-send { fill: var(--fx-send); } .oc-pulse.h-report { fill: var(--fx-report); }
|
|
1309
|
+
.oc-pulse.h-broadcast { fill: var(--fx-broadcast); } .oc-pulse.h-team { fill: var(--fx-team); }
|
|
1310
|
+
.oc-fl.dim { opacity: 0.18; }
|
|
1311
|
+
.oc-badge rect { fill: var(--surface-2); stroke: var(--border); } .oc-badge text { fill: var(--text-2); font-size: 10.5px; }
|
|
1312
|
+
@keyframes oc-dash { to { stroke-dashoffset: -26; } }
|
|
1313
|
+
@keyframes oc-fade { from { opacity: 0.8; } to { opacity: 0.15; } }
|
|
1314
|
+
/* #2052: the key is a strip under the toolbar (its toggle is in the toolbar), never over the canvas. */
|
|
1315
|
+
.oc-legend { margin: 0 0 var(--s-2); font-size: var(--fs-xs); color: var(--text-2); background: var(--surface); border: 1px solid var(--border);
|
|
1316
|
+
border-radius: var(--r-md); padding: 6px 10px; }
|
|
1317
|
+
.oc-key.on { border-color: var(--accent); }
|
|
1318
|
+
.oc-lg-rows { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); }
|
|
1319
|
+
.oc-lg { display: inline-flex; align-items: center; gap: 6px; }
|
|
1320
|
+
.oc-sw { width: 18px; height: 3px; border-radius: 2px; display: inline-block; background: var(--text-3); }
|
|
1321
|
+
.oc-sw.h-task { background: var(--fx-task); } .oc-sw.h-send { background: var(--fx-send); } .oc-sw.h-report { background: var(--fx-report); } .oc-sw.h-broadcast { background: var(--fx-broadcast); }
|
|
1322
|
+
.oc-sw.ph-queued { background: repeating-linear-gradient(90deg, var(--text-2) 0 3px, transparent 3px 7px); }
|
|
1323
|
+
.oc-sw.ph-fading { opacity: 0.5; }
|
|
1324
|
+
.oc-sw.ph-work { background: repeating-linear-gradient(90deg, var(--fx-task) 0 6px, transparent 6px 9px); height: 4px; }
|
|
1325
|
+
.oc-sw.ph-return { height: 4px; }
|
|
1326
|
+
.oc-sw.ph-stale { background: repeating-linear-gradient(90deg, var(--text-3) 0 2px, transparent 2px 6px); }
|
|
1327
|
+
.oc-live { gap: 6px; }
|
|
1328
|
+
.oc-live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--text-3); }
|
|
1329
|
+
.oc-live.on .oc-live-dot { background: var(--ok); }
|
|
1330
|
+
.org-sending { font-size: var(--fs-xs); color: var(--text-2); overflow-wrap: anywhere; }
|
|
1331
|
+
.org-send.k-task { color: var(--fx-task); } .org-send.k-report { color: var(--fx-report); } .org-send.k-broadcast { color: var(--fx-broadcast); }
|
|
1332
|
+
.org-send.k-send, .org-send.k-query, .org-send.k-update { color: var(--fx-send); }
|
|
1333
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1334
|
+
.oc-flow.ph-live { animation: none; stroke-dasharray: none; }
|
|
1335
|
+
.oc-flow.ph-fading { animation: none; opacity: 0.4; }
|
|
1336
|
+
.oc-flow.ph-work { animation: none; }
|
|
1337
|
+
.oc-flow.ph-return, .oc-flow.ph-stale { animation: none; opacity: 0.5; }
|
|
1338
|
+
.oc-pulse { display: none; }
|
|
1339
|
+
}
|
|
1340
|
+
@media (max-width: 640px) {
|
|
1341
|
+
.oc-stage { height: calc(100dvh - 248px); min-height: 340px; }
|
|
1342
|
+
.oc-find { flex: 1 1 150px; }
|
|
1343
|
+
/* #2052: Find, Key, Live and Canvas/List are wider than a phone together: the row wraps (nothing is cut off). */
|
|
1344
|
+
.oc-tools { margin-left: 0; width: 100%; flex-wrap: wrap; row-gap: var(--s-2); }
|
|
1345
|
+
.oc-mini { display: none; }
|
|
1346
|
+
}
|
|
1026
1347
|
/* A phone: Fleet's five tabs fit when only the open one shows its label (the others keep theirs for screen readers). */
|
|
1027
1348
|
@media (max-width: 479px) {
|
|
1028
1349
|
.p-fleet .seg-item:not(.active) > span, .p-settings .seg-item:not(.active) > span { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
|
|
@@ -1064,6 +1385,73 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1064
1385
|
.ch-bar .btn { min-height: var(--tap); }
|
|
1065
1386
|
}
|
|
1066
1387
|
|
|
1388
|
+
/* ── #2122: Fleet → Usage. A categorical palette kept apart from the state colours (Okabe–Ito hues, tuned per mode for
|
|
1389
|
+
contrast); every series also has a text label, so colour is never the only cue. ── */
|
|
1390
|
+
.us { --us-0: #56b4e9; --us-1: #e69f00; --us-2: #2bc48a; --us-3: #f0e442; --us-4: #e78ac3; --us-5: #94a3b8; --us-heat: #56b4e9;
|
|
1391
|
+
display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
|
|
1392
|
+
@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .us { --us-0: #0072b2; --us-1: #c25400; --us-2: #007a5a; --us-3: #8a6d00; --us-4: #b0457a; --us-5: #64748b; --us-heat: #0072b2; } }
|
|
1393
|
+
:root[data-theme="light"] .us { --us-0: #0072b2; --us-1: #c25400; --us-2: #007a5a; --us-3: #8a6d00; --us-4: #b0457a; --us-5: #64748b; --us-heat: #0072b2; }
|
|
1394
|
+
.us-bar-top { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); margin-top: var(--s-2); }
|
|
1395
|
+
.us-group { display: inline-flex; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); color: var(--text-2); }
|
|
1396
|
+
.us-group select, .us-custom input { min-height: 32px; padding: 0 var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg); color: var(--text); }
|
|
1397
|
+
.us-group select:focus, .us-custom input:focus { border-color: var(--focus); box-shadow: 0 0 0 3px var(--accent-dim); outline: none; }
|
|
1398
|
+
.us-csv { margin-left: auto; }
|
|
1399
|
+
.us-custom { display: flex; flex-wrap: wrap; align-items: end; gap: var(--s-2) var(--s-3); font-size: var(--fs-sm); }
|
|
1400
|
+
.us-custom label { display: inline-flex; flex-direction: column; gap: 2px; color: var(--text-2); }
|
|
1401
|
+
.us-basis { font-size: var(--fs-sm); color: var(--text); padding: var(--s-2) var(--s-3); border-left: 3px solid var(--accent); background: var(--surface-2); border-radius: var(--r-sm); }
|
|
1402
|
+
.us-fresh { font-size: var(--fs-xs); }
|
|
1403
|
+
.us-partial { font-size: var(--fs-sm); padding: var(--s-2) var(--s-3); border-left: 3px solid var(--warn); background: var(--warn-bg); border-radius: var(--r-sm); }
|
|
1404
|
+
.us-unpriced { font-size: var(--fs-xs); }
|
|
1405
|
+
.us-scan { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
|
|
1406
|
+
.us-totals { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-3); margin: 0; }
|
|
1407
|
+
.us-totals .ch-metric dd { font-size: var(--fs-lg); }
|
|
1408
|
+
.us-table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
|
|
1409
|
+
.us-table th, .us-table td { padding: var(--s-2); border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
|
|
1410
|
+
.us-table thead th { font-size: 11px; font-weight: var(--fw-regular); color: var(--text-3); }
|
|
1411
|
+
.us-table .num { text-align: right; white-space: nowrap; }
|
|
1412
|
+
.us-name { min-width: 0; max-width: 360px; font-weight: var(--fw-regular); }
|
|
1413
|
+
.us-name .mono { display: block; font-weight: var(--fw-semibold); overflow-wrap: anywhere; }
|
|
1414
|
+
.us-bar { display: block; width: 100%; height: 6px; margin: 4px 0; }
|
|
1415
|
+
.us-bar-bg { fill: var(--surface-2); } .us-bar-fg { fill: var(--us-0); }
|
|
1416
|
+
.us-meta { display: block; font-size: var(--fs-xs); color: var(--text-3); overflow-wrap: anywhere; }
|
|
1417
|
+
.us-flags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
|
|
1418
|
+
.us-trend, .us-heat { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
|
|
1419
|
+
.us-trend h3, .us-heat h3, .us-rest h3 { font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
|
|
1420
|
+
.us-scroll { overflow-x: auto; max-width: 100%; }
|
|
1421
|
+
.us-chart, .us-heatmap { display: block; }
|
|
1422
|
+
.us-axis { font-size: 9px; fill: var(--text-3); }
|
|
1423
|
+
.us-s0 { fill: var(--us-0); background: var(--us-0); } .us-s1 { fill: var(--us-1); background: var(--us-1); } .us-s2 { fill: var(--us-2); background: var(--us-2); }
|
|
1424
|
+
.us-s3 { fill: var(--us-3); background: var(--us-3); } .us-s4 { fill: var(--us-4); background: var(--us-4); } .us-s5 { fill: var(--us-5); background: var(--us-5); }
|
|
1425
|
+
.us-legend { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-4); list-style: none; padding: 0; margin: 0; font-size: var(--fs-xs); }
|
|
1426
|
+
.us-legend li { display: inline-flex; align-items: center; gap: var(--s-1); min-width: 0; overflow-wrap: anywhere; }
|
|
1427
|
+
.us-sw, .us-h-sw { display: inline-block; width: 10px; height: 10px; border-radius: 2px; flex-shrink: 0; }
|
|
1428
|
+
.us-h { fill: var(--us-heat); }
|
|
1429
|
+
.us-h.l1, .us-h-sw.l1 { opacity: 0.45; } .us-h.l2 { opacity: 0.65; } .us-h.l3 { opacity: 0.85; } .us-h.l4, .us-h-sw.l4 { opacity: 1; }
|
|
1430
|
+
.us-h-sw.l4 { background: var(--us-heat); }
|
|
1431
|
+
/* Read with nothing used: a solid grey cell. Not collected: an empty dashed outline. */
|
|
1432
|
+
.us-h.idle { fill: var(--text-3); opacity: 0.35; }
|
|
1433
|
+
.us-h-sw.idle { background: var(--text-3); opacity: 0.35; }
|
|
1434
|
+
.us-h.gap { fill: none; stroke: var(--text-3); stroke-width: 1; stroke-dasharray: 2 2; }
|
|
1435
|
+
.us-h-sw.gap { border: 1px dashed var(--text-3); }
|
|
1436
|
+
.us-grid, .us-base { stroke: var(--border); stroke-width: 1; }
|
|
1437
|
+
.us-grid { stroke-dasharray: 3 3; }
|
|
1438
|
+
.us-scale, .us-earlier { font-size: var(--fs-xs); }
|
|
1439
|
+
.us-heat-key { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1); font-size: var(--fs-xs); }
|
|
1440
|
+
.us-rest .row-item { font-size: var(--fs-xs); }
|
|
1441
|
+
.u-by-agent { margin-left: auto; }
|
|
1442
|
+
@media (max-width: 699px) {
|
|
1443
|
+
.us-totals { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
1444
|
+
.us-csv { margin-left: 0; }
|
|
1445
|
+
.us-bar-top .btn { min-height: var(--tap); }
|
|
1446
|
+
/* Rows become cards: each value with its label. */
|
|
1447
|
+
.us-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
|
|
1448
|
+
.us-table, .us-table tbody, .us-table tr, .us-table th, .us-table td { display: block; width: 100%; }
|
|
1449
|
+
.us-table tr { margin-bottom: var(--s-3); padding: var(--s-3); border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--bg); }
|
|
1450
|
+
.us-table th, .us-table td { border: 0; padding: 2px 0; max-width: none; }
|
|
1451
|
+
.us-table td { display: flex; justify-content: space-between; gap: var(--s-3); }
|
|
1452
|
+
.us-table td::before { content: attr(data-label); color: var(--text-3); text-align: left; }
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1067
1455
|
/* ── Chat commands and quick actions (#1269) ── */
|
|
1068
1456
|
.hd-chip { margin-left: var(--s-2); padding: 0 var(--s-2); border: 1px solid var(--border); border-radius: var(--r-full); background: transparent; color: var(--text-2);
|
|
1069
1457
|
font-size: var(--fs-xs); line-height: 20px; cursor: pointer; max-width: 16em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle; }
|
|
@@ -1096,6 +1484,179 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1096
1484
|
}
|
|
1097
1485
|
/* #1630: a Discord server emoji in a chat message, the size of the text around it. */
|
|
1098
1486
|
.md img.emoji { display: inline-block; width: 1.375em; height: 1.375em; object-fit: contain; vertical-align: -0.3em; margin: 0 0.05em; }
|
|
1487
|
+
.md .emoji-text { color: var(--text-2); }
|
|
1099
1488
|
/* #1682: a mention, as Discord draws one — accent text on a tint of it; the id (or the Telegram handle) on hover. */
|
|
1100
1489
|
.md .mention { display: inline; padding: 0 0.2em; border-radius: var(--r-sm); color: var(--accent); background: var(--accent-dim);
|
|
1101
1490
|
font-weight: var(--fw-medium); white-space: nowrap; }
|
|
1491
|
+
|
|
1492
|
+
/* #1629 r4 §1 / r4.1 Q3 (a): the identity card (identity-card.js). The size is a class token; its heights are here
|
|
1493
|
+
(S 160 / M 240 / L 360 px, on a phone 120 / 180 / 240). Never a style attribute.
|
|
1494
|
+
#2038: the banner's height follows the card's width — S 4:1, M 3:1, L 2.25:1 — between a floor and a ceiling per size,
|
|
1495
|
+
so it is never a strip across a wide chat and never a wall on a phone; the picture fills it, cropped about its middle.
|
|
1496
|
+
The chat header's card (card-c) follows the same size choice (card-c bs-<size>). */
|
|
1497
|
+
.id-card { --id-feather: linear-gradient(to right, transparent 0, #000 7%, #000 93%, transparent 100%); --id-h: 240px; --id-ar: 3 / 1; --id-bmin: 140px; --id-bmax: 240px; margin: 0 0 var(--s-4); border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface); overflow: hidden; }
|
|
1498
|
+
.id-card.card-s { --id-h: 160px; --id-ar: 4 / 1; --id-bmin: 100px; --id-bmax: 160px; }
|
|
1499
|
+
.id-card.card-l { --id-h: 360px; --id-ar: 9 / 4; --id-bmin: 200px; --id-bmax: 360px; }
|
|
1500
|
+
.id-card.card-c { --id-h: 96px; --id-bmin: 120px; --id-bmax: 200px; margin: 0; border: 0; border-radius: 0; background: none; }
|
|
1501
|
+
.id-card.card-c.bs-s { --id-ar: 4 / 1; --id-bmin: 96px; --id-bmax: 150px; }
|
|
1502
|
+
.id-card.card-c.bs-l { --id-ar: 9 / 4; --id-bmin: 150px; --id-bmax: 220px; }
|
|
1503
|
+
/* #2086: the banner at its focus (--id-focus, set per card), never wider than 5 : 1 — its width is capped at five times its
|
|
1504
|
+
size's tallest height, so the band shown everywhere is (picture aspect ÷ 5) of its height. Beyond that it is centred
|
|
1505
|
+
over a blurred copy of itself. */
|
|
1506
|
+
.id-banner-box { position: relative; overflow: hidden; container: idbanner / inline-size; }
|
|
1507
|
+
/* #2089 review: and never narrower than 9 : 4 — its height never more than its box's width ÷ 2.25 (a size's floor yields
|
|
1508
|
+
to it on a narrow column: a wide sidebar, the usage rail), so the promised safe area holds on every layout. */
|
|
1509
|
+
.id-banner { position: relative; display: block; width: 100%; max-width: calc(var(--id-bmax) * 5); margin-inline: auto; height: auto; aspect-ratio: var(--id-ar);
|
|
1510
|
+
min-height: min(var(--id-bmin), calc(100cqw / 2.25)); max-height: min(var(--id-bmax), calc(100cqw / 2.25)); object-fit: cover; object-position: 50% var(--id-focus, 50%); }
|
|
1511
|
+
/* #2086: Edit profile's banner focus — the picture whole, the band every screen shows (dashed, outside it shaded) and a phone's. */
|
|
1512
|
+
.bf-wrap { position: relative; max-width: 440px; overflow: hidden; border-radius: var(--r-sm); }
|
|
1513
|
+
.bf-pic { display: block; width: 100%; height: auto; }
|
|
1514
|
+
.bf-band { position: absolute; pointer-events: none; box-sizing: border-box; }
|
|
1515
|
+
.bf-band span { position: absolute; right: 4px; top: 2px; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: #fff; text-shadow: 0 1px 2px #000, 0 0 4px #000; }
|
|
1516
|
+
.bf-safe { border: 2px dashed #fff; box-shadow: 0 0 0 999px rgba(0, 0, 0, .45); }
|
|
1517
|
+
/* The phone's band over the shade, in its own colour (its label at its own top-left, never in the shaded part). */
|
|
1518
|
+
.bf-phone { z-index: 1; border: 2px solid #ffd54a; }
|
|
1519
|
+
.bf-phone span { right: auto; left: 8px; top: 5px; color: #ffd54a; }
|
|
1520
|
+
.bf-field input[type=range] { width: 100%; max-width: 440px; }
|
|
1521
|
+
.id-banner-fill { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% var(--id-focus, 50%); filter: blur(24px) saturate(0.75) brightness(0.7); transform: scale(1.4); opacity: .9; pointer-events: none; }
|
|
1522
|
+
/* Wider than the banner's cap (5 × the size's tallest height): its sides feather into the fill, so the sharp centre
|
|
1523
|
+
leads without a seam. One threshold per size (a container query cannot read a custom property). */
|
|
1524
|
+
@container idbanner (min-width: 750px) { .id-card.card-c.bs-s .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1525
|
+
@container idbanner (min-width: 800px) { .id-card.card-s .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1526
|
+
@container idbanner (min-width: 1000px) { .id-card.card-c:not(.bs-s):not(.bs-l) .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1527
|
+
@container idbanner (min-width: 1100px) { .id-card.card-c.bs-l .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1528
|
+
@container idbanner (min-width: 1200px) { .id-card:not(.card-s):not(.card-l):not(.card-c) .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1529
|
+
@container idbanner (min-width: 1800px) { .id-card.card-l .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1530
|
+
.id-row { display: flex; align-items: flex-start; gap: var(--s-3); padding: var(--s-3) var(--s-4); }
|
|
1531
|
+
.id-portrait { display: block; flex-shrink: 0; height: var(--id-h); width: auto; max-width: min(calc(var(--id-h) * 0.75), 100%); object-fit: cover; border-radius: var(--r-sm); }
|
|
1532
|
+
.id-text { flex: 1; min-width: 0; }
|
|
1533
|
+
.id-tagline { margin: 0 0 var(--s-1); font-weight: var(--fw-semibold); overflow-wrap: anywhere; }
|
|
1534
|
+
.id-bio { margin: 0; color: var(--text-2); white-space: pre-line; overflow-wrap: anywhere; }
|
|
1535
|
+
.card-size { display: flex; flex-shrink: 0; gap: var(--s-1); }
|
|
1536
|
+
.card-size .seg-item { min-height: 28px; padding: 0 var(--s-2); border: 1px solid transparent; background: none; font: inherit; font-size: var(--fs-xs); cursor: pointer; }
|
|
1537
|
+
.card-size .seg-item.active { border-color: var(--accent); background: var(--accent-dim); color: var(--text); }
|
|
1538
|
+
.chat-card { flex-shrink: 0; border-bottom: 1px solid var(--border); }
|
|
1539
|
+
/* #1629 r4-4: widgets — the page's own components, from a declarative spec (agent-widget.js). The host draws the 1px
|
|
1540
|
+
frame and the ✦ chip, outside anything the spec chooses; nothing in a widget takes a click or focus. Colours are the
|
|
1541
|
+
theme's tokens (an agent's chat header sits inside its themed chat), so a person's own CSS can restyle them too. */
|
|
1542
|
+
.aw { border: 1px dashed var(--border-strong); border-radius: var(--r-md); padding: var(--s-2) var(--s-3); display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; overflow: clip; user-select: text; }
|
|
1543
|
+
.aw-head { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
1544
|
+
.aw-chip { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--accent); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
1545
|
+
.aw-by { font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; }
|
|
1546
|
+
.aw-items { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
|
|
1547
|
+
.aw-item { display: flex; align-items: center; gap: var(--s-2); min-width: 0; font-size: var(--fs-sm); }
|
|
1548
|
+
.aw-label { color: var(--text-2); font-size: var(--fs-xs); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 1; min-width: 0; }
|
|
1549
|
+
.aw-value { color: var(--text); font-weight: var(--fw-medium); overflow-wrap: anywhere; min-width: 0; }
|
|
1550
|
+
.aw-stat .aw-value { margin-left: auto; font-variant-numeric: tabular-nums; }
|
|
1551
|
+
.aw-unit { margin-left: 2px; color: var(--text-2); font-weight: var(--fw-regular); }
|
|
1552
|
+
.aw-text .aw-value { font-weight: var(--fw-regular); }
|
|
1553
|
+
.aw-bar { flex: 1; min-width: 48px; height: 6px; appearance: none; border: 0; border-radius: var(--r-full); background: var(--surface-2); overflow: hidden; }
|
|
1554
|
+
.aw-bar::-webkit-progress-bar { background: var(--surface-2); border-radius: var(--r-full); }
|
|
1555
|
+
.aw-bar::-webkit-progress-value { background: var(--accent); border-radius: var(--r-full); }
|
|
1556
|
+
.aw-bar::-moz-progress-bar { background: var(--accent); border-radius: var(--r-full); }
|
|
1557
|
+
.aw-progress .aw-value { margin-left: auto; font-size: var(--fs-xs); font-variant-numeric: tabular-nums; min-width: 3.5em; text-align: right; }
|
|
1558
|
+
.aw-list { flex-direction: column; align-items: stretch; gap: var(--s-1); }
|
|
1559
|
+
.aw-list ul { margin: 0; padding-left: 1.2em; display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
|
|
1560
|
+
.aw-badge { display: inline-block; padding: 1px var(--s-2); border-radius: var(--r-full); font-size: var(--fs-xs); font-weight: var(--fw-medium); white-space: nowrap; background: var(--surface-2); color: var(--text-2); }
|
|
1561
|
+
.aw-tone-ok { background: var(--ok-bg); color: var(--ok); }
|
|
1562
|
+
.aw-tone-warn { background: var(--warn-bg); color: var(--warn); }
|
|
1563
|
+
.aw-tone-bad { background: var(--danger-bg); color: var(--danger); }
|
|
1564
|
+
.aw-tone-info { background: var(--accent-dim); color: var(--accent); }
|
|
1565
|
+
.aw-spark { flex: 1; min-width: 48px; height: 24px; }
|
|
1566
|
+
.aw-spark polyline { fill: none; stroke: var(--accent); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
|
|
1567
|
+
.aw-spark-item .aw-value { font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
1568
|
+
/* The chat header strip: one compact row under the card, in that agent's chat only. When it is wider than the chat (a
|
|
1569
|
+
phone), the row scrolls sideways inside its own box — never wraps out of it, never cuts an item. */
|
|
1570
|
+
.aw-chat_header { flex-shrink: 0; flex-direction: row; flex-wrap: nowrap; align-items: center; gap: var(--s-4); border-width: 0 0 1px; border-radius: 0; padding: var(--s-1) var(--s-4); min-height: 32px; max-height: 72px; overflow-x: auto; overflow-y: hidden; overscroll-behavior-x: contain; }
|
|
1571
|
+
.aw-chat_header .aw-head { flex-shrink: 0; }
|
|
1572
|
+
.aw-chat_header .aw-items { flex-direction: row; flex: 1 0 auto; gap: var(--s-4); }
|
|
1573
|
+
.aw-chat_header .aw-item { flex: 0 0 auto; white-space: nowrap; }
|
|
1574
|
+
.aw-chat_header .aw-value { white-space: nowrap; }
|
|
1575
|
+
.aw-chat_header .aw-text .aw-value { display: inline-block; max-width: 24em; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; }
|
|
1576
|
+
.aw-chat_header .aw-stat .aw-value { margin-left: 0; }
|
|
1577
|
+
.aw-chat_header .aw-bar { flex: 0 0 auto; width: 96px; }
|
|
1578
|
+
/* On a phone the strip may run past the edge: a fade says there is more to scroll to (the last item scrolls clear of it). */
|
|
1579
|
+
@media (max-width: 899px) { .aw-chat_header { padding-right: var(--s-7); -webkit-mask-image: linear-gradient(to right, #000 calc(100% - var(--s-7)), transparent); mask-image: linear-gradient(to right, #000 calc(100% - var(--s-7)), transparent); } }
|
|
1580
|
+
.aw-details { background: var(--surface); margin-bottom: var(--s-4); padding: var(--s-4) var(--s-5); }
|
|
1581
|
+
.side-widget { padding: 0 var(--s-3) var(--s-2); }
|
|
1582
|
+
.aw-sidebar { max-height: 240px; overflow: auto; }
|
|
1583
|
+
|
|
1584
|
+
.chat-card-toggle { display: flex; align-items: center; gap: var(--s-2); width: 100%; min-height: 32px; padding: 0 var(--s-4); border: 0; background: none; color: var(--text-2); font: inherit; font-size: var(--fs-xs); text-align: left; cursor: pointer; }
|
|
1585
|
+
.chat-card-peek { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); }
|
|
1586
|
+
/* A phone: the portrait stays on the text's row, smaller (the user's ask: never a portrait alone on a line with the text
|
|
1587
|
+
under it); the S / M / L control takes the line below. The chat header's card is trimmed further: a smaller portrait
|
|
1588
|
+
and banner, and its tagline and bio cut to a few lines (Details and View show them whole). */
|
|
1589
|
+
@media (max-width: 479px) {
|
|
1590
|
+
.id-card.card-s { --id-h: 96px; --id-bmin: 80px; --id-bmax: 120px; }
|
|
1591
|
+
.id-card.card-m { --id-h: 128px; --id-bmin: 100px; --id-bmax: 150px; }
|
|
1592
|
+
.id-card.card-l { --id-h: 168px; --id-bmin: 120px; --id-bmax: 200px; }
|
|
1593
|
+
.id-card.card-c { --id-h: 64px; --id-bmin: 80px; --id-bmax: 110px; }
|
|
1594
|
+
.id-card.card-c.bs-s { --id-bmin: 80px; --id-bmax: 100px; }
|
|
1595
|
+
.id-card.card-c.bs-l { --id-bmin: 96px; --id-bmax: 130px; }
|
|
1596
|
+
.id-row { flex-wrap: wrap; gap: var(--s-2) var(--s-3); padding: var(--s-2) var(--s-3); }
|
|
1597
|
+
.card-size { flex-basis: 100%; justify-content: flex-end; }
|
|
1598
|
+
.id-card.card-c .id-tagline, .id-card.card-c .id-bio { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; }
|
|
1599
|
+
.id-card.card-c .id-tagline { -webkit-line-clamp: 2; line-clamp: 2; }
|
|
1600
|
+
.id-card.card-c .id-bio { -webkit-line-clamp: 3; line-clamp: 3; }
|
|
1601
|
+
}
|
|
1602
|
+
/* #1629 r4 §1: the card in View (above the profile row) and its part of Edit profile. */
|
|
1603
|
+
.v-id { flex-shrink: 0; padding: var(--s-2) var(--s-4) 0; background: var(--bg); }
|
|
1604
|
+
.v-id .id-card { margin: 0; }
|
|
1605
|
+
.form-sub { margin: var(--s-2) 0 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
|
|
1606
|
+
/* #1629 r4.1 Q3 (b): Settings → Appearance, the card's upload limits (three to a row; one on a phone). */
|
|
1607
|
+
.grid3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-3) var(--s-4); margin-bottom: var(--s-3); }
|
|
1608
|
+
.s-limit-warnings { margin: var(--s-2) 0; padding-left: var(--s-4); }
|
|
1609
|
+
@media (max-width: 479px) { .grid3 { grid-template-columns: minmax(0, 1fr); } }
|
|
1610
|
+
|
|
1611
|
+
/* #1629 B2: effect library controls. No runtime layer is created by this card. */
|
|
1612
|
+
.s-fx-actions { display: flex; flex-wrap: wrap; gap: var(--s-2); align-items: center; }
|
|
1613
|
+
.s-fx-item { margin-top: var(--s-3); padding-top: var(--s-3); border-top: 1px solid var(--border); }
|
|
1614
|
+
.s-fx-item h4 { margin: 0; }
|
|
1615
|
+
.s-fx-poster { display: block; max-width: min(240px, 100%); max-height: 160px; object-fit: contain; border-radius: var(--r-sm); }
|
|
1616
|
+
|
|
1617
|
+
.s-fx-chat, .s-fx-params label:not(.check) { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2); }
|
|
1618
|
+
.s-fx-chat { margin: var(--s-2) 0; }
|
|
1619
|
+
.s-fx-params { display: flex; flex-direction: column; gap: var(--s-2); margin: var(--s-2) 0; max-width: 100%; }
|
|
1620
|
+
.s-fx-target, .s-fx-params input:not([type=checkbox]), .s-fx-params select { min-height: 36px; min-width: 0; max-width: 100%; padding: 0 var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg); color: var(--text); }
|
|
1621
|
+
|
|
1622
|
+
/* #1629: stock paint bands. Structural ancestors remain neutral; only bounded content owns level 1.
|
|
1623
|
+
The viewport effect root is a direct body sibling: behind 0 / stock content 1 (header 2) / front 20.
|
|
1624
|
+
Nested menus cannot cross a content stacking context: the unmounted trust guard suspends fronts for overlays. */
|
|
1625
|
+
.app-root { z-index: auto; }
|
|
1626
|
+
.conn, .panel-head, .chat-card, .aw-chat_header, .chat-main > .scroller, .chat-main > .dock,
|
|
1627
|
+
.sidebar > .side-head, .sidebar > .side-nav, .sidebar > .side-section, .sidebar > .side-widget, .sidebar > .side-foot,
|
|
1628
|
+
.u-rail > .u-rail-head, .u-rail > .u-rail-body { position: relative; z-index: 1; }
|
|
1629
|
+
/* Header menus must stay above the later scroller stacking context. */
|
|
1630
|
+
.panel-head { z-index: 2; }
|
|
1631
|
+
@media (min-width: 900px) { .chat-split > .pv-divider, .chat-split > .pv-panel { position: relative; z-index: 1; } }
|
|
1632
|
+
/* #1629: owner choices share the existing control font floor. */
|
|
1633
|
+
.s-fx-owner{margin-top:var(--s-4);padding-top:var(--s-3);border-top:1px solid var(--border)}
|
|
1634
|
+
.s-fx-owner-row{display:flex;align-items:end;flex-wrap:wrap;gap:var(--s-2);margin-top:var(--s-2)}
|
|
1635
|
+
.s-fx-owner-row>label{display:flex;flex-direction:column;gap:var(--s-1);min-width:0;flex:1}
|
|
1636
|
+
|
|
1637
|
+
/* #2044: the effect frame's document declares no colour scheme (light). An iframe whose own colour scheme differs
|
|
1638
|
+
from its document's gets an opaque backdrop, so under the dark theme the frame hid the whole chat: keep them equal. */
|
|
1639
|
+
.agend-effect-frame { color-scheme: normal !important; }
|
|
1640
|
+
|
|
1641
|
+
/* #1629: host-created static poster IMG; geometry and visibility belong to the trusted CSSOM binding. */
|
|
1642
|
+
.agend-effect-poster { object-fit: cover !important; object-position: center !important; user-select: none; }
|
|
1643
|
+
|
|
1644
|
+
/* #1629: full-app bounded stock surfaces. Panel roots stay neutral; effects never raise the whole app. */
|
|
1645
|
+
.p-fleet > .seg, .p-settings > .seg,
|
|
1646
|
+
.p-fleet > .panel-body, .p-needs > .panel-body, .p-settings > .panel-body,
|
|
1647
|
+
.p-log > .panel-body, .p-details > .panel-body, .p-view > .panel-body,
|
|
1648
|
+
.p-log > .log-bar, .p-view > .v-term, .p-view > .v-id, .p-view > .v-card { position: relative; z-index: 1; }
|
|
1649
|
+
/* Keep the existing Apply bar's sticky behavior, in its own bounded stock band. */
|
|
1650
|
+
.p-settings > .s-pending { z-index: 1; }
|
|
1651
|
+
|
|
1652
|
+
/* #1629: host-owned local Trial panel. Only its canvas frame lives inside the paint-contained stage. */
|
|
1653
|
+
.effect-trial-head, .effect-trial-controls, .effect-trial-note { position: relative; z-index: 1; background: var(--bg); padding: var(--s-3); margin: 0; }
|
|
1654
|
+
.effect-trial-head { display: flex; align-items: center; gap: var(--s-2); border-bottom: 1px solid var(--border); }
|
|
1655
|
+
.effect-trial-head > span { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
1656
|
+
.effect-trial-body { flex: 1; min-height: 0; display: flex; padding: var(--s-3); }
|
|
1657
|
+
.effect-trial-stage { position: relative; z-index: 0; flex: 1; min-width: 0; min-height: 0; contain: paint; overflow: clip; padding: 0; border: 0; outline: none; box-shadow: none; }
|
|
1658
|
+
|
|
1659
|
+
/* #2115: diagnostics remain inside the stock protected panel header, never in an effect plane. */
|
|
1660
|
+
.panel-head:has(> .chat-fx-notice) { flex-wrap: wrap; }
|
|
1661
|
+
.chat-fx-notice { order: 10; flex: 1 1 100%; min-width: 0; max-width: 100%; font-size: var(--fs-sm); overflow-wrap: anywhere; }
|
|
1662
|
+
.chat-fx-notice > span { display: block; }
|