@songsid/agend 2.3.0-beta.2 → 2.3.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/README.zh-TW.md +7 -1
- package/dist/agent-cli-instructions.md +9 -2
- package/dist/agent-cli.js +63 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +4 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +4 -1
- package/dist/agent-file-read.js +189 -16
- package/dist/agent-file-read.js.map +1 -1
- package/dist/agent-whats-new.d.ts +11 -0
- package/dist/agent-whats-new.js +29 -5
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/auth-api.d.ts +30 -1
- package/dist/auth-api.js +45 -13
- 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/claude-code.d.ts +2 -2
- package/dist/backend/claude-code.js +18 -8
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +8 -0
- package/dist/backend/codex-metadata.js +74 -17
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.js +15 -2
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +2 -0
- package/dist/backend/credential-profile.js +2 -0
- package/dist/backend/credential-profile.js.map +1 -1
- package/dist/backend/types.d.ts +6 -0
- package/dist/backend/types.js +15 -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 +23 -3
- package/dist/backend-command.js +25 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/bug-report-cli.d.ts +30 -0
- package/dist/bug-report-cli.js +138 -0
- package/dist/bug-report-cli.js.map +1 -0
- package/dist/bug-report.d.ts +47 -0
- package/dist/bug-report.js +136 -0
- package/dist/bug-report.js.map +1 -0
- 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-ledger.d.ts +16 -3
- package/dist/cache-ledger.js +33 -13
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-service.d.ts +55 -3
- package/dist/cache-service.js +152 -16
- 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 +9 -0
- package/dist/channel/adapters/discord.js +49 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +22 -11
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +6 -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 +224 -111
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.d.ts +6 -0
- package/dist/config-validator.js +129 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +13 -1
- package/dist/config.js +14 -5
- package/dist/config.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +7 -0
- package/dist/cross-instance-notice.js +10 -0
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +24 -1
- package/dist/daemon.js +151 -19
- 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 +17 -1
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/diagnostic-redaction.d.ts +10 -0
- package/dist/diagnostic-redaction.js +167 -0
- package/dist/diagnostic-redaction.js.map +1 -0
- package/dist/fleet-context.d.ts +10 -0
- package/dist/fleet-manager.d.ts +505 -15
- package/dist/fleet-manager.js +1870 -204
- 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/bug-report/SKILL.md +31 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +17 -6
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +2 -0
- 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/scheduling/SKILL.md +4 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +190 -47
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +545 -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-config-impact.js +7 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -1
- package/dist/instance-lifecycle.js +79 -18
- 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 +173 -12
- package/dist/locale.js.map +1 -1
- package/dist/log-steps.d.ts +1 -0
- package/dist/log-steps.js +15 -0
- package/dist/log-steps.js.map +1 -1
- package/dist/login-controller.d.ts +45 -0
- package/dist/login-controller.js +101 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +96 -0
- package/dist/ls-attach-resolve.js +180 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/ls-rows.d.ts +12 -0
- package/dist/ls-rows.js +82 -3
- package/dist/ls-rows.js.map +1 -1
- 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.d.ts +10 -0
- package/dist/needs-you.js +2 -1
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +11 -0
- package/dist/outbound-handlers.js +139 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +200 -4
- package/dist/outbound-schemas.js +124 -11
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +17 -4
- 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 +19 -1
- package/dist/quickstart-api.js +94 -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/restart-progress.d.ts +80 -1
- package/dist/restart-progress.js +306 -21
- 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/db.d.ts +40 -13
- package/dist/scheduler/db.js +123 -89
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/task-board-text.d.ts +26 -0
- package/dist/scheduler/task-board-text.js +135 -0
- package/dist/scheduler/task-board-text.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +650 -0
- package/dist/scheduler/task-board.js +1938 -0
- package/dist/scheduler/task-board.js.map +1 -0
- package/dist/scheduler/types.d.ts +6 -1
- package/dist/search/search-docs.d.ts +58 -0
- package/dist/search/search-docs.js +63 -0
- package/dist/search/search-docs.js.map +1 -0
- package/dist/search/search-index.d.ts +141 -0
- package/dist/search/search-index.js +440 -0
- package/dist/search/search-index.js.map +1 -0
- package/dist/search/search-store.d.ts +122 -0
- package/dist/search/search-store.js +236 -0
- package/dist/search/search-store.js.map +1 -0
- package/dist/search/search-worker.d.ts +1 -0
- package/dist/search/search-worker.js +163 -0
- package/dist/search/search-worker.js.map +1 -0
- package/dist/service-installer.js +12 -0
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +23 -0
- package/dist/settings-api.js +164 -3
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +104 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +3 -1
- package/dist/settings-confirmation.js +2 -0
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +34 -3
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +11 -0
- package/dist/settings-http-confirmation.js +10 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +23 -7
- package/dist/setup-form.js.map +1 -1
- package/dist/spawn-gate.d.ts +1 -0
- package/dist/spawn-gate.js +13 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/task-board-tool.d.ts +25 -0
- package/dist/task-board-tool.js +154 -0
- package/dist/task-board-tool.js.map +1 -0
- package/dist/task-board-waker.d.ts +44 -0
- package/dist/task-board-waker.js +128 -0
- package/dist/task-board-waker.js.map +1 -0
- package/dist/tmux-exec-helper.d.ts +94 -0
- package/dist/tmux-exec-helper.js +407 -0
- package/dist/tmux-exec-helper.js.map +1 -0
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +42 -11
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +0 -7
- package/dist/tool-permissions.js +44 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +17 -1
- package/dist/topic-commands.js +45 -19
- package/dist/topic-commands.js.map +1 -1
- 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 +63 -1
- package/dist/ui/app-effects.js +90 -32
- package/dist/ui/backend-signin.js +297 -0
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +8 -8
- package/dist/ui/chat-effects.js +110 -15
- package/dist/ui/chat-msg-actions.js +176 -0
- package/dist/ui/chat-render.js +21 -3
- package/dist/ui/chat-store.js +64 -12
- package/dist/ui/chat-strings.js +85 -8
- package/dist/ui/chat-thread.js +204 -21
- package/dist/ui/effect-trial-controller.js +13 -8
- package/dist/ui/effect-trial-panel.js +19 -16
- package/dist/ui/effects-waker.js +70 -0
- package/dist/ui/fleet-canvas-layout.js +117 -0
- package/dist/ui/fleet-canvas.js +555 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-route-scene.js +207 -0
- package/dist/ui/fleet-route-worker.js +21 -0
- package/dist/ui/fleet-route.js +88 -0
- package/dist/ui/fleet-task-card.js +436 -0
- package/dist/ui/fleet-task-common.js +448 -0
- package/dist/ui/fleet-tasks.js +535 -0
- package/dist/ui/fleet-traffic.js +359 -0
- package/dist/ui/fleet-usage.js +435 -0
- package/dist/ui/panel-chat.js +264 -66
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +65 -83
- package/dist/ui/panel-needs.js +4 -2
- package/dist/ui/panel-settings.js +56 -11
- package/dist/ui/preview.js +3 -2
- package/dist/ui/search-dialog.js +349 -0
- package/dist/ui/settings-appearance.js +44 -19
- package/dist/ui/settings-apply.js +3 -3
- package/dist/ui/settings-catalog.js +92 -0
- package/dist/ui/settings-confirm.js +7 -2
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +4 -3
- 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 +23 -9
- package/dist/ui/settings-owner-effects.js +15 -13
- package/dist/ui/settings-strings.js +122 -42
- package/dist/ui/settings-web-authority.js +91 -0
- package/dist/ui/shared/agend-auth.js +1 -1
- package/dist/ui/shared/app-i18n.js +11 -2
- package/dist/ui/shared/app-prefs.js +17 -4
- package/dist/ui/shared/app-route.js +19 -1
- package/dist/ui/shared/app-session.js +2 -0
- package/dist/ui/shared/app-shell.js +174 -30
- package/dist/ui/shared/app-store.js +26 -1
- package/dist/ui/shared/app-stream.js +5 -1
- package/dist/ui/shared/app-themes.js +140 -7
- package/dist/ui/shared/app.css +704 -20
- package/dist/ui/shared/app.js +26 -15
- package/dist/ui/shared/card-strings.js +8 -0
- package/dist/ui/shared/effect-app-runtime.js +68 -19
- package/dist/ui/shared/effect-chat-runtime.js +16 -3
- package/dist/ui/shared/effect-frame.js +26 -7
- package/dist/ui/shared/effect-geometry.js +24 -9
- package/dist/ui/shared/effect-owner-source.js +8 -1
- package/dist/ui/shared/effect-policy.js +21 -7
- package/dist/ui/shared/effect-profiler.js +31 -9
- package/dist/ui/shared/effect-registry.js +97 -50
- package/dist/ui/shared/effect-stock-snapshot.js +9 -0
- package/dist/ui/shared/effect-stock-trust.js +62 -10
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-source.js +1 -1
- package/dist/ui/shared/effect-trial-stage.js +54 -31
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/fx-motion.js +67 -0
- package/dist/ui/shared/identity-card.js +100 -11
- package/dist/ui/shared/identity-color.js +14 -10
- package/dist/ui/shared/instance-nav.js +179 -23
- package/dist/ui/shared/owner-css.js +30 -1
- package/dist/ui/shared/panel-view.js +24 -4
- package/dist/ui/shared/tokens.css +9 -3
- package/dist/ui/shared/ui-icons.js +2 -0
- package/dist/ui/shared/ui-menu.js +20 -7
- package/dist/ui/shared/ui-toast.js +16 -3
- package/dist/ui/shared/usage-dialog.js +34 -3
- package/dist/ui/shared/view-strings.js +72 -0
- package/dist/ui/shared/web-authorize.js +198 -0
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/ui/web-terminal/terminal.html +1 -1
- package/dist/update-launch.d.ts +9 -0
- package/dist/update-launch.js +38 -12
- package/dist/update-launch.js.map +1 -1
- package/dist/usage/format-rich.js +6 -3
- package/dist/usage/format-rich.js.map +1 -1
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +2 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/i18n.d.ts +13 -1
- package/dist/usage/i18n.js +29 -0
- package/dist/usage/i18n.js.map +1 -1
- package/dist/usage/providers.d.ts +81 -2
- package/dist/usage/providers.js +240 -38
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/usage-api.d.ts +5 -1
- package/dist/usage/usage-api.js +184 -58
- package/dist/usage/usage-api.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/user-systemd.d.ts +24 -0
- package/dist/user-systemd.js +75 -0
- package/dist/user-systemd.js.map +1 -0
- package/dist/view-api.d.ts +39 -0
- package/dist/view-api.js +69 -6
- 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 +98 -14
- package/dist/web-api.js +1027 -83
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-policy.d.ts +4 -6
- package/dist/web-appearance-policy.js +5 -12
- package/dist/web-appearance-policy.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +3 -0
- package/dist/web-appearance-tools.js +22 -3
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.d.ts +27 -2
- package/dist/web-appearance-view.js +129 -14
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +17 -3
- package/dist/web-appearance.js +85 -8
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-asset-parts.d.ts +2 -2
- package/dist/web-asset-parts.js +3 -3
- package/dist/web-asset-parts.js.map +1 -1
- package/dist/web-auth.js +3 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-backend-login.d.ts +130 -0
- package/dist/web-backend-login.js +225 -0
- package/dist/web-backend-login.js.map +1 -0
- package/dist/web-card.d.ts +14 -0
- package/dist/web-card.js +40 -6
- package/dist/web-card.js.map +1 -1
- 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 +83 -0
- package/dist/web-chat-history.js +137 -5
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +6 -1
- package/dist/web-commands.js +1 -1
- package/dist/web-commands.js.map +1 -1
- 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.js +46 -1
- package/dist/web-effect-bundle.js.map +1 -1
- 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-profiles.d.ts +4 -4
- package/dist/web-effect-service.d.ts +11 -4
- package/dist/web-effect-service.js +25 -4
- package/dist/web-effect-service.js.map +1 -1
- package/dist/web-effect-tools.d.ts +1 -0
- package/dist/web-effect-tools.js +4 -4
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.d.ts +2 -2
- package/dist/web-effect-trials.js +3 -3
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-effect-upload.js +1 -1
- package/dist/web-effect-upload.js.map +1 -1
- package/dist/web-effect-worker.d.ts +1 -1
- package/dist/web-effect-worker.js +2 -2
- package/dist/web-effect-worker.js.map +1 -1
- package/dist/web-effect.d.ts +1 -1
- package/dist/web-guest-access.d.ts +126 -0
- package/dist/web-guest-access.js +238 -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-host-guard.d.ts +11 -0
- package/dist/web-host-guard.js +11 -0
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-identity-color.d.ts +1 -1
- package/dist/web-identity-color.js +2 -2
- package/dist/web-identity-color.js.map +1 -1
- package/dist/web-identity-palette.d.ts +1 -1
- package/dist/web-identity-palette.js +2 -2
- package/dist/web-identity-palette.js.map +1 -1
- package/dist/web-image-meta.d.ts +13 -0
- package/dist/web-image-meta.js +62 -0
- package/dist/web-image-meta.js.map +1 -1
- package/dist/web-libavoid.d.ts +14 -0
- package/dist/web-libavoid.js +46 -0
- package/dist/web-libavoid.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 +1 -1
- package/dist/web-mod-agent.js +7 -5
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-bundle.d.ts +9 -1
- package/dist/web-mod-bundle.js +62 -3
- package/dist/web-mod-bundle.js.map +1 -1
- package/dist/web-mod-export.d.ts +9 -0
- package/dist/web-mod-export.js +21 -0
- package/dist/web-mod-export.js.map +1 -1
- package/dist/web-mod-store.d.ts +7 -1
- package/dist/web-mod-store.js +19 -6
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +44 -1
- package/dist/web-owner-css-store.js +70 -9
- package/dist/web-owner-css-store.js.map +1 -1
- package/dist/web-prefs.d.ts +14 -0
- package/dist/web-prefs.js +37 -4
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +6 -2
- package/dist/web-preview.js +4 -2
- 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 +49 -2
- package/dist/web-settings-patch.js +145 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +94 -0
- package/dist/web-settings-tools.js +301 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-shell-routes.d.ts +1 -1
- package/dist/web-shell-routes.js +1 -1
- 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 +39 -0
- package/dist/web-theme-store.js +122 -11
- package/dist/web-theme-store.js.map +1 -1
- package/dist/web-theme.d.ts +31 -0
- package/dist/web-theme.js +99 -2
- package/dist/web-theme.js.map +1 -1
- 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/windows-shortcuts.d.ts +78 -0
- package/dist/windows-shortcuts.js +203 -0
- package/dist/windows-shortcuts.js.map +1 -0
- package/dist/workflow-templates/default.md +4 -1
- package/dist/yaml-shared-nodes.d.ts +25 -0
- package/dist/yaml-shared-nodes.js +185 -0
- package/dist/yaml-shared-nodes.js.map +1 -0
- package/launcher/agend-install.cjs +553 -0
- package/launcher/install-admission.cjs +4 -39
- package/launcher/postinstall.cjs +14 -12
- package/package.json +4 -2
- package/scripts/preinstall-guard.cjs +2 -5
- package/templates/windows-shortcuts.ps1 +181 -0
- package/launcher/old-updater-note.cjs +0 -48
package/dist/ui/shared/app.css
CHANGED
|
@@ -119,7 +119,10 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
119
119
|
@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .idc { --id: var(--id-light); --id-name: var(--id-name-light); } }
|
|
120
120
|
:root[data-theme="light"] .idc { --id: var(--id-light); --id-name: var(--id-name-light); }
|
|
121
121
|
.idc.id-ring .av { box-shadow: 0 0 0 2px var(--id); }
|
|
122
|
-
|
|
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; }
|
|
123
126
|
.idc.id-name .inst-name { color: var(--id-name); }
|
|
124
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; }
|
|
125
128
|
.idc-swatches legend, .idc-places legend { font-weight: var(--fw-semibold); margin-bottom: 6px; width: 100%; }
|
|
@@ -132,6 +135,20 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
132
135
|
.idc-hex { width: 9ch; font-family: var(--font-mono, monospace); }
|
|
133
136
|
.dlg-actions .dlg-spacer { flex: 1 1 auto; }
|
|
134
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; }
|
|
135
152
|
.av-text { overflow: hidden; }
|
|
136
153
|
.av .av-dot { position: absolute; right: -2px; bottom: -2px; margin: 0; box-shadow: 0 0 0 2px var(--bg-sidebar); }
|
|
137
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 */
|
|
@@ -164,6 +181,13 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
164
181
|
.side-foot > .session { position: static; }
|
|
165
182
|
.side-foot .side-row span:not(.dot):not(.meta) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
166
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%; }
|
|
167
191
|
.prefs-pop > summary { list-style: none; cursor: pointer; }
|
|
168
192
|
.prefs-pop > summary::-webkit-details-marker { display: none; }
|
|
169
193
|
.prefs.labelled { flex-direction: column; gap: var(--s-2); padding: 0; }
|
|
@@ -222,11 +246,15 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
222
246
|
}
|
|
223
247
|
.panel-head .sb-open { display: none; }
|
|
224
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)); }
|
|
225
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. */
|
|
226
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)); }
|
|
227
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; }
|
|
228
254
|
.panel-sub { color: var(--text-2); font-size: var(--fs-sm); white-space: nowrap; }
|
|
229
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; }
|
|
230
258
|
.panel-actions { display: flex; align-items: center; gap: var(--s-1); }
|
|
231
259
|
/* #1523 N2: the instance view switch — beside the title on a wide screen; on a phone, a row of tabs under the header. */
|
|
232
260
|
.inst-switch.seg { padding: 0; margin: 0; width: auto; max-width: none; flex-shrink: 0; }
|
|
@@ -322,6 +350,10 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
322
350
|
.menu-item:hover:not(:disabled), .menu-item:focus-visible { background: var(--surface-2); outline: none; }
|
|
323
351
|
.menu-item.danger { color: var(--danger); }
|
|
324
352
|
.menu-item:disabled { opacity: 0.45; }
|
|
353
|
+
/* #2196: a group's heading in a menu (Page colours) and its radio items (the chosen one ticked). */
|
|
354
|
+
.menu-heading { padding: var(--s-2) var(--s-3) var(--s-1); font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); border-top: 1px solid var(--border); margin-top: var(--s-1); }
|
|
355
|
+
.menu-heading:first-child { border-top: 0; margin-top: 0; }
|
|
356
|
+
.menu-radio .menu-tick { width: 16px; display: inline-flex; color: var(--accent); }
|
|
325
357
|
|
|
326
358
|
/* ── Dialog: centred on a desktop, a bottom sheet on a phone ── */
|
|
327
359
|
.dlg { border: 0; padding: 0; border-radius: var(--r-lg); background: var(--bg); color: var(--text); box-shadow: var(--shadow-2); width: min(480px, calc(100vw - 32px)); max-height: 85vh; }
|
|
@@ -345,6 +377,9 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
345
377
|
.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); }
|
|
346
378
|
.field input:disabled { opacity: 0.6; }
|
|
347
379
|
.field-row { display: flex; gap: var(--s-1); align-items: center; }
|
|
380
|
+
/* #2072: a model field — the list, and the text box "Other…" opens under it. */
|
|
381
|
+
.model-pick { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
|
|
382
|
+
.model-pick > select, .model-pick > input { width: 100%; }
|
|
348
383
|
.note { font-size: var(--fs-xs); color: var(--text-3); }
|
|
349
384
|
.checks { display: flex; flex-direction: column; gap: var(--s-1); max-height: 180px; overflow-y: auto; }
|
|
350
385
|
.check { display: flex; gap: var(--s-2); align-items: center; font-size: var(--fs-sm); }
|
|
@@ -392,7 +427,7 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
392
427
|
|
|
393
428
|
/* ── Chat ── */
|
|
394
429
|
.p-chat .scroller { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; position: relative; }
|
|
395
|
-
.thread { max-width: var(--col); margin:
|
|
430
|
+
.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); }
|
|
396
431
|
.msg { font-size: var(--fs-md); line-height: var(--lh-md); overflow-wrap: anywhere; min-width: 0; }
|
|
397
432
|
.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); }
|
|
398
433
|
.msg .sender { font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
@@ -422,6 +457,9 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
422
457
|
.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); }
|
|
423
458
|
.msg.status-line .st-more:hover { color: var(--text); }
|
|
424
459
|
.msg-tools { display: flex; gap: var(--s-1); margin-top: var(--s-1); opacity: 0; transition: opacity var(--t-fast); }
|
|
460
|
+
/* #2147: bounded stock toolbar paint, including fixed descendants. Padding preserves focus outlines. */
|
|
461
|
+
.shell .thread .msg-tools { contain: paint; overflow: clip; overflow-clip-margin: 0px; padding: 4px; margin: 0 -4px -4px; }
|
|
462
|
+
.shell .thread .codeblock > .cb-head { contain: paint; overflow: clip; overflow-clip-margin: 0px; }
|
|
425
463
|
.msg:hover .msg-tools, .msg:focus-within .msg-tools { opacity: 1; }
|
|
426
464
|
@media (hover: none) { .msg-tools { opacity: 1; } }
|
|
427
465
|
/* Delivery ticks: always visible, in colour, with their label on hover and for screen readers (rough edge 10). */
|
|
@@ -526,9 +564,17 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
526
564
|
.chat-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
527
565
|
/* #1629: an agent's theme on its own chat surface — custom properties set on .p-chat through the CSSOM, choices as
|
|
528
566
|
these tokens. The surface paints its own background (the page's body is not its). */
|
|
567
|
+
/*
|
|
568
|
+
* #2196: an agent's colours on the whole page (app-themes.js applyPageTheme, on .shell): the shell paints its own
|
|
569
|
+
* background then, under the sidebar, the header, the usage rail and a phone's tabs. The header follows the page, not
|
|
570
|
+
* the chat: it takes the shell's colours back (--chrome-*: resolved on .shell, so the page's theme or the page's own).
|
|
571
|
+
*/
|
|
572
|
+
.shell.th-page { background: var(--bg); color: var(--text); }
|
|
573
|
+
.shell { --chrome-bg: var(--bg); --chrome-surface: var(--surface); --chrome-text: var(--text); --chrome-text-2: var(--text-2); --chrome-accent: var(--accent); }
|
|
574
|
+
.p-chat > .panel-head { --bg: var(--chrome-bg); --surface: var(--chrome-surface); --text: var(--chrome-text); --text-2: var(--chrome-text-2); --accent: var(--chrome-accent); background: var(--bg); color: var(--text); }
|
|
529
575
|
.p-chat.th { background: var(--bg); color: var(--text); }
|
|
530
576
|
.p-chat.th .msg.user .body { border-radius: var(--bubble-radius, var(--r-xl)); }
|
|
531
|
-
.p-chat.th-font-system .thread, .p-chat.th-font-system .composer textarea { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; }
|
|
577
|
+
.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); }
|
|
532
578
|
.p-chat.th-font-mono .thread, .p-chat.th-font-mono .composer textarea { font-family: var(--font-mono); }
|
|
533
579
|
.p-chat.th-bubble-thin .msg.user .body { box-shadow: inset 0 0 0 1px var(--border); }
|
|
534
580
|
.p-chat.th-bubble-accent .msg.user .body { box-shadow: inset 0 0 0 1px var(--accent); }
|
|
@@ -538,6 +584,20 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
538
584
|
.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; }
|
|
539
585
|
.th-bg-cover { object-fit: cover; }
|
|
540
586
|
.th-bg-contain { object-fit: contain; }
|
|
587
|
+
/* #2117: an agent's ambient effect (chat-ambient.js). The loop sits behind the thread (z 0, under the scroller and the
|
|
588
|
+
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).
|
|
589
|
+
Neither ever takes a pointer, focus or selection; positions and sizes are set through the CSSOM. */
|
|
590
|
+
.chat-main.has-amb { position: relative; }
|
|
591
|
+
.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; }
|
|
592
|
+
.chat-main.has-amb > .amb-layer { z-index: 0; }
|
|
593
|
+
.chat-main.has-amb > .amb-burst { z-index: 1; }
|
|
594
|
+
.amb-p { position: absolute; left: 0; top: 0; line-height: 1; color: var(--accent); pointer-events: none; will-change: transform, opacity; }
|
|
595
|
+
img.amb-p { object-fit: contain; }
|
|
596
|
+
.s-mod-glyph { width: 24px; height: 24px; object-fit: contain; }
|
|
597
|
+
/* #2117: the one-time "reduced motion; effects are on" note, a strip above the thread. */
|
|
598
|
+
.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; }
|
|
599
|
+
.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; }
|
|
600
|
+
.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; }
|
|
541
601
|
.pv-divider { flex: 0 0 8px; cursor: col-resize; background: var(--bg); border-left: 1px solid var(--border); touch-action: none; position: relative; }
|
|
542
602
|
.pv-divider::after { content: ""; position: absolute; top: 50%; left: 2px; width: 3px; height: 32px; margin-top: -16px; border-radius: 2px; background: var(--border-strong); }
|
|
543
603
|
.pv-divider:hover::after, .pv-divider:focus-visible::after, .chat-split.resizing .pv-divider::after { background: var(--accent); }
|
|
@@ -566,6 +626,24 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
566
626
|
.pv-code { flex: 1; min-height: 0; margin: 0; overflow: auto; font-family: var(--font-mono); font-size: var(--fs-xs); line-height: 1.5;
|
|
567
627
|
background: var(--surface); border-radius: var(--r-sm); padding: var(--s-3); white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text); }
|
|
568
628
|
.msg.flash { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r-sm); transition: outline-color var(--t-med); }
|
|
629
|
+
/* #2272: a message's reply action (top right, on hover or focus), the quote a reply shows, the message menu, a swipe. */
|
|
630
|
+
.msg[data-key] { position: relative; }
|
|
631
|
+
.msg[data-key]:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r-sm); }
|
|
632
|
+
.msg-actions { position: absolute; top: -6px; right: 0; z-index: 2; display: flex; gap: var(--s-1); padding: 2px; border-radius: var(--r-sm);
|
|
633
|
+
background: var(--surface); box-shadow: var(--shadow-1); opacity: 0; pointer-events: none; transition: opacity var(--t-fast); }
|
|
634
|
+
.msg:hover > .msg-actions, .msg:focus-within > .msg-actions { opacity: 1; pointer-events: auto; }
|
|
635
|
+
@media (hover: none) { .msg-actions { display: none; } }
|
|
636
|
+
.msg-quote { display: flex; align-items: center; gap: 4px; max-width: 100%; margin: 0 0 4px; padding: 2px var(--s-2); border: 0;
|
|
637
|
+
border-left: 3px solid var(--border-strong, var(--border)); border-radius: var(--r-sm); background: transparent; color: var(--text-3);
|
|
638
|
+
font: inherit; font-size: var(--fs-sm); text-align: left; cursor: pointer; overflow: hidden; }
|
|
639
|
+
.msg.user .msg-quote { margin-left: auto; }
|
|
640
|
+
.msg-quote:hover, .msg-quote:focus-visible { color: var(--text-2); background: var(--surface-2); outline: none; }
|
|
641
|
+
.msg-quote .quote-sender { font-weight: var(--fw-semibold); white-space: nowrap; }
|
|
642
|
+
.msg-quote .quote-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
643
|
+
.msg-menu { position: fixed; z-index: 60; min-width: 180px; padding: var(--s-1); border-radius: var(--r-md); background: var(--surface);
|
|
644
|
+
box-shadow: var(--shadow-2); display: flex; flex-direction: column; }
|
|
645
|
+
.msg[data-key] { transition: transform var(--t-fast); }
|
|
646
|
+
.msg.swipe-ready { box-shadow: 3px 0 0 var(--accent); border-radius: var(--r-sm); } /* let go now: a reply */
|
|
569
647
|
@media (max-width: 899px) {
|
|
570
648
|
.only-wide { display: none; }
|
|
571
649
|
.pv-divider { display: none; }
|
|
@@ -593,8 +671,12 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
593
671
|
.pv-menu[open] { z-index: 6; background: var(--surface); border-radius: var(--r-sm); padding: var(--s-1); box-shadow: var(--shadow-2); }
|
|
594
672
|
.pv-menu[open] > .chip-btn { display: block; text-align: left; width: max-content; max-width: 260px; white-space: normal; }
|
|
595
673
|
|
|
674
|
+
/* #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
|
|
675
|
+
hiding it 48 px from the bottom took that room away under a reader still scrolling — the wheel's last step was cut
|
|
676
|
+
short, or the view clamped back. Its dock is sticky and 0 px tall; the pill floats above it. */
|
|
677
|
+
.jump-dock { position: sticky; bottom: 0; height: 0; z-index: 5; }
|
|
596
678
|
.jump-latest {
|
|
597
|
-
position:
|
|
679
|
+
position: absolute; bottom: var(--s-3); left: 50%; transform: translateX(-50%); white-space: nowrap; display: inline-flex; align-items: center; gap: var(--s-1);
|
|
598
680
|
background: var(--bg); color: var(--text); border: 1px solid var(--border); border-radius: var(--r-full); box-shadow: var(--shadow-2);
|
|
599
681
|
padding: 6px var(--s-4); font-size: var(--fs-xs); font-weight: var(--fw-semibold); cursor: pointer;
|
|
600
682
|
}
|
|
@@ -632,8 +714,58 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
632
714
|
/* A narrow phone: Stop reply beside Send leaves the message box no room — the label is for screen readers there. */
|
|
633
715
|
@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; } }
|
|
634
716
|
.btn-stop { background: var(--bg); }
|
|
635
|
-
.hint { font-size: var(--fs-xs); color: var(--text-3);
|
|
717
|
+
.hint { font-size: var(--fs-xs); color: var(--text-3); }
|
|
718
|
+
/* #2215 (the user's request, 2026-10-19): one row under the composer, at the bottom left — this browser's web authority, then
|
|
719
|
+
the key hint. Its height is kept even before the authority is read (#2184: switching chats never moves the composer). */
|
|
720
|
+
.composer-row { position: relative; display: flex; align-items: center; gap: var(--s-2); min-height: 20px; margin-top: calc(-1 * var(--s-1));
|
|
721
|
+
font-size: var(--fs-xs); line-height: 1.4; color: var(--text-3); white-space: nowrap; }
|
|
722
|
+
.composer-row > * { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
723
|
+
.composer-row > .hint { flex-shrink: 1000; }
|
|
724
|
+
.composer-row > :not(.hint) + .hint::before { content: "·"; margin-right: var(--s-2); }
|
|
725
|
+
/* A guest's note and the public link's sentence are kept whole: on a narrow screen they wrap rather than lose words. */
|
|
726
|
+
.composer-row .guest-note, .composer-row .webauth-row[data-state="public"] { margin: 0; text-align: left; white-space: normal; flex-shrink: 1; }
|
|
727
|
+
.webauth-row { display: inline-flex; align-items: center; gap: var(--s-1); }
|
|
728
|
+
.webauth-row .webauth-ok, .webauth-row .webauth-ask { font: inherit; padding: 0 2px; border: 0; background: none; cursor: pointer; border-radius: var(--r-sm); }
|
|
729
|
+
.webauth-row .webauth-ok { color: var(--ok); }
|
|
730
|
+
.webauth-row .webauth-ask { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
|
|
731
|
+
.webauth-row .webauth-ok:focus-visible, .webauth-row .webauth-ask:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
|
|
732
|
+
/* What pressing Authorize answered is said in the row, in the hint's place: nothing is laid over the composer. */
|
|
733
|
+
.webauth-row .webauth-notice { white-space: normal; color: var(--text-2); }
|
|
734
|
+
.webauth-row .webauth-notice::before { content: "·"; margin-right: var(--s-2); color: var(--text-3); }
|
|
735
|
+
.composer-row:has(.webauth-notice) > .hint { display: none; }
|
|
736
|
+
/* When "✓ Verified" ends, on a tap (touch has no hover): a bubble above the row while it has focus. */
|
|
737
|
+
.webauth-tip { position: absolute; left: 0; bottom: calc(100% + 4px); z-index: 5; max-width: min(420px, calc(100vw - 32px)); white-space: normal;
|
|
738
|
+
padding: var(--s-1) var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); color: var(--text);
|
|
739
|
+
box-shadow: var(--shadow-2); }
|
|
740
|
+
.webauth-tip[hidden] { display: none; }
|
|
741
|
+
/* #1920 phase 3: Settings → Web → Guests. */
|
|
742
|
+
.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;
|
|
743
|
+
padding: var(--s-1) var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); }
|
|
744
|
+
.s-guests .guest-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
745
|
+
.s-guests .guest-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
746
|
+
.s-guests .guest-row { padding: var(--s-2) var(--s-3); border: 1px solid var(--border); border-radius: var(--r-sm); }
|
|
747
|
+
.s-guests .guest-actions { display: flex; flex-wrap: wrap; gap: var(--s-1); margin-top: var(--s-1); }
|
|
748
|
+
.s-guests .guest-narrow-edit { margin-top: var(--s-2); }
|
|
749
|
+
.s-guests .guest-away { color: var(--text-3); }
|
|
750
|
+
/* #1939 S2b: this browser's authorization, under the composer and in the session menu (one compact line). */
|
|
751
|
+
.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); }
|
|
752
|
+
.webauth-chip .webauth-ok { color: var(--ok); }
|
|
753
|
+
.webauth-chip .btn-sm { min-height: 24px; }
|
|
754
|
+
/* #1939 S2a: Settings → Web → Web authority. */
|
|
755
|
+
.s-web-authority .s-va-sessions { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
756
|
+
.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; }
|
|
757
|
+
.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); }
|
|
758
|
+
.s-web-authority .save-row { flex-wrap: wrap; }
|
|
759
|
+
/* #1920: a guest's note under the composer — on a phone too, where the key hints are hidden. */
|
|
760
|
+
.guest-note { margin: 2px 0 0; font-size: var(--fs-xs); color: var(--text-3); text-align: center; }
|
|
636
761
|
.pending-files { display: flex; flex-wrap: wrap; gap: var(--s-2); padding: var(--s-2) var(--s-2) 0; }
|
|
762
|
+
/* #2272: replying — the bar above the composer (who and what is answered; ✕ / Esc cancels). */
|
|
763
|
+
.reply-bar { display: flex; align-items: center; gap: var(--s-2); min-width: 0; margin: var(--s-2) var(--s-2) 0; padding: 4px var(--s-2) 4px var(--s-3);
|
|
764
|
+
border-left: 3px solid var(--accent); border-radius: var(--r-sm); background: var(--surface-2); font-size: var(--fs-sm); }
|
|
765
|
+
.reply-bar .reply-mark { color: var(--accent); }
|
|
766
|
+
.reply-bar .reply-label { font-weight: var(--fw-semibold); white-space: nowrap; }
|
|
767
|
+
.reply-bar .reply-text { flex: 1; min-width: 0; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
768
|
+
.reply-bar .reply-cancel { flex: none; width: 28px; height: 28px; }
|
|
637
769
|
.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; }
|
|
638
770
|
.file-chip img { width: 28px; height: 28px; object-fit: cover; border-radius: 4px; }
|
|
639
771
|
.file-chip .nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
@@ -702,6 +834,9 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
702
834
|
.oc-keep { left: var(--s-2); right: var(--s-2); transform: none; max-width: none; flex-wrap: nowrap; }
|
|
703
835
|
.oc-keep-text { flex: 1; flex-direction: column; align-items: flex-start; gap: 0; }
|
|
704
836
|
}
|
|
837
|
+
/* #2299: the toasts are a manual popover (ui-toast.js), so they stand in the top layer above an open dialog's backdrop;
|
|
838
|
+
the popover's own box (inset 0, margin, border, background) is undone here, before any placement below. */
|
|
839
|
+
:where(.toasts) { inset: auto; margin: 0; padding: 0; border: 0; background: none; color: inherit; overflow: visible; width: auto; height: auto; }
|
|
705
840
|
.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; }
|
|
706
841
|
.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); }
|
|
707
842
|
.toast.err { background: var(--danger-fill); color: var(--on-danger); }
|
|
@@ -725,9 +860,15 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
725
860
|
.sb-open .sidebar { transform: none; visibility: visible; }
|
|
726
861
|
.sb-open .scrim { display: block; position: fixed; inset: 0; background: var(--scrim); z-index: 39; }
|
|
727
862
|
.panel-head .sb-open { display: inline-flex; }
|
|
863
|
+
.panel-head .sb-new { display: none; }
|
|
728
864
|
.only-narrow { display: inline-flex; }
|
|
729
865
|
.thread { padding: var(--s-3) var(--s-3) var(--s-2); gap: var(--s-5); }
|
|
730
|
-
|
|
866
|
+
/* #2299: a phone's side gutter is 16 px — the content column, the header and the toasts alike. */
|
|
867
|
+
.col { padding: var(--s-3) var(--s-4) var(--s-8); }
|
|
868
|
+
.panel-head { padding: max(var(--s-1), env(safe-area-inset-top)) max(var(--s-4), env(safe-area-inset-right)) var(--s-1) max(var(--s-4), env(safe-area-inset-left)); }
|
|
869
|
+
/* #2299: the header's controls are a full touch target (its row is 52 px: 44 px plus its padding). */
|
|
870
|
+
.panel-head .icon-btn { min-width: var(--tap); min-height: var(--tap); }
|
|
871
|
+
.panel-head .btn, .panel-head .seg-item, .panel-head select { min-height: var(--tap); }
|
|
731
872
|
.dock { padding: 0 max(var(--s-2), env(safe-area-inset-right)) var(--s-2) max(var(--s-2), env(safe-area-inset-left)); }
|
|
732
873
|
.hint { display: none; }
|
|
733
874
|
.msg.user { max-width: 88%; }
|
|
@@ -743,7 +884,7 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
743
884
|
.tab-badge { position: absolute; top: 6px; left: calc(50% + 6px); min-width: 16px; height: 16px; padding: 0 4px; border-radius: var(--r-full); background: var(--danger-fill); color: var(--on-danger); font-size: 10px; line-height: 16px; text-align: center; }
|
|
744
885
|
.main { padding-bottom: calc(56px + env(safe-area-inset-bottom)); }
|
|
745
886
|
.kb-open .main { padding-bottom: 0; }
|
|
746
|
-
.toasts { top: calc(60px + env(safe-area-inset-top)); bottom: auto; left: var(--s-
|
|
887
|
+
.toasts { top: calc(60px + env(safe-area-inset-top)); bottom: auto; left: var(--s-4); right: var(--s-4); align-items: stretch; }
|
|
747
888
|
.tour { left: var(--s-4); right: var(--s-4); width: auto; top: calc(64px + env(safe-area-inset-top)); }
|
|
748
889
|
.dlg { width: 100vw; max-width: 100vw; margin: auto 0 0; border-radius: var(--r-lg) var(--r-lg) 0 0; max-height: 90vh; }
|
|
749
890
|
.dlg-box { max-height: 90vh; }
|
|
@@ -767,6 +908,9 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
767
908
|
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;
|
|
768
909
|
}
|
|
769
910
|
.v-group-head:hover { color: var(--text); }
|
|
911
|
+
/* #2172: what a group is — a team's icon, or "#" before a tag — muted, before its name (sidebar and Settings). */
|
|
912
|
+
.v-group-kind { display: inline-flex; align-items: center; flex: none; color: var(--text-3); font-weight: var(--fw-medium); }
|
|
913
|
+
.v-group-kind.tag { min-width: 0.7em; justify-content: center; }
|
|
770
914
|
.v-group-head .grow { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
771
915
|
.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); }
|
|
772
916
|
.caret { transition: transform var(--t-fast) var(--ease); }
|
|
@@ -796,6 +940,35 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
796
940
|
@media (max-width: 899px) { .fav-editing .inst-star, .fav-editing .inst-move { width: 36px; height: 36px; } }
|
|
797
941
|
.v-inst .dot { margin-top: 0; }
|
|
798
942
|
.v-meta { color: var(--text-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
943
|
+
.v-meta { flex: none; }
|
|
944
|
+
/* #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
|
|
945
|
+
second, the time at its end — one column of times down the list. The ★ beside a two-line row sits on the first line. */
|
|
946
|
+
.inst-line { display: flex; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
947
|
+
.inst-line > .inst-name, .inst-line2 > .inst-alt { flex: 1; min-width: 0; }
|
|
948
|
+
.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; }
|
|
949
|
+
.inst-when.fresh { color: var(--accent); font-weight: var(--fw-semibold); }
|
|
950
|
+
.v-li.two-line > .inst-star, .v-li.two-line > .inst-move { align-self: flex-start; margin-top: 6px; }
|
|
951
|
+
/* A fresh reply: an accent tint that fades with --reply-a (1 → 0 over ten minutes, set on the row), never over the open
|
|
952
|
+
or a hovered row; one under a minute old pulses once — not under reduced motion. Nothing to click or clear. */
|
|
953
|
+
.inst.replied:not(.active):not(:hover) { background: color-mix(in srgb, var(--accent) calc(var(--reply-a, 0) * 22%), transparent); }
|
|
954
|
+
.inst.just:not(.active) { animation: inst-just 2.4s ease-out 1; }
|
|
955
|
+
@keyframes inst-just { from { box-shadow: inset 0 0 0 1.5px var(--accent); } to { box-shadow: inset 0 0 0 1.5px transparent; } }
|
|
956
|
+
@media (prefers-reduced-motion: reduce) { .inst.just:not(.active) { animation: none; } } /* as specific as the rule it stops */
|
|
957
|
+
/* #2179: how the list sorts — the button says it (the accent while "Recent replies" is on); its menu under it. */
|
|
958
|
+
.inst-head { position: relative; }
|
|
959
|
+
.nav-sort { position: static; flex: none; } /* the menu spans the header's width, under it — never past the sidebar's edge */
|
|
960
|
+
.nav-sort-btn { display: inline-flex; align-items: center; gap: 4px; }
|
|
961
|
+
.nav-sort-btn.on { color: var(--accent); }
|
|
962
|
+
.nav-sort-static { cursor: default; }
|
|
963
|
+
.nav-sort-menu { position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 30; padding: var(--s-3);
|
|
964
|
+
border-radius: var(--r-md); background: var(--surface); border: 1px solid var(--border); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);
|
|
965
|
+
display: flex; flex-direction: column; gap: var(--s-3); }
|
|
966
|
+
.nav-sort-menu fieldset { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
967
|
+
.nav-sort-menu legend { padding: 0 0 4px; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
968
|
+
.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; }
|
|
969
|
+
.nav-sort-opt input { margin-top: 3px; flex: none; }
|
|
970
|
+
.nav-sort-hint { display: block; font-size: var(--fs-xs); color: var(--text-3); }
|
|
971
|
+
.recent-head { cursor: default; }
|
|
799
972
|
/* #1722: the sidebar's width — a separator on its right edge (drag, arrows, Home/End, double-click resets); not on a phone */
|
|
800
973
|
.side-resize { position: absolute; top: 0; right: -3px; width: 6px; height: 100%; z-index: 5; cursor: col-resize; touch-action: none; }
|
|
801
974
|
.side-resize:hover, .side-resize:focus-visible, .side-resize.dragging { background: var(--accent-dim, var(--border-strong)); }
|
|
@@ -886,6 +1059,11 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
886
1059
|
.u-meter { height: 10px; border-radius: var(--r-full); background: var(--surface-2); overflow: hidden; }
|
|
887
1060
|
.u-fill { height: 100%; width: 0; min-width: 3px; border-radius: var(--r-full); background: var(--accent); transition: width 0.3s var(--ease); }
|
|
888
1061
|
.u-fill.warn { background: var(--warn); } .u-fill.crit { background: var(--danger); }
|
|
1062
|
+
/* Last known numbers (the live read failed): greyed, so they never read as live; the mark says when they were read. */
|
|
1063
|
+
.u-provider.is-stale .u-pct, .u-provider.is-stale .u-val, .u-provider.is-stale .u-status { color: var(--text-3); }
|
|
1064
|
+
.u-provider.is-stale .u-fill { background: var(--text-3); }
|
|
1065
|
+
.u-stale { font-weight: var(--fw-semibold); }
|
|
1066
|
+
.u-stale-detail { color: var(--text-3); font-size: var(--fs-xs); }
|
|
889
1067
|
.u-sub { color: var(--text-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
890
1068
|
.u-err { color: var(--warn); font-size: var(--fs-sm); }
|
|
891
1069
|
.u-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); }
|
|
@@ -1041,6 +1219,18 @@ textarea.s-yaml { white-space: pre; overflow-x: auto; }
|
|
|
1041
1219
|
.op-line { display: flex; align-items: center; justify-content: center; gap: var(--s-2); }
|
|
1042
1220
|
.op-line.ok { color: var(--ok); }
|
|
1043
1221
|
.op-line.bad { color: var(--danger); }
|
|
1222
|
+
/* #2233: the backend sign-in dialog and Settings' list */
|
|
1223
|
+
.signin-field { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; margin: var(--s-2) 0; }
|
|
1224
|
+
.signin-label { color: var(--text-2); font-size: var(--fs-xs); min-width: 6em; }
|
|
1225
|
+
.signin-value { font-size: var(--fs-md); letter-spacing: 0.04em; user-select: all; word-break: break-all; }
|
|
1226
|
+
.signin-url { color: var(--text-2); font-size: var(--fs-xs); word-break: break-all; }
|
|
1227
|
+
.signin-note { color: var(--text-2); font-size: var(--fs-xs); }
|
|
1228
|
+
.signin-ok { color: var(--ok); }
|
|
1229
|
+
.signin-message { white-space: pre-wrap; }
|
|
1230
|
+
.signin-lines { margin: var(--s-2) 0 0; padding-left: 1.2em; color: var(--text-2); font-size: var(--fs-xs); white-space: pre-wrap; }
|
|
1231
|
+
.signin-list { margin-top: var(--s-4); }
|
|
1232
|
+
.signin-list code { font-size: var(--fs-xs); word-break: break-all; }
|
|
1233
|
+
.signin-list .s-meta { white-space: normal; max-width: none; overflow: visible; }
|
|
1044
1234
|
@media (max-width: 899px) {
|
|
1045
1235
|
.grid2 { grid-template-columns: minmax(0, 1fr); }
|
|
1046
1236
|
.se-row { grid-template-columns: minmax(0, 1fr) auto auto; }
|
|
@@ -1122,6 +1312,123 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1122
1312
|
content: ""; position: absolute; top: var(--s-5); left: calc(-1 * var(--s-4) - 2px); width: var(--s-4); height: 2px; background: var(--border-strong); }
|
|
1123
1313
|
.org-link { min-height: var(--tap); }
|
|
1124
1314
|
}
|
|
1315
|
+
/* ── #1918: the org chart as a canvas (fleet-canvas.js). SVG with classes only: per-card values are SVG attributes, the
|
|
1316
|
+
view's transform one attribute on .oc-world (#1300). The stage fills the panel's height; touch gestures are the
|
|
1317
|
+
canvas's own (touch-action: none on it only), the page around it still scrolls. ── */
|
|
1318
|
+
.oc-bar { flex-wrap: wrap; row-gap: var(--s-2); }
|
|
1319
|
+
.oc-tools { margin-left: auto; display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
|
|
1320
|
+
.oc-find { flex: 0 1 260px; min-width: 150px; position: relative; }
|
|
1321
|
+
.oc-find input { height: 32px; padding-right: 72px; }
|
|
1322
|
+
.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; }
|
|
1323
|
+
.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); }
|
|
1324
|
+
.oc-svg { display: block; width: 100%; height: 100%; touch-action: none; cursor: grab; user-select: none; -webkit-user-select: none; }
|
|
1325
|
+
.oc-svg:active { cursor: grabbing; }
|
|
1326
|
+
.oc-svg:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
|
|
1327
|
+
.oc-tree path { fill: none; stroke: var(--border-strong); stroke-width: 1.25; }
|
|
1328
|
+
.oc-box { fill: var(--surface); stroke: var(--border); stroke-width: 1; }
|
|
1329
|
+
.oc-team.loose .oc-box { stroke-dasharray: 5 4; }
|
|
1330
|
+
.oc-box.match { stroke: var(--focus); stroke-width: 2.5; }
|
|
1331
|
+
.oc-head { fill: var(--surface-2); }
|
|
1332
|
+
.oc-hit { fill: transparent; }
|
|
1333
|
+
.oc-toggle:not(.empty) { cursor: pointer; }
|
|
1334
|
+
.oc-toggle:focus { outline: none; }
|
|
1335
|
+
.oc-toggle:focus-visible .oc-hit { stroke: var(--focus); stroke-width: 2; }
|
|
1336
|
+
.oc-caret { fill: var(--text-2); font-size: 12px; }
|
|
1337
|
+
.oc-team-name { fill: var(--text); font-size: 13px; font-weight: 600; }
|
|
1338
|
+
.oc-team-meta { fill: var(--text-3); font-size: 11px; }
|
|
1339
|
+
.oc-team-sum { fill: var(--text-2); font-size: 11.5px; }
|
|
1340
|
+
.oc-team.dim, .oc-team-head.dim { opacity: 0.55; }
|
|
1341
|
+
.oc-node.dim { opacity: 0.4; }
|
|
1342
|
+
.oc-node { cursor: pointer; }
|
|
1343
|
+
.oc-node[role="img"] { cursor: default; }
|
|
1344
|
+
.oc-node:focus { outline: none; }
|
|
1345
|
+
.oc-card { fill: var(--bg); stroke: var(--border); stroke-width: 1; }
|
|
1346
|
+
.oc-node.lead .oc-card { fill: var(--surface); stroke: var(--accent); stroke-width: 1.5; }
|
|
1347
|
+
.oc-node:hover .oc-card { stroke: var(--border-strong); }
|
|
1348
|
+
.oc-node:focus-visible .oc-card, .oc-node.match .oc-card, .oc-node.match:hover .oc-card { stroke: var(--focus); stroke-width: 2.5; }
|
|
1349
|
+
.oc-node.st-missing { opacity: 0.7; }
|
|
1350
|
+
.oc-av { fill: var(--surface-2); stroke: var(--surface); stroke-width: 2; }
|
|
1351
|
+
.oc-node.idc.id-ring .oc-av { stroke: var(--id); stroke-width: 2.5; }
|
|
1352
|
+
.oc-idbar { display: none; }
|
|
1353
|
+
.oc-node.idc.id-bar .oc-idbar { display: inline; fill: var(--id); }
|
|
1354
|
+
.oc-face.emoji .oc-av { fill: transparent; }
|
|
1355
|
+
.oc-av-t { fill: var(--text-2); font-size: 12px; font-weight: 600; }
|
|
1356
|
+
.oc-face.emoji .oc-av-t { font-size: 18px; font-weight: normal; }
|
|
1357
|
+
.oc-name { fill: var(--text); font-size: 13.5px; font-weight: 600; }
|
|
1358
|
+
.oc-node.lead .oc-name { font-size: 15px; }
|
|
1359
|
+
.oc-node.idc.id-name .oc-name { fill: var(--id-name); }
|
|
1360
|
+
.oc-sub { font-size: 12px; }
|
|
1361
|
+
.oc-st { fill: var(--text-2); }
|
|
1362
|
+
.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); }
|
|
1363
|
+
.oc-dot { fill: var(--text-3); stroke: var(--bg); stroke-width: 2; }
|
|
1364
|
+
.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); }
|
|
1365
|
+
.oc-dot.st-paused { fill: var(--bg); stroke: var(--text-3); stroke-width: 1.5; }
|
|
1366
|
+
.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); }
|
|
1367
|
+
.oc-zoom .icon-btn { width: 36px; height: 34px; border-radius: 0; font-size: 18px; }
|
|
1368
|
+
.oc-zoom .icon-btn + .icon-btn { border-top: 1px solid var(--border); }
|
|
1369
|
+
.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; }
|
|
1370
|
+
.oc-mini-team { fill: var(--surface-2); stroke: var(--border-strong); stroke-width: 6; }
|
|
1371
|
+
.oc-mini-team.needs { fill: var(--warn-bg); stroke: var(--warn); }
|
|
1372
|
+
.oc-mini-top { fill: var(--accent-dim); stroke: var(--accent); stroke-width: 6; }
|
|
1373
|
+
.oc-mini-team.match { stroke: var(--focus); stroke-width: 14; }
|
|
1374
|
+
.oc-mini-hit { fill: var(--focus); }
|
|
1375
|
+
.oc-mini-view { fill: none; stroke: var(--focus); stroke-width: 10; }
|
|
1376
|
+
/* #1918 phase 3: live traffic. Kind hues kept apart from the state colours (ok = working/idle, warn = needs you, danger). */
|
|
1377
|
+
.oc { --fx-task: #b794f6; --fx-send: #2dd4bf; --fx-report: #f472b6; --fx-broadcast: #fb923c; --fx-team: #cbd5e1; }
|
|
1378
|
+
@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; } }
|
|
1379
|
+
:root[data-theme="light"] .oc { --fx-task: #7c3aed; --fx-send: #0f766e; --fx-report: #be185d; --fx-broadcast: #c2410c; --fx-team: #475569; }
|
|
1380
|
+
.oc-flow { fill: none; stroke-width: 2.5; stroke-linecap: round; }
|
|
1381
|
+
.oc-flow-halo { fill: none; stroke: var(--bg); stroke-width: 6; stroke-linecap: round; opacity: 0.85; }
|
|
1382
|
+
.oc-flow.h-task { stroke: var(--fx-task); } .oc-flow.h-send { stroke: var(--fx-send); } .oc-flow.h-report { stroke: var(--fx-report); }
|
|
1383
|
+
.oc-flow.h-broadcast { stroke: var(--fx-broadcast); } .oc-flow.h-team { stroke: var(--fx-team); stroke-width: 3.5; }
|
|
1384
|
+
.oc-flow.ph-live { stroke-dasharray: 7 6; animation: oc-dash 0.9s linear infinite; }
|
|
1385
|
+
.oc-flow.ph-queued { stroke-dasharray: 2 5; opacity: 0.8; }
|
|
1386
|
+
.oc-flow.ph-fading { stroke: var(--text-3); animation: oc-fade 12s ease-out forwards; }
|
|
1387
|
+
/* #1918 review: the work — a delegation in progress (a slow dash, kept until its report), its report coming back, none. */
|
|
1388
|
+
.oc-flow.ph-work { stroke-dasharray: 10 7; stroke-width: 3; animation: oc-dash 2.4s linear infinite; }
|
|
1389
|
+
.oc-flow.ph-return { stroke-width: 3; animation: oc-fade 2.4s ease-out forwards; }
|
|
1390
|
+
.oc-flow.ph-stale { stroke: var(--text-3); stroke-dasharray: 3 6; animation: oc-fade 12s ease-out forwards; }
|
|
1391
|
+
.oc-ah.h-task { fill: var(--fx-task); } .oc-ah.h-send { fill: var(--fx-send); } .oc-ah.h-report { fill: var(--fx-report); }
|
|
1392
|
+
.oc-ah.h-broadcast { fill: var(--fx-broadcast); } .oc-ah.h-team { fill: var(--fx-team); } .oc-ah.h-fading { fill: var(--text-3); }
|
|
1393
|
+
.oc-pulse.h-task { fill: var(--fx-task); } .oc-pulse.h-send { fill: var(--fx-send); } .oc-pulse.h-report { fill: var(--fx-report); }
|
|
1394
|
+
.oc-pulse.h-broadcast { fill: var(--fx-broadcast); } .oc-pulse.h-team { fill: var(--fx-team); }
|
|
1395
|
+
.oc-fl.dim { opacity: 0.18; }
|
|
1396
|
+
.oc-badge rect { fill: var(--surface-2); stroke: var(--border); } .oc-badge text { fill: var(--text-2); font-size: 10.5px; }
|
|
1397
|
+
@keyframes oc-dash { to { stroke-dashoffset: -26; } }
|
|
1398
|
+
@keyframes oc-fade { from { opacity: 0.8; } to { opacity: 0.15; } }
|
|
1399
|
+
/* #2052: the key is a strip under the toolbar (its toggle is in the toolbar), never over the canvas. */
|
|
1400
|
+
.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);
|
|
1401
|
+
border-radius: var(--r-md); padding: 6px 10px; }
|
|
1402
|
+
.oc-key.on { border-color: var(--accent); }
|
|
1403
|
+
.oc-lg-rows { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); }
|
|
1404
|
+
.oc-lg { display: inline-flex; align-items: center; gap: 6px; }
|
|
1405
|
+
.oc-sw { width: 18px; height: 3px; border-radius: 2px; display: inline-block; background: var(--text-3); }
|
|
1406
|
+
.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); }
|
|
1407
|
+
.oc-sw.ph-queued { background: repeating-linear-gradient(90deg, var(--text-2) 0 3px, transparent 3px 7px); }
|
|
1408
|
+
.oc-sw.ph-fading { opacity: 0.5; }
|
|
1409
|
+
.oc-sw.ph-work { background: repeating-linear-gradient(90deg, var(--fx-task) 0 6px, transparent 6px 9px); height: 4px; }
|
|
1410
|
+
.oc-sw.ph-return { height: 4px; }
|
|
1411
|
+
.oc-sw.ph-stale { background: repeating-linear-gradient(90deg, var(--text-3) 0 2px, transparent 2px 6px); }
|
|
1412
|
+
.oc-live { gap: 6px; }
|
|
1413
|
+
.oc-live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--text-3); }
|
|
1414
|
+
.oc-live.on .oc-live-dot { background: var(--ok); }
|
|
1415
|
+
.org-sending { font-size: var(--fs-xs); color: var(--text-2); overflow-wrap: anywhere; }
|
|
1416
|
+
.org-send.k-task { color: var(--fx-task); } .org-send.k-report { color: var(--fx-report); } .org-send.k-broadcast { color: var(--fx-broadcast); }
|
|
1417
|
+
.org-send.k-send, .org-send.k-query, .org-send.k-update { color: var(--fx-send); }
|
|
1418
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1419
|
+
.oc-flow.ph-live { animation: none; stroke-dasharray: none; }
|
|
1420
|
+
.oc-flow.ph-fading { animation: none; opacity: 0.4; }
|
|
1421
|
+
.oc-flow.ph-work { animation: none; }
|
|
1422
|
+
.oc-flow.ph-return, .oc-flow.ph-stale { animation: none; opacity: 0.5; }
|
|
1423
|
+
.oc-pulse { display: none; }
|
|
1424
|
+
}
|
|
1425
|
+
@media (max-width: 640px) {
|
|
1426
|
+
.oc-stage { height: calc(100dvh - 248px); min-height: 340px; }
|
|
1427
|
+
.oc-find { flex: 1 1 150px; }
|
|
1428
|
+
/* #2052: Find, Key, Live and Canvas/List are wider than a phone together: the row wraps (nothing is cut off). */
|
|
1429
|
+
.oc-tools { margin-left: 0; width: 100%; flex-wrap: wrap; row-gap: var(--s-2); }
|
|
1430
|
+
.oc-mini { display: none; }
|
|
1431
|
+
}
|
|
1125
1432
|
/* A phone: Fleet's five tabs fit when only the open one shows its label (the others keep theirs for screen readers). */
|
|
1126
1433
|
@media (max-width: 479px) {
|
|
1127
1434
|
.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; }
|
|
@@ -1163,6 +1470,73 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1163
1470
|
.ch-bar .btn { min-height: var(--tap); }
|
|
1164
1471
|
}
|
|
1165
1472
|
|
|
1473
|
+
/* ── #2122: Fleet → Usage. A categorical palette kept apart from the state colours (Okabe–Ito hues, tuned per mode for
|
|
1474
|
+
contrast); every series also has a text label, so colour is never the only cue. ── */
|
|
1475
|
+
.us { --us-0: #56b4e9; --us-1: #e69f00; --us-2: #2bc48a; --us-3: #f0e442; --us-4: #e78ac3; --us-5: #94a3b8; --us-heat: #56b4e9;
|
|
1476
|
+
display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
|
|
1477
|
+
@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; } }
|
|
1478
|
+
: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; }
|
|
1479
|
+
.us-bar-top { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); margin-top: var(--s-2); }
|
|
1480
|
+
.us-group { display: inline-flex; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); color: var(--text-2); }
|
|
1481
|
+
.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); }
|
|
1482
|
+
.us-group select:focus, .us-custom input:focus { border-color: var(--focus); box-shadow: 0 0 0 3px var(--accent-dim); outline: none; }
|
|
1483
|
+
.us-csv { margin-left: auto; }
|
|
1484
|
+
.us-custom { display: flex; flex-wrap: wrap; align-items: end; gap: var(--s-2) var(--s-3); font-size: var(--fs-sm); }
|
|
1485
|
+
.us-custom label { display: inline-flex; flex-direction: column; gap: 2px; color: var(--text-2); }
|
|
1486
|
+
.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); }
|
|
1487
|
+
.us-fresh { font-size: var(--fs-xs); }
|
|
1488
|
+
.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); }
|
|
1489
|
+
.us-unpriced { font-size: var(--fs-xs); }
|
|
1490
|
+
.us-scan { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
|
|
1491
|
+
.us-totals { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-3); margin: 0; }
|
|
1492
|
+
.us-totals .ch-metric dd { font-size: var(--fs-lg); }
|
|
1493
|
+
.us-table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
|
|
1494
|
+
.us-table th, .us-table td { padding: var(--s-2); border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
|
|
1495
|
+
.us-table thead th { font-size: 11px; font-weight: var(--fw-regular); color: var(--text-3); }
|
|
1496
|
+
.us-table .num { text-align: right; white-space: nowrap; }
|
|
1497
|
+
.us-name { min-width: 0; max-width: 360px; font-weight: var(--fw-regular); }
|
|
1498
|
+
.us-name .mono { display: block; font-weight: var(--fw-semibold); overflow-wrap: anywhere; }
|
|
1499
|
+
.us-bar { display: block; width: 100%; height: 6px; margin: 4px 0; }
|
|
1500
|
+
.us-bar-bg { fill: var(--surface-2); } .us-bar-fg { fill: var(--us-0); }
|
|
1501
|
+
.us-meta { display: block; font-size: var(--fs-xs); color: var(--text-3); overflow-wrap: anywhere; }
|
|
1502
|
+
.us-flags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
|
|
1503
|
+
.us-trend, .us-heat { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
|
|
1504
|
+
.us-trend h3, .us-heat h3, .us-rest h3 { font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
|
|
1505
|
+
.us-scroll { overflow-x: auto; max-width: 100%; }
|
|
1506
|
+
.us-chart, .us-heatmap { display: block; }
|
|
1507
|
+
.us-axis { font-size: 9px; fill: var(--text-3); }
|
|
1508
|
+
.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); }
|
|
1509
|
+
.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); }
|
|
1510
|
+
.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); }
|
|
1511
|
+
.us-legend li { display: inline-flex; align-items: center; gap: var(--s-1); min-width: 0; overflow-wrap: anywhere; }
|
|
1512
|
+
.us-sw, .us-h-sw { display: inline-block; width: 10px; height: 10px; border-radius: 2px; flex-shrink: 0; }
|
|
1513
|
+
.us-h { fill: var(--us-heat); }
|
|
1514
|
+
.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; }
|
|
1515
|
+
.us-h-sw.l4 { background: var(--us-heat); }
|
|
1516
|
+
/* Read with nothing used: a solid grey cell. Not collected: an empty dashed outline. */
|
|
1517
|
+
.us-h.idle { fill: var(--text-3); opacity: 0.35; }
|
|
1518
|
+
.us-h-sw.idle { background: var(--text-3); opacity: 0.35; }
|
|
1519
|
+
.us-h.gap { fill: none; stroke: var(--text-3); stroke-width: 1; stroke-dasharray: 2 2; }
|
|
1520
|
+
.us-h-sw.gap { border: 1px dashed var(--text-3); }
|
|
1521
|
+
.us-grid, .us-base { stroke: var(--border); stroke-width: 1; }
|
|
1522
|
+
.us-grid { stroke-dasharray: 3 3; }
|
|
1523
|
+
.us-scale, .us-earlier { font-size: var(--fs-xs); }
|
|
1524
|
+
.us-heat-key { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1); font-size: var(--fs-xs); }
|
|
1525
|
+
.us-rest .row-item { font-size: var(--fs-xs); }
|
|
1526
|
+
.u-by-agent { margin-left: auto; }
|
|
1527
|
+
@media (max-width: 699px) {
|
|
1528
|
+
.us-totals { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
1529
|
+
.us-csv { margin-left: 0; }
|
|
1530
|
+
.us-bar-top .btn { min-height: var(--tap); }
|
|
1531
|
+
/* Rows become cards: each value with its label. */
|
|
1532
|
+
.us-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
|
|
1533
|
+
.us-table, .us-table tbody, .us-table tr, .us-table th, .us-table td { display: block; width: 100%; }
|
|
1534
|
+
.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); }
|
|
1535
|
+
.us-table th, .us-table td { border: 0; padding: 2px 0; max-width: none; }
|
|
1536
|
+
.us-table td { display: flex; justify-content: space-between; gap: var(--s-3); }
|
|
1537
|
+
.us-table td::before { content: attr(data-label); color: var(--text-3); text-align: left; }
|
|
1538
|
+
}
|
|
1539
|
+
|
|
1166
1540
|
/* ── Chat commands and quick actions (#1269) ── */
|
|
1167
1541
|
.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);
|
|
1168
1542
|
font-size: var(--fs-xs); line-height: 20px; cursor: pointer; max-width: 16em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle; }
|
|
@@ -1195,17 +1569,49 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1195
1569
|
}
|
|
1196
1570
|
/* #1630: a Discord server emoji in a chat message, the size of the text around it. */
|
|
1197
1571
|
.md img.emoji { display: inline-block; width: 1.375em; height: 1.375em; object-fit: contain; vertical-align: -0.3em; margin: 0 0.05em; }
|
|
1572
|
+
.md .emoji-text { color: var(--text-2); }
|
|
1198
1573
|
/* #1682: a mention, as Discord draws one — accent text on a tint of it; the id (or the Telegram handle) on hover. */
|
|
1199
1574
|
.md .mention { display: inline; padding: 0 0.2em; border-radius: var(--r-sm); color: var(--accent); background: var(--accent-dim);
|
|
1200
1575
|
font-weight: var(--fw-medium); white-space: nowrap; }
|
|
1201
1576
|
|
|
1202
1577
|
/* #1629 r4 §1 / r4.1 Q3 (a): the identity card (identity-card.js). The size is a class token; its heights are here
|
|
1203
|
-
(S 160 / M 240 / L 360 px, on a phone 120 / 180 / 240)
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
.id-card
|
|
1208
|
-
.id-
|
|
1578
|
+
(S 160 / M 240 / L 360 px, on a phone 120 / 180 / 240). Never a style attribute.
|
|
1579
|
+
#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,
|
|
1580
|
+
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.
|
|
1581
|
+
The chat header's card (card-c) follows the same size choice (card-c bs-<size>). */
|
|
1582
|
+
.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; }
|
|
1583
|
+
.id-card.card-s { --id-h: 160px; --id-ar: 4 / 1; --id-bmin: 100px; --id-bmax: 160px; }
|
|
1584
|
+
.id-card.card-l { --id-h: 360px; --id-ar: 9 / 4; --id-bmin: 200px; --id-bmax: 360px; }
|
|
1585
|
+
.id-card.card-c { --id-h: 96px; --id-bmin: 120px; --id-bmax: 200px; margin: 0; border: 0; border-radius: 0; background: none; }
|
|
1586
|
+
.id-card.card-c.bs-s { --id-ar: 4 / 1; --id-bmin: 96px; --id-bmax: 150px; }
|
|
1587
|
+
.id-card.card-c.bs-l { --id-ar: 9 / 4; --id-bmin: 150px; --id-bmax: 220px; }
|
|
1588
|
+
/* #2086: the banner at its focus (--id-focus, set per card), never wider than 5 : 1 — its width is capped at five times its
|
|
1589
|
+
size's tallest height, so the band shown everywhere is (picture aspect ÷ 5) of its height. Beyond that it is centred
|
|
1590
|
+
over a blurred copy of itself. */
|
|
1591
|
+
.id-banner-box { position: relative; overflow: hidden; container: idbanner / inline-size; }
|
|
1592
|
+
/* #2089 review: and never narrower than 9 : 4 — its height never more than its box's width ÷ 2.25 (a size's floor yields
|
|
1593
|
+
to it on a narrow column: a wide sidebar, the usage rail), so the promised safe area holds on every layout. */
|
|
1594
|
+
.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);
|
|
1595
|
+
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%); }
|
|
1596
|
+
/* #2086: Edit profile's banner focus — the picture whole, the band every screen shows (dashed, outside it shaded) and a phone's. */
|
|
1597
|
+
.bf-wrap { position: relative; max-width: 440px; overflow: hidden; border-radius: var(--r-sm); }
|
|
1598
|
+
.bf-pic { display: block; width: 100%; height: auto; }
|
|
1599
|
+
.bf-band { position: absolute; pointer-events: none; box-sizing: border-box; }
|
|
1600
|
+
.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; }
|
|
1601
|
+
.bf-safe { border: 2px dashed #fff; box-shadow: 0 0 0 999px rgba(0, 0, 0, .45); }
|
|
1602
|
+
/* The phone's band over the shade, in its own colour (its label at its own top-left, never in the shaded part). */
|
|
1603
|
+
.bf-phone { z-index: 1; border: 2px solid #ffd54a; }
|
|
1604
|
+
.bf-phone span { right: auto; left: 8px; top: 5px; color: #ffd54a; }
|
|
1605
|
+
.bf-field input[type=range] { width: 100%; max-width: 440px; }
|
|
1606
|
+
.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; }
|
|
1607
|
+
/* Wider than the banner's cap (5 × the size's tallest height): its sides feather into the fill, so the sharp centre
|
|
1608
|
+
leads without a seam. One threshold per size (a container query cannot read a custom property). */
|
|
1609
|
+
@container idbanner (min-width: 750px) { .id-card.card-c.bs-s .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1610
|
+
@container idbanner (min-width: 800px) { .id-card.card-s .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1611
|
+
@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); } }
|
|
1612
|
+
@container idbanner (min-width: 1100px) { .id-card.card-c.bs-l .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1613
|
+
@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); } }
|
|
1614
|
+
@container idbanner (min-width: 1800px) { .id-card.card-l .id-banner { -webkit-mask-image: var(--id-feather); mask-image: var(--id-feather); } }
|
|
1209
1615
|
.id-row { display: flex; align-items: flex-start; gap: var(--s-3); padding: var(--s-3) var(--s-4); }
|
|
1210
1616
|
.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); }
|
|
1211
1617
|
.id-text { flex: 1; min-width: 0; }
|
|
@@ -1260,14 +1666,23 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1260
1666
|
.side-widget { padding: 0 var(--s-3) var(--s-2); }
|
|
1261
1667
|
.aw-sidebar { max-height: 240px; overflow: auto; }
|
|
1262
1668
|
|
|
1263
|
-
|
|
1264
|
-
.chat-card-
|
|
1669
|
+
/* The chat header's card menu button (the user, 2026-10-20: no control on the card): pressed-looking while the card shows. */
|
|
1670
|
+
.chat-card-menu > .icon-btn.active { background: var(--accent-dim); color: var(--accent); }
|
|
1671
|
+
/* 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
|
|
1672
|
+
under it); the S / M / L control takes the line below. The chat header's card is trimmed further: a smaller portrait
|
|
1673
|
+
and banner, and its tagline and bio cut to a few lines (Details and View show them whole). */
|
|
1265
1674
|
@media (max-width: 479px) {
|
|
1266
|
-
.id-card.card-s { --id-h: 120px; }
|
|
1267
|
-
.id-card.card-m { --id-h:
|
|
1268
|
-
.id-card.card-l { --id-h:
|
|
1269
|
-
.id-
|
|
1270
|
-
.id-
|
|
1675
|
+
.id-card.card-s { --id-h: 96px; --id-bmin: 80px; --id-bmax: 120px; }
|
|
1676
|
+
.id-card.card-m { --id-h: 128px; --id-bmin: 100px; --id-bmax: 150px; }
|
|
1677
|
+
.id-card.card-l { --id-h: 168px; --id-bmin: 120px; --id-bmax: 200px; }
|
|
1678
|
+
.id-card.card-c { --id-h: 64px; --id-bmin: 80px; --id-bmax: 110px; }
|
|
1679
|
+
.id-card.card-c.bs-s { --id-bmin: 80px; --id-bmax: 100px; }
|
|
1680
|
+
.id-card.card-c.bs-l { --id-bmin: 96px; --id-bmax: 130px; }
|
|
1681
|
+
.id-row { flex-wrap: wrap; gap: var(--s-2) var(--s-3); padding: var(--s-2) var(--s-3); }
|
|
1682
|
+
.card-size { flex-basis: 100%; justify-content: flex-end; }
|
|
1683
|
+
.id-card.card-c .id-tagline, .id-card.card-c .id-bio { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; }
|
|
1684
|
+
.id-card.card-c .id-tagline { -webkit-line-clamp: 2; line-clamp: 2; }
|
|
1685
|
+
.id-card.card-c .id-bio { -webkit-line-clamp: 3; line-clamp: 3; }
|
|
1271
1686
|
}
|
|
1272
1687
|
/* #1629 r4 §1: the card in View (above the profile row) and its part of Edit profile. */
|
|
1273
1688
|
.v-id { flex-shrink: 0; padding: var(--s-2) var(--s-4) 0; background: var(--bg); }
|
|
@@ -1304,6 +1719,10 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1304
1719
|
.s-fx-owner-row{display:flex;align-items:end;flex-wrap:wrap;gap:var(--s-2);margin-top:var(--s-2)}
|
|
1305
1720
|
.s-fx-owner-row>label{display:flex;flex-direction:column;gap:var(--s-1);min-width:0;flex:1}
|
|
1306
1721
|
|
|
1722
|
+
/* #2044: the effect frame's document declares no colour scheme (light). An iframe whose own colour scheme differs
|
|
1723
|
+
from its document's gets an opaque backdrop, so under the dark theme the frame hid the whole chat: keep them equal. */
|
|
1724
|
+
.agend-effect-frame { color-scheme: normal !important; }
|
|
1725
|
+
|
|
1307
1726
|
/* #1629: host-created static poster IMG; geometry and visibility belong to the trusted CSSOM binding. */
|
|
1308
1727
|
.agend-effect-poster { object-fit: cover !important; object-position: center !important; user-select: none; }
|
|
1309
1728
|
|
|
@@ -1321,3 +1740,268 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1321
1740
|
.effect-trial-head > span { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
1322
1741
|
.effect-trial-body { flex: 1; min-height: 0; display: flex; padding: var(--s-3); }
|
|
1323
1742
|
.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; }
|
|
1743
|
+
|
|
1744
|
+
/* #2115: diagnostics remain inside the stock protected panel header, never in an effect plane. */
|
|
1745
|
+
.panel-head:has(> .chat-fx-notice) { flex-wrap: wrap; }
|
|
1746
|
+
.chat-fx-notice { order: 10; flex: 1 1 100%; min-width: 0; max-width: 100%; font-size: var(--fs-sm); overflow-wrap: anywhere; }
|
|
1747
|
+
.chat-fx-notice > span { display: block; }
|
|
1748
|
+
|
|
1749
|
+
/* ── #2293: global search — the sidebar row's shortcut, the header's button (collapsed sidebar, phone), the dialog ── */
|
|
1750
|
+
.kbd-hint { font: inherit; font-size: var(--fs-xs); color: var(--text-3); border: 1px solid var(--border); border-radius: var(--r-sm); padding: 0 var(--s-1); line-height: 18px; white-space: nowrap; }
|
|
1751
|
+
.panel-head .sb-search { display: none; }
|
|
1752
|
+
.sb-collapsed .panel-head .sb-search { display: inline-flex; }
|
|
1753
|
+
.chip-btn.on { color: var(--text); background: var(--surface-2); font-weight: var(--fw-semibold); }
|
|
1754
|
+
.dlg.search-dlg { width: min(680px, calc(100vw - 32px)); margin: 10vh auto auto; max-height: 76vh; }
|
|
1755
|
+
.search-box { display: flex; flex-direction: column; max-height: 76vh; }
|
|
1756
|
+
.search-head { display: flex; align-items: center; gap: var(--s-2); padding: var(--s-2) var(--s-2) var(--s-2) var(--s-4); border-bottom: 1px solid var(--border); color: var(--text-2); }
|
|
1757
|
+
.search-input { flex: 1; min-width: 0; border: 0; background: transparent; color: var(--text); font-size: max(16px, var(--fs-lg)); padding: var(--s-2) 0; }
|
|
1758
|
+
.search-input:focus { outline: none; }
|
|
1759
|
+
.search-filters-toggle { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
|
|
1760
|
+
.search-filters { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-4); padding: var(--s-2) var(--s-4); border-bottom: 1px solid var(--border); font-size: var(--fs-sm); }
|
|
1761
|
+
.search-field { display: inline-flex; align-items: center; gap: var(--s-2); color: var(--text-2); }
|
|
1762
|
+
.search-field select { max-width: 260px; }
|
|
1763
|
+
/* The filter chips' "on" state in the accent, so it reads apart from the hover and from the folded toggle. */
|
|
1764
|
+
.search-chips .chip-btn.on { background: var(--accent-dim); color: var(--accent); }
|
|
1765
|
+
.search-chips { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 2px; }
|
|
1766
|
+
.search-mine { display: inline-flex; align-items: center; gap: 6px; margin-left: var(--s-2); color: var(--text-2); cursor: pointer; }
|
|
1767
|
+
.search-mine input { margin: 0; accent-color: var(--accent); }
|
|
1768
|
+
.search-body { flex: 1; min-height: 140px; overflow-y: auto; padding: var(--s-2); }
|
|
1769
|
+
.search-foot { padding: var(--s-2) var(--s-4); border-top: 1px solid var(--border); color: var(--text-3); font-size: var(--fs-xs); }
|
|
1770
|
+
.search-hint, .search-status, .search-note { margin: 0; padding: var(--s-2) var(--s-3); color: var(--text-2); font-size: var(--fs-sm); }
|
|
1771
|
+
.search-status.bad { color: var(--danger); }
|
|
1772
|
+
.search-note { color: var(--warn); }
|
|
1773
|
+
.search-recent-head { display: flex; align-items: center; justify-content: space-between; padding: var(--s-2) var(--s-3) 0; color: var(--text-3); font-size: var(--fs-xs); }
|
|
1774
|
+
.search-recent ul { list-style: none; margin: 0; padding: 0; }
|
|
1775
|
+
.search-recent-item { display: flex; align-items: center; gap: var(--s-2); width: 100%; border: 0; border-radius: var(--r-sm); background: transparent; color: var(--text); padding: var(--s-2) var(--s-3); font-size: var(--fs-sm); text-align: left; cursor: pointer; }
|
|
1776
|
+
.search-recent-item:hover { background: var(--surface-2); }
|
|
1777
|
+
.search-recent-item svg { color: var(--text-3); flex: none; }
|
|
1778
|
+
.search-results.stale { opacity: 0.6; }
|
|
1779
|
+
.search-group + .search-group { margin-top: var(--s-2); }
|
|
1780
|
+
.search-group-head { display: flex; justify-content: space-between; gap: var(--s-2); padding: var(--s-2) var(--s-3) var(--s-1); font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
1781
|
+
.search-count { color: var(--text-3); font-weight: var(--fw-regular); }
|
|
1782
|
+
.search-row { padding: var(--s-2) var(--s-3); border-radius: var(--r-sm); cursor: pointer; }
|
|
1783
|
+
.search-row.on { background: var(--surface-2); box-shadow: inset 2px 0 0 var(--accent); }
|
|
1784
|
+
.search-row-top { display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-xs); color: var(--text-2); }
|
|
1785
|
+
.search-who { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1786
|
+
.search-kind { color: var(--text-3); }
|
|
1787
|
+
.search-time { color: var(--text-3); white-space: nowrap; }
|
|
1788
|
+
.search-badge { flex: none; font-size: 10px; line-height: 16px; font-weight: var(--fw-semibold); padding: 0 6px; border-radius: var(--r-full); background: var(--surface-2); color: var(--text-2); }
|
|
1789
|
+
.search-badge.chat { background: var(--accent-dim); color: var(--accent); }
|
|
1790
|
+
.search-badge.xmsg { background: var(--warn-bg); color: var(--warn); }
|
|
1791
|
+
.search-badge.task { background: var(--ok-bg); color: var(--ok); }
|
|
1792
|
+
.search-snippet { margin-top: 2px; font-size: var(--fs-sm); color: var(--text); overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
|
1793
|
+
.search-snippet mark, .search-ctx-text mark { background: var(--accent-dim); color: inherit; border-radius: 2px; padding: 0 1px; }
|
|
1794
|
+
.search-detail-head { display: flex; align-items: center; gap: var(--s-2); padding: var(--s-1) var(--s-1) var(--s-2); font-size: var(--fs-sm); }
|
|
1795
|
+
.search-detail-head .chip-btn { display: inline-flex; align-items: center; gap: 4px; }
|
|
1796
|
+
.search-ctx { list-style: none; margin: 0; padding: 0 var(--s-1); display: flex; flex-direction: column; gap: var(--s-1); }
|
|
1797
|
+
.search-ctx-line { padding: var(--s-2) var(--s-3); border-radius: var(--r-sm); }
|
|
1798
|
+
.search-ctx-line.here { background: var(--surface-2); box-shadow: inset 2px 0 0 var(--accent); }
|
|
1799
|
+
.search-ctx-text { margin-top: 2px; font-size: var(--fs-sm); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
1800
|
+
.search-detail-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--s-2); padding: var(--s-3) var(--s-1) var(--s-1); }
|
|
1801
|
+
@media (max-width: 899px) {
|
|
1802
|
+
.panel-head .sb-search { display: inline-flex; }
|
|
1803
|
+
.dlg.search-dlg { width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; margin: 0; border-radius: 0; }
|
|
1804
|
+
.search-box { height: 100%; max-height: 100dvh; padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom); box-sizing: border-box; }
|
|
1805
|
+
.search-foot { display: none; }
|
|
1806
|
+
.search-row { padding: var(--s-3); }
|
|
1807
|
+
.search-filters-toggle, .search-chips .chip-btn { min-height: var(--tap); }
|
|
1808
|
+
/* The task board (Fleet › Tasks: fleet-tasks.js, fleet-task-card.js). Status colours: to do neutral, in progress the
|
|
1809
|
+
accent, blocked danger, waiting for you warn, done ok. Bars are SVG rects (no style attribute: the CSP). */
|
|
1810
|
+
.tb { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
|
|
1811
|
+
.tb-grow { flex: 1; }
|
|
1812
|
+
.tb-head { flex-wrap: wrap; }
|
|
1813
|
+
.tb-code { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; }
|
|
1814
|
+
.tb-who { font-size: var(--fs-xs); color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14em; }
|
|
1815
|
+
.tb-link { color: var(--accent); font-size: var(--fs-xs); background: none; border: 0; padding: 0; cursor: pointer; text-align: left; }
|
|
1816
|
+
.tb-link:hover { text-decoration: underline; }
|
|
1817
|
+
.tb-select { min-height: 30px; padding: 0 var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg); color: var(--text); font-size: var(--fs-xs); max-width: 100%; }
|
|
1818
|
+
.tb-select:disabled, .tb-check input:disabled { opacity: 0.6; cursor: default; }
|
|
1819
|
+
.tb-check { display: inline-flex; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); color: var(--text-2); cursor: pointer; }
|
|
1820
|
+
.tb-check input { width: auto; min-height: 0; margin: 0; }
|
|
1821
|
+
.tb-form-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-3); }
|
|
1822
|
+
.tb-chev { transition: transform var(--t-fast) var(--ease); transform: rotate(-90deg); }
|
|
1823
|
+
.tb-chev.open { transform: rotate(0deg); }
|
|
1824
|
+
|
|
1825
|
+
.tb-pill, .tb-tag, .tb-flag { display: inline-flex; align-items: center; gap: 2px; font-size: 11px; font-weight: var(--fw-semibold); padding: 1px var(--s-2); border-radius: var(--r-full); background: var(--surface-2); color: var(--text-2); white-space: nowrap; }
|
|
1826
|
+
.tb-pill.st-claimed, .tb-tag.st-claimed { background: var(--accent-dim); color: var(--accent); }
|
|
1827
|
+
.tb-pill.st-blocked, .tb-tag.st-blocked, .tb-flag.st-blocked, .tb-tag.p-urgent { background: var(--danger-bg); color: var(--danger); }
|
|
1828
|
+
.tb-pill.st-review, .tb-tag.st-review, .tb-flag.st-review, .tb-tag.p-high { background: var(--warn-bg); color: var(--warn); }
|
|
1829
|
+
.tb-pill.st-done, .tb-tag.st-done { background: var(--ok-bg); color: var(--ok); }
|
|
1830
|
+
.tb-pill.st-cancelled { color: var(--text-3); text-decoration: line-through; }
|
|
1831
|
+
.tb-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--text-3); flex-shrink: 0; }
|
|
1832
|
+
.tb-col.st-claimed > .tb-col-head > .tb-dot, .tb-dot.st-claimed { background: var(--accent); }
|
|
1833
|
+
.tb-col.st-blocked > .tb-col-head > .tb-dot, .tb-dot.st-blocked { background: var(--danger); }
|
|
1834
|
+
.tb-col.st-review > .tb-col-head > .tb-dot, .tb-dot.st-review { background: var(--warn); }
|
|
1835
|
+
.tb-col.st-done > .tb-col-head > .tb-dot, .tb-dot.st-done { background: var(--ok); }
|
|
1836
|
+
|
|
1837
|
+
.tb-bar { width: 96px; height: 6px; border-radius: var(--r-full); overflow: hidden; flex-shrink: 0; }
|
|
1838
|
+
.tb-bar.wide { width: 100%; flex-shrink: 1; }
|
|
1839
|
+
.tb-bar-track { fill: var(--surface-2); }
|
|
1840
|
+
.tb-seg.st-done { fill: var(--ok); }
|
|
1841
|
+
.tb-seg.st-review { fill: var(--warn); }
|
|
1842
|
+
.tb-seg.st-claimed { fill: var(--accent); }
|
|
1843
|
+
.tb-seg.st-blocked { fill: var(--danger); }
|
|
1844
|
+
.tb-pct { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
|
|
1845
|
+
|
|
1846
|
+
/* Home: what waits for the person, then the projects. */
|
|
1847
|
+
.tb-home { display: flex; flex-direction: column; gap: var(--s-4); }
|
|
1848
|
+
/* The public link: the board is shown, not changed. */
|
|
1849
|
+
.tb-readonly { display: flex; align-items: center; gap: var(--s-2); margin: 0 0 var(--s-3); padding: var(--s-2) var(--s-3); border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface); color: var(--text-2); font-size: var(--fs-sm); }
|
|
1850
|
+
.tb-home > .list-head { margin: 0; }
|
|
1851
|
+
.tb-section-title { display: flex; align-items: center; gap: var(--s-2); margin: 0 0 var(--s-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
1852
|
+
.tb-waiting { padding: var(--s-3); border: 1px solid var(--warn-line); border-radius: var(--r-lg); }
|
|
1853
|
+
.tb-wait-row { flex-wrap: wrap; align-items: flex-start; }
|
|
1854
|
+
/* #2299: the pill sits on the title's first line (one baseline); the reason, under the title; the actions after. */
|
|
1855
|
+
.tb-wait-main { flex: 1 1 320px; min-width: 0; display: flex; align-items: baseline; gap: var(--s-2) var(--s-3); }
|
|
1856
|
+
.tb-wait-main > .tb-pill { flex-shrink: 0; min-width: 112px; justify-content: center; }
|
|
1857
|
+
.tb-wait-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin-left: auto; }
|
|
1858
|
+
.tb-wait-actions .btn { min-width: 88px; padding: 0 var(--s-4); }
|
|
1859
|
+
.tb-wait-title { flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s-2); background: none; border: 0; padding: 0; color: var(--text); text-align: left; cursor: pointer; font-size: var(--fs-sm); }
|
|
1860
|
+
.tb-wait-title:hover { text-decoration: underline; }
|
|
1861
|
+
.tb-wait-reason { flex-basis: 100%; margin-top: 2px; color: var(--danger); font-size: var(--fs-xs); line-height: var(--lh-xs); overflow-wrap: anywhere; }
|
|
1862
|
+
.tb-projects { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: var(--s-3); }
|
|
1863
|
+
.tb-project { position: relative; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--surface); min-width: 0; }
|
|
1864
|
+
.tb-project:hover { border-color: var(--border-strong); }
|
|
1865
|
+
.tb-project.is-archived { opacity: 0.7; }
|
|
1866
|
+
.tb-project-open { display: flex; flex-direction: column; gap: var(--s-2); width: 100%; padding: var(--s-4); padding-right: calc(var(--s-4) + 32px); background: none; border: 0; color: inherit; text-align: left; cursor: pointer; border-radius: inherit; }
|
|
1867
|
+
.tb-project-name { font-weight: var(--fw-bold); font-size: var(--fs-md); overflow-wrap: anywhere; }
|
|
1868
|
+
.tb-project-desc { color: var(--text-2); font-size: var(--fs-xs); overflow-wrap: anywhere; }
|
|
1869
|
+
.tb-project-pct { display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); }
|
|
1870
|
+
.tb-project-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-3); font-size: var(--fs-xs); color: var(--text-2); }
|
|
1871
|
+
.tb-project-menu { position: absolute; top: var(--s-2); right: var(--s-2); }
|
|
1872
|
+
.tb-archived { display: flex; flex-direction: column; gap: var(--s-2); align-items: flex-start; }
|
|
1873
|
+
.tb-archived > .tb-projects { align-self: stretch; }
|
|
1874
|
+
|
|
1875
|
+
.tb-search { position: relative; min-width: 180px; flex: 0 1 280px; }
|
|
1876
|
+
.tb-search input { width: 100%; min-height: 34px; padding: 0 var(--s-3) 0 30px; border: 1px solid var(--border); border-radius: var(--r-full); background: var(--bg); color: var(--text); font-size: var(--fs-sm); }
|
|
1877
|
+
.tb-search input:focus { border-color: var(--focus); outline: none; box-shadow: 0 0 0 3px var(--accent-dim); }
|
|
1878
|
+
.tb-search-icon { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: var(--text-3); pointer-events: none; }
|
|
1879
|
+
.tb-search-results { position: absolute; z-index: 5; top: calc(100% + 4px); right: 0; width: min(440px, calc(100vw - 32px)); max-height: 60vh; overflow-y: auto; margin: 0; padding: var(--s-1); list-style: none; background: var(--bg); border: 1px solid var(--border-strong); border-radius: var(--r-md); box-shadow: var(--shadow-2); }
|
|
1880
|
+
.tb-search-results button { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); width: 100%; padding: var(--s-2); background: none; border: 0; border-radius: var(--r-sm); color: var(--text); text-align: left; cursor: pointer; font-size: var(--fs-sm); }
|
|
1881
|
+
.tb-search-results li.active button, .tb-search-results button:hover { background: var(--surface-2); }
|
|
1882
|
+
.tb-search-title { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
1883
|
+
.tb-search-where { flex-basis: 100%; font-size: var(--fs-xs); overflow-wrap: anywhere; }
|
|
1884
|
+
.tb-search-none { padding: var(--s-2); font-size: var(--fs-sm); }
|
|
1885
|
+
|
|
1886
|
+
/* A project: its header, then one column per status. */
|
|
1887
|
+
.tb-bar-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-3); }
|
|
1888
|
+
.tb-title { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
1889
|
+
.tb-title h2 { margin: 0; font-size: var(--fs-lg); overflow-wrap: anywhere; }
|
|
1890
|
+
.tb-stats { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); }
|
|
1891
|
+
.tb-scroll { overflow-x: auto; margin: 0 calc(-1 * var(--s-2)); padding: 0 var(--s-2) var(--s-2); }
|
|
1892
|
+
/* #2299: 176 px a column fits all five beside the sidebar from 1280 px wide (220 px cut Done off at 1366). */
|
|
1893
|
+
.tb-columns { display: grid; grid-template-columns: repeat(5, minmax(176px, 1fr)); gap: var(--s-3); align-items: start; min-width: min-content; }
|
|
1894
|
+
.tb-col { display: flex; flex-direction: column; gap: var(--s-2); min-height: 120px; padding: var(--s-2); border-radius: var(--r-lg); background: var(--surface); border: 1px dashed transparent; }
|
|
1895
|
+
.tb-col.can-drop { border-color: var(--border); }
|
|
1896
|
+
.tb-col.over { border-color: var(--accent); background: var(--accent-dim); }
|
|
1897
|
+
.tb-col-head { display: flex; align-items: center; gap: var(--s-2); margin: 0; padding: var(--s-1) var(--s-1) 0; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); text-transform: uppercase; letter-spacing: 0.04em; }
|
|
1898
|
+
.tb-col-head .tb-link { text-transform: none; letter-spacing: 0; font-weight: var(--fw-regular); }
|
|
1899
|
+
.tb-count { margin-left: auto; font-variant-numeric: tabular-nums; color: var(--text-3); }
|
|
1900
|
+
.tb-drop-line { height: 3px; border-radius: 2px; background: var(--accent); }
|
|
1901
|
+
|
|
1902
|
+
.tb-tile { display: flex; flex-direction: column; gap: var(--s-2); padding: var(--s-3); border-radius: var(--r-md); background: var(--bg); border: 1px solid var(--border); border-left: 3px solid var(--text-3); cursor: pointer; font-size: var(--fs-sm); min-width: 0; }
|
|
1903
|
+
.tb-tile:hover { border-color: var(--border-strong); }
|
|
1904
|
+
.tb-tile.st-claimed { border-left-color: var(--accent); }
|
|
1905
|
+
.tb-tile.st-blocked { border-left-color: var(--danger); }
|
|
1906
|
+
.tb-tile.st-review { border-left-color: var(--warn); }
|
|
1907
|
+
.tb-tile.st-done { border-left-color: var(--ok); }
|
|
1908
|
+
.tb-tile.dragging { opacity: 0.4; }
|
|
1909
|
+
.tb-tile.flash { animation: tb-flash 1.6s var(--ease); }
|
|
1910
|
+
@keyframes tb-flash { from { box-shadow: 0 0 0 3px var(--accent-dim); background: var(--accent-dim); } to { box-shadow: none; } }
|
|
1911
|
+
.tb-tile-top { display: flex; align-items: center; gap: var(--s-2); }
|
|
1912
|
+
.tb-size { font-size: var(--fs-xs); color: var(--text-3); }
|
|
1913
|
+
/* The tile's control: its title, a plain-looking button (Enter opens the card, Alt+arrows move it). */
|
|
1914
|
+
.tb-tile-title { display: block; width: 100%; padding: 0; background: none; border: 0; border-radius: var(--r-sm); color: var(--text); font: inherit; font-weight: var(--fw-medium); text-align: left; cursor: pointer; overflow-wrap: anywhere; }
|
|
1915
|
+
.tb-tile-title:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
|
|
1916
|
+
.tb-tile:has(.tb-tile-title:focus-visible) { border-color: var(--focus); }
|
|
1917
|
+
.tb-tile-note { display: flex; gap: var(--s-1); align-items: flex-start; font-size: var(--fs-xs); color: var(--text-2); overflow-wrap: anywhere; }
|
|
1918
|
+
/* A main task's sub task at work now (its worker in the foot), and what a card waiting for you still lacks. */
|
|
1919
|
+
.tb-tile-now { display: flex; align-items: baseline; gap: var(--s-1); min-width: 0; font-size: var(--fs-xs); color: var(--text-2); }
|
|
1920
|
+
.tb-now-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1921
|
+
.tb-now-label { flex-shrink: 0; font-size: 11px; font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
1922
|
+
.tb-now-label.st-claimed { color: var(--accent); }
|
|
1923
|
+
.tb-now-label.st-blocked { color: var(--danger); }
|
|
1924
|
+
.tb-now-label.st-review { color: var(--warn); }
|
|
1925
|
+
.tb-tag.wrapup { background: var(--warn-bg); color: var(--warn); }
|
|
1926
|
+
.tb-wait-reason.wrapup, .tc-hint.wrapup { color: var(--warn); }
|
|
1927
|
+
.tb-wait-asked { flex-basis: 100%; font-size: var(--fs-xs); }
|
|
1928
|
+
.tc-now { display: flex; align-items: baseline; gap: var(--s-2); width: 100%; padding: 0; background: none; border: 0; color: var(--text); text-align: left; cursor: pointer; font-size: var(--fs-sm); }
|
|
1929
|
+
.tc-now:hover .tc-child-title { text-decoration: underline; }
|
|
1930
|
+
.tb-tile-note.st-blocked { color: var(--danger); }
|
|
1931
|
+
.tb-tile-progress { display: flex; align-items: center; gap: var(--s-2); width: 100%; padding: 0; background: none; border: 0; color: var(--text-2); font-size: var(--fs-xs); cursor: pointer; }
|
|
1932
|
+
.tb-tile-progress > span { white-space: nowrap; }
|
|
1933
|
+
.tb-tile-progress > .tb-bar { flex: 1; min-width: 40px; }
|
|
1934
|
+
.tb-subs { display: flex; flex-direction: column; gap: 2px; margin: 0; padding: 0; list-style: none; border-top: 1px solid var(--border); padding-top: var(--s-2); }
|
|
1935
|
+
.tb-subs button { display: flex; align-items: center; gap: var(--s-2); width: 100%; padding: 2px var(--s-1); background: none; border: 0; border-radius: var(--r-sm); color: var(--text); text-align: left; cursor: pointer; font-size: var(--fs-xs); }
|
|
1936
|
+
.tb-subs button:hover { background: var(--surface-2); }
|
|
1937
|
+
.tb-sub-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1938
|
+
.tb-sub-blocked { padding-left: 22px; font-size: var(--fs-xs); color: var(--danger); overflow-wrap: anywhere; }
|
|
1939
|
+
.tb-sub-more { font-size: var(--fs-xs); padding-left: var(--s-1); }
|
|
1940
|
+
.tb-tile-foot { display: flex; align-items: center; gap: var(--s-2); }
|
|
1941
|
+
.tb-tile-foot > .tb-who { flex: 1; min-width: 0; max-width: none; }
|
|
1942
|
+
.tb-tile-stats { display: inline-flex; gap: var(--s-2); font-size: var(--fs-xs); color: var(--text-3); }
|
|
1943
|
+
.tb-tile-stats > span { display: inline-flex; align-items: center; gap: 2px; }
|
|
1944
|
+
.tb-tile-stats > .all { color: var(--ok); }
|
|
1945
|
+
.tb-tile-stats > .reply { color: var(--accent); }
|
|
1946
|
+
|
|
1947
|
+
/* One card, in the app's dialog. */
|
|
1948
|
+
.tc { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
|
|
1949
|
+
.tc-head { display: flex; align-items: center; gap: var(--s-2); }
|
|
1950
|
+
.tc-title { flex: 1; min-width: 0; padding: var(--s-1) var(--s-2); margin-left: calc(-1 * var(--s-2)); background: none; border: 1px solid transparent; border-radius: var(--r-sm); color: var(--text); font: inherit; font-size: var(--fs-lg); font-weight: var(--fw-semibold); text-align: left; cursor: text; overflow-wrap: anywhere; }
|
|
1951
|
+
.tc-title:hover { border-color: var(--border); }
|
|
1952
|
+
.tc-title-input { flex: 1; min-width: 0; padding: var(--s-1) var(--s-2); border: 1px solid var(--focus); border-radius: var(--r-sm); background: var(--bg); color: var(--text); font-size: max(16px, var(--fs-lg)); font-weight: var(--fw-semibold); }
|
|
1953
|
+
.tc-ver { font-size: var(--fs-xs); }
|
|
1954
|
+
.tc-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); padding-bottom: var(--s-3); border-bottom: 1px solid var(--border); }
|
|
1955
|
+
.tc-hint { font-size: var(--fs-xs); }
|
|
1956
|
+
.tc-meta { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--s-2) var(--s-4); margin: 0; font-size: var(--fs-sm); align-items: center; }
|
|
1957
|
+
.tc-meta dt { color: var(--text-2); }
|
|
1958
|
+
.tc-meta dd { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: 0; min-width: 0; }
|
|
1959
|
+
.tc-value { color: var(--text); overflow-wrap: anywhere; }
|
|
1960
|
+
.tc-dep { padding: 1px var(--s-2); border: 1px solid var(--ok); border-radius: var(--r-full); background: none; color: var(--ok); font-family: var(--font-mono); font-size: var(--fs-xs); cursor: pointer; }
|
|
1961
|
+
.tc-dep.waiting { border-color: var(--warn); color: var(--warn); }
|
|
1962
|
+
.tc-field h3 { margin: 0 0 var(--s-1); font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); text-transform: uppercase; letter-spacing: 0.04em; }
|
|
1963
|
+
.tc-field.tone-blocked h3 { color: var(--danger); }
|
|
1964
|
+
.tc-text { display: block; width: 100%; padding: var(--s-2); background: none; border: 1px solid transparent; border-radius: var(--r-sm); color: var(--text); font: inherit; font-size: var(--fs-sm); text-align: left; white-space: pre-wrap; overflow-wrap: anywhere; cursor: text; }
|
|
1965
|
+
.tc-text:hover { border-color: var(--border); background: var(--surface); }
|
|
1966
|
+
.tc-text.empty { color: var(--text-3); }
|
|
1967
|
+
.tc-edit textarea, .tc-composer textarea, .tc-quick-add { width: 100%; padding: var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg); color: var(--text); font-size: var(--fs-sm); resize: vertical; }
|
|
1968
|
+
.tc-edit textarea:focus, .tc-composer textarea:focus, .tc-quick-add:focus { border-color: var(--focus); outline: none; box-shadow: 0 0 0 3px var(--accent-dim); }
|
|
1969
|
+
.tc-edit-bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin-top: var(--s-1); font-size: var(--fs-xs); }
|
|
1970
|
+
.tc-counter { font-variant-numeric: tabular-nums; color: var(--text-3); }
|
|
1971
|
+
.tc-counter.over { color: var(--danger); font-weight: var(--fw-semibold); }
|
|
1972
|
+
.tc-checklist { display: flex; flex-direction: column; gap: var(--s-1); margin: 0 0 var(--s-1); padding: 0; list-style: none; }
|
|
1973
|
+
.tc-checklist .done { color: var(--text-3); text-decoration: line-through; }
|
|
1974
|
+
.tc-children { display: flex; flex-direction: column; gap: 2px; margin: 0 0 var(--s-2); padding: 0; list-style: none; }
|
|
1975
|
+
.tc-children button { display: flex; align-items: center; gap: var(--s-2); width: 100%; padding: var(--s-1) var(--s-2); background: none; border: 0; border-radius: var(--r-sm); color: var(--text); text-align: left; cursor: pointer; font-size: var(--fs-sm); }
|
|
1976
|
+
.tc-children button:hover { background: var(--surface); }
|
|
1977
|
+
.tc-child-title { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
1978
|
+
.tc-tabs { padding: 0; margin: var(--s-2) 0 0; max-width: none; }
|
|
1979
|
+
.tc-feed { display: flex; flex-direction: column; gap: var(--s-1); margin: 0; padding: 0; list-style: none; font-size: var(--fs-sm); overflow-wrap: anywhere; }
|
|
1980
|
+
.tc-comments { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
1981
|
+
.tc-comment { padding: var(--s-2) var(--s-3); border-radius: var(--r-md); background: var(--surface); font-size: var(--fs-sm); }
|
|
1982
|
+
.tc-comment.person { background: var(--accent-dim); }
|
|
1983
|
+
.tc-comment-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin-bottom: 2px; font-size: var(--fs-xs); }
|
|
1984
|
+
.tc-comment-body { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
1985
|
+
.tc-composer { display: flex; gap: var(--s-2); align-items: flex-end; }
|
|
1986
|
+
|
|
1987
|
+
@media (max-width: 899px) {
|
|
1988
|
+
/* A phone stacks the columns: no sideways scrolling, and a card moves through its dialog's "Move to…". */
|
|
1989
|
+
.tb-scroll { overflow-x: visible; margin: 0; padding: 0; }
|
|
1990
|
+
.tb-columns { grid-template-columns: minmax(0, 1fr); min-width: 0; }
|
|
1991
|
+
.tb-col { min-height: 0; }
|
|
1992
|
+
.tb-form-row { grid-template-columns: minmax(0, 1fr); }
|
|
1993
|
+
.tb-search { flex: 1 1 100%; }
|
|
1994
|
+
/* #2299: a phone's waiting row: pill and title on one line, the actions under them (assignee left, buttons right). */
|
|
1995
|
+
.tb-wait-main > .tb-pill { min-width: 0; }
|
|
1996
|
+
.tb-wait-actions { flex-basis: 100%; margin-left: 0; }
|
|
1997
|
+
.tb-wait-actions > .muted { margin-right: auto; }
|
|
1998
|
+
/* #2299: on the board its toasts come in above the tabs, not over its title, search and progress — unless a card's
|
|
1999
|
+
sheet is open (its buttons are at the bottom). */
|
|
2000
|
+
.shell:has(.tb-home, .tb-board-page):not(:has(dialog[open])) .toasts { top: auto; bottom: calc(56px + env(safe-area-inset-bottom) + var(--s-3)); }
|
|
2001
|
+
/* …and they do not pile down the board: an older confirmation gives way to two newer toasts; an error never does. */
|
|
2002
|
+
.shell:has(.tb-home, .tb-board-page) .toasts > .toast.ok:nth-last-child(n+3) { display: none; }
|
|
2003
|
+
}
|
|
2004
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2005
|
+
.tb-tile.flash { animation: none; }
|
|
2006
|
+
.tb-chev { transition: none; }
|
|
2007
|
+
}
|