@songsid/agend 2.3.0-beta.9 → 2.3.1
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 +16 -8
- package/README.zh-TW.md +16 -8
- package/dist/adapter-world.js.map +1 -1
- package/dist/agend-home.d.ts +5 -0
- package/dist/agend-home.js +7 -0
- package/dist/agend-home.js.map +1 -0
- package/dist/agent-cli-instructions.md +7 -1
- package/dist/agent-cli.js +41 -0
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +9 -0
- package/dist/agent-endpoint.js +23 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.js +1 -1
- package/dist/agent-file-read.js.map +1 -1
- package/dist/agent-whats-new.d.ts +16 -0
- package/dist/agent-whats-new.js +53 -12
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/apply-job.js.map +1 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +12 -0
- package/dist/auth-api.js +77 -22
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +4 -0
- package/dist/authority/authority-state.js +17 -8
- package/dist/authority/authority-state.js.map +1 -1
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +16 -8
- package/dist/authority/web-authority.js +19 -5
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/antigravity.d.ts +2 -2
- package/dist/backend/antigravity.js +2 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.js +13 -4
- 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-package.d.ts +30 -0
- package/dist/backend/codex-package.js +133 -0
- package/dist/backend/codex-package.js.map +1 -0
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex.d.ts +2 -0
- package/dist/backend/codex.js +25 -5
- 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/effort-metadata.js.map +1 -1
- package/dist/backend/grok.js +58 -3
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-engine-ledger.js.map +1 -1
- package/dist/backend/kiro-kas-store.js.map +1 -1
- package/dist/backend/kiro-v2-store.js.map +1 -1
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +9 -1
- package/dist/backend/kiro.js +102 -1
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/mock.js.map +1 -1
- package/dist/backend/muse.d.ts +20 -2
- package/dist/backend/muse.js +154 -16
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/opencode-permission.js +1 -1
- package/dist/backend/opencode-permission.js.map +1 -1
- package/dist/backend/opencode.js +2 -1
- package/dist/backend/opencode.js.map +1 -1
- package/dist/backend/session-signals.js.map +1 -1
- package/dist/backend-availability.js.map +1 -1
- package/dist/backend-command.d.ts +2 -0
- package/dist/backend-command.js +3 -1
- package/dist/backend-command.js.map +1 -1
- package/dist/backend-outage.js.map +1 -1
- package/dist/binary-probe.js +1 -1
- package/dist/binary-probe.js.map +1 -1
- package/dist/bug-report-cli.d.ts +30 -0
- package/dist/bug-report-cli.js +139 -0
- package/dist/bug-report-cli.js.map +1 -0
- package/dist/bug-report.d.ts +47 -0
- package/dist/bug-report.js +137 -0
- package/dist/bug-report.js.map +1 -0
- package/dist/bundled-skills.d.ts +18 -0
- package/dist/bundled-skills.js +38 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-service.js +1 -1
- 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 +4 -0
- package/dist/channel/adapters/discord.js +57 -12
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +7 -1
- package/dist/channel/adapters/telegram.js +57 -49
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-server.js +21 -4
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +3 -1
- package/dist/channel/mcp-tools.js +41 -4
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-queue.js.map +1 -1
- package/dist/channel/sticker-download.js.map +1 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/child-process.d.ts +21 -0
- package/dist/child-process.js +54 -0
- package/dist/child-process.js.map +1 -0
- package/dist/classic-channel-manager.js +3 -2
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli-entry.js.map +1 -1
- package/dist/cli-flags.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +448 -313
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +1 -1
- package/dist/command-table.js +1 -1
- package/dist/command-table.js.map +1 -1
- package/dist/compact-watch.js.map +1 -1
- package/dist/completion-install.js.map +1 -1
- package/dist/completion.js.map +1 -1
- package/dist/config-validator.d.ts +6 -0
- package/dist/config-validator.js +81 -8
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +15 -3
- package/dist/config.js +41 -10
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.js.map +1 -1
- package/dist/context-guardian.js.map +1 -1
- package/dist/coredump-filter.js.map +1 -1
- package/dist/cpu-profile.js.map +1 -1
- package/dist/cross-instance-envelope.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 +52 -1
- package/dist/daemon.js +385 -27
- package/dist/daemon.js.map +1 -1
- package/dist/daily-summary.js.map +1 -1
- package/dist/darwin-memory.js +1 -1
- package/dist/darwin-memory.js.map +1 -1
- package/dist/dashboard-live.d.ts +8 -0
- package/dist/dashboard-live.js +35 -0
- package/dist/dashboard-live.js.map +1 -0
- package/dist/dashboard-permissions.d.ts +69 -0
- package/dist/dashboard-permissions.js +138 -0
- package/dist/dashboard-permissions.js.map +1 -0
- package/dist/decision-list.js.map +1 -1
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.d.ts +11 -0
- package/dist/delivery-outbox.js +52 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-outbox.test.js.map +1 -1
- package/dist/delivery-reconciliation.test.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/doctor.d.ts +8 -0
- package/dist/doctor.js +52 -0
- package/dist/doctor.js.map +1 -1
- package/dist/e2e-isolation.js.map +1 -1
- package/dist/event-log.js.map +1 -1
- package/dist/export-import.js +7 -5
- package/dist/export-import.js.map +1 -1
- package/dist/fleet-context.d.ts +1 -1
- package/dist/fleet-control-audit.js.map +1 -1
- package/dist/fleet-label.js.map +1 -1
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +2 -0
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-lock.d.ts +6 -0
- package/dist/fleet-lock.js +22 -2
- package/dist/fleet-lock.js.map +1 -1
- package/dist/fleet-manager.d.ts +283 -15
- package/dist/fleet-manager.js +1825 -331
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +70 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-startup.d.ts +14 -0
- package/dist/fleet-startup.js +30 -0
- package/dist/fleet-startup.js.map +1 -0
- package/dist/fleet-traffic.js.map +1 -1
- package/dist/forged-envelope-scan.d.ts +0 -20
- package/dist/forged-envelope-scan.js +3 -2
- package/dist/forged-envelope-scan.js.map +1 -1
- package/dist/full-restart.d.ts +5 -5
- package/dist/full-restart.js +5 -5
- package/dist/full-restart.js.map +1 -1
- package/dist/general-knowledge/skills/bug-report/SKILL.md +31 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +52 -11
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +5 -1
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +3 -1
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +8 -9
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +11 -0
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +1 -1
- 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.canvas-worker-off.md +321 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +24 -4
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +554 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +156 -32
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/general-knowledge/steering/core-rules.md +1 -1
- package/dist/host-memory.js.map +1 -1
- package/dist/idle-gate-log.d.ts +19 -0
- package/dist/idle-gate-log.js +15 -0
- package/dist/idle-gate-log.js.map +1 -0
- package/dist/instance-config-impact.js +25 -4
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +11 -1
- package/dist/instance-lifecycle.js +97 -25
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +12 -6
- package/dist/instructions.js +19 -10
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-compact-pane.js.map +1 -1
- package/dist/kiro-db-reader.js.map +1 -1
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-log-gate.js.map +1 -1
- package/dist/kiro-transcript-lane.js.map +1 -1
- package/dist/locale.js +450 -20
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -0
- package/dist/log-service.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/logger.js +3 -2
- package/dist/logger.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/login-flows.js +1 -1
- package/dist/login-manager.js.map +1 -1
- package/dist/login-shell.js +3 -1
- package/dist/login-shell.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 +83 -4
- package/dist/ls-rows.js.map +1 -1
- package/dist/memory-pressure.js.map +1 -1
- package/dist/muse-usage-relay.js.map +1 -1
- package/dist/needs-you-hub.d.ts +98 -1
- package/dist/needs-you-hub.js +313 -44
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +5 -2
- package/dist/needs-you-live.js +6 -3
- package/dist/needs-you-live.js.map +1 -1
- package/dist/needs-you.d.ts +68 -3
- package/dist/needs-you.js +39 -4
- package/dist/needs-you.js.map +1 -1
- package/dist/network-family.js.map +1 -1
- package/dist/operator-control-paths.js +3 -4
- package/dist/operator-control-paths.js.map +1 -1
- package/dist/outbound-handlers.d.ts +5 -2
- package/dist/outbound-handlers.js +81 -24
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +106 -60
- package/dist/outbound-schemas.js +33 -10
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/outbox-open-error.js.map +1 -1
- package/dist/pane-context-cache.js.map +1 -1
- package/dist/paths.js.map +1 -1
- package/dist/private-dir.js.map +1 -1
- package/dist/probe-worker-pool.js.map +1 -1
- package/dist/profile-control.js.map +1 -1
- package/dist/prompt-file-ref.js.map +1 -1
- package/dist/provider-probe.js.map +1 -1
- package/dist/provider-secret-registry.d.ts +5 -3
- package/dist/provider-secret-registry.js +8 -2
- package/dist/provider-secret-registry.js.map +1 -1
- package/dist/public-link-auto-open.d.ts +32 -0
- package/dist/public-link-auto-open.js +86 -0
- package/dist/public-link-auto-open.js.map +1 -0
- package/dist/public-link-owner.d.ts +10 -0
- package/dist/public-link-owner.js +36 -0
- package/dist/public-link-owner.js.map +1 -0
- package/dist/public-link-progress.d.ts +12 -1
- package/dist/public-link-progress.js +5 -10
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-preview.js.map +1 -1
- package/dist/public-tunnel-config.d.ts +11 -0
- package/dist/public-tunnel-config.js +68 -0
- package/dist/public-tunnel-config.js.map +1 -0
- package/dist/public-web-gateway.d.ts +2 -0
- package/dist/public-web-gateway.js +19 -6
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +48 -3
- package/dist/public-web-link.js +177 -51
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +9 -0
- package/dist/quickstart-api.js +82 -0
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +5 -0
- package/dist/quickstart.js +40 -25
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-dedup.js.map +1 -1
- package/dist/resource-report.js +1 -1
- package/dist/resource-report.js.map +1 -1
- package/dist/restart-guard.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.js.map +1 -1
- package/dist/runtime-cpu-profile.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/scheduler.js.map +1 -1
- package/dist/scheduler/task-board-text.d.ts +26 -0
- package/dist/scheduler/task-board-text.js +140 -0
- package/dist/scheduler/task-board-text.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +730 -0
- package/dist/scheduler/task-board.js +2179 -0
- package/dist/scheduler/task-board.js.map +1 -0
- package/dist/scheduler/types.d.ts +6 -1
- package/dist/sd-notify.js +2 -1
- package/dist/sd-notify.js.map +1 -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 +149 -0
- package/dist/search/search-index.js +453 -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/secret-file.js.map +1 -1
- package/dist/secret-store.d.ts +2 -0
- package/dist/secret-store.js +21 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-installer.d.ts +98 -1
- package/dist/service-installer.js +246 -11
- package/dist/service-installer.js.map +1 -1
- package/dist/service-owner.d.ts +44 -0
- package/dist/service-owner.js +48 -0
- package/dist/service-owner.js.map +1 -0
- package/dist/service-plan.d.ts +39 -2
- package/dist/service-plan.js +188 -6
- package/dist/service-plan.js.map +1 -1
- package/dist/session-oom-stop.d.ts +45 -0
- package/dist/session-oom-stop.js +259 -0
- package/dist/session-oom-stop.js.map +1 -0
- package/dist/session-oom.d.ts +34 -0
- package/dist/session-oom.js +251 -0
- package/dist/session-oom.js.map +1 -0
- package/dist/settings-api.d.ts +14 -1
- package/dist/settings-api.js +74 -13
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.d.ts +5 -0
- package/dist/settings-change.js +167 -6
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +9 -1
- package/dist/settings-confirmation.js +18 -8
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-control.js +2 -1
- package/dist/settings-control.js.map +1 -1
- package/dist/settings-effect.js +29 -4
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +13 -0
- package/dist/settings-http-confirmation.js +15 -3
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +13 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/settings-request-capability.d.ts +4 -1
- package/dist/settings-request-capability.js +11 -3
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-auth.d.ts +1 -0
- package/dist/setup-auth.js +2 -1
- package/dist/setup-auth.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/setup-host.d.ts +6 -1
- package/dist/setup-host.js +15 -4
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +6 -3
- package/dist/setup-wizard.js.map +1 -1
- package/dist/spawn-gate.d.ts +7 -0
- package/dist/spawn-gate.js +45 -12
- package/dist/spawn-gate.js.map +1 -1
- package/dist/start-attempt.d.ts +11 -0
- package/dist/start-attempt.js +29 -0
- package/dist/start-attempt.js.map +1 -0
- package/dist/start-failure-chat.d.ts +37 -0
- package/dist/start-failure-chat.js +142 -0
- package/dist/start-failure-chat.js.map +1 -0
- package/dist/start-failure-notice.d.ts +4 -0
- package/dist/start-failure-notice.js +20 -0
- package/dist/start-failure-notice.js.map +1 -0
- package/dist/start-failure.d.ts +171 -0
- package/dist/start-failure.js +348 -0
- package/dist/start-failure.js.map +1 -0
- package/dist/startup-memory-deadline.d.ts +23 -0
- package/dist/startup-memory-deadline.js +55 -0
- package/dist/startup-memory-deadline.js.map +1 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/storm-window.js.map +1 -1
- package/dist/systemd-peer-bus.js.map +1 -1
- package/dist/target-queue-worker.js.map +1 -1
- package/dist/task-board-summary.d.ts +101 -0
- package/dist/task-board-summary.js +177 -0
- package/dist/task-board-summary.js.map +1 -0
- package/dist/task-board-tool.d.ts +25 -0
- package/dist/task-board-tool.js +155 -0
- package/dist/task-board-tool.js.map +1 -0
- package/dist/task-board-waker.d.ts +51 -0
- package/dist/task-board-waker.js +141 -0
- package/dist/task-board-waker.js.map +1 -0
- package/dist/telegram-api-root.d.ts +1 -0
- package/dist/telegram-api-root.js +40 -0
- package/dist/telegram-api-root.js.map +1 -0
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.js +1 -1
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.d.ts +104 -0
- package/dist/tmux-exec-helper.js +412 -0
- package/dist/tmux-exec-helper.js.map +1 -0
- package/dist/tmux-manager.d.ts +1 -0
- package/dist/tmux-manager.js +29 -13
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.js +2 -2
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-archiver.js.map +1 -1
- package/dist/topic-commands.d.ts +13 -0
- package/dist/topic-commands.js +56 -33
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.js.map +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-monitor.js +5 -0
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +2 -0
- package/dist/transcript-sources.js +4 -0
- package/dist/transcript-sources.js.map +1 -1
- package/dist/tunnel/cloudflared-install.js +3 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +7 -16
- package/dist/tunnel/cloudflared.js +100 -13
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/lease.js +3 -2
- package/dist/tunnel/lease.js.map +1 -1
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/tunnel/named-diagnostics.d.ts +13 -0
- package/dist/tunnel/named-diagnostics.js +52 -0
- package/dist/tunnel/named-diagnostics.js.map +1 -0
- package/dist/tunnel/public-fetch.js.map +1 -1
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/tunnel/types.d.ts +4 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/types.d.ts +56 -2
- package/dist/ui/app-effects.js +23 -5
- package/dist/ui/app.html +2 -0
- package/dist/ui/backend-signin.js +297 -0
- package/dist/ui/chat-effects.js +10 -3
- package/dist/ui/chat-msg-actions.js +176 -0
- package/dist/ui/chat-render.js +62 -18
- package/dist/ui/chat-store.js +218 -48
- package/dist/ui/chat-strings.js +40 -8
- package/dist/ui/chat-thread.js +119 -10
- package/dist/ui/effect-trial-offer.js +2 -31
- package/dist/ui/effects-waker.js +2 -0
- package/dist/ui/fleet-canvas-layout.js +13 -4
- package/dist/ui/fleet-canvas.js +69 -28
- package/dist/ui/fleet-office-editor.js +149 -0
- package/dist/ui/fleet-office-model.js +358 -0
- package/dist/ui/fleet-office-pack.js +199 -0
- package/dist/ui/fleet-office-skin.js +474 -0
- package/dist/ui/fleet-office-store.js +49 -0
- package/dist/ui/fleet-office-zones.js +177 -0
- package/dist/ui/fleet-office.js +434 -0
- package/dist/ui/fleet-org.js +18 -5
- package/dist/ui/fleet-route-scene.js +272 -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 +482 -0
- package/dist/ui/fleet-task-work.js +107 -0
- package/dist/ui/fleet-tasks.js +569 -0
- package/dist/ui/fleet-traffic.js +81 -18
- package/dist/ui/fleet-usage.js +36 -2
- package/dist/ui/guest-refused.html +41 -0
- package/dist/ui/icons/icon-192.png +0 -0
- package/dist/ui/icons/icon-512.png +0 -0
- package/dist/ui/image-lightbox.js +45 -1
- package/dist/ui/image-zoom.js +242 -0
- package/dist/ui/panel-chat.js +214 -57
- package/dist/ui/panel-details.js +2 -0
- package/dist/ui/panel-fleet.js +32 -71
- package/dist/ui/panel-log.js +3 -3
- package/dist/ui/panel-needs.js +23 -6
- package/dist/ui/panel-settings.js +166 -33
- package/dist/ui/preview-panel.js +2 -1
- package/dist/ui/search-dialog.js +350 -0
- package/dist/ui/settings-appearance.js +170 -10
- package/dist/ui/settings-apply.js +3 -3
- package/dist/ui/settings-confirm.js +7 -2
- package/dist/ui/settings-dialogs.js +46 -21
- package/dist/ui/settings-discord.js +6 -2
- package/dist/ui/settings-guests.js +2 -1
- package/dist/ui/settings-learn.js +1 -0
- package/dist/ui/settings-model.js +51 -18
- package/dist/ui/settings-mods.js +8 -3
- package/dist/ui/settings-owner-effects.js +6 -4
- package/dist/ui/settings-strings.js +186 -6
- package/dist/ui/settings-token.js +3 -1
- package/dist/ui/settings-web-authority.js +13 -5
- package/dist/ui/settings-wizard.js +13 -7
- package/dist/ui/shared/agend-auth.js +2 -0
- package/dist/ui/shared/app-i18n.js +12 -5
- package/dist/ui/shared/app-needs.js +2 -2
- package/dist/ui/shared/app-prefs.js +15 -0
- package/dist/ui/shared/app-route.js +18 -0
- package/dist/ui/shared/app-shell.js +189 -28
- package/dist/ui/shared/app-store.js +3 -2
- package/dist/ui/shared/app-stream.js +5 -1
- package/dist/ui/shared/app-themes.js +116 -1
- package/dist/ui/shared/app.css +668 -48
- package/dist/ui/shared/app.js +9 -1
- package/dist/ui/shared/card-strings.js +4 -0
- package/dist/ui/shared/effect-app-runtime.js +7 -5
- package/dist/ui/shared/effect-chat-runtime.js +2 -7
- package/dist/ui/shared/effect-cursor.js +3 -2
- package/dist/ui/shared/effect-display-metadata.js +39 -0
- package/dist/ui/shared/effect-owner-source.js +8 -1
- package/dist/ui/shared/effect-registry.js +14 -4
- package/dist/ui/shared/effect-runtime-loader.js +3 -1
- package/dist/ui/shared/effect-stock-trust.js +5 -5
- package/dist/ui/shared/feature-flags.js +127 -0
- package/dist/ui/shared/guest-refused.js +35 -0
- package/dist/ui/shared/header-tools.js +2 -2
- package/dist/ui/shared/identity-card.js +26 -8
- package/dist/ui/shared/identity-color.js +17 -10
- package/dist/ui/shared/instance-nav.js +183 -28
- package/dist/ui/shared/owner-css.js +30 -1
- package/dist/ui/shared/panel-view.js +14 -29
- package/dist/ui/shared/text-undo.js +210 -0
- package/dist/ui/shared/tokens.css +4 -0
- package/dist/ui/shared/ui-dialog.js +5 -4
- package/dist/ui/shared/ui-icons.js +4 -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 +216 -16
- package/dist/ui/shared/view-strings.js +70 -4
- package/dist/ui/shared/web-authorize.js +50 -1
- package/dist/ui/signin.html +2 -0
- package/dist/ui/web-terminal/terminal.html +10 -10
- package/dist/ui/web-terminal/terminal.js +58 -12
- package/dist/update-check.js.map +1 -1
- package/dist/update-dispatch.js +1 -1
- package/dist/update-dispatch.js.map +1 -1
- package/dist/update-install.js.map +1 -1
- package/dist/update-launch.d.ts +10 -1
- package/dist/update-launch.js +39 -14
- package/dist/update-launch.js.map +1 -1
- package/dist/update-marker.js.map +1 -1
- package/dist/update-preflight.js +1 -1
- package/dist/update-preflight.js.map +1 -1
- package/dist/update-progress.d.ts +3 -1
- package/dist/update-progress.js +3 -1
- package/dist/update-progress.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 +89 -2
- package/dist/usage/providers.js +247 -41
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/usage/usage-api.d.ts +5 -1
- package/dist/usage/usage-api.js +185 -58
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.js +1 -1
- package/dist/usage-rollup.js.map +1 -1
- 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 +7 -0
- package/dist/view-api.js +16 -4
- package/dist/view-api.js.map +1 -1
- package/dist/wake-coordinator.js.map +1 -1
- package/dist/web-ambient.js.map +1 -1
- package/dist/web-api.d.ts +58 -11
- package/dist/web-api.js +1104 -71
- package/dist/web-api.js.map +1 -1
- package/dist/web-app-icon-worker.d.ts +1 -0
- package/dist/web-app-icon-worker.js +16 -0
- package/dist/web-app-icon-worker.js.map +1 -0
- package/dist/web-app-icon.d.ts +109 -0
- package/dist/web-app-icon.js +257 -0
- package/dist/web-app-icon.js.map +1 -0
- package/dist/web-appearance-policy.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +1 -0
- package/dist/web-appearance-tools.js +7 -3
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +4 -10
- package/dist/web-appearance.js +7 -4
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-auth.d.ts +8 -4
- package/dist/web-auth.js +33 -21
- 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.js.map +1 -1
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +118 -8
- package/dist/web-chat-history.js +220 -25
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +5 -1
- package/dist/web-commands.js +1 -1
- package/dist/web-commands.js.map +1 -1
- package/dist/web-cookie-names.d.ts +5 -0
- package/dist/web-cookie-names.js +12 -0
- package/dist/web-cookie-names.js.map +1 -0
- package/dist/web-effect-bundle.d.ts +2 -2
- package/dist/web-effect-library.js.map +1 -1
- package/dist/web-effect-playback.js.map +1 -1
- package/dist/web-effect-profiles.d.ts +16 -16
- package/dist/web-effect-profiles.js +3 -2
- package/dist/web-effect-profiles.js.map +1 -1
- package/dist/web-effect-service.js.map +1 -1
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-effect-upload.js.map +1 -1
- package/dist/web-effect.d.ts +6 -6
- package/dist/web-effect.js.map +1 -1
- package/dist/web-experimental-http.d.ts +2 -0
- package/dist/web-experimental-http.js +12 -0
- package/dist/web-experimental-http.js.map +1 -0
- package/dist/web-experimental.d.ts +11 -0
- package/dist/web-experimental.js +49 -0
- package/dist/web-experimental.js.map +1 -0
- package/dist/web-guest-access.d.ts +4 -2
- package/dist/web-guest-access.js +22 -10
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-guest-rooms.js.map +1 -1
- 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-icons.d.ts +33 -1
- package/dist/web-icons.js +83 -11
- package/dist/web-icons.js.map +1 -1
- package/dist/web-identity-color.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-images.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.js.map +1 -1
- package/dist/web-mentions.js.map +1 -1
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-store.d.ts +2 -0
- package/dist/web-mod-store.js +10 -0
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-office-store.d.ts +104 -0
- package/dist/web-office-store.js +236 -0
- package/dist/web-office-store.js.map +1 -0
- 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-owner-css.js.map +1 -1
- package/dist/web-png.d.ts +33 -0
- package/dist/web-png.js +329 -0
- package/dist/web-png.js.map +1 -0
- package/dist/web-prefs.d.ts +6 -0
- package/dist/web-prefs.js +29 -3
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +2 -0
- package/dist/web-preview.js +2 -0
- package/dist/web-preview.js.map +1 -1
- package/dist/web-profile.js.map +1 -1
- package/dist/web-reactions.d.ts +35 -0
- package/dist/web-reactions.js +47 -0
- package/dist/web-reactions.js.map +1 -0
- package/dist/web-request-context.d.ts +5 -0
- package/dist/web-request-context.js.map +1 -1
- package/dist/web-returning-device.d.ts +4 -2
- package/dist/web-returning-device.js +13 -6
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-schedules.js.map +1 -1
- package/dist/web-send-dedupe.d.ts +36 -0
- package/dist/web-send-dedupe.js +69 -0
- package/dist/web-send-dedupe.js.map +1 -0
- package/dist/web-session-authorization.js.map +1 -1
- package/dist/web-session.js +1 -1
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +3 -1
- package/dist/web-settings-patch.js +11 -5
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +6 -0
- package/dist/web-settings-tools.js +52 -17
- package/dist/web-settings-tools.js.map +1 -1
- package/dist/web-terminal-http.js +15 -2
- package/dist/web-terminal-http.js.map +1 -1
- package/dist/web-terminal.js +1 -1
- package/dist/web-terminal.js.map +1 -1
- package/dist/web-theme-store.d.ts +2 -2
- package/dist/web-theme-store.js +6 -3
- package/dist/web-theme-store.js.map +1 -1
- package/dist/web-theme.d.ts +29 -0
- package/dist/web-theme.js +89 -1
- package/dist/web-theme.js.map +1 -1
- package/dist/web-upload.d.ts +18 -1
- package/dist/web-upload.js +45 -7
- package/dist/web-upload.js.map +1 -1
- package/dist/web-widget.js.map +1 -1
- package/dist/webhook-emitter.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 +3 -0
- package/dist/working-state-journal.d.ts +68 -0
- package/dist/working-state-journal.js +93 -0
- package/dist/working-state-journal.js.map +1 -0
- package/dist/ws-server.js.map +1 -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 +828 -0
- package/launcher/install-admission.cjs +4 -39
- package/launcher/postinstall.cjs +14 -12
- package/launcher/private-home.cjs +43 -0
- package/package.json +16 -13
- 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
|
@@ -124,6 +124,23 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
124
124
|
.idc.id-bar { position: relative; }
|
|
125
125
|
.idc.id-bar::before { content: ""; position: absolute; left: 0; top: var(--s-2); bottom: var(--s-2); width: 3px; background: var(--id); pointer-events: none; }
|
|
126
126
|
.idc.id-name .inst-name { color: var(--id-name); }
|
|
127
|
+
/* #2330: the same straight bar for every other coloured left edge (a 3px border-left curved into a rounded box's
|
|
128
|
+
corners). `.lbar` is the utility; the places below join its selector list instead of carrying a class. A place sets
|
|
129
|
+
--lbar-color (status variants too) and adds the 3px the border took to its own padding-left, so its text stays put.
|
|
130
|
+
A short box that clips to its corners (.msg-quote) moves the bar in (--lbar-left) and shortens it (--lbar-inset) so
|
|
131
|
+
the corner never cuts its ends round.
|
|
132
|
+
tests/web-left-bar-2330.test.ts keeps a coloured border-left off rounded boxes. */
|
|
133
|
+
.lbar, .reply-bar, .msg-quote, .p-log .log-item.k-error, .p-log .log-item.s-failed, .org-node, .us-basis, .us-partial, .cmd-card.bad, .tb-tile,
|
|
134
|
+
.search-row.on, .search-recent-item:hover, .search-recent-item:focus-visible, .search-ctx-line.here, .tw-line:hover, .tw-line:focus-visible,
|
|
135
|
+
.u-crow:focus-visible { position: relative; }
|
|
136
|
+
.lbar::before, .reply-bar::before, .msg-quote::before, .p-log .log-item.k-error::before, .p-log .log-item.s-failed::before, .org-node::before,
|
|
137
|
+
.us-basis::before, .us-partial::before, .cmd-card.bad::before, .tb-tile::before,
|
|
138
|
+
/* #2478 item 7 (the user's fixed template): a selected, hovered or keyboard-focused row is the straight bar and a flat
|
|
139
|
+
background at most — never a rounded fill, a curved inset edge or a rounded ring. */
|
|
140
|
+
.search-row.on::before, .search-recent-item:hover::before, .search-recent-item:focus-visible::before, .search-ctx-line.here::before,
|
|
141
|
+
.tw-line:hover::before, .tw-line:focus-visible::before, .u-crow:focus-visible::before {
|
|
142
|
+
content: ""; position: absolute; left: var(--lbar-left, 0); top: var(--lbar-inset, var(--s-2)); bottom: var(--lbar-inset, var(--s-2)); width: 3px;
|
|
143
|
+
background: var(--lbar-color, var(--accent)); pointer-events: none; }
|
|
127
144
|
.idc-swatches, .idc-places { border: 0; padding: 0; margin: 0 0 var(--s-3); display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
128
145
|
.idc-swatches legend, .idc-places legend { font-weight: var(--fw-semibold); margin-bottom: 6px; width: 100%; }
|
|
129
146
|
.idc-swatch { --sw: var(--sw-dark); width: 28px; height: 28px; border-radius: 50%; border: 2px solid transparent; background: var(--sw); cursor: pointer; padding: 0; }
|
|
@@ -139,6 +156,14 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
139
156
|
.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
157
|
.s-ap-group:first-child { margin-top: 0; }
|
|
141
158
|
.s-ap-title { display: flex; align-items: center; gap: var(--s-2); }
|
|
159
|
+
/* #2308: the app icon card — the icon now (home-screen size, and tab size) beside the one chosen, before it is used. */
|
|
160
|
+
.s-app-icon-row { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--s-4); margin: var(--s-2) 0; }
|
|
161
|
+
.s-app-icon-row figure { margin: 0; display: grid; justify-items: center; gap: var(--s-1); }
|
|
162
|
+
.s-app-icon-row figure.s-app-icon-now { grid-template-columns: auto auto; align-items: end; column-gap: var(--s-3); }
|
|
163
|
+
.s-app-icon-row figure.s-app-icon-now figcaption { grid-column: 1 / -1; }
|
|
164
|
+
.s-app-icon-row figcaption { font-size: var(--fs-sm); color: var(--text-2); }
|
|
165
|
+
.s-app-icon-big { width: 96px; height: 96px; border-radius: 22%; border: 1px solid var(--border); background: var(--surface-2); object-fit: cover; }
|
|
166
|
+
.s-app-icon-small { width: 32px; height: 32px; border-radius: 6px; object-fit: cover; }
|
|
142
167
|
/* The fields' placeholders show the defaults: readable, not the browser's faint grey (dark mode). */
|
|
143
168
|
.s-appearance input::placeholder { color: var(--text-3); opacity: 1; }
|
|
144
169
|
/* A card title in Chinese is never upper-cased ("AGENT 的主題"): the small caps are a Latin convention. */
|
|
@@ -284,7 +309,7 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
284
309
|
.p-log .log-item.turn-start { margin-top: var(--s-4); }
|
|
285
310
|
.p-log .log-item.k-user { background: var(--user-bubble); }
|
|
286
311
|
.p-log .log-item.k-turn_end, .p-log .log-item.k-state, .p-log .log-item.k-event { background: transparent; color: var(--text-3); padding-block: 2px; font-size: var(--fs-sm); }
|
|
287
|
-
.p-log .log-item.k-error, .p-log .log-item.s-failed {
|
|
312
|
+
.p-log .log-item.k-error, .p-log .log-item.s-failed { --lbar-color: var(--danger); padding-left: calc(var(--s-3) + 3px); }
|
|
288
313
|
.p-log .log-head { display: flex; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
289
314
|
.p-log .log-icon { flex: none; }
|
|
290
315
|
.p-log .log-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
@@ -350,6 +375,10 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
350
375
|
.menu-item:hover:not(:disabled), .menu-item:focus-visible { background: var(--surface-2); outline: none; }
|
|
351
376
|
.menu-item.danger { color: var(--danger); }
|
|
352
377
|
.menu-item:disabled { opacity: 0.45; }
|
|
378
|
+
/* #2196: a group's heading in a menu (Page colours) and its radio items (the chosen one ticked). */
|
|
379
|
+
.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); }
|
|
380
|
+
.menu-heading:first-child { border-top: 0; margin-top: 0; }
|
|
381
|
+
.menu-radio .menu-tick { width: 16px; display: inline-flex; color: var(--accent); }
|
|
353
382
|
|
|
354
383
|
/* ── Dialog: centred on a desktop, a bottom sheet on a phone ── */
|
|
355
384
|
.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; }
|
|
@@ -360,6 +389,17 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
360
389
|
.dlg-title { flex: 1; font-size: var(--fs-lg); font-weight: var(--fw-semibold); }
|
|
361
390
|
.dlg-body { padding: var(--s-2) var(--s-5) var(--s-4); overflow-y: auto; display: flex; flex-direction: column; gap: var(--s-3); }
|
|
362
391
|
.dlg-actions { display: flex; justify-content: flex-end; gap: var(--s-2); padding: var(--s-3) var(--s-5) var(--s-5); }
|
|
392
|
+
/* A drawer (ui-dialog.js `drawer`): on a desk, the right edge at full height, the page in view beside it. A phone keeps
|
|
393
|
+
the bottom sheet (the rules below are for 900 px and up only). */
|
|
394
|
+
@media (min-width: 900px) {
|
|
395
|
+
.dlg.dlg-drawer { width: min(620px, 100vw); max-width: 100vw; height: 100dvh; max-height: 100dvh; margin: 0 0 0 auto; border-radius: 0;
|
|
396
|
+
background: var(--bg); box-shadow: var(--shadow-2); animation: dlg-drawer-in 0.18s var(--ease); }
|
|
397
|
+
.dlg-drawer .dlg-box { height: 100%; max-height: 100dvh; }
|
|
398
|
+
.dlg-drawer .dlg-head { padding: var(--s-3) var(--s-3) var(--s-3) var(--s-5); border-bottom: 1px solid var(--border); }
|
|
399
|
+
.dlg-drawer .dlg-body { flex: 1; padding-top: var(--s-4); padding-bottom: var(--s-8); }
|
|
400
|
+
}
|
|
401
|
+
@keyframes dlg-drawer-in { from { transform: translateX(28px); opacity: 0.6; } }
|
|
402
|
+
@media (prefers-reduced-motion: reduce) { .dlg.dlg-drawer { animation: none; } }
|
|
363
403
|
|
|
364
404
|
/* ── Forms ── */
|
|
365
405
|
.form { display: flex; flex-direction: column; gap: var(--s-3); }
|
|
@@ -423,7 +463,7 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
423
463
|
|
|
424
464
|
/* ── Chat ── */
|
|
425
465
|
.p-chat .scroller { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; position: relative; }
|
|
426
|
-
.thread { max-width: var(--col); margin:
|
|
466
|
+
.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); }
|
|
427
467
|
.msg { font-size: var(--fs-md); line-height: var(--lh-md); overflow-wrap: anywhere; min-width: 0; }
|
|
428
468
|
.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); }
|
|
429
469
|
.msg .sender { font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
@@ -436,6 +476,36 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
436
476
|
such as 「昨天 下午03:58」, ticks) — and a block body would stretch to it; fit-content keeps a short message short, on
|
|
437
477
|
the right under its meta, and a long one still wraps at the message's max-width. */
|
|
438
478
|
.msg.user .body { background: var(--user-bubble); border-radius: var(--r-xl); padding: 10px var(--s-4); width: fit-content; max-width: 100%; margin-left: auto; }
|
|
479
|
+
/* A message this page is sending (chat-thread.js outgoingHtml): shown at once, its text dimmed with "Sending…" until the
|
|
480
|
+
server takes it; failed, a straight red bar with Retry and Delete. Each file: a picture as itself (or a document mark),
|
|
481
|
+
its name, a square-ended bar and its percentage, moved in place. */
|
|
482
|
+
.msg.user.out .meta { align-items: center; gap: var(--s-2); }
|
|
483
|
+
.msg.out.out-queued .body, .msg.out.out-sending .body { color: var(--text-3); }
|
|
484
|
+
.msg.out.out-queued .body .md, .msg.out.out-sending .body .md { opacity: .72; }
|
|
485
|
+
.out-state { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--text-3); }
|
|
486
|
+
.out-spin { width: 10px; height: 10px; border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%; animation: out-spin .8s linear infinite; }
|
|
487
|
+
@keyframes out-spin { to { transform: rotate(360deg); } }
|
|
488
|
+
.out-files { display: flex; flex-direction: column; gap: var(--s-2); margin-top: var(--s-2); }
|
|
489
|
+
.msg.out .body .out-files:first-child { margin-top: 0; }
|
|
490
|
+
.out-file { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
491
|
+
.out-pic { width: 72px; height: 72px; object-fit: cover; border-radius: var(--r-md); flex: none; background: var(--surface-2); }
|
|
492
|
+
.msg.out.out-queued .out-pic, .msg.out.out-sending .out-pic { opacity: .7; }
|
|
493
|
+
.out-doc { width: 32px; height: 40px; flex: none; border: 1px solid var(--border); border-radius: 4px; background: var(--surface-2); }
|
|
494
|
+
.out-file-info { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 4px var(--s-2); min-width: 0; flex: 1; min-width: 140px; }
|
|
495
|
+
.out-name { font-size: var(--fs-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
496
|
+
.out-pct { font-size: var(--fs-xs); color: var(--text-3); font-variant-numeric: tabular-nums; }
|
|
497
|
+
.out-bar { grid-column: 1 / -1; height: 3px; background: var(--border); overflow: hidden; }
|
|
498
|
+
.out-fill { display: block; height: 100%; background: var(--accent); transform: scaleX(0); transform-origin: left; transition: transform .2s linear; }
|
|
499
|
+
.out-file[data-state="done"] .out-bar, .out-file[data-state="done"] .out-pct { visibility: hidden; }
|
|
500
|
+
.out-file[data-state="failed"] .out-fill { background: var(--danger); }
|
|
501
|
+
.out-file[data-state="failed"] .out-pct { color: var(--danger); }
|
|
502
|
+
.msg.out.out-sent .out-file .out-bar, .msg.out.out-sent .out-file .out-pct { visibility: hidden; }
|
|
503
|
+
/* Hugs its words under the bubble's right edge, as the bubble does: the bar stays beside them, never across the row. */
|
|
504
|
+
.out-note { --lbar-color: var(--danger); display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); width: fit-content; max-width: 100%;
|
|
505
|
+
margin: var(--s-2) 0 0 auto; padding: var(--s-1) 0 var(--s-1) calc(var(--s-2) + 3px); font-size: var(--fs-xs); color: var(--danger); }
|
|
506
|
+
.out-error { overflow-wrap: anywhere; }
|
|
507
|
+
.out-actions { display: inline-flex; gap: var(--s-1); }
|
|
508
|
+
@media (prefers-reduced-motion: reduce) { .out-spin { animation: none; border-right-color: currentColor; opacity: .6; } .out-fill { transition: none; } }
|
|
439
509
|
/* A person's click on a reply button: the bubble shows 🔘 and the button's label (never the value the agent was given);
|
|
440
510
|
live, the label is a button that shows the reply its buttons were on. */
|
|
441
511
|
.click-chip { display: flex; }
|
|
@@ -491,8 +561,19 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
491
561
|
.lb { position: fixed; inset: 0; width: 100vw; height: 100vh; height: 100dvh; max-width: none; max-height: none; margin: 0; padding: 0; border: 0;
|
|
492
562
|
background: rgba(0, 0, 0, 0.95); color: #fff; overflow: hidden; overscroll-behavior: contain; }
|
|
493
563
|
.lb::backdrop { background: rgba(0, 0, 0, 0.6); }
|
|
494
|
-
.lb-stage { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 56px 16px 16px; box-sizing: border-box;
|
|
495
|
-
|
|
564
|
+
.lb-stage { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 56px 16px 16px; box-sizing: border-box;
|
|
565
|
+
overflow: hidden; touch-action: none; }
|
|
566
|
+
/* #2333: the picture at its own size, placed and scaled by a CSSOM transform from its top-left corner (image-zoom.js);
|
|
567
|
+
hidden until it has loaded and been fitted. One that fails to load is shown where the browser puts a broken one. */
|
|
568
|
+
.lb-img { position: absolute; left: 0; top: 0; max-width: none; max-height: none; display: block; transform-origin: 0 0; will-change: transform;
|
|
569
|
+
visibility: hidden; cursor: zoom-in; user-select: none; -webkit-user-select: none; -webkit-user-drag: none; -webkit-touch-callout: none; }
|
|
570
|
+
.lb-img.lb-ready { visibility: visible; }
|
|
571
|
+
.lb-img.lb-err { position: static; max-width: 100%; max-height: 100%; visibility: visible; transform: none; cursor: default; }
|
|
572
|
+
.lb-stage.lb-zoomed .lb-img { cursor: grab; }
|
|
573
|
+
.lb-stage.lb-zoomed .lb-img:active { cursor: grabbing; }
|
|
574
|
+
.lb-zoom { display: inline-flex; align-items: center; gap: 2px; }
|
|
575
|
+
.lb .lb-level { min-width: 4.5em; justify-content: center; color: #fff; background: rgba(255, 255, 255, 0.12); border-color: rgba(255, 255, 255, 0.3); font-variant-numeric: tabular-nums; }
|
|
576
|
+
.lb .lb-fit-width.on { background: rgba(255, 255, 255, 0.22); }
|
|
496
577
|
.lb-bar { position: absolute; top: 0; left: 0; right: 0; z-index: 1; display: flex; align-items: center; gap: var(--s-2); padding: var(--s-2) var(--s-3);
|
|
497
578
|
background: rgba(0, 0, 0, 0.75); }
|
|
498
579
|
.lb-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); }
|
|
@@ -560,10 +641,18 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
560
641
|
.chat-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
561
642
|
/* #1629: an agent's theme on its own chat surface — custom properties set on .p-chat through the CSSOM, choices as
|
|
562
643
|
these tokens. The surface paints its own background (the page's body is not its). */
|
|
644
|
+
/*
|
|
645
|
+
* #2196: an agent's colours on the whole page (app-themes.js applyPageTheme, on .shell): the shell paints its own
|
|
646
|
+
* background then, under the sidebar, the header, the usage rail and a phone's tabs. The header follows the page, not
|
|
647
|
+
* the chat: it takes the shell's colours back (--chrome-*: resolved on .shell, so the page's theme or the page's own).
|
|
648
|
+
*/
|
|
649
|
+
.shell.th-page { background: var(--bg); color: var(--text); }
|
|
650
|
+
.shell { --chrome-bg: var(--bg); --chrome-surface: var(--surface); --chrome-text: var(--text); --chrome-text-2: var(--text-2); --chrome-accent: var(--accent); }
|
|
651
|
+
.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); }
|
|
563
652
|
.p-chat.th { background: var(--bg); color: var(--text); }
|
|
564
653
|
.p-chat.th .msg.user .body { border-radius: var(--bubble-radius, var(--r-xl)); }
|
|
565
|
-
.p-chat.th-font-system .thread, .p-chat.th-font-system .composer textarea { font-family: system-ui, -apple-system, "Segoe UI", sans-serif, var(--font-emoji); }
|
|
566
|
-
.p-chat.th-font-mono .thread, .p-chat.th-font-mono .composer textarea { font-family: var(--font-mono); }
|
|
654
|
+
.p-chat.th-font-system .thread, .p-chat.th-font-system .composer textarea, .p-chat.th-font-system .composer-ph { font-family: system-ui, -apple-system, "Segoe UI", sans-serif, var(--font-emoji); }
|
|
655
|
+
.p-chat.th-font-mono .thread, .p-chat.th-font-mono .composer textarea, .p-chat.th-font-mono .composer-ph { font-family: var(--font-mono); }
|
|
567
656
|
.p-chat.th-bubble-thin .msg.user .body { box-shadow: inset 0 0 0 1px var(--border); }
|
|
568
657
|
.p-chat.th-bubble-accent .msg.user .body { box-shadow: inset 0 0 0 1px var(--accent); }
|
|
569
658
|
.p-chat.th-agent-bubble .msg.agent .body { background: var(--agent-bubble); border-radius: var(--bubble-radius, var(--r-xl)); padding: 10px var(--s-4); }
|
|
@@ -614,6 +703,24 @@ img.amb-p { object-fit: contain; }
|
|
|
614
703
|
.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;
|
|
615
704
|
background: var(--surface); border-radius: var(--r-sm); padding: var(--s-3); white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text); }
|
|
616
705
|
.msg.flash { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r-sm); transition: outline-color var(--t-med); }
|
|
706
|
+
/* #2272: a message's reply action (top right, on hover or focus), the quote a reply shows, the message menu, a swipe. */
|
|
707
|
+
.msg[data-key] { position: relative; }
|
|
708
|
+
.msg[data-key]:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r-sm); }
|
|
709
|
+
.msg-actions { position: absolute; top: -6px; right: 0; z-index: 2; display: flex; gap: var(--s-1); padding: 2px; border-radius: var(--r-sm);
|
|
710
|
+
background: var(--surface); box-shadow: var(--shadow-1); opacity: 0; pointer-events: none; transition: opacity var(--t-fast); }
|
|
711
|
+
.msg:hover > .msg-actions, .msg:focus-within > .msg-actions { opacity: 1; pointer-events: auto; }
|
|
712
|
+
@media (hover: none) { .msg-actions { display: none; } }
|
|
713
|
+
.msg-quote { display: flex; align-items: center; gap: 4px; max-width: 100%; margin: 0 0 4px; padding: 2px var(--s-2) 2px calc(var(--s-2) + 3px); border: 0;
|
|
714
|
+
--lbar-color: var(--border-strong, var(--border)); --lbar-inset: 4px; --lbar-left: 2px; border-radius: var(--r-sm); background: transparent; color: var(--text-3);
|
|
715
|
+
font: inherit; font-size: var(--fs-sm); text-align: left; cursor: pointer; overflow: hidden; }
|
|
716
|
+
.msg.user .msg-quote { margin-left: auto; }
|
|
717
|
+
.msg-quote:hover, .msg-quote:focus-visible { color: var(--text-2); background: var(--surface-2); outline: none; }
|
|
718
|
+
.msg-quote .quote-sender { font-weight: var(--fw-semibold); white-space: nowrap; }
|
|
719
|
+
.msg-quote .quote-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
720
|
+
.msg-menu { position: fixed; z-index: 60; min-width: 180px; padding: var(--s-1); border-radius: var(--r-md); background: var(--surface);
|
|
721
|
+
box-shadow: var(--shadow-2); display: flex; flex-direction: column; }
|
|
722
|
+
.msg[data-key] { transition: transform var(--t-fast); }
|
|
723
|
+
.msg.swipe-ready { box-shadow: 3px 0 0 var(--accent); border-radius: var(--r-sm); } /* let go now: a reply */
|
|
617
724
|
@media (max-width: 899px) {
|
|
618
725
|
.only-wide { display: none; }
|
|
619
726
|
.pv-divider { display: none; }
|
|
@@ -679,12 +786,41 @@ img.amb-p { object-fit: contain; }
|
|
|
679
786
|
font-size: var(--fs-md); line-height: var(--lh-md); resize: none; min-height: 24px; max-height: 240px; overflow-y: auto;
|
|
680
787
|
}
|
|
681
788
|
.composer textarea::placeholder { color: var(--text-3); }
|
|
789
|
+
/* #2478: the placeholder, drawn over the empty box at its text's place: one line ending in "…" (a textarea's own is
|
|
790
|
+
clipped, never ellipsized). The same size and line as the box's text; it never takes a tap. */
|
|
791
|
+
.composer-field { position: relative; flex: 1; min-width: 0; display: flex; }
|
|
792
|
+
.composer-ph { position: absolute; left: var(--s-1); right: var(--s-1); top: 7px; pointer-events: none; color: var(--text-3);
|
|
793
|
+
font-size: var(--fs-md); line-height: var(--lh-md); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
794
|
+
.composer-field textarea:not(:placeholder-shown) + .composer-ph { display: none; } /* text in the box, composing text too */
|
|
682
795
|
.btn-send { width: 36px; padding: 0; }
|
|
683
796
|
.btn-send .send-label { display: none; }
|
|
684
797
|
/* A narrow phone: Stop reply beside Send leaves the message box no room — the label is for screen readers there. */
|
|
685
798
|
@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; } }
|
|
686
799
|
.btn-stop { background: var(--bg); }
|
|
687
|
-
.hint { font-size: var(--fs-xs); color: var(--text-3);
|
|
800
|
+
.hint { font-size: var(--fs-xs); color: var(--text-3); }
|
|
801
|
+
/* #2215 (the user's request, 2026-10-19): one row under the composer, at the bottom left — this browser's web authority, then
|
|
802
|
+
the key hint. Its height is kept even before the authority is read (#2184: switching chats never moves the composer). */
|
|
803
|
+
.composer-row { position: relative; display: flex; align-items: center; gap: var(--s-2); min-height: 20px; margin-top: calc(-1 * var(--s-1));
|
|
804
|
+
font-size: var(--fs-xs); line-height: 1.4; color: var(--text-3); white-space: nowrap; }
|
|
805
|
+
.composer-row > * { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
806
|
+
.composer-row > .hint { flex-shrink: 1000; }
|
|
807
|
+
.composer-row > :not(.hint) + .hint::before { content: "·"; margin-right: var(--s-2); }
|
|
808
|
+
/* A guest's note and the public link's sentence are kept whole: on a narrow screen they wrap rather than lose words. */
|
|
809
|
+
.composer-row .guest-note, .composer-row .webauth-row[data-state="public"] { margin: 0; text-align: left; white-space: normal; flex-shrink: 1; }
|
|
810
|
+
.webauth-row { display: inline-flex; align-items: center; gap: var(--s-1); }
|
|
811
|
+
.webauth-row .webauth-ok, .webauth-row .webauth-ask { font: inherit; padding: 0 2px; border: 0; background: none; cursor: pointer; border-radius: var(--r-sm); }
|
|
812
|
+
.webauth-row .webauth-ok { color: var(--ok); }
|
|
813
|
+
.webauth-row .webauth-ask { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
|
|
814
|
+
.webauth-row .webauth-ok:focus-visible, .webauth-row .webauth-ask:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
|
|
815
|
+
/* What pressing Authorize answered is said in the row, in the hint's place: nothing is laid over the composer. */
|
|
816
|
+
.webauth-row .webauth-notice { white-space: normal; color: var(--text-2); }
|
|
817
|
+
.webauth-row .webauth-notice::before { content: "·"; margin-right: var(--s-2); color: var(--text-3); }
|
|
818
|
+
.composer-row:has(.webauth-notice) > .hint { display: none; }
|
|
819
|
+
/* When "✓ Verified" ends, on a tap (touch has no hover): a bubble above the row while it has focus. */
|
|
820
|
+
.webauth-tip { position: absolute; left: 0; bottom: calc(100% + 4px); z-index: 5; max-width: min(420px, calc(100vw - 32px)); white-space: normal;
|
|
821
|
+
padding: var(--s-1) var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); color: var(--text);
|
|
822
|
+
box-shadow: var(--shadow-2); }
|
|
823
|
+
.webauth-tip[hidden] { display: none; }
|
|
688
824
|
/* #1920 phase 3: Settings → Web → Guests. */
|
|
689
825
|
.s-guests .guest-names { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 2px var(--s-3); max-height: 220px; overflow: auto;
|
|
690
826
|
padding: var(--s-1) var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); }
|
|
@@ -701,11 +837,20 @@ img.amb-p { object-fit: contain; }
|
|
|
701
837
|
/* #1939 S2a: Settings → Web → Web authority. */
|
|
702
838
|
.s-web-authority .s-va-sessions { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
703
839
|
.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; }
|
|
840
|
+
/* #2453: "over your named link" stays one phrase (the list item may break anywhere, CJK included). */
|
|
841
|
+
.s-web-authority .s-va-named { white-space: nowrap; }
|
|
704
842
|
.s-web-authority .s-va-warn { background: var(--warn-bg); color: var(--warn); border: 1px solid var(--warn-line); border-radius: var(--r-sm); padding: var(--s-1) var(--s-2); }
|
|
705
843
|
.s-web-authority .save-row { flex-wrap: wrap; }
|
|
706
844
|
/* #1920: a guest's note under the composer — on a phone too, where the key hints are hidden. */
|
|
707
845
|
.guest-note { margin: 2px 0 0; font-size: var(--fs-xs); color: var(--text-3); text-align: center; }
|
|
708
846
|
.pending-files { display: flex; flex-wrap: wrap; gap: var(--s-2); padding: var(--s-2) var(--s-2) 0; }
|
|
847
|
+
/* #2272: replying — the bar above the composer (who and what is answered; ✕ / Esc cancels). */
|
|
848
|
+
.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 calc(var(--s-3) + 3px);
|
|
849
|
+
--lbar-color: var(--accent); border-radius: var(--r-sm); background: var(--surface-2); font-size: var(--fs-sm); }
|
|
850
|
+
.reply-bar .reply-mark { color: var(--accent); }
|
|
851
|
+
.reply-bar .reply-label { font-weight: var(--fw-semibold); white-space: nowrap; }
|
|
852
|
+
.reply-bar .reply-text { flex: 1; min-width: 0; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
853
|
+
.reply-bar .reply-cancel { flex: none; width: 28px; height: 28px; }
|
|
709
854
|
.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; }
|
|
710
855
|
.file-chip img { width: 28px; height: 28px; object-fit: cover; border-radius: 4px; }
|
|
711
856
|
.file-chip .nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
@@ -774,6 +919,9 @@ img.amb-p { object-fit: contain; }
|
|
|
774
919
|
.oc-keep { left: var(--s-2); right: var(--s-2); transform: none; max-width: none; flex-wrap: nowrap; }
|
|
775
920
|
.oc-keep-text { flex: 1; flex-direction: column; align-items: flex-start; gap: 0; }
|
|
776
921
|
}
|
|
922
|
+
/* #2299: the toasts are a manual popover (ui-toast.js), so they stand in the top layer above an open dialog's backdrop;
|
|
923
|
+
the popover's own box (inset 0, margin, border, background) is undone here, before any placement below. */
|
|
924
|
+
:where(.toasts) { inset: auto; margin: 0; padding: 0; border: 0; background: none; color: inherit; overflow: visible; width: auto; height: auto; }
|
|
777
925
|
.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; }
|
|
778
926
|
.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); }
|
|
779
927
|
.toast.err { background: var(--danger-fill); color: var(--on-danger); }
|
|
@@ -800,7 +948,12 @@ img.amb-p { object-fit: contain; }
|
|
|
800
948
|
.panel-head .sb-new { display: none; }
|
|
801
949
|
.only-narrow { display: inline-flex; }
|
|
802
950
|
.thread { padding: var(--s-3) var(--s-3) var(--s-2); gap: var(--s-5); }
|
|
803
|
-
|
|
951
|
+
/* #2299: a phone's side gutter is 16 px — the content column, the header and the toasts alike. */
|
|
952
|
+
.col { padding: var(--s-3) var(--s-4) var(--s-8); }
|
|
953
|
+
.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)); }
|
|
954
|
+
/* #2299: the header's controls are a full touch target (its row is 52 px: 44 px plus its padding). */
|
|
955
|
+
.panel-head .icon-btn { min-width: var(--tap); min-height: var(--tap); }
|
|
956
|
+
.panel-head .btn, .panel-head .seg-item, .panel-head select { min-height: var(--tap); }
|
|
804
957
|
.dock { padding: 0 max(var(--s-2), env(safe-area-inset-right)) var(--s-2) max(var(--s-2), env(safe-area-inset-left)); }
|
|
805
958
|
.hint { display: none; }
|
|
806
959
|
.msg.user { max-width: 88%; }
|
|
@@ -811,12 +964,14 @@ img.amb-p { object-fit: contain; }
|
|
|
811
964
|
padding: 0 env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
|
|
812
965
|
}
|
|
813
966
|
.kb-open .tabs { display: none; }
|
|
967
|
+
/* #2478: with the keyboard up the line under the composer goes too — the box sits on the keyboard; back on blur. */
|
|
968
|
+
.kb-open .composer-row { display: none; }
|
|
814
969
|
.tab { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px; min-height: 56px; justify-content: center; font-size: 11px; color: var(--text-2); position: relative; }
|
|
815
970
|
.tab.active { color: var(--text); font-weight: var(--fw-semibold); }
|
|
816
971
|
.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; }
|
|
817
972
|
.main { padding-bottom: calc(56px + env(safe-area-inset-bottom)); }
|
|
818
973
|
.kb-open .main { padding-bottom: 0; }
|
|
819
|
-
.toasts { top: calc(60px + env(safe-area-inset-top)); bottom: auto; left: var(--s-
|
|
974
|
+
.toasts { top: calc(60px + env(safe-area-inset-top)); bottom: auto; left: var(--s-4); right: var(--s-4); align-items: stretch; }
|
|
820
975
|
.tour { left: var(--s-4); right: var(--s-4); width: auto; top: calc(64px + env(safe-area-inset-top)); }
|
|
821
976
|
.dlg { width: 100vw; max-width: 100vw; margin: auto 0 0; border-radius: var(--r-lg) var(--r-lg) 0 0; max-height: 90vh; }
|
|
822
977
|
.dlg-box { max-height: 90vh; }
|
|
@@ -840,6 +995,9 @@ img.amb-p { object-fit: contain; }
|
|
|
840
995
|
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;
|
|
841
996
|
}
|
|
842
997
|
.v-group-head:hover { color: var(--text); }
|
|
998
|
+
/* #2172: what a group is — a team's icon, or "#" before a tag — muted, before its name (sidebar and Settings). */
|
|
999
|
+
.v-group-kind { display: inline-flex; align-items: center; flex: none; color: var(--text-3); font-weight: var(--fw-medium); }
|
|
1000
|
+
.v-group-kind.tag { min-width: 0.7em; justify-content: center; }
|
|
843
1001
|
.v-group-head .grow { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
844
1002
|
.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); }
|
|
845
1003
|
.caret { transition: transform var(--t-fast) var(--ease); }
|
|
@@ -869,6 +1027,35 @@ img.amb-p { object-fit: contain; }
|
|
|
869
1027
|
@media (max-width: 899px) { .fav-editing .inst-star, .fav-editing .inst-move { width: 36px; height: 36px; } }
|
|
870
1028
|
.v-inst .dot { margin-top: 0; }
|
|
871
1029
|
.v-meta { color: var(--text-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
1030
|
+
.v-meta { flex: none; }
|
|
1031
|
+
/* #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
|
|
1032
|
+
second, the time at its end — one column of times down the list. The ★ beside a two-line row sits on the first line. */
|
|
1033
|
+
.inst-line { display: flex; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
1034
|
+
.inst-line > .inst-name, .inst-line2 > .inst-alt { flex: 1; min-width: 0; }
|
|
1035
|
+
.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; }
|
|
1036
|
+
.inst-when.fresh { color: var(--accent); font-weight: var(--fw-semibold); }
|
|
1037
|
+
.v-li.two-line > .inst-star, .v-li.two-line > .inst-move { align-self: flex-start; margin-top: 6px; }
|
|
1038
|
+
/* A fresh reply: an accent tint that fades with --reply-a (1 → 0 over ten minutes, set on the row), never over the open
|
|
1039
|
+
or a hovered row; one under a minute old pulses once — not under reduced motion. Nothing to click or clear. */
|
|
1040
|
+
.inst.replied:not(.active):not(:hover) { background: color-mix(in srgb, var(--accent) calc(var(--reply-a, 0) * 22%), transparent); }
|
|
1041
|
+
.inst.just:not(.active) { animation: inst-just 2.4s ease-out 1; }
|
|
1042
|
+
@keyframes inst-just { from { box-shadow: inset 0 0 0 1.5px var(--accent); } to { box-shadow: inset 0 0 0 1.5px transparent; } }
|
|
1043
|
+
@media (prefers-reduced-motion: reduce) { .inst.just:not(.active) { animation: none; } } /* as specific as the rule it stops */
|
|
1044
|
+
/* #2179: how the list sorts — the button says it (the accent while "Recent replies" is on); its menu under it. */
|
|
1045
|
+
.inst-head { position: relative; }
|
|
1046
|
+
.nav-sort { position: static; flex: none; } /* the menu spans the header's width, under it — never past the sidebar's edge */
|
|
1047
|
+
.nav-sort-btn { display: inline-flex; align-items: center; gap: 4px; }
|
|
1048
|
+
.nav-sort-btn.on { color: var(--accent); }
|
|
1049
|
+
.nav-sort-static { cursor: default; }
|
|
1050
|
+
.nav-sort-menu { position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 30; padding: var(--s-3);
|
|
1051
|
+
border-radius: var(--r-md); background: var(--surface); border: 1px solid var(--border); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);
|
|
1052
|
+
display: flex; flex-direction: column; gap: var(--s-3); }
|
|
1053
|
+
.nav-sort-menu fieldset { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
1054
|
+
.nav-sort-menu legend { padding: 0 0 4px; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
1055
|
+
.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; }
|
|
1056
|
+
.nav-sort-opt input { margin-top: 3px; flex: none; }
|
|
1057
|
+
.nav-sort-hint { display: block; font-size: var(--fs-xs); color: var(--text-3); }
|
|
1058
|
+
.recent-head { cursor: default; }
|
|
872
1059
|
/* #1722: the sidebar's width — a separator on its right edge (drag, arrows, Home/End, double-click resets); not on a phone */
|
|
873
1060
|
.side-resize { position: absolute; top: 0; right: -3px; width: 6px; height: 100%; z-index: 5; cursor: col-resize; touch-action: none; }
|
|
874
1061
|
.side-resize:hover, .side-resize:focus-visible, .side-resize.dragging { background: var(--accent-dim, var(--border-strong)); }
|
|
@@ -891,7 +1078,21 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
891
1078
|
down, never the count; the count is as tall as a header, so the row does not grow. */
|
|
892
1079
|
.nav-facets { display: flex; align-items: flex-start; gap: var(--s-2); padding: var(--s-2) var(--s-1) 0; }
|
|
893
1080
|
.nav-facet-groups { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--s-1) var(--s-2); flex: 1 1 auto; min-width: 0; }
|
|
894
|
-
|
|
1081
|
+
/* #2401: the count, "shown" under it and Clear under that. The word's width is held by ::before (its text from
|
|
1082
|
+
data-reserve) and idle Clear's by the button itself, both at no height, unseen and out of reach (visibility): the column —
|
|
1083
|
+
and the headers' box beside it — is as wide with a facet set as without. */
|
|
1084
|
+
.nav-facet-end { flex: none; margin: 0 0 0 auto; display: flex; flex-direction: column; align-items: flex-end; }
|
|
1085
|
+
.nav-facets .nav-shown { margin: 0; padding: 2px 0; white-space: nowrap; text-align: right; font-variant-numeric: tabular-nums; }
|
|
1086
|
+
.nav-shown-word { display: block; }
|
|
1087
|
+
.nav-facet-end::before { content: attr(data-reserve); display: block; height: 0; overflow: hidden; visibility: hidden; font-size: var(--fs-xs); white-space: nowrap; }
|
|
1088
|
+
.nav-facet-end .is-idle { visibility: hidden; height: 0; min-height: 0; margin: 0; padding-top: 0; padding-bottom: 0; border-top-width: 0; border-bottom-width: 0; overflow: hidden; }
|
|
1089
|
+
/* No open list beside it (.compact): one cell of one line, as wide as the count or Clear; a facet set, Clear in the count's
|
|
1090
|
+
place (the count transparent, still read; the word for a screen reader only, so its width is not held here). */
|
|
1091
|
+
.nav-facets.compact .nav-facet-end { display: grid; justify-items: end; align-items: center; }
|
|
1092
|
+
.nav-facets.compact .nav-facet-end > * { grid-area: 1 / 1; margin: 0; }
|
|
1093
|
+
.nav-facets.compact .nav-facet-end::before { display: none; }
|
|
1094
|
+
.nav-facets.compact .nav-shown.is-set { opacity: 0; pointer-events: none; }
|
|
1095
|
+
.nav-facets.compact .nav-shown-word { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
|
|
895
1096
|
.nav-facet { font-size: var(--fs-xs); color: var(--text-2); min-width: 0; max-width: 100%; }
|
|
896
1097
|
/* #1700: a facet group's header — the whole row toggles its list; folded with a filter set, a short summary. */
|
|
897
1098
|
.nav-facet-head { display: inline-flex; align-items: center; gap: var(--s-1); max-width: 100%; padding: 2px var(--s-2); border: 0; border-radius: var(--r-sm);
|
|
@@ -900,10 +1101,15 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
900
1101
|
.nav-facet-head:focus-visible { outline: 2px solid var(--accent); }
|
|
901
1102
|
.nav-facet-head .caret { color: var(--text-3); flex: none; }
|
|
902
1103
|
.nav-facet-sum { min-width: 0; max-width: 12em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--accent); }
|
|
1104
|
+
/* #2401: the summary takes only the room its line has left — never counted when the headers wrap (contain: inline-size,
|
|
1105
|
+
its gap taken back), so a facet set never sends a header to a line of its own; the header holding it grows into the rest. */
|
|
1106
|
+
.nav-facet.has-sum { flex-grow: 1; }
|
|
1107
|
+
.nav-facet.has-sum .nav-facet-head { width: 100%; }
|
|
1108
|
+
.nav-facet-sum { contain: inline-size; flex: 1 1 0; margin-left: calc(-1 * var(--s-1)); padding-left: var(--s-1); }
|
|
903
1109
|
.nav-facet-n { display: inline-block; min-width: 16px; padding: 0 4px; border-radius: 8px; background: var(--accent); color: var(--on-accent, #fff); text-align: center; font-variant-numeric: tabular-nums; }
|
|
904
1110
|
.nav-facet-list { display: flex; flex-direction: column; gap: 2px; padding: var(--s-1) var(--s-2); }
|
|
905
1111
|
.nav-chip { display: flex; align-items: center; gap: var(--s-2); cursor: pointer; color: var(--text); }
|
|
906
|
-
.nav-facet-reset { font-size: var(--fs-xs); }
|
|
1112
|
+
.nav-facet-reset { font-size: var(--fs-xs); flex: none; white-space: nowrap; margin-top: 2px; padding: 2px var(--s-1); }
|
|
907
1113
|
|
|
908
1114
|
/* One gap on every page (View's, #1448): the header's controls are the same size on every tab. */
|
|
909
1115
|
.panel-actions .btn { gap: var(--s-1); }
|
|
@@ -921,26 +1127,17 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
921
1127
|
.v-pre .ansi[data-dim] { opacity: .5; }
|
|
922
1128
|
.v-term-note { position: absolute; left: var(--s-3); right: var(--s-3); top: var(--s-3); padding: var(--s-2) var(--s-3); border-radius: var(--r-sm); background: var(--warn-bg); border: 1px solid var(--warn-line); color: #f0f0f0; font-size: var(--fs-sm); }
|
|
923
1129
|
.v-probe { position: absolute; visibility: hidden; white-space: pre; left: -9999px; top: 0; font-size: 100px; }
|
|
924
|
-
.v-card { flex-shrink: 0; display: flex; align-items: center; gap: var(--s-3); padding: var(--s-2) var(--s-4); background: var(--bg); padding-bottom: max(var(--s-2), env(safe-area-inset-bottom)); }
|
|
925
|
-
.v-card.open { align-items: flex-start; padding-top: var(--s-3); padding-bottom: var(--s-3); }
|
|
926
|
-
.v-avatar { width: 28px; height: 28px; flex-shrink: 0; border-radius: 50%; overflow: hidden; background: var(--surface-2); display: flex; align-items: center; justify-content: center; }
|
|
927
|
-
.v-card.open .v-avatar { width: 48px; height: 48px; }
|
|
928
|
-
.v-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
929
|
-
.v-initial { color: var(--text-2); font-weight: var(--fw-semibold); text-transform: uppercase; }
|
|
930
|
-
.v-card-body { flex: 1; min-width: 0; }
|
|
931
|
-
.v-card-line { display: flex; align-items: baseline; gap: var(--s-2); font-size: var(--fs-sm); min-width: 0; }
|
|
932
|
-
.v-card-line strong { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
933
|
-
.v-role { color: var(--accent); font-size: var(--fs-xs); white-space: nowrap; }
|
|
934
|
-
.v-card-meta { color: var(--text-3); font-size: var(--fs-xs); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
935
|
-
.v-card.open .v-card-meta { white-space: normal; }
|
|
936
|
-
.v-card-desc { margin-top: var(--s-2); color: var(--text-2); font-size: var(--fs-sm); white-space: pre-wrap; }
|
|
937
1130
|
.help-list { list-style: disc; padding-left: var(--s-5); display: flex; flex-direction: column; gap: var(--s-2); font-size: var(--fs-sm); }
|
|
938
1131
|
.err { color: var(--danger); font-size: var(--fs-sm); }
|
|
939
1132
|
.u-provider { padding: var(--s-3) var(--s-4); border-radius: var(--r-md); background: var(--surface); display: flex; flex-direction: column; gap: var(--s-2); }
|
|
940
1133
|
.u-head { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
941
|
-
/* #1749: one line beside
|
|
942
|
-
|
|
943
|
-
|
|
1134
|
+
/* #1749 / #2412: one line beside ↑↓, by flexing alone (no widths assumed: ↑↓ are larger on a phone). The plan badge
|
|
1135
|
+
starts at its minimum (40 px) and grows up to its own width into the room the name and ↑↓ leave, so a long badge ends
|
|
1136
|
+
in an ellipsis (the full name its tooltip) while the name keeps every pixel (#2415 review: a shared shrink, however
|
|
1137
|
+
weighted, still took a fraction of one and painted "Meta Muse Co…"). Only when the name, that minimum badge and ↑↓
|
|
1138
|
+
cannot all fit (a 320 px phone) does the name shrink and end in an ellipsis — nothing leaves the card. */
|
|
1139
|
+
.u-head strong { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1140
|
+
.u-plan { flex: 1 0 40px; max-width: max-content; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
944
1141
|
/* #2014: a credential profile's row — the provider name beside the plan badge, and the profile on its own full-width
|
|
945
1142
|
muted line under the head (one line in the rail, whole in the dialog). */
|
|
946
1143
|
.u-profile { margin-top: calc(-1 * var(--s-2) + 2px); color: var(--text-3); font-size: var(--fs-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
@@ -959,19 +1156,67 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
959
1156
|
.u-meter { height: 10px; border-radius: var(--r-full); background: var(--surface-2); overflow: hidden; }
|
|
960
1157
|
.u-fill { height: 100%; width: 0; min-width: 3px; border-radius: var(--r-full); background: var(--accent); transition: width 0.3s var(--ease); }
|
|
961
1158
|
.u-fill.warn { background: var(--warn); } .u-fill.crit { background: var(--danger); }
|
|
1159
|
+
/* Last known numbers (the live read failed): greyed, so they never read as live; the mark says when they were read. */
|
|
1160
|
+
.u-provider.is-stale .u-pct, .u-provider.is-stale .u-val, .u-provider.is-stale .u-status { color: var(--text-3); }
|
|
1161
|
+
.u-provider.is-stale .u-fill { background: var(--text-3); }
|
|
1162
|
+
.u-stale { font-weight: var(--fw-semibold); }
|
|
1163
|
+
.u-stale-detail { color: var(--text-3); font-size: var(--fs-xs); }
|
|
962
1164
|
.u-sub { color: var(--text-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
963
1165
|
.u-err { color: var(--warn); font-size: var(--fs-sm); }
|
|
964
1166
|
.u-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); }
|
|
965
1167
|
/* #1673: the usage rail beside the page on a wide screen (header-tools.js UsageRail; shown only at min-width 1200px). */
|
|
966
1168
|
.u-rail { width: 320px; flex-shrink: 0; display: flex; flex-direction: column; min-height: 0; border-left: 1px solid var(--border); background: var(--bg); }
|
|
967
1169
|
.u-rail-head { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); padding: var(--s-3) var(--s-3) var(--s-2) var(--s-4); }
|
|
968
|
-
.u-rail-head h2 { margin: 0; font-size: var(--fs-md); font-weight: var(--fw-semibold); }
|
|
1170
|
+
.u-rail-head h2 { margin: 0; flex: 1; min-width: 0; font-size: var(--fs-md); font-weight: var(--fw-semibold); }
|
|
1171
|
+
/* The usage view's compact mode (usage-dialog.js CompactGroup / CompactRow), the user's pick (2026-10-22): the logins
|
|
1172
|
+
grouped by provider (its name once, in small capitals), each in three short lines — its name and plan with the
|
|
1173
|
+
soonest reset on the right, then each window as a labelled full-width bar and the percent. */
|
|
1174
|
+
.dlg-tools { display: inline-flex; align-items: center; flex: none; }
|
|
1175
|
+
.u-compact-toggle { flex: none; }
|
|
1176
|
+
/* flex: none — a group never shrinks to fit the rail (it would clip its accounts): the rail scrolls instead. */
|
|
1177
|
+
.u-cgroup { flex: none; display: flex; flex-direction: column; border-radius: var(--r-md); background: var(--surface); overflow: hidden; }
|
|
1178
|
+
.u-cg-head { display: flex; align-items: baseline; gap: 4px; padding: 7px var(--s-3) 3px; font-size: 11px; font-weight: var(--fw-semibold);
|
|
1179
|
+
letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-3); }
|
|
1180
|
+
.u-cg-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1181
|
+
.u-cg-count { flex: none; }
|
|
1182
|
+
.u-crow { display: flex; flex-direction: column; gap: 3px; width: 100%; min-width: 0; padding: 6px var(--s-3); border: 0; border-top: 1px solid var(--border);
|
|
1183
|
+
background: transparent; color: inherit; font: inherit; line-height: 1.3; text-align: left; cursor: pointer; }
|
|
1184
|
+
.u-cg-head + .u-crow { border-top: 0; }
|
|
1185
|
+
.u-crow:hover { background: var(--surface-2); }
|
|
1186
|
+
/* #2478 (Prism r1): the compact rows sit in .u-cgroup, rounded and clipping (overflow: hidden) — the bar keeps clear of
|
|
1187
|
+
its 12 px corners (4 px in, 6 px off the row's ends) and there is no full-width underline to be rounded at the ends:
|
|
1188
|
+
the bar is the focus mark (hover has none). */
|
|
1189
|
+
.u-crow:focus-visible { outline: none; background: var(--surface-2); --lbar-left: var(--s-1); --lbar-inset: 6px; }
|
|
1190
|
+
/* The name never gives way to the plan (#2415); the reset keeps its room on the right. */
|
|
1191
|
+
.u-crow-head { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: var(--fs-sm); }
|
|
1192
|
+
.u-crow-name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--fw-semibold); color: var(--text); }
|
|
1193
|
+
.u-crow .u-plan { flex: 0 100 auto; min-width: 22px; max-width: max-content; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
1194
|
+
padding-block: 0; line-height: 16px; font-size: 10.5px; }
|
|
1195
|
+
/* Last known numbers: a small muted "cached at …" at the name line's end (why, in its tooltip). */
|
|
1196
|
+
.u-crow-stale { margin-left: auto; flex: none; padding-left: 6px; font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
1197
|
+
.u-cm { display: grid; grid-template-columns: 2.2em minmax(0, 1fr) 2.9em 3.7em; align-items: center; gap: 5px; min-width: 0; }
|
|
1198
|
+
/* Each window's own reset, after its percent: muted, tabular, right-aligned (an empty cell keeps the columns lined up). */
|
|
1199
|
+
.u-cm-reset { text-align: right; font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; font-variant-numeric: tabular-nums; overflow: hidden; }
|
|
1200
|
+
.u-cm-tag { font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
1201
|
+
/* #2240: an account of several pools (agy) names each pool's line: a wider label, ending in an ellipsis if it must. */
|
|
1202
|
+
.u-crow.is-pooled .u-cm { grid-template-columns: minmax(0, 7.0em) minmax(0, 1fr) 2.9em 3.7em; column-gap: 7px; }
|
|
1203
|
+
.u-cm-bar { height: 6px; border-radius: var(--r-full); background: var(--surface-2); overflow: hidden; }
|
|
1204
|
+
.u-cm-fill { display: block; height: 100%; width: 0; min-width: 2px; border-radius: var(--r-full); background: var(--accent); }
|
|
1205
|
+
.u-cm-fill.warn { background: var(--warn); } .u-cm-fill.crit { background: var(--danger); }
|
|
1206
|
+
.u-cm-pct { text-align: right; font-size: 13px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; color: var(--text); }
|
|
1207
|
+
.u-cm-pct.warn { color: var(--warn); } .u-cm-pct.crit { color: var(--danger); }
|
|
1208
|
+
.u-crow-note { font-size: var(--fs-xs); color: var(--text-3); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1209
|
+
.u-crow-note.is-alert::before { content: "●"; margin-right: 5px; color: var(--danger); }
|
|
1210
|
+
.u-crow.is-stale .u-crow-note.is-alert::before { color: var(--warn); }
|
|
1211
|
+
/* Last known numbers in compact: as the full card shows them (#2386), muted — not current. */
|
|
1212
|
+
.u-crow.is-stale .u-cm-pct { color: var(--text-3); } .u-crow.is-stale .u-cm-fill { background: var(--text-3); }
|
|
1213
|
+
@media (prefers-reduced-motion: no-preference) { .u-crow { transition: background-color 0.15s var(--ease); } }
|
|
969
1214
|
.u-rail-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--s-3) var(--s-4); display: flex; flex-direction: column; gap: var(--s-3); }
|
|
970
1215
|
@media (max-width: 1199px) { .u-rail { display: none; } }
|
|
971
1216
|
@media (max-width: 899px) {
|
|
972
1217
|
.hide-narrow { display: none; }
|
|
973
|
-
.v-
|
|
974
|
-
.v-
|
|
1218
|
+
.v-id { padding-left: var(--s-3); padding-right: var(--s-3); }
|
|
1219
|
+
.v-id-actions .btn { min-height: var(--tap); }
|
|
975
1220
|
}
|
|
976
1221
|
|
|
977
1222
|
/* ── Settings (#1408 step 3): lists, forms, the pending bar, the Apply in hand ── */
|
|
@@ -1063,8 +1308,6 @@ textarea.s-yaml { white-space: pre; overflow-x: auto; }
|
|
|
1063
1308
|
.s-dev-bar .lbl { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
|
|
1064
1309
|
/* An agent's row: name and model on the first line, its tags and buttons from the second, on every row alike. */
|
|
1065
1310
|
.s-br { display: block; flex-basis: 100%; height: 0; }
|
|
1066
|
-
/* View: the profile line wraps to two lines instead of hiding the model and context. */
|
|
1067
|
-
.v-card-meta { white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
|
|
1068
1311
|
/* A text button in Needs you lines up with the text above it, first in its row or wrapped onto a line of its own;
|
|
1069
1312
|
a row's trailing Delete sits at the right. */
|
|
1070
1313
|
.n-actions > .btn-ghost { padding-left: 0; padding-right: 0; margin-left: -1px; }
|
|
@@ -1114,6 +1357,18 @@ textarea.s-yaml { white-space: pre; overflow-x: auto; }
|
|
|
1114
1357
|
.op-line { display: flex; align-items: center; justify-content: center; gap: var(--s-2); }
|
|
1115
1358
|
.op-line.ok { color: var(--ok); }
|
|
1116
1359
|
.op-line.bad { color: var(--danger); }
|
|
1360
|
+
/* #2233: the backend sign-in dialog and Settings' list */
|
|
1361
|
+
.signin-field { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; margin: var(--s-2) 0; }
|
|
1362
|
+
.signin-label { color: var(--text-2); font-size: var(--fs-xs); min-width: 6em; }
|
|
1363
|
+
.signin-value { font-size: var(--fs-md); letter-spacing: 0.04em; user-select: all; word-break: break-all; }
|
|
1364
|
+
.signin-url { color: var(--text-2); font-size: var(--fs-xs); word-break: break-all; }
|
|
1365
|
+
.signin-note { color: var(--text-2); font-size: var(--fs-xs); }
|
|
1366
|
+
.signin-ok { color: var(--ok); }
|
|
1367
|
+
.signin-message { white-space: pre-wrap; }
|
|
1368
|
+
.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; }
|
|
1369
|
+
.signin-list { margin-top: var(--s-4); }
|
|
1370
|
+
.signin-list code { font-size: var(--fs-xs); word-break: break-all; }
|
|
1371
|
+
.signin-list .s-meta { white-space: normal; max-width: none; overflow: visible; }
|
|
1117
1372
|
@media (max-width: 899px) {
|
|
1118
1373
|
.grid2 { grid-template-columns: minmax(0, 1fr); }
|
|
1119
1374
|
.se-row { grid-template-columns: minmax(0, 1fr) auto auto; }
|
|
@@ -1164,10 +1419,10 @@ textarea.s-yaml { white-space: pre; overflow-x: auto; }
|
|
|
1164
1419
|
.org-team-head h3 { display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-md); font-weight: var(--fw-semibold); overflow-wrap: anywhere; }
|
|
1165
1420
|
.org-team-desc { color: var(--text-2); font-size: var(--fs-sm); overflow-wrap: anywhere; }
|
|
1166
1421
|
.org-team-sub { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-3); font-size: var(--fs-xs); }
|
|
1167
|
-
.org-node { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; padding: var(--s-3); border-radius: var(--r-md); background: var(--surface);
|
|
1168
|
-
.org-node.st-needs, .org-node.st-stuck {
|
|
1169
|
-
.org-node.st-crashed {
|
|
1170
|
-
.org-node.st-working {
|
|
1422
|
+
.org-node { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; padding: var(--s-3) var(--s-3) var(--s-3) calc(var(--s-3) + 3px); border-radius: var(--r-md); background: var(--surface); --lbar-color: transparent; }
|
|
1423
|
+
.org-node.st-needs, .org-node.st-stuck { --lbar-color: var(--warn); }
|
|
1424
|
+
.org-node.st-crashed { --lbar-color: var(--danger); }
|
|
1425
|
+
.org-node.st-working { --lbar-color: var(--ok); }
|
|
1171
1426
|
.org-node.st-missing { opacity: 0.7; }
|
|
1172
1427
|
.org-node-head { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
1173
1428
|
.org-names { flex: 1; min-width: 0; display: flex; flex-direction: column; }
|
|
@@ -1260,16 +1515,17 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1260
1515
|
.oc { --fx-task: #b794f6; --fx-send: #2dd4bf; --fx-report: #f472b6; --fx-broadcast: #fb923c; --fx-team: #cbd5e1; }
|
|
1261
1516
|
@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; } }
|
|
1262
1517
|
:root[data-theme="light"] .oc { --fx-task: #7c3aed; --fx-send: #0f766e; --fx-report: #be185d; --fx-broadcast: #c2410c; --fx-team: #475569; }
|
|
1263
|
-
|
|
1518
|
+
/* #2329: a line's stroke width is its own attribute (fleet-traffic.js strokeOf): its head and its trimmed ends are sized from it. */
|
|
1519
|
+
.oc-flow { fill: none; stroke-linecap: round; }
|
|
1264
1520
|
.oc-flow-halo { fill: none; stroke: var(--bg); stroke-width: 6; stroke-linecap: round; opacity: 0.85; }
|
|
1265
1521
|
.oc-flow.h-task { stroke: var(--fx-task); } .oc-flow.h-send { stroke: var(--fx-send); } .oc-flow.h-report { stroke: var(--fx-report); }
|
|
1266
|
-
.oc-flow.h-broadcast { stroke: var(--fx-broadcast); } .oc-flow.h-team { stroke: var(--fx-team);
|
|
1522
|
+
.oc-flow.h-broadcast { stroke: var(--fx-broadcast); } .oc-flow.h-team { stroke: var(--fx-team); }
|
|
1267
1523
|
.oc-flow.ph-live { stroke-dasharray: 7 6; animation: oc-dash 0.9s linear infinite; }
|
|
1268
1524
|
.oc-flow.ph-queued { stroke-dasharray: 2 5; opacity: 0.8; }
|
|
1269
1525
|
.oc-flow.ph-fading { stroke: var(--text-3); animation: oc-fade 12s ease-out forwards; }
|
|
1270
1526
|
/* #1918 review: the work — a delegation in progress (a slow dash, kept until its report), its report coming back, none. */
|
|
1271
|
-
.oc-flow.ph-work { stroke-dasharray: 10 7;
|
|
1272
|
-
.oc-flow.ph-return {
|
|
1527
|
+
.oc-flow.ph-work { stroke-dasharray: 10 7; animation: oc-dash 2.4s linear infinite; }
|
|
1528
|
+
.oc-flow.ph-return { animation: oc-fade 2.4s ease-out forwards; }
|
|
1273
1529
|
.oc-flow.ph-stale { stroke: var(--text-3); stroke-dasharray: 3 6; animation: oc-fade 12s ease-out forwards; }
|
|
1274
1530
|
.oc-ah.h-task { fill: var(--fx-task); } .oc-ah.h-send { fill: var(--fx-send); } .oc-ah.h-report { fill: var(--fx-report); }
|
|
1275
1531
|
.oc-ah.h-broadcast { fill: var(--fx-broadcast); } .oc-ah.h-team { fill: var(--fx-team); } .oc-ah.h-fading { fill: var(--text-3); }
|
|
@@ -1312,6 +1568,49 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1312
1568
|
.oc-tools { margin-left: 0; width: 100%; flex-wrap: wrap; row-gap: var(--s-2); }
|
|
1313
1569
|
.oc-mini { display: none; }
|
|
1314
1570
|
}
|
|
1571
|
+
/* ── Fleet → Org chart → Office (fleet-office.js): the fleet as a pixel office on one <canvas>. Its size is set through
|
|
1572
|
+
the CSSOM (never a style attribute, #1300); the stage scrolls, the page around it too. ── */
|
|
1573
|
+
.oo { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
1574
|
+
.oo-bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
|
|
1575
|
+
.oo-pick { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--text-2); }
|
|
1576
|
+
.oo-pick .tb-select { max-width: 200px; }
|
|
1577
|
+
.oo-people { position: relative; }
|
|
1578
|
+
/* #2399: the offices' minimal editor (fleet-office-editor.js) — one row per office, its members unfolded under it. */
|
|
1579
|
+
.oe-form { border: 0; margin: 0; padding: 0; min-width: 0; }
|
|
1580
|
+
/* #2431: after a 409, the two ways on (keep my edits, load theirs), side by side; they wrap on a phone. */
|
|
1581
|
+
.oe-conflict { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }
|
|
1582
|
+
.oe-list { list-style: none; margin: var(--s-3) 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-3); }
|
|
1583
|
+
.oe-row { padding: var(--s-3); border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface); display: flex; flex-direction: column; gap: var(--s-2); }
|
|
1584
|
+
.oe-head { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--s-2); }
|
|
1585
|
+
.oe-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
|
|
1586
|
+
.oe-label { font-size: var(--fs-xs); color: var(--text-2); }
|
|
1587
|
+
.oe-name { min-width: 0; width: 16em; max-width: 100%; }
|
|
1588
|
+
.oe-remove { margin-left: auto; }
|
|
1589
|
+
.oe-members { display: flex; flex-wrap: wrap; gap: var(--s-3); }
|
|
1590
|
+
.oe-group { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; min-width: 12em; max-height: 240px; overflow-y: auto; }
|
|
1591
|
+
.oe-group legend { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); padding: 0; margin-bottom: 4px; }
|
|
1592
|
+
.oo-people > .btn.on { border-color: var(--accent); }
|
|
1593
|
+
.oo-people-pop { position: absolute; z-index: 20; top: calc(100% + 4px); left: 0; width: min(280px, calc(100vw - 32px)); max-height: 340px; overflow-y: auto;
|
|
1594
|
+
display: flex; flex-direction: column; gap: var(--s-2); padding: var(--s-2); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: var(--shadow-2); }
|
|
1595
|
+
.oo-people-pop input[type="search"] { width: 100%; height: 32px; }
|
|
1596
|
+
.oo-people-list { list-style: none; margin: 0; padding: 0; }
|
|
1597
|
+
.oo-people-list label { display: flex; align-items: center; gap: 8px; padding: 3px 2px; font-size: var(--fs-xs); color: var(--text); cursor: pointer; overflow-wrap: anywhere; }
|
|
1598
|
+
.oo-note { font-size: var(--fs-xs); }
|
|
1599
|
+
.oo-stage { position: relative; height: clamp(420px, calc(100dvh - 280px), 960px); overflow: auto; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--bg); }
|
|
1600
|
+
.oo-canvas { display: block; margin: 0 auto; image-rendering: pixelated; }
|
|
1601
|
+
.oo-canvas.hot { cursor: pointer; }
|
|
1602
|
+
.oo-tip { position: absolute; left: 0; top: 0; z-index: 5; max-width: 240px; pointer-events: none; padding: 6px 10px; font-size: var(--fs-xs); line-height: 1.4;
|
|
1603
|
+
color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: var(--shadow-2); overflow-wrap: anywhere; }
|
|
1604
|
+
/* The desks as a list: for a screen reader, and shown (over the stage's corner) while the keyboard is in it. */
|
|
1605
|
+
.oo-desks { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; list-style: none; }
|
|
1606
|
+
.oo-desks:focus-within { position: sticky; left: var(--s-2); bottom: var(--s-2); width: auto; height: auto; max-height: 40%; margin: 0; padding: var(--s-1); clip: auto; overflow-y: auto;
|
|
1607
|
+
display: inline-flex; flex-wrap: wrap; gap: 4px; max-width: calc(100% - 2 * var(--s-2)); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); white-space: normal; }
|
|
1608
|
+
.oo-desk { font-size: var(--fs-xs); padding: 2px 6px; border-radius: var(--r-sm); background: var(--bg); color: var(--text); border: 1px solid var(--border); }
|
|
1609
|
+
.oo-desk:focus-visible { outline: none; border-color: var(--focus); box-shadow: inset 0 -2px 0 var(--focus); }
|
|
1610
|
+
@media (max-width: 640px) {
|
|
1611
|
+
.oo-stage { height: calc(100dvh - 300px); min-height: 340px; }
|
|
1612
|
+
.oo-pick .tb-select { max-width: 150px; }
|
|
1613
|
+
}
|
|
1315
1614
|
/* A phone: Fleet's five tabs fit when only the open one shows its label (the others keep theirs for screen readers). */
|
|
1316
1615
|
@media (max-width: 479px) {
|
|
1317
1616
|
.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; }
|
|
@@ -1366,9 +1665,9 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1366
1665
|
.us-csv { margin-left: auto; }
|
|
1367
1666
|
.us-custom { display: flex; flex-wrap: wrap; align-items: end; gap: var(--s-2) var(--s-3); font-size: var(--fs-sm); }
|
|
1368
1667
|
.us-custom label { display: inline-flex; flex-direction: column; gap: 2px; color: var(--text-2); }
|
|
1369
|
-
.us-basis { font-size: var(--fs-sm); color: var(--text); padding: var(--s-2) var(--s-3)
|
|
1668
|
+
.us-basis { font-size: var(--fs-sm); color: var(--text); padding: var(--s-2) var(--s-3) var(--s-2) calc(var(--s-3) + 3px); --lbar-color: var(--accent); background: var(--surface-2); border-radius: var(--r-sm); }
|
|
1370
1669
|
.us-fresh { font-size: var(--fs-xs); }
|
|
1371
|
-
.us-partial { font-size: var(--fs-sm); padding: var(--s-2) var(--s-3)
|
|
1670
|
+
.us-partial { font-size: var(--fs-sm); padding: var(--s-2) var(--s-3) var(--s-2) calc(var(--s-3) + 3px); --lbar-color: var(--warn); background: var(--warn-bg); border-radius: var(--r-sm); }
|
|
1372
1671
|
.us-unpriced { font-size: var(--fs-xs); }
|
|
1373
1672
|
.us-scan { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
|
|
1374
1673
|
.us-totals { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-3); margin: 0; }
|
|
@@ -1434,7 +1733,7 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1434
1733
|
.cmd-palette .cmd-arg { color: var(--text-3); }
|
|
1435
1734
|
.cmd-palette .cmd-none { color: var(--text-3); cursor: default; }
|
|
1436
1735
|
.cmd-card { display: flex; flex-direction: column; gap: var(--s-2); margin-bottom: var(--s-2); padding: var(--s-2) var(--s-3); border-radius: var(--r-md); background: var(--surface); font-size: var(--fs-sm); }
|
|
1437
|
-
.cmd-card.bad {
|
|
1736
|
+
.cmd-card.bad { --lbar-color: var(--danger); padding-left: calc(var(--s-3) + 3px); }
|
|
1438
1737
|
.cmd-head { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); }
|
|
1439
1738
|
.cmd-name { font-weight: var(--fw-semibold); }
|
|
1440
1739
|
.cmd-text { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font-family: var(--font-ui); color: var(--text-2); }
|
|
@@ -1549,8 +1848,8 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1549
1848
|
.side-widget { padding: 0 var(--s-3) var(--s-2); }
|
|
1550
1849
|
.aw-sidebar { max-height: 240px; overflow: auto; }
|
|
1551
1850
|
|
|
1552
|
-
|
|
1553
|
-
.chat-card-
|
|
1851
|
+
/* The chat header's card menu button (the user, 2026-10-20: no control on the card): pressed-looking while the card shows. */
|
|
1852
|
+
.chat-card-menu > .icon-btn.active { background: var(--accent-dim); color: var(--accent); }
|
|
1554
1853
|
/* 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
|
|
1555
1854
|
under it); the S / M / L control takes the line below. The chat header's card is trimmed further: a smaller portrait
|
|
1556
1855
|
and banner, and its tagline and bio cut to a few lines (Details and View show them whole). */
|
|
@@ -1567,9 +1866,10 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1567
1866
|
.id-card.card-c .id-tagline { -webkit-line-clamp: 2; line-clamp: 2; }
|
|
1568
1867
|
.id-card.card-c .id-bio { -webkit-line-clamp: 3; line-clamp: 3; }
|
|
1569
1868
|
}
|
|
1570
|
-
/* #1629 r4 §1: the card in View
|
|
1571
|
-
.v-id { flex-shrink: 0; padding: var(--s-2) var(--s-4)
|
|
1869
|
+
/* #1629 r4 §1: the identity card in View, with Edit profile under it. */
|
|
1870
|
+
.v-id { flex-shrink: 0; padding: var(--s-2) var(--s-4); background: var(--bg); padding-bottom: max(var(--s-2), env(safe-area-inset-bottom)); }
|
|
1572
1871
|
.v-id .id-card { margin: 0; }
|
|
1872
|
+
.v-id-actions { display: flex; justify-content: flex-end; padding-top: var(--s-2); }
|
|
1573
1873
|
.form-sub { margin: var(--s-2) 0 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
|
|
1574
1874
|
/* #1629 r4.1 Q3 (b): Settings → Appearance, the card's upload limits (three to a row; one on a phone). */
|
|
1575
1875
|
.grid3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-3) var(--s-4); margin-bottom: var(--s-3); }
|
|
@@ -1613,7 +1913,7 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1613
1913
|
.p-fleet > .seg, .p-settings > .seg,
|
|
1614
1914
|
.p-fleet > .panel-body, .p-needs > .panel-body, .p-settings > .panel-body,
|
|
1615
1915
|
.p-log > .panel-body, .p-details > .panel-body, .p-view > .panel-body,
|
|
1616
|
-
.p-log > .log-bar, .p-view > .v-term, .p-view > .v-id
|
|
1916
|
+
.p-log > .log-bar, .p-view > .v-term, .p-view > .v-id { position: relative; z-index: 1; }
|
|
1617
1917
|
/* Keep the existing Apply bar's sticky behavior, in its own bounded stock band. */
|
|
1618
1918
|
.p-settings > .s-pending { z-index: 1; }
|
|
1619
1919
|
|
|
@@ -1628,3 +1928,323 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1628
1928
|
.panel-head:has(> .chat-fx-notice) { flex-wrap: wrap; }
|
|
1629
1929
|
.chat-fx-notice { order: 10; flex: 1 1 100%; min-width: 0; max-width: 100%; font-size: var(--fs-sm); overflow-wrap: anywhere; }
|
|
1630
1930
|
.chat-fx-notice > span { display: block; }
|
|
1931
|
+
|
|
1932
|
+
/* ── #2293: global search — the sidebar row's shortcut, the header's button (collapsed sidebar, phone), the dialog ── */
|
|
1933
|
+
/* #2478: a touch screen has no Ctrl/⌘ K — the shortcut's hint is not shown there (the row is). */
|
|
1934
|
+
@media (pointer: coarse) { .side-search .kbd-hint { display: none; } }
|
|
1935
|
+
.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; }
|
|
1936
|
+
.panel-head .sb-search { display: none; }
|
|
1937
|
+
.sb-collapsed .panel-head .sb-search { display: inline-flex; }
|
|
1938
|
+
.chip-btn.on { color: var(--text); background: var(--surface-2); font-weight: var(--fw-semibold); }
|
|
1939
|
+
.dlg.search-dlg { width: min(680px, calc(100vw - 32px)); margin: 10vh auto auto; max-height: 76vh; }
|
|
1940
|
+
.search-box { display: flex; flex-direction: column; max-height: 76vh; }
|
|
1941
|
+
.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); }
|
|
1942
|
+
.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; }
|
|
1943
|
+
.search-input:focus { outline: none; }
|
|
1944
|
+
.search-filters-toggle { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
|
|
1945
|
+
.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); }
|
|
1946
|
+
.search-field { display: inline-flex; align-items: center; gap: var(--s-2); color: var(--text-2); }
|
|
1947
|
+
.search-field select { max-width: 260px; }
|
|
1948
|
+
/* The filter chips' "on" state in the accent, so it reads apart from the hover and from the folded toggle. */
|
|
1949
|
+
.search-chips .chip-btn.on { background: var(--accent-dim); color: var(--accent); }
|
|
1950
|
+
.search-chips { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 2px; }
|
|
1951
|
+
.search-mine { display: inline-flex; align-items: center; gap: 6px; margin-left: var(--s-2); color: var(--text-2); cursor: pointer; }
|
|
1952
|
+
.search-mine input { margin: 0; accent-color: var(--accent); }
|
|
1953
|
+
.search-body { flex: 1; min-height: 140px; overflow-y: auto; padding: var(--s-2); }
|
|
1954
|
+
.search-foot { padding: var(--s-2) var(--s-4); border-top: 1px solid var(--border); color: var(--text-3); font-size: var(--fs-xs); }
|
|
1955
|
+
.search-hint, .search-status, .search-note { margin: 0; padding: var(--s-2) var(--s-3); color: var(--text-2); font-size: var(--fs-sm); }
|
|
1956
|
+
.search-status.bad { color: var(--danger); }
|
|
1957
|
+
.search-note { color: var(--warn); }
|
|
1958
|
+
.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); }
|
|
1959
|
+
.search-recent ul { list-style: none; margin: 0; padding: 0; }
|
|
1960
|
+
.search-recent-item { display: flex; align-items: center; gap: var(--s-2); width: 100%; border: 0; border-radius: 0; --lbar-inset: 4px; background: transparent; color: var(--text); padding: var(--s-2) var(--s-3); font-size: var(--fs-sm); text-align: left; cursor: pointer; }
|
|
1961
|
+
.search-recent-item:hover, .search-recent-item:focus-visible { background: var(--surface-2); }
|
|
1962
|
+
/* Keyboard focus: the bar and a straight underline (no rounded ring). */
|
|
1963
|
+
.search-recent-item:focus-visible { outline: none; box-shadow: inset 0 -2px 0 var(--focus); }
|
|
1964
|
+
.search-recent-item svg { color: var(--text-3); flex: none; }
|
|
1965
|
+
.search-results.stale { opacity: 0.6; }
|
|
1966
|
+
.search-group + .search-group { margin-top: var(--s-2); }
|
|
1967
|
+
.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); }
|
|
1968
|
+
.search-count { color: var(--text-3); font-weight: var(--fw-regular); }
|
|
1969
|
+
.search-row { padding: var(--s-2) var(--s-3); border-radius: 0; cursor: pointer; }
|
|
1970
|
+
.search-row.on { background: var(--surface-2); }
|
|
1971
|
+
.search-row-top { display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-xs); color: var(--text-2); }
|
|
1972
|
+
.search-who { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1973
|
+
.search-kind { color: var(--text-3); }
|
|
1974
|
+
.search-time { color: var(--text-3); white-space: nowrap; }
|
|
1975
|
+
.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); }
|
|
1976
|
+
.search-badge.chat { background: var(--accent-dim); color: var(--accent); }
|
|
1977
|
+
.search-badge.xmsg { background: var(--warn-bg); color: var(--warn); }
|
|
1978
|
+
.search-badge.task { background: var(--ok-bg); color: var(--ok); }
|
|
1979
|
+
.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; }
|
|
1980
|
+
.search-snippet mark, .search-ctx-text mark { background: var(--accent-dim); color: inherit; border-radius: 2px; padding: 0 1px; }
|
|
1981
|
+
.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); }
|
|
1982
|
+
.search-detail-head .chip-btn { display: inline-flex; align-items: center; gap: 4px; }
|
|
1983
|
+
.search-ctx { list-style: none; margin: 0; padding: 0 var(--s-1); display: flex; flex-direction: column; gap: var(--s-1); }
|
|
1984
|
+
.search-ctx-line { padding: var(--s-2) var(--s-3); border-radius: 0; }
|
|
1985
|
+
.search-ctx-line.here { background: var(--surface-2); }
|
|
1986
|
+
.search-ctx-text { margin-top: 2px; font-size: var(--fs-sm); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
1987
|
+
.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); }
|
|
1988
|
+
@media (max-width: 899px) {
|
|
1989
|
+
.panel-head .sb-search { display: inline-flex; }
|
|
1990
|
+
.dlg.search-dlg { width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; margin: 0; border-radius: 0; }
|
|
1991
|
+
.search-box { height: 100%; max-height: 100dvh; padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom); box-sizing: border-box; }
|
|
1992
|
+
.search-foot { display: none; }
|
|
1993
|
+
.search-row { padding: var(--s-3); }
|
|
1994
|
+
.search-filters-toggle, .search-chips .chip-btn { min-height: var(--tap); }
|
|
1995
|
+
}
|
|
1996
|
+
/* The task board (Fleet › Tasks: fleet-tasks.js, fleet-task-card.js). Status colours: to do neutral, in progress the
|
|
1997
|
+
accent, blocked danger, waiting for you warn, done ok. Bars are SVG rects (no style attribute: the CSP). */
|
|
1998
|
+
.tb { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
|
|
1999
|
+
.tb-grow { flex: 1; }
|
|
2000
|
+
.tb-head { flex-wrap: wrap; }
|
|
2001
|
+
.tb-code { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; }
|
|
2002
|
+
.tb-who { font-size: var(--fs-xs); color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14em; }
|
|
2003
|
+
.tb-link { color: var(--accent); font-size: var(--fs-xs); background: none; border: 0; padding: 0; cursor: pointer; text-align: left; }
|
|
2004
|
+
.tb-link:hover { text-decoration: underline; }
|
|
2005
|
+
.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%; }
|
|
2006
|
+
.tb-select:disabled, .tb-check input:disabled { opacity: 0.6; cursor: default; }
|
|
2007
|
+
.tb-check { display: inline-flex; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); color: var(--text-2); cursor: pointer; }
|
|
2008
|
+
.tb-check input { width: auto; min-height: 0; margin: 0; }
|
|
2009
|
+
.tb-form-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-3); }
|
|
2010
|
+
.tb-chev { transition: transform var(--t-fast) var(--ease); transform: rotate(-90deg); }
|
|
2011
|
+
.tb-chev.open { transform: rotate(0deg); }
|
|
2012
|
+
|
|
2013
|
+
.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; }
|
|
2014
|
+
.tb-pill.st-claimed, .tb-tag.st-claimed { background: var(--accent-dim); color: var(--accent); }
|
|
2015
|
+
.tb-pill.st-blocked, .tb-tag.st-blocked, .tb-flag.st-blocked, .tb-tag.p-urgent { background: var(--danger-bg); color: var(--danger); }
|
|
2016
|
+
.tb-pill.st-review, .tb-tag.st-review, .tb-flag.st-review, .tb-tag.p-high { background: var(--warn-bg); color: var(--warn); }
|
|
2017
|
+
.tb-pill.st-done, .tb-tag.st-done { background: var(--ok-bg); color: var(--ok); }
|
|
2018
|
+
.tb-pill.st-cancelled { color: var(--text-3); text-decoration: line-through; }
|
|
2019
|
+
.tb-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--text-3); flex-shrink: 0; }
|
|
2020
|
+
.tb-col.st-claimed > .tb-col-head > .tb-dot, .tb-dot.st-claimed { background: var(--accent); }
|
|
2021
|
+
.tb-col.st-blocked > .tb-col-head > .tb-dot, .tb-dot.st-blocked { background: var(--danger); }
|
|
2022
|
+
.tb-col.st-review > .tb-col-head > .tb-dot, .tb-dot.st-review { background: var(--warn); }
|
|
2023
|
+
.tb-col.st-done > .tb-col-head > .tb-dot, .tb-dot.st-done { background: var(--ok); }
|
|
2024
|
+
|
|
2025
|
+
.tb-bar { width: 96px; height: 6px; border-radius: var(--r-full); overflow: hidden; flex-shrink: 0; }
|
|
2026
|
+
.tb-bar.wide { width: 100%; flex-shrink: 1; }
|
|
2027
|
+
.tb-bar-track { fill: var(--surface-2); }
|
|
2028
|
+
.tb-seg.st-done { fill: var(--ok); }
|
|
2029
|
+
.tb-seg.st-review { fill: var(--warn); }
|
|
2030
|
+
.tb-seg.st-claimed { fill: var(--accent); }
|
|
2031
|
+
.tb-seg.st-blocked { fill: var(--danger); }
|
|
2032
|
+
.tb-pct { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
|
|
2033
|
+
|
|
2034
|
+
/* Home: what waits for the person, then the projects. */
|
|
2035
|
+
.tb-home { display: flex; flex-direction: column; gap: var(--s-4); }
|
|
2036
|
+
/* The public link: the board is shown, not changed. */
|
|
2037
|
+
.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); }
|
|
2038
|
+
.tb-home > .list-head { margin: 0; }
|
|
2039
|
+
.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); }
|
|
2040
|
+
.tb-waiting { padding: var(--s-3); border: 1px solid var(--warn-line); border-radius: var(--r-lg); }
|
|
2041
|
+
.tb-wait-row { flex-wrap: wrap; align-items: flex-start; }
|
|
2042
|
+
/* #2299: the pill sits on the title's first line (one baseline); the reason, under the title; the actions after. */
|
|
2043
|
+
.tb-wait-main { flex: 1 1 320px; min-width: 0; display: flex; align-items: baseline; gap: var(--s-2) var(--s-3); }
|
|
2044
|
+
.tb-wait-main > .tb-pill { flex-shrink: 0; min-width: 112px; justify-content: center; }
|
|
2045
|
+
.tb-wait-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin-left: auto; }
|
|
2046
|
+
.tb-wait-actions .btn { min-width: 88px; padding: 0 var(--s-4); }
|
|
2047
|
+
.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); }
|
|
2048
|
+
.tb-wait-title:hover { text-decoration: underline; }
|
|
2049
|
+
.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; }
|
|
2050
|
+
.tb-projects { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: var(--s-3); }
|
|
2051
|
+
.tb-project { position: relative; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--surface); min-width: 0; }
|
|
2052
|
+
.tb-project:hover { border-color: var(--border-strong); }
|
|
2053
|
+
.tb-project.is-archived { opacity: 0.7; }
|
|
2054
|
+
.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; }
|
|
2055
|
+
.tb-project-name { font-weight: var(--fw-bold); font-size: var(--fs-md); overflow-wrap: anywhere; }
|
|
2056
|
+
.tb-project-desc { color: var(--text-2); font-size: var(--fs-xs); overflow-wrap: anywhere; }
|
|
2057
|
+
.tb-project-pct { display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); }
|
|
2058
|
+
.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); }
|
|
2059
|
+
.tb-project-menu { position: absolute; top: var(--s-2); right: var(--s-2); }
|
|
2060
|
+
.tb-archived { display: flex; flex-direction: column; gap: var(--s-2); align-items: flex-start; }
|
|
2061
|
+
.tb-archived > .tb-projects { align-self: stretch; }
|
|
2062
|
+
|
|
2063
|
+
.tb-search { position: relative; min-width: 180px; flex: 0 1 280px; }
|
|
2064
|
+
.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); }
|
|
2065
|
+
.tb-search input:focus { border-color: var(--focus); outline: none; box-shadow: 0 0 0 3px var(--accent-dim); }
|
|
2066
|
+
.tb-search-icon { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: var(--text-3); pointer-events: none; }
|
|
2067
|
+
.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); }
|
|
2068
|
+
.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); }
|
|
2069
|
+
.tb-search-results li.active button, .tb-search-results button:hover { background: var(--surface-2); }
|
|
2070
|
+
.tb-search-title { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
2071
|
+
.tb-search-where { flex-basis: 100%; font-size: var(--fs-xs); overflow-wrap: anywhere; }
|
|
2072
|
+
.tb-search-none { padding: var(--s-2); font-size: var(--fs-sm); }
|
|
2073
|
+
|
|
2074
|
+
/* A project: its header, then one column per status. */
|
|
2075
|
+
.tb-bar-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-3); }
|
|
2076
|
+
.tb-title { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
2077
|
+
.tb-title h2 { margin: 0; font-size: var(--fs-lg); overflow-wrap: anywhere; }
|
|
2078
|
+
.tb-stats { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); }
|
|
2079
|
+
.tb-scroll { overflow-x: auto; margin: 0 calc(-1 * var(--s-2)); padding: 0 var(--s-2) var(--s-2); }
|
|
2080
|
+
/* #2299: 176 px a column fits all five beside the sidebar from 1280 px wide (220 px cut Done off at 1366). */
|
|
2081
|
+
.tb-columns { display: grid; grid-template-columns: repeat(5, minmax(176px, 1fr)); gap: var(--s-3); align-items: start; min-width: min-content; }
|
|
2082
|
+
.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; }
|
|
2083
|
+
.tb-col.can-drop { border-color: var(--border); }
|
|
2084
|
+
.tb-col.over { border-color: var(--accent); background: var(--accent-dim); }
|
|
2085
|
+
.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; }
|
|
2086
|
+
.tb-col-head .tb-link { text-transform: none; letter-spacing: 0; font-weight: var(--fw-regular); }
|
|
2087
|
+
.tb-count { margin-left: auto; font-variant-numeric: tabular-nums; color: var(--text-3); }
|
|
2088
|
+
.tb-drop-line { height: 3px; border-radius: 2px; background: var(--accent); }
|
|
2089
|
+
|
|
2090
|
+
.tb-tile { display: flex; flex-direction: column; gap: var(--s-2); padding: var(--s-3) var(--s-3) var(--s-3) calc(var(--s-3) + 2px); border-radius: var(--r-md); background: var(--bg); border: 1px solid var(--border); box-shadow: var(--shadow-1); --lbar-color: transparent; cursor: pointer; font-size: var(--fs-sm); min-width: 0; }
|
|
2091
|
+
.tb-tile:hover { border-color: var(--border-strong); box-shadow: var(--shadow-2); }
|
|
2092
|
+
/* As taskhall: the shared straight bar (#2330) only while the card is under way (in progress, blocked, waiting for
|
|
2093
|
+
you); none on to do or done, and a done tile is dimmed. */
|
|
2094
|
+
.tb-tile.st-claimed { --lbar-color: var(--accent); }
|
|
2095
|
+
.tb-tile.st-blocked { --lbar-color: var(--danger); }
|
|
2096
|
+
.tb-tile.st-review { --lbar-color: var(--warn); }
|
|
2097
|
+
.tb-tile.st-done { background: color-mix(in srgb, var(--bg) 60%, var(--surface)); box-shadow: none; }
|
|
2098
|
+
.tb-tile.st-done .tb-tile-title { color: var(--text-2); }
|
|
2099
|
+
.tb-tile.dragging { opacity: 0.4; }
|
|
2100
|
+
.tb-tile.flash { animation: tb-flash 1.6s var(--ease); }
|
|
2101
|
+
@keyframes tb-flash { from { box-shadow: 0 0 0 3px var(--accent-dim); background: var(--accent-dim); } to { box-shadow: none; } }
|
|
2102
|
+
.tb-tile-top { display: flex; align-items: center; gap: var(--s-2); }
|
|
2103
|
+
.tb-size { padding: 0 5px; border: 1px solid var(--border); border-radius: var(--r-sm); font-size: 11px; font-weight: var(--fw-bold); line-height: 16px; color: var(--text-3); }
|
|
2104
|
+
/* The tile's control: its title, a plain-looking button (Enter opens the card, Alt+arrows move it). */
|
|
2105
|
+
.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-semibold); line-height: 1.4; text-align: left; cursor: pointer; overflow-wrap: anywhere; }
|
|
2106
|
+
.tb-tile-title:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
|
|
2107
|
+
.tb-tile:has(.tb-tile-title:focus-visible) { border-color: var(--focus); }
|
|
2108
|
+
.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; }
|
|
2109
|
+
/* A main task's sub task at work now (its worker in the foot), and what a card waiting for you still lacks. */
|
|
2110
|
+
.tb-tile-now { display: flex; align-items: baseline; gap: var(--s-1); min-width: 0; font-size: var(--fs-xs); color: var(--text-2); }
|
|
2111
|
+
.tb-now-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2112
|
+
.tb-now-label { flex-shrink: 0; font-size: 11px; font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
2113
|
+
.tb-now-label.st-claimed { color: var(--accent); }
|
|
2114
|
+
.tb-now-label.st-blocked { color: var(--danger); }
|
|
2115
|
+
.tb-now-label.st-review { color: var(--warn); }
|
|
2116
|
+
.tb-tag.wrapup { background: var(--warn-bg); color: var(--warn); }
|
|
2117
|
+
.tb-wait-reason.wrapup, .tc-hint.wrapup { color: var(--warn); }
|
|
2118
|
+
.tb-wait-asked { flex-basis: 100%; font-size: var(--fs-xs); }
|
|
2119
|
+
.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); }
|
|
2120
|
+
.tc-now:hover .tc-child-title { text-decoration: underline; }
|
|
2121
|
+
.tb-tile-note.st-blocked { color: var(--danger); }
|
|
2122
|
+
.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; }
|
|
2123
|
+
.tb-tile-progress > span { white-space: nowrap; }
|
|
2124
|
+
.tb-tile-progress > .tb-bar { flex: 1; min-width: 40px; }
|
|
2125
|
+
.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); }
|
|
2126
|
+
.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); }
|
|
2127
|
+
.tb-subs button:hover { background: var(--surface-2); }
|
|
2128
|
+
.tb-sub-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2129
|
+
.tb-sub-blocked { padding-left: 22px; font-size: var(--fs-xs); color: var(--danger); overflow-wrap: anywhere; }
|
|
2130
|
+
.tb-sub-more { font-size: var(--fs-xs); padding-left: var(--s-1); }
|
|
2131
|
+
.tb-tile-foot { display: flex; align-items: center; gap: var(--s-2); }
|
|
2132
|
+
.tb-tile-foot > .tb-who, .tb-tile-foot > .tb-person, .tb-tile-foot > .tb-people { flex: 1; min-width: 0; max-width: none; }
|
|
2133
|
+
.tb-people { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); }
|
|
2134
|
+
/* Who (fleet-task-common.js): a round initial — the instance's identity colour when it has one — then the name. */
|
|
2135
|
+
.tb-person { display: inline-flex; align-items: center; gap: 6px; min-width: 0; }
|
|
2136
|
+
.tb-person > .tb-who { min-width: 0; }
|
|
2137
|
+
.tb-person.none > .tb-who { color: var(--text-3); }
|
|
2138
|
+
.tb-av { display: inline-grid; place-items: center; width: 20px; height: 20px; flex: none; border-radius: 50%; font-size: 11px; font-weight: var(--fw-bold); line-height: 1;
|
|
2139
|
+
background: color-mix(in srgb, var(--id, var(--text-3)) 16%, var(--bg)); color: var(--id-name, var(--text-2)); }
|
|
2140
|
+
.tb-tile-stats { display: inline-flex; gap: var(--s-2); font-size: var(--fs-xs); color: var(--text-3); }
|
|
2141
|
+
.tb-tile-stats > span { display: inline-flex; align-items: center; gap: 2px; }
|
|
2142
|
+
.tb-tile-stats > .all { color: var(--ok); }
|
|
2143
|
+
.tb-tile-stats > .reply { color: var(--accent); }
|
|
2144
|
+
|
|
2145
|
+
/* #2246 step 3: who works on what (fleet-task-work.js) — the board's Instance drawer and the Details page's block. */
|
|
2146
|
+
.tw { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
|
|
2147
|
+
.tw-head { margin: 0; font-size: var(--fs-sm); }
|
|
2148
|
+
.tw-error { margin: 0; color: var(--danger); font-size: var(--fs-sm); }
|
|
2149
|
+
.tw-group { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
2150
|
+
.tw-group-head { display: flex; align-items: center; gap: var(--s-2); margin: 0; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
2151
|
+
.tw-inst { display: flex; flex-direction: column; gap: var(--s-1); padding: var(--s-3); border: 1px solid var(--border); border-radius: var(--r-md); background: var(--bg); min-width: 0; }
|
|
2152
|
+
.tw-inst-head { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
2153
|
+
.tw-inst-head .av { width: 24px; height: 24px; font-size: 11px; }
|
|
2154
|
+
.tw-inst-head .av .av-dot { box-shadow: 0 0 0 2px var(--bg); }
|
|
2155
|
+
.tw-name { font-weight: var(--fw-semibold); font-size: var(--fs-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
2156
|
+
.tw-state { font-size: var(--fs-xs); white-space: nowrap; }
|
|
2157
|
+
.tw-alt { font-size: var(--fs-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
2158
|
+
.tw-desc { margin: 0; font-size: var(--fs-xs); overflow-wrap: anywhere; }
|
|
2159
|
+
.tw-none { margin: 0; font-size: var(--fs-xs); }
|
|
2160
|
+
.tw-lines { display: flex; flex-direction: column; gap: 2px; margin: 0; padding: 0; list-style: none; }
|
|
2161
|
+
.tw-line { display: flex; align-items: baseline; gap: var(--s-2); width: 100%; padding: 2px var(--s-1); background: none; border: 0; border-radius: 0; --lbar-inset: 2px; color: var(--text); text-align: left; cursor: pointer; font-size: var(--fs-sm); min-width: 0; }
|
|
2162
|
+
.tw-line:hover { background: var(--surface-2); }
|
|
2163
|
+
.tw-line:focus-visible { outline: none; background: var(--surface-2); box-shadow: inset 0 -2px 0 var(--focus); }
|
|
2164
|
+
.tw-kind { flex-shrink: 0; min-width: 4.5em; font-size: 11px; font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
2165
|
+
.tw-kind.k-doing { color: var(--accent); }
|
|
2166
|
+
.tw-kind.k-blocked, .tw-kind.k-back { color: var(--danger); }
|
|
2167
|
+
.tw-kind.k-review { color: var(--warn); }
|
|
2168
|
+
.tw-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2169
|
+
.tw-note { flex-shrink: 0; font-size: var(--fs-xs); white-space: nowrap; }
|
|
2170
|
+
.tw-unread { flex-shrink: 0; display: inline-flex; color: var(--accent); }
|
|
2171
|
+
.d-board .tw-lines { margin-top: var(--s-1); }
|
|
2172
|
+
|
|
2173
|
+
/* One card, in the app's dialog. */
|
|
2174
|
+
.tc { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
|
|
2175
|
+
.tc-head { display: flex; align-items: center; gap: var(--s-2); }
|
|
2176
|
+
.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; }
|
|
2177
|
+
.tc-title:hover { border-color: var(--border); }
|
|
2178
|
+
.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); }
|
|
2179
|
+
.tc-ver { font-size: var(--fs-xs); }
|
|
2180
|
+
.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); }
|
|
2181
|
+
.tc-hint { font-size: var(--fs-xs); }
|
|
2182
|
+
.tc-meta { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--s-2) var(--s-4); margin: 0; padding: var(--s-3) var(--s-4); border-radius: var(--r-md); background: var(--surface); font-size: var(--fs-sm); align-items: center; }
|
|
2183
|
+
.tc-meta dt { color: var(--text-2); }
|
|
2184
|
+
.tc-meta dd { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: 0; min-width: 0; }
|
|
2185
|
+
.tc-value { color: var(--text); overflow-wrap: anywhere; }
|
|
2186
|
+
.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; }
|
|
2187
|
+
.tc-dep.waiting { border-color: var(--warn); color: var(--warn); }
|
|
2188
|
+
.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; }
|
|
2189
|
+
.tc-field.tone-blocked h3 { color: var(--danger); }
|
|
2190
|
+
.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; }
|
|
2191
|
+
.tc-text:hover { border-color: var(--border); background: var(--surface); }
|
|
2192
|
+
.tc-text.empty { color: var(--text-3); }
|
|
2193
|
+
.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; }
|
|
2194
|
+
.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); }
|
|
2195
|
+
.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); }
|
|
2196
|
+
.tc-counter { font-variant-numeric: tabular-nums; color: var(--text-3); }
|
|
2197
|
+
.tc-counter.over { color: var(--danger); font-weight: var(--fw-semibold); }
|
|
2198
|
+
.tc-checklist { display: flex; flex-direction: column; gap: var(--s-1); margin: 0 0 var(--s-1); padding: 0; list-style: none; }
|
|
2199
|
+
.tc-checklist .done { color: var(--text-3); text-decoration: line-through; }
|
|
2200
|
+
.tc-children { display: flex; flex-direction: column; gap: 2px; margin: 0 0 var(--s-2); padding: 0; list-style: none; }
|
|
2201
|
+
.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); }
|
|
2202
|
+
.tc-children button:hover { background: var(--surface); }
|
|
2203
|
+
.tc-child-title { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
2204
|
+
.tc-tabs { padding: 0; margin: var(--s-2) 0 0; max-width: none; }
|
|
2205
|
+
.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; }
|
|
2206
|
+
.tc-comments { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
2207
|
+
.tc-comment { padding: var(--s-2) var(--s-3); border-radius: var(--r-md); background: var(--surface); font-size: var(--fs-sm); }
|
|
2208
|
+
.tc-comment.person { background: var(--accent-dim); }
|
|
2209
|
+
.tc-comment-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin-bottom: 2px; font-size: var(--fs-xs); }
|
|
2210
|
+
.tc-comment-body { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
2211
|
+
.tc-composer { display: flex; gap: var(--s-2); align-items: flex-end; }
|
|
2212
|
+
|
|
2213
|
+
@media (max-width: 899px) {
|
|
2214
|
+
/* A phone stacks the columns: no sideways scrolling, and a card moves through its dialog's "Move to…". */
|
|
2215
|
+
.tb-scroll { overflow-x: visible; margin: 0; padding: 0; }
|
|
2216
|
+
.tb-columns { grid-template-columns: minmax(0, 1fr); min-width: 0; }
|
|
2217
|
+
.tb-col { min-height: 0; }
|
|
2218
|
+
.tb-form-row { grid-template-columns: minmax(0, 1fr); }
|
|
2219
|
+
.tb-search { flex: 1 1 100%; }
|
|
2220
|
+
/* The card's sheet keeps its fields full width (the grey block is the desk drawer's). */
|
|
2221
|
+
.tc-meta { padding: 0; background: none; }
|
|
2222
|
+
/* #2299: a phone's waiting row: pill and title on one line, the actions under them (assignee left, buttons right). */
|
|
2223
|
+
.tb-wait-main > .tb-pill { min-width: 0; }
|
|
2224
|
+
.tb-wait-actions { flex-basis: 100%; margin-left: 0; }
|
|
2225
|
+
.tb-wait-actions > .muted { margin-right: auto; }
|
|
2226
|
+
/* #2299: on the board its toasts come in above the tabs, not over its title, search and progress — unless a card's
|
|
2227
|
+
sheet is open (its buttons are at the bottom). */
|
|
2228
|
+
.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)); }
|
|
2229
|
+
/* …and they do not pile down the board: an older confirmation gives way to two newer toasts; an error never does. */
|
|
2230
|
+
.shell:has(.tb-home, .tb-board-page) .toasts > .toast.ok:nth-last-child(n+3) { display: none; }
|
|
2231
|
+
}
|
|
2232
|
+
/* On a desk a project's columns reach the bottom of the page, as taskhall's: a card drops anywhere down a column, and
|
|
2233
|
+
an empty column still reads as one. The page's column, the board and its scroller pass the height down as flex. */
|
|
2234
|
+
@media (min-width: 900px) {
|
|
2235
|
+
.col:has(> .tb > .tb-board-page) { display: flex; flex-direction: column; min-height: 100%; }
|
|
2236
|
+
.tb:has(> .tb-board-page) { flex: 1; }
|
|
2237
|
+
.tb-board-page { display: flex; flex-direction: column; flex: 1; }
|
|
2238
|
+
.tb-board-page > .tb-scroll { display: flex; flex-direction: column; flex: 1; }
|
|
2239
|
+
.tb-board-page .tb-columns { flex: 1; align-items: stretch; }
|
|
2240
|
+
}
|
|
2241
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2242
|
+
.tb-tile.flash { animation: none; }
|
|
2243
|
+
.tb-chev { transition: none; }
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
/* #2305: the agent's reactions to a message (its minimal reply), under the bubble — on the person's side for theirs. */
|
|
2247
|
+
.msg-reactions { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
|
|
2248
|
+
.msg.user .msg-reactions { justify-content: flex-end; }
|
|
2249
|
+
.msg-reactions .reaction { display: inline-flex; align-items: center; justify-content: center; min-width: 28px; height: 24px; padding: 0 6px;
|
|
2250
|
+
border: 1px solid var(--border); border-radius: var(--r-full); background: var(--surface-2); font-family: var(--font-emoji); font-size: 15px; line-height: 1; }
|