@songsid/agend 2.2.0-beta.9 → 2.3.0-beta.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 +40 -24
- package/README.zh-TW.md +40 -24
- package/dist/agent-cli.js +248 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +2 -0
- package/dist/agent-endpoint.js +28 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +30 -0
- package/dist/agent-file-read.js +129 -0
- package/dist/agent-file-read.js.map +1 -0
- package/dist/agent-whats-new.js +20 -1
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/atomic-write.js +9 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +3 -1
- package/dist/auth-api.js +32 -1
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.d.ts +33 -0
- package/dist/backend/antigravity.js +129 -21
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +3 -0
- package/dist/backend/claude-code.js +9 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +33 -0
- package/dist/backend/codex-metadata.js +122 -18
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.d.ts +3 -0
- package/dist/backend/codex.js +17 -1
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/effort-metadata.d.ts +37 -1
- package/dist/backend/effort-metadata.js +86 -15
- package/dist/backend/effort-metadata.js.map +1 -1
- package/dist/backend/grok.d.ts +3 -0
- package/dist/backend/grok.js +9 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -1
- package/dist/backend/kiro.js +7 -3
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.d.ts +61 -0
- package/dist/backend/launch-effort.js +170 -0
- package/dist/backend/launch-effort.js.map +1 -0
- package/dist/backend/muse.js +10 -2
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +24 -0
- package/dist/backend/types.js +12 -1
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-command.d.ts +91 -0
- package/dist/backend-command.js +122 -0
- package/dist/backend-command.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +14 -0
- package/dist/channel/adapters/discord.js +66 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +26 -1
- package/dist/channel/adapters/telegram.js +98 -7
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +36 -0
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.d.ts +2 -0
- package/dist/channel/tool-router.js +1 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +31 -0
- package/dist/cli.js +124 -24
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +2 -2
- package/dist/command-table.js +5 -2
- package/dist/command-table.js.map +1 -1
- package/dist/compact-watch.d.ts +86 -0
- package/dist/compact-watch.js +288 -0
- package/dist/compact-watch.js.map +1 -0
- package/dist/config-validator.js +55 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +9 -0
- package/dist/daemon.js +394 -29
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +8 -1
- package/dist/delivery-outbox.js +6 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/doctor.js +7 -0
- package/dist/doctor.js.map +1 -1
- package/dist/fleet-context.d.ts +12 -0
- package/dist/fleet-manager.d.ts +247 -9
- package/dist/fleet-manager.js +1227 -142
- package/dist/fleet-manager.js.map +1 -1
- package/dist/forged-envelope-scan.d.ts +4 -3
- package/dist/forged-envelope-scan.js +4 -3
- package/dist/forged-envelope-scan.js.map +1 -1
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +4 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +258 -0
- package/dist/install-lock.d.ts +18 -1
- package/dist/install-lock.js +30 -3
- package/dist/install-lock.js.map +1 -1
- package/dist/instance-avatar.d.ts +5 -4
- package/dist/instance-avatar.js +15 -8
- package/dist/instance-avatar.js.map +1 -1
- package/dist/instance-config-impact.js +3 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.js +9 -4
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.js +2 -2
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-compact-pane.d.ts +38 -0
- package/dist/kiro-compact-pane.js +57 -0
- package/dist/kiro-compact-pane.js.map +1 -0
- package/dist/launchd-handoff.d.ts +43 -0
- package/dist/launchd-handoff.js +56 -0
- package/dist/launchd-handoff.js.map +1 -0
- package/dist/locale.js +202 -30
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +10 -2
- package/dist/log-service.js.map +1 -1
- package/dist/login-shell.d.ts +21 -0
- package/dist/login-shell.js +98 -0
- package/dist/login-shell.js.map +1 -0
- package/dist/needs-you-hub.d.ts +4 -0
- package/dist/needs-you-hub.js +31 -6
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +1 -13
- package/dist/needs-you.js +3 -37
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +32 -0
- package/dist/outbound-handlers.js +150 -45
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +76 -0
- package/dist/outbound-schemas.js +65 -4
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/provider-probe.d.ts +29 -0
- package/dist/provider-probe.js +198 -2
- package/dist/provider-probe.js.map +1 -1
- package/dist/public-web-gateway.d.ts +2 -0
- package/dist/public-web-gateway.js +25 -1
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/quickstart-api.d.ts +1 -1
- package/dist/quickstart-api.js +8 -6
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +12 -0
- package/dist/quickstart.js +36 -6
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +86 -5
- package/dist/reply-buttons-controller.js +271 -7
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-buttons.d.ts +48 -3
- package/dist/reply-buttons.js +105 -10
- package/dist/reply-buttons.js.map +1 -1
- package/dist/reply-polls.d.ts +85 -0
- package/dist/reply-polls.js +154 -0
- package/dist/reply-polls.js.map +1 -0
- package/dist/repo-worktree-guard.d.ts +36 -0
- package/dist/repo-worktree-guard.js +143 -0
- package/dist/repo-worktree-guard.js.map +1 -0
- package/dist/restart-guard.d.ts +6 -3
- package/dist/restart-guard.js +6 -3
- package/dist/restart-guard.js.map +1 -1
- package/dist/restart-progress.d.ts +0 -2
- package/dist/restart-progress.js +0 -2
- package/dist/restart-progress.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +58 -1
- package/dist/scheduler/scheduler.js +176 -10
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/sd-notify.d.ts +22 -1
- package/dist/sd-notify.js +63 -10
- package/dist/sd-notify.js.map +1 -1
- package/dist/service-activation.d.ts +15 -7
- package/dist/service-activation.js +42 -26
- package/dist/service-activation.js.map +1 -1
- package/dist/service-installer.d.ts +24 -0
- package/dist/service-installer.js +49 -1
- package/dist/service-installer.js.map +1 -1
- package/dist/service-plan.d.ts +11 -0
- package/dist/service-plan.js +23 -0
- package/dist/service-plan.js.map +1 -1
- package/dist/settings-api.js +74 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +8 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +16 -2
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +5 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/systemd-peer-bus.d.ts +95 -0
- package/dist/systemd-peer-bus.js +430 -0
- package/dist/systemd-peer-bus.js.map +1 -0
- package/dist/systemd-runtime.d.ts +27 -1
- package/dist/systemd-runtime.js +69 -7
- package/dist/systemd-runtime.js.map +1 -1
- package/dist/tool-permissions.js +53 -3
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +72 -2
- package/dist/topic-commands.js +156 -38
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.d.ts +128 -0
- package/dist/topic-link.js +269 -0
- package/dist/topic-link.js.map +1 -0
- package/dist/transcript-jsonl.d.ts +7 -2
- package/dist/transcript-jsonl.js +13 -7
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-sources.js +6 -1
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/ui/app-effects.js +187 -0
- package/dist/ui/chat-commands.js +1 -0
- package/dist/ui/chat-effect-posters.js +42 -0
- package/dist/ui/chat-effects.js +72 -0
- package/dist/ui/chat-live-replies.js +58 -0
- package/dist/ui/chat-render.js +59 -14
- package/dist/ui/chat-store.js +78 -8
- package/dist/ui/chat-strings.js +43 -16
- package/dist/ui/chat-thread.js +175 -31
- package/dist/ui/chat-tour.js +18 -15
- package/dist/ui/effect-trial-controller.js +119 -0
- package/dist/ui/effect-trial-offer.js +31 -0
- package/dist/ui/effect-trial-panel.js +37 -0
- package/dist/ui/image-lightbox.js +1 -1
- package/dist/ui/panel-chat.js +101 -27
- package/dist/ui/panel-details.js +18 -5
- package/dist/ui/panel-fleet.js +18 -5
- package/dist/ui/panel-log.js +10 -10
- package/dist/ui/panel-needs.js +13 -10
- package/dist/ui/panel-settings.js +66 -12
- package/dist/ui/preview-panel.js +25 -9
- package/dist/ui/settings-appearance.js +325 -0
- package/dist/ui/settings-dialogs.js +11 -6
- package/dist/ui/settings-effects.js +201 -0
- package/dist/ui/settings-model.js +3 -1
- package/dist/ui/settings-mods.js +257 -0
- package/dist/ui/settings-owner-effects.js +80 -0
- package/dist/ui/settings-strings.js +269 -10
- package/dist/ui/settings-token.js +7 -0
- package/dist/ui/settings-wizard.js +5 -3
- package/dist/ui/shared/agend-auth.js +27 -3
- package/dist/ui/shared/agent-widget.js +248 -0
- package/dist/ui/shared/app-i18n.js +3 -1
- package/dist/ui/shared/app-prefs.js +30 -10
- package/dist/ui/shared/app-route.js +23 -1
- package/dist/ui/shared/app-session.js +1 -1
- package/dist/ui/shared/app-shell.js +29 -16
- package/dist/ui/shared/app-store.js +2 -0
- package/dist/ui/shared/app-stream.js +15 -7
- package/dist/ui/shared/app-themes.js +188 -0
- package/dist/ui/shared/app.css +266 -11
- package/dist/ui/shared/app.js +6 -0
- package/dist/ui/shared/card-strings.js +28 -0
- package/dist/ui/shared/effect-app-runtime.js +248 -0
- package/dist/ui/shared/effect-baseline.js +64 -0
- package/dist/ui/shared/effect-chat-runtime.js +154 -0
- package/dist/ui/shared/effect-cursor.js +125 -0
- package/dist/ui/shared/effect-frame.js +127 -0
- package/dist/ui/shared/effect-geometry.js +122 -0
- package/dist/ui/shared/effect-host-style.js +10 -0
- package/dist/ui/shared/effect-owner-regions.js +74 -0
- package/dist/ui/shared/effect-owner-source.js +115 -0
- package/dist/ui/shared/effect-policy.js +137 -0
- package/dist/ui/shared/effect-poster-reader.js +98 -0
- package/dist/ui/shared/effect-posters.js +117 -0
- package/dist/ui/shared/effect-profiler.js +162 -0
- package/dist/ui/shared/effect-profiles.js +65 -0
- package/dist/ui/shared/effect-registry.js +496 -0
- package/dist/ui/shared/effect-runtime-loader.js +234 -0
- package/dist/ui/shared/effect-safety.js +153 -0
- package/dist/ui/shared/effect-stock-snapshot.js +34 -0
- package/dist/ui/shared/effect-stock-trust.js +165 -0
- package/dist/ui/shared/effect-trial-source.js +103 -0
- package/dist/ui/shared/effect-trial-stage.js +147 -0
- package/dist/ui/shared/header-tools.js +35 -15
- package/dist/ui/shared/identity-card.js +202 -0
- package/dist/ui/shared/identity-color.js +261 -0
- package/dist/ui/shared/instance-nav.js +22 -14
- package/dist/ui/shared/instance-switch.js +5 -2
- package/dist/ui/shared/owner-css.js +221 -0
- package/dist/ui/shared/owner-effect-prefs.js +117 -0
- package/dist/ui/shared/panel-view.js +96 -12
- package/dist/ui/shared/signin.js +17 -9
- package/dist/ui/shared/ui-dialog.js +1 -1
- package/dist/ui/shared/ui-icons.js +3 -0
- package/dist/ui/shared/ui-menu.js +1 -1
- package/dist/ui/shared/ui-toast.js +1 -1
- package/dist/ui/shared/view-strings.js +40 -2
- package/dist/ui/signin.html +9 -3
- package/dist/update-check.d.ts +31 -0
- package/dist/update-check.js +47 -0
- package/dist/update-check.js.map +1 -1
- package/dist/update-launch.d.ts +48 -1
- package/dist/update-launch.js +159 -5
- package/dist/update-launch.js.map +1 -1
- package/dist/usage/providers.d.ts +28 -8
- package/dist/usage/providers.js +96 -41
- package/dist/usage/providers.js.map +1 -1
- package/dist/view-api.d.ts +29 -0
- package/dist/view-api.js +214 -17
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +86 -2
- package/dist/web-api.js +1160 -92
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-limits.d.ts +82 -0
- package/dist/web-appearance-limits.js +83 -0
- package/dist/web-appearance-limits.js.map +1 -0
- package/dist/web-appearance-policy.d.ts +66 -0
- package/dist/web-appearance-policy.js +94 -0
- package/dist/web-appearance-policy.js.map +1 -0
- package/dist/web-appearance-tools.d.ts +50 -0
- package/dist/web-appearance-tools.js +105 -0
- package/dist/web-appearance-tools.js.map +1 -0
- package/dist/web-appearance-view.d.ts +99 -0
- package/dist/web-appearance-view.js +163 -0
- package/dist/web-appearance-view.js.map +1 -0
- package/dist/web-appearance.d.ts +79 -0
- package/dist/web-appearance.js +298 -0
- package/dist/web-appearance.js.map +1 -0
- package/dist/web-asset-parts.d.ts +98 -0
- package/dist/web-asset-parts.js +133 -0
- package/dist/web-asset-parts.js.map +1 -0
- package/dist/web-auth.js +17 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-card.d.ts +96 -0
- package/dist/web-card.js +232 -0
- package/dist/web-card.js.map +1 -0
- package/dist/web-chat-history.d.ts +39 -1
- package/dist/web-chat-history.js +69 -9
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +39 -3
- package/dist/web-commands.js +22 -5
- package/dist/web-commands.js.map +1 -1
- package/dist/web-effect-bundle.d.ts +28 -0
- package/dist/web-effect-bundle.js +126 -0
- package/dist/web-effect-bundle.js.map +1 -0
- package/dist/web-effect-canonical.d.ts +8 -0
- package/dist/web-effect-canonical.js +27 -0
- package/dist/web-effect-canonical.js.map +1 -0
- package/dist/web-effect-library.d.ts +114 -0
- package/dist/web-effect-library.js +530 -0
- package/dist/web-effect-library.js.map +1 -0
- package/dist/web-effect-poster.d.ts +8 -0
- package/dist/web-effect-poster.js +52 -0
- package/dist/web-effect-poster.js.map +1 -0
- package/dist/web-effect-profiles.d.ts +118 -0
- package/dist/web-effect-profiles.js +180 -0
- package/dist/web-effect-profiles.js.map +1 -0
- package/dist/web-effect-service.d.ts +86 -0
- package/dist/web-effect-service.js +312 -0
- package/dist/web-effect-service.js.map +1 -0
- package/dist/web-effect-tools.d.ts +47 -0
- package/dist/web-effect-tools.js +126 -0
- package/dist/web-effect-tools.js.map +1 -0
- package/dist/web-effect-trials.d.ts +86 -0
- package/dist/web-effect-trials.js +204 -0
- package/dist/web-effect-trials.js.map +1 -0
- package/dist/web-effect-upload.d.ts +29 -0
- package/dist/web-effect-upload.js +190 -0
- package/dist/web-effect-upload.js.map +1 -0
- package/dist/web-effect-worker.d.ts +8 -0
- package/dist/web-effect-worker.js +170 -0
- package/dist/web-effect-worker.js.map +1 -0
- package/dist/web-effect.d.ts +89 -0
- package/dist/web-effect.js +132 -0
- package/dist/web-effect.js.map +1 -0
- package/dist/web-identity-color.d.ts +87 -0
- package/dist/web-identity-color.js +209 -0
- package/dist/web-identity-color.js.map +1 -0
- package/dist/web-identity-palette.d.ts +113 -0
- package/dist/web-identity-palette.js +84 -0
- package/dist/web-identity-palette.js.map +1 -0
- package/dist/web-image-meta.d.ts +25 -0
- package/dist/web-image-meta.js +200 -0
- package/dist/web-image-meta.js.map +1 -0
- package/dist/web-login.d.ts +14 -0
- package/dist/web-login.js +4 -2
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +50 -0
- package/dist/web-mod-agent.js +203 -0
- package/dist/web-mod-agent.js.map +1 -0
- package/dist/web-mod-bundle.d.ts +144 -0
- package/dist/web-mod-bundle.js +464 -0
- package/dist/web-mod-bundle.js.map +1 -0
- package/dist/web-mod-export.d.ts +59 -0
- package/dist/web-mod-export.js +79 -0
- package/dist/web-mod-export.js.map +1 -0
- package/dist/web-mod-store.d.ts +283 -0
- package/dist/web-mod-store.js +624 -0
- package/dist/web-mod-store.js.map +1 -0
- package/dist/web-org.d.ts +3 -3
- package/dist/web-org.js +11 -17
- package/dist/web-org.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +180 -0
- package/dist/web-owner-css-store.js +384 -0
- package/dist/web-owner-css-store.js.map +1 -0
- package/dist/web-owner-css.d.ts +58 -0
- package/dist/web-owner-css.js +552 -0
- package/dist/web-owner-css.js.map +1 -0
- package/dist/web-prefs.d.ts +66 -0
- package/dist/web-prefs.js +243 -35
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +9 -1
- package/dist/web-preview.js +24 -7
- package/dist/web-preview.js.map +1 -1
- package/dist/web-profile.d.ts +32 -0
- package/dist/web-profile.js +132 -0
- package/dist/web-profile.js.map +1 -0
- package/dist/web-session.d.ts +14 -0
- package/dist/web-session.js +10 -0
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +18 -0
- package/dist/web-settings-patch.js +51 -0
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-shell-routes.d.ts +1 -1
- package/dist/web-shell-routes.js +1 -1
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-theme-store.d.ts +218 -0
- package/dist/web-theme-store.js +516 -0
- package/dist/web-theme-store.js.map +1 -0
- package/dist/web-theme.d.ts +121 -0
- package/dist/web-theme.js +407 -0
- package/dist/web-theme.js.map +1 -0
- package/dist/web-upload.d.ts +119 -4
- package/dist/web-upload.js +252 -39
- package/dist/web-upload.js.map +1 -1
- package/dist/web-widget.d.ts +72 -0
- package/dist/web-widget.js +245 -0
- package/dist/web-widget.js.map +1 -0
- package/launcher/install-admission.cjs +61 -6
- package/package.json +3 -3
package/dist/ui/shared/app.css
CHANGED
|
@@ -69,10 +69,12 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
69
69
|
.sidebar {
|
|
70
70
|
width: var(--sidebar-w); flex-shrink: 0; display: flex; flex-direction: column; background: var(--bg-sidebar);
|
|
71
71
|
position: relative; /* #1722: the resize handle sits on its right edge (the width above: tokens.css, or this device's) */
|
|
72
|
-
padding:
|
|
72
|
+
padding: 0 0 env(safe-area-inset-bottom) env(safe-area-inset-left); /* the top inset is the head's, as the page header's is */
|
|
73
73
|
}
|
|
74
74
|
.sb-collapsed .sidebar { display: none; }
|
|
75
|
-
|
|
75
|
+
/* The brand row is the page header's row: the same height, padding and centre line (--header-h; .panel-head, .panel-title). */
|
|
76
|
+
.side-head { display: flex; align-items: center; gap: var(--s-1); box-sizing: content-box; min-height: calc(var(--header-h) - 2 * var(--s-1));
|
|
77
|
+
padding: max(var(--s-1), env(safe-area-inset-top)) var(--s-2) var(--s-1) var(--s-4); }
|
|
76
78
|
.brand { flex: 1; font-size: var(--fs-lg); font-weight: var(--fw-semibold); letter-spacing: -0.01em; }
|
|
77
79
|
.side-nav { display: flex; flex-direction: column; padding: var(--s-1) var(--s-2); gap: 1px; }
|
|
78
80
|
.side-row {
|
|
@@ -110,7 +112,26 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
110
112
|
.av img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; }
|
|
111
113
|
.av.av-emoji { background: transparent; font-size: 18px; font-weight: normal; }
|
|
112
114
|
.av.av-emoji img { width: 22px; height: 22px; border-radius: 0; object-fit: contain; }
|
|
113
|
-
|
|
115
|
+
/* #1958: an instance's identity colour — both modes' values set on the row through the CSSOM (identity-color.js), the
|
|
116
|
+
page's mode picks one (the same selectors as tokens.css). Places: .id-ring (the avatar's ring, every face), .id-bar (a
|
|
117
|
+
bar at the row's left edge), .id-name (the name, in a shade readable on the page and the sidebar). */
|
|
118
|
+
.idc { --id: var(--id-dark); --id-name: var(--id-name-dark); }
|
|
119
|
+
@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .idc { --id: var(--id-light); --id-name: var(--id-name-light); } }
|
|
120
|
+
:root[data-theme="light"] .idc { --id: var(--id-light); --id-name: var(--id-name-light); }
|
|
121
|
+
.idc.id-ring .av { box-shadow: 0 0 0 2px var(--id); }
|
|
122
|
+
.idc.id-bar { box-shadow: inset 3px 0 0 var(--id); }
|
|
123
|
+
.idc.id-name .inst-name { color: var(--id-name); }
|
|
124
|
+
.idc-swatches, .idc-places { border: 0; padding: 0; margin: 0 0 var(--s-3); display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
125
|
+
.idc-swatches legend, .idc-places legend { font-weight: var(--fw-semibold); margin-bottom: 6px; width: 100%; }
|
|
126
|
+
.idc-swatch { --sw: var(--sw-dark); width: 28px; height: 28px; border-radius: 50%; border: 2px solid transparent; background: var(--sw); cursor: pointer; padding: 0; }
|
|
127
|
+
@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .idc-swatch { --sw: var(--sw-light); } }
|
|
128
|
+
:root[data-theme="light"] .idc-swatch { --sw: var(--sw-light); }
|
|
129
|
+
.idc-swatch.on { border-color: var(--text); box-shadow: 0 0 0 2px var(--bg); }
|
|
130
|
+
.idc-custom { display: inline-flex; gap: 6px; align-items: center; }
|
|
131
|
+
.idc-custom input[type="color"] { width: 32px; height: 28px; padding: 0; border: 0; background: none; }
|
|
132
|
+
.idc-hex { width: 9ch; font-family: var(--font-mono, monospace); }
|
|
133
|
+
.dlg-actions .dlg-spacer { flex: 1 1 auto; }
|
|
134
|
+
.idc-preview { padding: 6px; border-radius: 10px; background: var(--bg-sidebar); max-width: 260px; }
|
|
114
135
|
.av-text { overflow: hidden; }
|
|
115
136
|
.av .av-dot { position: absolute; right: -2px; bottom: -2px; margin: 0; box-shadow: 0 0 0 2px var(--bg-sidebar); }
|
|
116
137
|
/* #1722: the CLI as a letter on the avatar's top-left corner — monochrome (the #1630 ring keeps the colour), cut out like the dot */
|
|
@@ -150,6 +171,10 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
150
171
|
.s-device { display: flex; flex-direction: column; gap: var(--s-3); }
|
|
151
172
|
.s-device .sub { margin: 0; color: var(--text-3); font-size: var(--fs-sm); }
|
|
152
173
|
.s-device-row { display: flex; gap: var(--s-2); }
|
|
174
|
+
/* #1827: the person's web name — its field takes the card's width; a refusal reads in the danger colour. */
|
|
175
|
+
.s-profile .field { display: flex; flex-direction: column; gap: var(--s-1); }
|
|
176
|
+
.s-profile .field input { max-width: 24rem; }
|
|
177
|
+
.s-profile .err { color: var(--danger); }
|
|
153
178
|
/* #1620: Settings → Web — the lead, and the read-only list of what is set in fleet.yaml. */
|
|
154
179
|
.s-web .sub { margin: 0; color: var(--text-3); font-size: var(--fs-sm); }
|
|
155
180
|
.s-web-fields:disabled select { opacity: 0.6; } /* over the public link: dimmed like the inputs (.field input:disabled) */
|
|
@@ -195,14 +220,17 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
195
220
|
}
|
|
196
221
|
.panel-head .sb-open { display: none; }
|
|
197
222
|
.sb-collapsed .panel-head .sb-open { display: inline-flex; }
|
|
198
|
-
|
|
223
|
+
/* One row of --header-h on every page (a phone's instance tabs wrap below it): the title, its status and badges on one centre line. */
|
|
224
|
+
.panel-title { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--s-3); min-height: calc(var(--header-h) - 2 * var(--s-1)); }
|
|
199
225
|
.panel-title h1 { font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; outline: none; }
|
|
200
226
|
.panel-sub { color: var(--text-2); font-size: var(--fs-sm); white-space: nowrap; }
|
|
201
227
|
.status { display: inline-flex; align-items: center; gap: 6px; }
|
|
202
228
|
.panel-actions { display: flex; align-items: center; gap: var(--s-1); }
|
|
203
229
|
/* #1523 N2: the instance view switch — beside the title on a wide screen; on a phone, a row of tabs under the header. */
|
|
204
230
|
.inst-switch.seg { padding: 0; margin: 0; width: auto; max-width: none; flex-shrink: 0; }
|
|
205
|
-
.inst-switch .seg-item { min-height: 30px; }
|
|
231
|
+
.inst-switch .seg-item { min-height: 30px; flex-direction: column; justify-content: center; gap: 0; }
|
|
232
|
+
/* The label again in the current tab's weight, taking width but no height and never seen: the bar's size does not change with the tab. */
|
|
233
|
+
.inst-switch .seg-item::after { content: attr(data-label); font-weight: var(--fw-semibold); height: 0; overflow: hidden; visibility: hidden; pointer-events: none; user-select: none; }
|
|
206
234
|
/* #1523 N3 (Q2 = A): the text size, one custom property from the root's data-text-size (header-tools.js). The chat's
|
|
207
235
|
messages, Details and the Fleet tabs scale the type tokens by it; View's terminal scales itself (VIEW_SCALE). */
|
|
208
236
|
:root { --text-scale: 1; }
|
|
@@ -248,6 +276,10 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
248
276
|
.p-log .log-older, .p-log .log-start { text-align: center; margin: var(--s-2) 0; }
|
|
249
277
|
.p-log .log-off { padding: var(--s-6) var(--s-4); }
|
|
250
278
|
.p-details .d-edit { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); flex-wrap: wrap; margin-top: var(--s-2); }
|
|
279
|
+
/* The header's controls are one height, the icon buttons' (36 px): its small buttons, and the instance tabs when they share
|
|
280
|
+
its row (a phone puts them on a row of their own, under it). */
|
|
281
|
+
.panel-head .btn-sm { min-height: 36px; }
|
|
282
|
+
@media (min-width: 900px) { .panel-head .inst-switch .seg-item { min-height: 36px; } }
|
|
251
283
|
@media (max-width: 899px) {
|
|
252
284
|
.panel-head:has(.inst-switch) { flex-wrap: wrap; }
|
|
253
285
|
.inst-switch.seg { order: 3; flex-basis: 100%; display: grid; grid-template-columns: repeat(4, 1fr); padding: 0 0 var(--s-1); }
|
|
@@ -264,8 +296,7 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
264
296
|
.empty-title { color: var(--text); font-size: var(--fs-lg); font-weight: var(--fw-semibold); }
|
|
265
297
|
.empty-hint { font-size: var(--fs-sm); }
|
|
266
298
|
.empty .btn { margin-top: var(--s-3); }
|
|
267
|
-
/* #1519 P7: the first-run card (a fleet with no chat connection), above
|
|
268
|
-
.first-run-stack { width: 100%; max-width: var(--col); }
|
|
299
|
+
/* #1519 P7: the first-run card (a fleet with no chat connection), above a Settings list (#1854: no longer on Chat). */
|
|
269
300
|
.first-run h3 { display: flex; align-items: center; gap: var(--s-2); }
|
|
270
301
|
.first-run p { color: var(--text-2); font-size: var(--fs-sm); }
|
|
271
302
|
.error-state { display: flex; flex-direction: column; align-items: center; gap: var(--s-3); padding: var(--s-8) var(--s-4); color: var(--danger); text-align: center; }
|
|
@@ -334,6 +365,8 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
334
365
|
.seg-item { display: inline-flex; align-items: center; gap: var(--s-2); min-height: 34px; padding: 0 var(--s-3); border-radius: var(--r-full); color: var(--text-2); font-size: var(--fs-sm); white-space: nowrap; }
|
|
335
366
|
.seg-item:hover { background: var(--surface); color: var(--text); }
|
|
336
367
|
.seg-item.active { background: var(--surface-2); color: var(--text); font-weight: var(--fw-semibold); }
|
|
368
|
+
/* #1629: Settings has eight sections (Appearance added): they wrap to a second row rather than hide behind a scroll. */
|
|
369
|
+
.p-settings .seg { flex-wrap: wrap; row-gap: var(--s-1); overflow-x: visible; }
|
|
337
370
|
.list-head { display: flex; justify-content: space-between; align-items: center; gap: var(--s-3); margin: var(--s-2) 0 var(--s-3); color: var(--text-2); font-size: var(--fs-sm); }
|
|
338
371
|
.rows { display: flex; flex-direction: column; gap: var(--s-1); }
|
|
339
372
|
.row-item { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; padding: var(--s-3) var(--s-4); border-radius: var(--r-md); background: var(--surface); font-size: var(--fs-sm); }
|
|
@@ -370,6 +403,13 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
370
403
|
such as 「昨天 下午03:58」, ticks) — and a block body would stretch to it; fit-content keeps a short message short, on
|
|
371
404
|
the right under its meta, and a long one still wraps at the message's max-width. */
|
|
372
405
|
.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; }
|
|
406
|
+
/* A person's click on a reply button: the bubble shows 🔘 and the button's label (never the value the agent was given);
|
|
407
|
+
live, the label is a button that shows the reply its buttons were on. */
|
|
408
|
+
.click-chip { display: flex; }
|
|
409
|
+
.click-chip .click-link, .click-chip .click-text { display: inline-flex; align-items: baseline; gap: var(--s-1); padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; overflow-wrap: anywhere; }
|
|
410
|
+
.click-chip .click-link { cursor: pointer; }
|
|
411
|
+
.click-chip .click-link:hover, .click-chip .click-link:focus-visible { text-decoration: underline; }
|
|
412
|
+
.click-mark { flex: none; }
|
|
373
413
|
.msg.agent { align-self: stretch; }
|
|
374
414
|
/* #1672: a status line (another instance's message, a daemon notice): muted plain text, no bubble; a long one folds.
|
|
375
415
|
Its class is `status-line`, never `status`: that is the header's inline-flex badge class, and on a message it turned
|
|
@@ -400,10 +440,13 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
400
440
|
.text-card { margin-top: var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); padding: var(--s-2) var(--s-3); }
|
|
401
441
|
.text-card .tc-head { display: flex; align-items: center; gap: var(--s-2); }
|
|
402
442
|
.text-card .tc-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-xs); font-family: var(--font-mono); color: var(--text-2); }
|
|
403
|
-
|
|
443
|
+
/* #1812: the scroller spans the card's padding box and insets its own content — 12px on both sides, from the border on
|
|
444
|
+
the left and from the scrollbar (or the border, with overlay scrollbars) on the right. A stable gutter keeps a
|
|
445
|
+
classic scrollbar off the content, and the content from shifting when the scrollbar comes and goes. */
|
|
446
|
+
.text-card .tc-body { margin: var(--s-2) calc(-1 * var(--s-3)) 0; padding: 0 var(--s-3); max-height: 480px; overflow: auto; scrollbar-gutter: stable; }
|
|
404
447
|
.text-card .tc-body[hidden] { display: none; }
|
|
405
448
|
.text-card .tc-pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-size: var(--fs-xs); }
|
|
406
|
-
.text-card .tc-table-wrap { overflow-x: auto; }
|
|
449
|
+
.text-card .tc-table-wrap { overflow-x: auto; padding-bottom: var(--s-3); }
|
|
407
450
|
.text-card .tc-table { border-collapse: collapse; font-size: var(--fs-xs); }
|
|
408
451
|
.text-card .tc-table th, .text-card .tc-table td { border: 1px solid var(--border); padding: 2px 6px; text-align: left; vertical-align: top; }
|
|
409
452
|
.text-card .tc-more { margin-top: var(--s-2); }
|
|
@@ -436,10 +479,17 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
436
479
|
.msg .md ul { list-style: disc; } .msg .md ol { list-style: decimal; }
|
|
437
480
|
.msg .md li > ul, .msg .md li > ol { margin: 2px 0; }
|
|
438
481
|
.msg .md hr { border: 0; border-top: 1px solid var(--border); margin: var(--s-3) 0; }
|
|
439
|
-
|
|
482
|
+
/* #1812: a table too wide for its message scrolls in this wrapper (see the cell rule below); the bottom padding keeps an
|
|
483
|
+
overlay scrollbar off the last row. */
|
|
484
|
+
.msg .md .tbl { overflow-x: auto; margin: var(--s-2) 0 0; padding-bottom: var(--s-3); }
|
|
440
485
|
.msg .md table { border-collapse: collapse; font-size: var(--fs-sm); }
|
|
441
486
|
.msg .md th, .msg .md td { border: 1px solid var(--border); padding: 5px 9px; text-align: left; vertical-align: top; }
|
|
442
487
|
.msg .md th { background: var(--surface); font-weight: var(--fw-semibold); }
|
|
488
|
+
/* #1812: table cells keep their words whole. The message's `overflow-wrap: anywhere` also shrinks a cell's minimum
|
|
489
|
+
width, so auto table layout squeezed the columns and split words ("directo|r"); `break-word` breaks a word only when
|
|
490
|
+
it alone is wider than its line and leaves the minimum at whole words, so a wide table overflows into its scrolling
|
|
491
|
+
wrapper instead. A column keeps at least 5em: CJK text can break between any two characters. */
|
|
492
|
+
.msg .md th, .msg .md td, .text-card .tc-table th, .text-card .tc-table td { overflow-wrap: break-word; word-break: normal; min-width: 5em; }
|
|
443
493
|
.msg .md .al-c { text-align: center; } .msg .md .al-r { text-align: right; }
|
|
444
494
|
.msg .md h3, .msg .md h4, .msg .md h5, .msg .md h6 { margin: var(--s-3) 0 var(--s-2); font-size: var(--fs-md); font-weight: var(--fw-semibold); }
|
|
445
495
|
.msg .md .tk-k { color: var(--tk-k); } .msg .md .tk-s { color: var(--tk-s); } .msg .md .tk-n { color: var(--tk-n); } .msg .md .tk-c { color: var(--tk-c); font-style: italic; }
|
|
@@ -472,6 +522,20 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
472
522
|
CSSOM), a full-screen sheet on a narrow one. The frame is the card's (preview.js), sized by the panel here. */
|
|
473
523
|
.chat-split { flex: 1; min-height: 0; display: flex; }
|
|
474
524
|
.chat-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
525
|
+
/* #1629: an agent's theme on its own chat surface — custom properties set on .p-chat through the CSSOM, choices as
|
|
526
|
+
these tokens. The surface paints its own background (the page's body is not its). */
|
|
527
|
+
.p-chat.th { background: var(--bg); color: var(--text); }
|
|
528
|
+
.p-chat.th .msg.user .body { border-radius: var(--bubble-radius, var(--r-xl)); }
|
|
529
|
+
.p-chat.th-font-system .thread, .p-chat.th-font-system .composer textarea { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; }
|
|
530
|
+
.p-chat.th-font-mono .thread, .p-chat.th-font-mono .composer textarea { font-family: var(--font-mono); }
|
|
531
|
+
.p-chat.th-bubble-thin .msg.user .body { box-shadow: inset 0 0 0 1px var(--border); }
|
|
532
|
+
.p-chat.th-bubble-accent .msg.user .body { box-shadow: inset 0 0 0 1px var(--accent); }
|
|
533
|
+
.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); }
|
|
534
|
+
.chat-main.has-th-bg { position: relative; }
|
|
535
|
+
.chat-main.has-th-bg > :not(.th-bg) { position: relative; z-index: 1; }
|
|
536
|
+
.th-bg { position: absolute; inset: 0; width: 100%; height: 100%; opacity: var(--th-bg-opacity, 1); pointer-events: none; z-index: 0; user-select: none; }
|
|
537
|
+
.th-bg-cover { object-fit: cover; }
|
|
538
|
+
.th-bg-contain { object-fit: contain; }
|
|
475
539
|
.pv-divider { flex: 0 0 8px; cursor: col-resize; background: var(--bg); border-left: 1px solid var(--border); touch-action: none; position: relative; }
|
|
476
540
|
.pv-divider::after { content: ""; position: absolute; top: 50%; left: 2px; width: 3px; height: 32px; margin-top: -16px; border-radius: 2px; background: var(--border-strong); }
|
|
477
541
|
.pv-divider:hover::after, .pv-divider:focus-visible::after, .chat-split.resizing .pv-divider::after { background: var(--accent); }
|
|
@@ -516,6 +580,10 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
516
580
|
.rb-btn { max-width: 100%; white-space: normal; text-align: left; }
|
|
517
581
|
.rb-btn.chosen, .rb-btn.chosen:disabled { border-color: var(--ok); color: var(--text); background: color-mix(in srgb, var(--ok) 14%, transparent); font-weight: var(--fw-semibold); opacity: 1; }
|
|
518
582
|
.rb-btn:disabled:not(.chosen) { opacity: 0.55; }
|
|
583
|
+
/* #1823: a poll — its closed buttons show the tally, so they stay readable; the time left keeps its width. */
|
|
584
|
+
.rb-row.poll .rb-btn:disabled { opacity: 0.85; }
|
|
585
|
+
.rb-row.poll .poll-left { font-variant-numeric: tabular-nums; }
|
|
586
|
+
.poll-voters { margin: var(--s-1) 0 0; padding-left: var(--s-4); color: var(--text-2); font-size: var(--fs-sm); }
|
|
519
587
|
.rb-note { font-size: var(--fs-xs); color: var(--text-3); }
|
|
520
588
|
.pv-menu { position: relative; }
|
|
521
589
|
.pv-menu > summary { list-style: none; cursor: pointer; padding: 2px var(--s-2); border-radius: var(--r-sm); color: var(--text-3); }
|
|
@@ -534,6 +602,9 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
534
602
|
.prompt { padding: var(--s-3) var(--s-4); border-radius: var(--r-md); font-size: var(--fs-sm); background: var(--warn-bg); border: 1px solid var(--warn-line); }
|
|
535
603
|
.prompt.done { background: transparent; border-style: dashed; color: var(--text-2); }
|
|
536
604
|
.prompt .txt { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
605
|
+
/* #1990: a name in a status line or a prompt that opens that instance in the app. */
|
|
606
|
+
.st-link { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
|
|
607
|
+
.st-link:hover { text-decoration-thickness: 2px; }
|
|
537
608
|
.prompt .acts { display: flex; gap: var(--s-2); margin-top: var(--s-2); align-items: center; flex-wrap: wrap; }
|
|
538
609
|
.prompt .wait { font-size: var(--fs-xs); color: var(--text-3); }
|
|
539
610
|
.work-bar { display: flex; gap: var(--s-2); align-items: center; padding: 0 var(--s-2); font-size: var(--fs-sm); color: var(--text-2); }
|
|
@@ -577,6 +648,58 @@ html.lb-open .scroller { overflow: hidden; }
|
|
|
577
648
|
.drop-card { display: flex; flex-direction: column; align-items: center; gap: var(--s-2); color: var(--accent); font-weight: var(--fw-semibold); }
|
|
578
649
|
|
|
579
650
|
/* ── Toasts ── */
|
|
651
|
+
/* #1629 r4 §3: Settings → Appearance (owner CSS). */
|
|
652
|
+
.s-css-text, .s-widget-text { font-family: var(--font-mono); font-size: var(--fs-sm); width: 100%; min-height: 12rem; resize: vertical; tab-size: 2; }
|
|
653
|
+
.s-widget-preview { max-width: 320px; }
|
|
654
|
+
/* #1629 r4-5: Settings → Appearance → Mods — the plan is shown in full before anything is applied. */
|
|
655
|
+
.s-mod-plan { display: flex; flex-direction: column; gap: var(--s-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--s-3); }
|
|
656
|
+
.s-mod-plan h4 { font-size: var(--fs-lg); font-weight: var(--fw-semibold); overflow-wrap: anywhere; }
|
|
657
|
+
.s-mod-plan h4 .muted { font-size: var(--fs-sm); font-weight: var(--fw-regular); }
|
|
658
|
+
.s-mod-items { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-3); }
|
|
659
|
+
.s-mod-item { display: flex; flex-direction: column; gap: var(--s-1); }
|
|
660
|
+
.s-mod-detail { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); padding-left: 1.75rem; color: var(--text-2); font-size: var(--fs-sm); min-width: 0; }
|
|
661
|
+
.s-mod-widget { display: block; max-width: min(360px, 100%); }
|
|
662
|
+
.s-mod-theme { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; width: 100%; }
|
|
663
|
+
.s-mod-kv { display: flex; gap: var(--s-2); align-items: baseline; flex-wrap: wrap; min-width: 0; }
|
|
664
|
+
.s-mod-kv .k { color: var(--text-3); font-size: var(--fs-xs); min-width: 9em; }
|
|
665
|
+
.s-mod-kv .v { color: var(--text); min-width: 0; overflow-wrap: anywhere; }
|
|
666
|
+
.s-mod-sws { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); }
|
|
667
|
+
.s-mod-sw { display: inline-flex; align-items: center; gap: var(--s-1); }
|
|
668
|
+
.s-mod-sw-chip { display: inline-block; width: 12px; height: 12px; border-radius: 3px; border: 1px solid var(--border-strong); background: var(--sw, transparent); }
|
|
669
|
+
.s-mod-pic { display: inline-flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
670
|
+
.s-mod-pic img { width: 64px; height: 40px; object-fit: cover; border-radius: var(--r-sm); border: 1px solid var(--border); }
|
|
671
|
+
.s-mod-raw summary { cursor: pointer; font-size: var(--fs-xs); color: var(--text-2); }
|
|
672
|
+
.s-mod-widget .aw-chat_header { border-width: 1px; border-radius: var(--r-md); }
|
|
673
|
+
.s-mod-text { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
674
|
+
.s-mod-warn { color: var(--warn); font-size: var(--fs-sm); padding-left: 1.75rem; }
|
|
675
|
+
.s-mod-css-text { margin: 0 0 0 1.75rem; max-height: 240px; overflow: auto; padding: var(--s-2); border-radius: var(--r-sm); background: var(--code-bg); font-family: var(--font-mono); font-size: var(--fs-xs); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
676
|
+
.s-mod-err { white-space: pre-line; }
|
|
677
|
+
.s-mod-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
678
|
+
.s-mod-list li { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; min-width: 0; }
|
|
679
|
+
.s-mod-list .grow { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
680
|
+
.s-mod-proposals { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
681
|
+
.s-mod-proposals h4 { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-2); }
|
|
682
|
+
.s-mod-export summary { cursor: pointer; font-weight: var(--fw-medium); }
|
|
683
|
+
.s-mod-export[open] { display: flex; flex-direction: column; gap: var(--s-2); }
|
|
684
|
+
.s-mod-boxes { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-4); }
|
|
685
|
+
.s-css-actions, .s-widget-actions { display: flex; gap: var(--s-2); flex-wrap: wrap; }
|
|
686
|
+
.s-css-status { margin: 0; font-size: var(--fs-sm); color: var(--text-2); }
|
|
687
|
+
.s-css-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--s-2); }
|
|
688
|
+
.s-css-list li { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; min-width: 0; }
|
|
689
|
+
.s-css-list code { overflow-wrap: anywhere; }
|
|
690
|
+
.s-owner-css h4 { margin: var(--s-2) 0 0; font-size: var(--fs-sm); }
|
|
691
|
+
/* #1629 r4 §3: keep-or-revert after saving custom CSS — on every page, above everything but dialogs' scrim. */
|
|
692
|
+
.oc-keep { position: fixed; top: var(--s-3); left: 50%; transform: translateX(-50%); z-index: 120; display: flex; align-items: center; gap: var(--s-2);
|
|
693
|
+
flex-wrap: wrap; max-width: calc(100vw - 32px); padding: var(--s-2) var(--s-3); border-radius: var(--r-md); background: var(--surface);
|
|
694
|
+
color: var(--text-1); border: 1px solid var(--border); box-shadow: var(--shadow-2); font-size: var(--fs-sm); }
|
|
695
|
+
.oc-keep-text { display: inline-flex; align-items: baseline; gap: var(--s-2); min-width: 0; }
|
|
696
|
+
.oc-keep-q { font-weight: var(--fw-medium); }
|
|
697
|
+
.oc-keep-left { color: var(--text-3); font-variant-numeric: tabular-nums; }
|
|
698
|
+
/* A phone: one row across the top — the question over the seconds left, then Keep and Revert. */
|
|
699
|
+
@media (max-width: 479px) {
|
|
700
|
+
.oc-keep { left: var(--s-2); right: var(--s-2); transform: none; max-width: none; flex-wrap: nowrap; }
|
|
701
|
+
.oc-keep-text { flex: 1; flex-direction: column; align-items: flex-start; gap: 0; }
|
|
702
|
+
}
|
|
580
703
|
.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; }
|
|
581
704
|
.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); }
|
|
582
705
|
.toast.err { background: var(--danger-fill); color: var(--on-danger); }
|
|
@@ -704,7 +827,15 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
704
827
|
.nav-chip { display: flex; align-items: center; gap: var(--s-2); cursor: pointer; color: var(--text); }
|
|
705
828
|
.nav-facet-reset { font-size: var(--fs-xs); }
|
|
706
829
|
|
|
707
|
-
|
|
830
|
+
/* One gap on every page (View's, #1448): the header's controls are the same size on every tab. */
|
|
831
|
+
.panel-actions .btn { gap: var(--s-1); }
|
|
832
|
+
/* Aa's names share one cell, only the current one shown: the button is as wide as its widest name on every page. */
|
|
833
|
+
.hd-text-names { display: inline-grid; }
|
|
834
|
+
.hd-text-names > span { grid-area: 1 / 1; visibility: hidden; }
|
|
835
|
+
.hd-text-names > .on { visibility: visible; }
|
|
836
|
+
.hd-slot { visibility: hidden; pointer-events: none; }
|
|
837
|
+
/* #1844 Fleet overview → Docs: the arrow says "opens a new tab". */
|
|
838
|
+
.hd-docs .hd-ext { color: var(--text-3); }
|
|
708
839
|
.v-term { flex: 1; min-height: 0; overflow: auto; scrollbar-gutter: stable; padding: 5px 6px; background: #000000; position: relative; }
|
|
709
840
|
.v-pre { margin: 0; min-width: 100%; min-height: 100%; font-family: var(--font-mono); line-height: 1.2; white-space: pre; color: #d0d0d0; }
|
|
710
841
|
.v-pre .ansi[data-b] { font-weight: var(--fw-bold); }
|
|
@@ -1041,6 +1172,7 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1041
1172
|
.cmd-head { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); }
|
|
1042
1173
|
.cmd-name { font-weight: var(--fw-semibold); }
|
|
1043
1174
|
.cmd-text { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font-family: var(--font-ui); color: var(--text-2); }
|
|
1175
|
+
.cmd-phase { color: var(--text); font-weight: var(--fw-semibold); }
|
|
1044
1176
|
.cmd-choices { display: flex; flex-wrap: wrap; gap: var(--s-1); max-height: 180px; overflow-y: auto; }
|
|
1045
1177
|
.cmd-choices .btn.current { border-color: var(--accent); color: var(--accent); }
|
|
1046
1178
|
.quick-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin-bottom: var(--s-2); font-size: var(--fs-xs); color: var(--text-2); }
|
|
@@ -1057,3 +1189,126 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1057
1189
|
/* #1682: a mention, as Discord draws one — accent text on a tint of it; the id (or the Telegram handle) on hover. */
|
|
1058
1190
|
.md .mention { display: inline; padding: 0 0.2em; border-radius: var(--r-sm); color: var(--accent); background: var(--accent-dim);
|
|
1059
1191
|
font-weight: var(--fw-medium); white-space: nowrap; }
|
|
1192
|
+
|
|
1193
|
+
/* #1629 r4 §1 / r4.1 Q3 (a): the identity card (identity-card.js). The size is a class token; its heights are here
|
|
1194
|
+
(S 160 / M 240 / L 360 px, on a phone 120 / 180 / 240); the banner scales with the portrait. Never a style attribute. */
|
|
1195
|
+
.id-card { --id-h: 240px; margin: 0 0 var(--s-4); border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface); overflow: hidden; }
|
|
1196
|
+
.id-card.card-s { --id-h: 160px; }
|
|
1197
|
+
.id-card.card-l { --id-h: 360px; }
|
|
1198
|
+
.id-card.card-c { --id-h: 96px; margin: 0; border: 0; border-radius: 0; background: none; }
|
|
1199
|
+
.id-banner { display: block; width: 100%; height: calc(var(--id-h) / 2); object-fit: cover; }
|
|
1200
|
+
.id-row { display: flex; align-items: flex-start; gap: var(--s-3); padding: var(--s-3) var(--s-4); }
|
|
1201
|
+
.id-portrait { display: block; flex-shrink: 0; height: var(--id-h); width: auto; max-width: min(calc(var(--id-h) * 0.75), 100%); object-fit: cover; border-radius: var(--r-sm); }
|
|
1202
|
+
.id-text { flex: 1; min-width: 0; }
|
|
1203
|
+
.id-tagline { margin: 0 0 var(--s-1); font-weight: var(--fw-semibold); overflow-wrap: anywhere; }
|
|
1204
|
+
.id-bio { margin: 0; color: var(--text-2); white-space: pre-line; overflow-wrap: anywhere; }
|
|
1205
|
+
.card-size { display: flex; flex-shrink: 0; gap: var(--s-1); }
|
|
1206
|
+
.card-size .seg-item { min-height: 28px; padding: 0 var(--s-2); border: 1px solid transparent; background: none; font: inherit; font-size: var(--fs-xs); cursor: pointer; }
|
|
1207
|
+
.card-size .seg-item.active { border-color: var(--accent); background: var(--accent-dim); color: var(--text); }
|
|
1208
|
+
.chat-card { flex-shrink: 0; border-bottom: 1px solid var(--border); }
|
|
1209
|
+
/* #1629 r4-4: widgets — the page's own components, from a declarative spec (agent-widget.js). The host draws the 1px
|
|
1210
|
+
frame and the ✦ chip, outside anything the spec chooses; nothing in a widget takes a click or focus. Colours are the
|
|
1211
|
+
theme's tokens (an agent's chat header sits inside its themed chat), so a person's own CSS can restyle them too. */
|
|
1212
|
+
.aw { border: 1px dashed var(--border-strong); border-radius: var(--r-md); padding: var(--s-2) var(--s-3); display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; overflow: clip; user-select: text; }
|
|
1213
|
+
.aw-head { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
|
|
1214
|
+
.aw-chip { font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--accent); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
1215
|
+
.aw-by { font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; }
|
|
1216
|
+
.aw-items { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
|
|
1217
|
+
.aw-item { display: flex; align-items: center; gap: var(--s-2); min-width: 0; font-size: var(--fs-sm); }
|
|
1218
|
+
.aw-label { color: var(--text-2); font-size: var(--fs-xs); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 1; min-width: 0; }
|
|
1219
|
+
.aw-value { color: var(--text); font-weight: var(--fw-medium); overflow-wrap: anywhere; min-width: 0; }
|
|
1220
|
+
.aw-stat .aw-value { margin-left: auto; font-variant-numeric: tabular-nums; }
|
|
1221
|
+
.aw-unit { margin-left: 2px; color: var(--text-2); font-weight: var(--fw-regular); }
|
|
1222
|
+
.aw-text .aw-value { font-weight: var(--fw-regular); }
|
|
1223
|
+
.aw-bar { flex: 1; min-width: 48px; height: 6px; appearance: none; border: 0; border-radius: var(--r-full); background: var(--surface-2); overflow: hidden; }
|
|
1224
|
+
.aw-bar::-webkit-progress-bar { background: var(--surface-2); border-radius: var(--r-full); }
|
|
1225
|
+
.aw-bar::-webkit-progress-value { background: var(--accent); border-radius: var(--r-full); }
|
|
1226
|
+
.aw-bar::-moz-progress-bar { background: var(--accent); border-radius: var(--r-full); }
|
|
1227
|
+
.aw-progress .aw-value { margin-left: auto; font-size: var(--fs-xs); font-variant-numeric: tabular-nums; min-width: 3.5em; text-align: right; }
|
|
1228
|
+
.aw-list { flex-direction: column; align-items: stretch; gap: var(--s-1); }
|
|
1229
|
+
.aw-list ul { margin: 0; padding-left: 1.2em; display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
|
|
1230
|
+
.aw-badge { display: inline-block; padding: 1px var(--s-2); border-radius: var(--r-full); font-size: var(--fs-xs); font-weight: var(--fw-medium); white-space: nowrap; background: var(--surface-2); color: var(--text-2); }
|
|
1231
|
+
.aw-tone-ok { background: var(--ok-bg); color: var(--ok); }
|
|
1232
|
+
.aw-tone-warn { background: var(--warn-bg); color: var(--warn); }
|
|
1233
|
+
.aw-tone-bad { background: var(--danger-bg); color: var(--danger); }
|
|
1234
|
+
.aw-tone-info { background: var(--accent-dim); color: var(--accent); }
|
|
1235
|
+
.aw-spark { flex: 1; min-width: 48px; height: 24px; }
|
|
1236
|
+
.aw-spark polyline { fill: none; stroke: var(--accent); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
|
|
1237
|
+
.aw-spark-item .aw-value { font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
1238
|
+
/* The chat header strip: one compact row under the card, in that agent's chat only. When it is wider than the chat (a
|
|
1239
|
+
phone), the row scrolls sideways inside its own box — never wraps out of it, never cuts an item. */
|
|
1240
|
+
.aw-chat_header { flex-shrink: 0; flex-direction: row; flex-wrap: nowrap; align-items: center; gap: var(--s-4); border-width: 0 0 1px; border-radius: 0; padding: var(--s-1) var(--s-4); min-height: 32px; max-height: 72px; overflow-x: auto; overflow-y: hidden; overscroll-behavior-x: contain; }
|
|
1241
|
+
.aw-chat_header .aw-head { flex-shrink: 0; }
|
|
1242
|
+
.aw-chat_header .aw-items { flex-direction: row; flex: 1 0 auto; gap: var(--s-4); }
|
|
1243
|
+
.aw-chat_header .aw-item { flex: 0 0 auto; white-space: nowrap; }
|
|
1244
|
+
.aw-chat_header .aw-value { white-space: nowrap; }
|
|
1245
|
+
.aw-chat_header .aw-text .aw-value { display: inline-block; max-width: 24em; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; }
|
|
1246
|
+
.aw-chat_header .aw-stat .aw-value { margin-left: 0; }
|
|
1247
|
+
.aw-chat_header .aw-bar { flex: 0 0 auto; width: 96px; }
|
|
1248
|
+
/* On a phone the strip may run past the edge: a fade says there is more to scroll to (the last item scrolls clear of it). */
|
|
1249
|
+
@media (max-width: 899px) { .aw-chat_header { padding-right: var(--s-7); -webkit-mask-image: linear-gradient(to right, #000 calc(100% - var(--s-7)), transparent); mask-image: linear-gradient(to right, #000 calc(100% - var(--s-7)), transparent); } }
|
|
1250
|
+
.aw-details { background: var(--surface); margin-bottom: var(--s-4); padding: var(--s-4) var(--s-5); }
|
|
1251
|
+
.side-widget { padding: 0 var(--s-3) var(--s-2); }
|
|
1252
|
+
.aw-sidebar { max-height: 240px; overflow: auto; }
|
|
1253
|
+
|
|
1254
|
+
.chat-card-toggle { display: flex; align-items: center; gap: var(--s-2); width: 100%; min-height: 32px; padding: 0 var(--s-4); border: 0; background: none; color: var(--text-2); font: inherit; font-size: var(--fs-xs); text-align: left; cursor: pointer; }
|
|
1255
|
+
.chat-card-peek { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); }
|
|
1256
|
+
@media (max-width: 479px) {
|
|
1257
|
+
.id-card.card-s { --id-h: 120px; }
|
|
1258
|
+
.id-card.card-m { --id-h: 180px; }
|
|
1259
|
+
.id-card.card-l { --id-h: 240px; }
|
|
1260
|
+
.id-row { flex-wrap: wrap; }
|
|
1261
|
+
.id-text { flex-basis: 100%; }
|
|
1262
|
+
}
|
|
1263
|
+
/* #1629 r4 §1: the card in View (above the profile row) and its part of Edit profile. */
|
|
1264
|
+
.v-id { flex-shrink: 0; padding: var(--s-2) var(--s-4) 0; background: var(--bg); }
|
|
1265
|
+
.v-id .id-card { margin: 0; }
|
|
1266
|
+
.form-sub { margin: var(--s-2) 0 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
|
|
1267
|
+
/* #1629 r4.1 Q3 (b): Settings → Appearance, the card's upload limits (three to a row; one on a phone). */
|
|
1268
|
+
.grid3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-3) var(--s-4); margin-bottom: var(--s-3); }
|
|
1269
|
+
.s-limit-warnings { margin: var(--s-2) 0; padding-left: var(--s-4); }
|
|
1270
|
+
@media (max-width: 479px) { .grid3 { grid-template-columns: minmax(0, 1fr); } }
|
|
1271
|
+
|
|
1272
|
+
/* #1629 B2: effect library controls. No runtime layer is created by this card. */
|
|
1273
|
+
.s-fx-actions { display: flex; flex-wrap: wrap; gap: var(--s-2); align-items: center; }
|
|
1274
|
+
.s-fx-item { margin-top: var(--s-3); padding-top: var(--s-3); border-top: 1px solid var(--border); }
|
|
1275
|
+
.s-fx-item h4 { margin: 0; }
|
|
1276
|
+
.s-fx-poster { display: block; max-width: min(240px, 100%); max-height: 160px; object-fit: contain; border-radius: var(--r-sm); }
|
|
1277
|
+
|
|
1278
|
+
.s-fx-chat, .s-fx-params label:not(.check) { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2); }
|
|
1279
|
+
.s-fx-chat { margin: var(--s-2) 0; }
|
|
1280
|
+
.s-fx-params { display: flex; flex-direction: column; gap: var(--s-2); margin: var(--s-2) 0; max-width: 100%; }
|
|
1281
|
+
.s-fx-target, .s-fx-params input:not([type=checkbox]), .s-fx-params select { min-height: 36px; min-width: 0; max-width: 100%; padding: 0 var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg); color: var(--text); }
|
|
1282
|
+
|
|
1283
|
+
/* #1629: stock paint bands. Structural ancestors remain neutral; only bounded content owns level 1.
|
|
1284
|
+
The viewport effect root is a direct body sibling: behind 0 / stock content 1 (header 2) / front 20.
|
|
1285
|
+
Nested menus cannot cross a content stacking context: the unmounted trust guard suspends fronts for overlays. */
|
|
1286
|
+
.app-root { z-index: auto; }
|
|
1287
|
+
.conn, .panel-head, .chat-card, .aw-chat_header, .chat-main > .scroller, .chat-main > .dock,
|
|
1288
|
+
.sidebar > .side-head, .sidebar > .side-nav, .sidebar > .side-section, .sidebar > .side-widget, .sidebar > .side-foot,
|
|
1289
|
+
.u-rail > .u-rail-head, .u-rail > .u-rail-body { position: relative; z-index: 1; }
|
|
1290
|
+
/* Header menus must stay above the later scroller stacking context. */
|
|
1291
|
+
.panel-head { z-index: 2; }
|
|
1292
|
+
@media (min-width: 900px) { .chat-split > .pv-divider, .chat-split > .pv-panel { position: relative; z-index: 1; } }
|
|
1293
|
+
/* #1629: owner choices share the existing control font floor. */
|
|
1294
|
+
.s-fx-owner{margin-top:var(--s-4);padding-top:var(--s-3);border-top:1px solid var(--border)}
|
|
1295
|
+
.s-fx-owner-row{display:flex;align-items:end;flex-wrap:wrap;gap:var(--s-2);margin-top:var(--s-2)}
|
|
1296
|
+
.s-fx-owner-row>label{display:flex;flex-direction:column;gap:var(--s-1);min-width:0;flex:1}
|
|
1297
|
+
|
|
1298
|
+
/* #1629: host-created static poster IMG; geometry and visibility belong to the trusted CSSOM binding. */
|
|
1299
|
+
.agend-effect-poster { object-fit: cover !important; object-position: center !important; user-select: none; }
|
|
1300
|
+
|
|
1301
|
+
/* #1629: full-app bounded stock surfaces. Panel roots stay neutral; effects never raise the whole app. */
|
|
1302
|
+
.p-fleet > .seg, .p-settings > .seg,
|
|
1303
|
+
.p-fleet > .panel-body, .p-needs > .panel-body, .p-settings > .panel-body,
|
|
1304
|
+
.p-log > .panel-body, .p-details > .panel-body, .p-view > .panel-body,
|
|
1305
|
+
.p-log > .log-bar, .p-view > .v-term, .p-view > .v-id, .p-view > .v-card { position: relative; z-index: 1; }
|
|
1306
|
+
/* Keep the existing Apply bar's sticky behavior, in its own bounded stock band. */
|
|
1307
|
+
.p-settings > .s-pending { z-index: 1; }
|
|
1308
|
+
|
|
1309
|
+
/* #1629: host-owned local Trial panel. Only its canvas frame lives inside the paint-contained stage. */
|
|
1310
|
+
.effect-trial-head, .effect-trial-controls, .effect-trial-note { position: relative; z-index: 1; background: var(--bg); padding: var(--s-3); margin: 0; }
|
|
1311
|
+
.effect-trial-head { display: flex; align-items: center; gap: var(--s-2); border-bottom: 1px solid var(--border); }
|
|
1312
|
+
.effect-trial-head > span { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
1313
|
+
.effect-trial-body { flex: 1; min-height: 0; display: flex; padding: var(--s-3); }
|
|
1314
|
+
.effect-trial-stage { position: relative; z-index: 0; flex: 1; min-width: 0; min-height: 0; contain: paint; overflow: clip; padding: 0; border: 0; outline: none; box-shadow: none; }
|
package/dist/ui/shared/app.js
CHANGED
|
@@ -18,6 +18,8 @@ import { startNeedsNotifier } from "./app-needs.js";
|
|
|
18
18
|
import { toast } from "./ui-toast.js";
|
|
19
19
|
import { t } from "./app-i18n.js";
|
|
20
20
|
import { initTextSize, initUsageRail } from "./header-tools.js";
|
|
21
|
+
import { installOwnerCss } from "./owner-css.js";
|
|
22
|
+
import { startThemes } from "./app-themes.js";
|
|
21
23
|
|
|
22
24
|
const boot = document.body.dataset;
|
|
23
25
|
// #1523 N3: this device's text size, on the root before the first paint of any panel.
|
|
@@ -89,6 +91,8 @@ if (mode === "full") {
|
|
|
89
91
|
startNeedsNotifier({ open: (instance) => navigate(chatPath(instance)) });
|
|
90
92
|
// #1665: this device's first upload of its own choices (once), then another device's changes at each status frame.
|
|
91
93
|
bootPrefs();
|
|
94
|
+
// #1629: agents' themes, read when the status frame's themes_rev moves.
|
|
95
|
+
startThemes();
|
|
92
96
|
onNewInstance = async () => {
|
|
93
97
|
closeDrawer(); // on a phone the dialog opens from the drawer: the drawer goes first
|
|
94
98
|
let m;
|
|
@@ -99,6 +103,8 @@ if (mode === "full") {
|
|
|
99
103
|
} else appStore.set({ connection: "none" });
|
|
100
104
|
|
|
101
105
|
startRouter(window);
|
|
106
|
+
// #1629 r4 §3: the person's owner CSS (full app only; never on Settings, in safe mode or where this device turned it off).
|
|
107
|
+
installOwnerCss();
|
|
102
108
|
// /ui on its own opens the chat this browser had open last (an unknown name shows the panel's "not found").
|
|
103
109
|
{
|
|
104
110
|
const r = navStore.get().route;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// #1629 r4 §1 / r4.1: the identity card's words (card.*), in English and zh-TW. Public (/assets/): View's anonymous
|
|
2
|
+
// reader sees a card too.
|
|
3
|
+
import { register } from "./app-i18n.js";
|
|
4
|
+
|
|
5
|
+
register("card", {
|
|
6
|
+
en: {
|
|
7
|
+
label: "Identity card of {0}",
|
|
8
|
+
portraitAlt: "{0}'s portrait",
|
|
9
|
+
size: "Card size",
|
|
10
|
+
sizeS: "S", sizeM: "M", sizeL: "L",
|
|
11
|
+
sizeSName: "Small", sizeMName: "Medium", sizeLName: "Large",
|
|
12
|
+
byHuman: "set by a person",
|
|
13
|
+
byAgent: "set by the agent",
|
|
14
|
+
show: "Show card",
|
|
15
|
+
hide: "Hide card",
|
|
16
|
+
},
|
|
17
|
+
"zh-TW": {
|
|
18
|
+
label: "{0} 的身分卡",
|
|
19
|
+
portraitAlt: "{0} 的肖像",
|
|
20
|
+
size: "卡片大小",
|
|
21
|
+
sizeS: "小", sizeM: "中", sizeL: "大",
|
|
22
|
+
sizeSName: "小", sizeMName: "中", sizeLName: "大",
|
|
23
|
+
byHuman: "由人設定",
|
|
24
|
+
byAgent: "由 agent 設定",
|
|
25
|
+
show: "顯示卡片",
|
|
26
|
+
hide: "隱藏卡片",
|
|
27
|
+
},
|
|
28
|
+
});
|