@zq-silk/yui 2.3.0 → 2.5.0
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 +15 -1
- package/dist/artifacts/artifactCapability.js +39 -10
- package/dist/artifacts/imageMetadata.js +120 -0
- package/dist/artifacts/managedGit.js +7 -4
- package/dist/artifacts/taskArtifactRepository.js +6 -0
- package/dist/cli/commandCatalog.js +18 -9
- package/dist/cli/invocationAuthority.js +1 -1
- package/dist/commands/executionAuditCommands.js +5 -0
- package/dist/commands/globalRoleCommands.js +41 -3
- package/dist/commands/projectCommands.js +89 -94
- package/dist/commands/roleSkillValidation.js +4 -8
- package/dist/commands/taskCommands.js +65 -14
- package/dist/commands/taskUsageCommand.js +38 -0
- package/dist/context/roleSessionContext.js +18 -2
- package/dist/context/runContextPack.js +5 -1
- package/dist/context/sessionBootstrapManifest.js +18 -3
- package/dist/context/skillCatalog.js +108 -0
- package/dist/context/skillPackage.js +161 -0
- package/dist/context/taskContext.js +3 -2
- package/dist/context/taskSearch.js +127 -0
- package/dist/controlPlaneCli.js +25 -20
- package/dist/controller/fileSchedulerStoreAdapter.js +39 -8
- package/dist/controller/globalInputDelivery.js +2 -4
- package/dist/controller/jobControl.js +2 -0
- package/dist/controller/nativeHostInput.js +37 -0
- package/dist/controller/providerRetryDelivery.js +4 -2
- package/dist/controller/runtime.js +93 -2
- package/dist/controller/runtimeEventInbox.js +2 -2
- package/dist/controller/runtimeEventProcessor.js +3 -3
- package/dist/doctor/doctor.js +10 -0
- package/dist/execution/reviewMainRun.js +1 -0
- package/dist/execution/workItemMainRun.js +1 -0
- package/dist/executor/agentAdapter.js +3 -5
- package/dist/executor/codexConfigConflict.js +6 -4
- package/dist/executor/effectiveLaunch.js +24 -1
- package/dist/executor/fileRoleLaunchPlanner.js +15 -7
- package/dist/integration/gitIntegrationService.js +7 -12
- package/dist/integration/integrationSourceApplication.js +4 -2
- package/dist/interaction/notificationPresentation.js +85 -0
- package/dist/interaction/operatorPresentation.js +1 -2
- package/dist/job/httpPreview.js +61 -0
- package/dist/job/jobRunner.js +12 -2
- package/dist/kernel/builtinCapabilities.js +3 -1
- package/dist/message/message.js +15 -1
- package/dist/output/rolePresentation.js +4 -1
- package/dist/repository/executionLaneGitSnapshot.js +2 -1
- package/dist/repository/gitCompatibility.js +62 -0
- package/dist/repository/gitWorkspace.js +48 -71
- package/dist/repository/gitWorktreeInventory.js +121 -0
- package/dist/repository/project.js +74 -25
- package/dist/resources/resourceDiscovery.js +2 -2
- package/dist/resources/resourceGc.js +7 -4
- package/dist/resources/resourceRegistrar.js +2 -1
- package/dist/runtime/agentEndpoint.js +8 -0
- package/dist/runtime/agentHost.js +170 -3
- package/dist/runtime/codexAppServerRuntime.js +1 -1
- package/dist/runtime/codexNativeAccess.js +175 -0
- package/dist/runtime/controlledCodexTui.js +116 -0
- package/dist/runtime/publicReply.js +23 -0
- package/dist/runtime/runtimeObservation.js +48 -0
- package/dist/runtime/structuredProviderHost.js +16 -7
- package/dist/runtime/taskCostMetrics.js +133 -0
- package/dist/runtime/taskUsageMetrics.js +11 -2
- package/dist/runtime/taskUsageQuery.js +38 -0
- package/dist/scheduler/leaderWakeupProcessor.js +1 -9
- package/dist/scheduler/taskExecutionProjection.js +2 -0
- package/dist/scheduler/taskObservabilityProjection.js +9 -1
- package/dist/storage/homeLayout.js +13 -0
- package/dist/storage/sqliteSchema.js +44 -0
- package/dist/storage/sqliteStore.js +53 -0
- package/dist/storage/storageVersions.js +1 -1
- package/dist/storage/storeRpc.js +2 -0
- package/dist/storage/taskSearch.js +35 -0
- package/dist/storage/upgrade/projectKnowledgeMigration.js +52 -0
- package/dist/task/ordinaryArchive.js +42 -0
- package/dist/tmux/tmuxManager.js +8 -8
- package/dist/web/assets/assetManifest.js +11 -51
- package/dist/web/assets/client/app/catalog.js +215 -0
- package/dist/web/assets/client/app/main.js +148 -0
- package/dist/web/assets/client/app/selection.js +139 -0
- package/dist/web/assets/client/app/settings.js +326 -0
- package/dist/web/assets/client/app/taskView.js +280 -0
- package/dist/web/assets/client/domain/context.js +96 -0
- package/dist/web/assets/client/domain/records.js +126 -0
- package/dist/web/assets/client/domain/runs.js +119 -0
- package/dist/web/assets/client/domain/taskForms.js +197 -0
- package/dist/web/assets/client/domain/vocab.js +69 -0
- package/dist/web/assets/client/domain/work.js +116 -0
- package/dist/web/assets/client/i18n/en.js +900 -0
- package/dist/web/assets/client/i18n/zh-CN.js +898 -0
- package/dist/web/assets/client/index.js +114 -0
- package/dist/web/assets/client/layout/resizer.js +37 -0
- package/dist/web/assets/client/layout/router.js +35 -0
- package/dist/web/assets/client/layout/shortcuts.js +45 -0
- package/dist/web/assets/client/layout/sizing.js +95 -0
- package/dist/web/assets/client/layout/workspace.js +247 -0
- package/dist/web/assets/client/{api.js → lib/api.js} +20 -4
- package/dist/web/assets/client/{dom.js → lib/dom.js} +24 -12
- package/dist/web/assets/client/{format.js → lib/format.js} +7 -0
- package/dist/web/assets/client/lib/i18n.js +54 -0
- package/dist/web/assets/client/lib/markdown.js +167 -0
- package/dist/web/assets/client/lib/prefs.js +28 -0
- package/dist/web/assets/client/lib/theme.js +68 -0
- package/dist/web/assets/client/ui/containers.js +101 -0
- package/dist/web/assets/client/ui/controls.js +51 -0
- package/dist/web/assets/client/ui/forms.js +48 -0
- package/dist/web/assets/client/ui/metrics.js +137 -0
- package/dist/web/assets/client/ui/primitives.js +92 -0
- package/dist/web/assets/client/ui/text.js +33 -0
- package/dist/web/assets/client/ui/toast.js +12 -0
- package/dist/web/assets/client/views/bodySearch.js +172 -0
- package/dist/web/assets/client/views/createTask.js +85 -0
- package/dist/web/assets/client/views/dock/conversation.js +612 -0
- package/dist/web/assets/client/views/dock/discussion.js +173 -0
- package/dist/web/assets/client/views/dock/preview.js +129 -0
- package/dist/web/assets/client/views/dock/terminal.js +199 -0
- package/dist/web/assets/client/views/globalInput.js +67 -0
- package/dist/web/assets/client/{overview.js → views/overview.js} +61 -51
- package/dist/web/assets/client/{sidebar.js → views/sidebar.js} +56 -62
- package/dist/web/assets/client/views/skills.js +152 -0
- package/dist/web/assets/client/views/task/actions.js +36 -0
- package/dist/web/assets/client/views/task/delivery.js +185 -0
- package/dist/web/assets/client/views/task/deliveryResults.js +159 -0
- package/dist/web/assets/client/views/task/files.js +272 -0
- package/dist/web/assets/client/views/task/observation.js +153 -0
- package/dist/web/assets/client/views/task/overview.js +161 -0
- package/dist/web/assets/client/views/task/page.js +131 -0
- package/dist/web/assets/client/views/task/records.js +163 -0
- package/dist/web/assets/client/views/task/runtime.js +130 -0
- package/dist/web/assets/client/views/task/timeline.js +190 -0
- package/dist/web/assets/shared/geometry.js +19 -0
- package/dist/web/assets/shared/taskTabs.js +8 -0
- package/dist/web/assets/shared/themes.js +93 -0
- package/dist/web/assets/shell/dialogs.js +63 -0
- package/dist/web/assets/shell/dock.js +40 -0
- package/dist/web/assets/shell/index.js +40 -0
- package/dist/web/assets/shell/settings.js +34 -0
- package/dist/web/assets/shell/sidebar.js +45 -0
- package/dist/web/assets/styles/index.js +41 -0
- package/dist/web/assets/styles/{responsive.js → layout/responsive.js} +10 -10
- package/dist/web/assets/styles/{layout.js → layout/workspace.js} +17 -24
- package/dist/web/assets/styles/markdown.js +22 -3
- package/dist/web/assets/styles/tokens.js +10 -63
- package/dist/web/assets/styles/ui/controls.js +76 -0
- package/dist/web/assets/styles/ui/forms.js +46 -0
- package/dist/web/assets/styles/ui/surfaces.js +122 -0
- package/dist/web/assets/styles/views/delivery.js +29 -0
- package/dist/web/assets/styles/views/dock.js +71 -0
- package/dist/web/assets/styles/views/page.js +32 -0
- package/dist/web/assets/styles/views/records.js +70 -0
- package/dist/web/assets/styles/views/settings.js +26 -0
- package/dist/web/assets/styles/views/sidebar.js +74 -0
- package/dist/web/assets/styles/views/task.js +80 -0
- package/dist/web/assets/styles/views/terminal.js +38 -0
- package/dist/web/taskPreviews.js +205 -0
- package/dist/web/tmuxWebTerminal.js +16 -9
- package/dist/web/webConversation.js +373 -0
- package/dist/web/webMaterials.js +155 -0
- package/dist/web/webServer.js +295 -18
- package/dist/web/webSettings.js +331 -0
- package/dist/web/webSkills.js +86 -0
- package/dist/web/webSnapshot.js +40 -8
- package/dist/web/webTaskSurface.js +106 -8
- package/dist/workspace/gitChangeSetCapture.js +3 -1
- package/docs/cli-information-contract.md +1 -1
- package/docs/cli-information-contract.zh-CN.md +1 -1
- package/docs/managed-turn-and-session-runtime.md +31 -0
- package/docs/managed-turn-and-session-runtime.zh-CN.md +22 -0
- package/docs/release-workflow.md +54 -0
- package/docs/release-workflow.zh-CN.md +39 -0
- package/docs/storage-baseline.md +38 -1
- package/docs/storage-baseline.zh-CN.md +22 -0
- package/docs/task-discovery.md +28 -0
- package/docs/testing/verification-levels.md +2 -2
- package/i18n/README.zh-CN.md +1 -1
- package/package.json +1 -1
- package/skills/yui-leader/SKILL.md +5 -4
- package/skills/yui-leader/references/execution.md +2 -1
- package/skills/yui-operator/SKILL.md +3 -0
- package/skills/yui-reviewer/SKILL.md +4 -2
- package/skills/yui-runtime/SKILL.md +43 -2
- package/skills/yui-worker/SKILL.md +3 -2
- package/dist/web/assets/client/app.js +0 -808
- package/dist/web/assets/client/components.js +0 -477
- package/dist/web/assets/client/detail.js +0 -379
- package/dist/web/assets/client/dock.js +0 -309
- package/dist/web/assets/client/evidence.js +0 -364
- package/dist/web/assets/client/forms.js +0 -230
- package/dist/web/assets/client/i18n.js +0 -1277
- package/dist/web/assets/client/markdown.js +0 -114
- package/dist/web/assets/client/records.js +0 -198
- package/dist/web/assets/client/sections.js +0 -349
- package/dist/web/assets/client/theme.js +0 -71
- package/dist/web/assets/shell.js +0 -161
- package/dist/web/assets/styles/components.js +0 -216
- package/dist/web/assets/styles/views.js +0 -309
- /package/dist/web/assets/{icons.js → shared/icons.js} +0 -0
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
export const THEME_SCRIPT = String.raw `
|
|
2
|
-
// Theme preference. "system" follows prefers-color-scheme and resolves to
|
|
3
|
-
// sumi (dark) or washi (light); the resolved name is stamped on <html> so the
|
|
4
|
-
// token blocks in styles/tokens.ts apply. To add a theme, append it here and
|
|
5
|
-
// add its token block.
|
|
6
|
-
import { h } from "/assets/js/dom.js";
|
|
7
|
-
|
|
8
|
-
export const THEMES = Object.freeze([
|
|
9
|
-
{ id: "system", swatch: ["#141518", "#fbfaf7", "#ff7a52"] },
|
|
10
|
-
{ id: "sumi", swatch: ["#0e0f11", "#191a1e", "#ff7a52"] },
|
|
11
|
-
{ id: "washi", swatch: ["#f4f2ed", "#ffffff", "#d24a26"] },
|
|
12
|
-
{ id: "ai", swatch: ["#0a0e1a", "#141a2e", "#8fa8ff"] }
|
|
13
|
-
]);
|
|
14
|
-
const IDS = THEMES.map(function (theme) { return theme.id; });
|
|
15
|
-
|
|
16
|
-
function storedPreference() {
|
|
17
|
-
try {
|
|
18
|
-
const saved = localStorage.getItem("yui.theme");
|
|
19
|
-
return IDS.includes(saved) ? saved : "system";
|
|
20
|
-
} catch { return "system"; }
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function createThemeController(container, t) {
|
|
24
|
-
const media = window.matchMedia("(prefers-color-scheme: light)");
|
|
25
|
-
let preference = storedPreference();
|
|
26
|
-
const listeners = new Set();
|
|
27
|
-
|
|
28
|
-
function resolved() {
|
|
29
|
-
return preference === "system" ? (media.matches ? "washi" : "sumi") : preference;
|
|
30
|
-
}
|
|
31
|
-
function apply() {
|
|
32
|
-
document.documentElement.dataset.theme = resolved();
|
|
33
|
-
if (container) container.querySelectorAll("[data-theme-option]").forEach(function (button) {
|
|
34
|
-
button.setAttribute("aria-pressed", String(button.dataset.themeOption === preference));
|
|
35
|
-
});
|
|
36
|
-
listeners.forEach(function (listener) { listener(resolved()); });
|
|
37
|
-
}
|
|
38
|
-
function render() {
|
|
39
|
-
if (!container) return;
|
|
40
|
-
container.replaceChildren.apply(container, THEMES.map(function (theme) {
|
|
41
|
-
const swatch = h("span.theme-swatch", { "aria-hidden": "true" },
|
|
42
|
-
theme.swatch.map(function (color, index) {
|
|
43
|
-
const part = h("i");
|
|
44
|
-
part.style.background = color;
|
|
45
|
-
part.dataset.part = String(index);
|
|
46
|
-
return part;
|
|
47
|
-
}));
|
|
48
|
-
return h("button.theme-option", {
|
|
49
|
-
type: "button",
|
|
50
|
-
dataset: { themeOption: theme.id },
|
|
51
|
-
onclick: function () { set(theme.id); }
|
|
52
|
-
}, swatch, h("span", null, t("theme." + theme.id)));
|
|
53
|
-
}));
|
|
54
|
-
apply();
|
|
55
|
-
}
|
|
56
|
-
function set(next) {
|
|
57
|
-
if (!IDS.includes(next)) return;
|
|
58
|
-
preference = next;
|
|
59
|
-
try { localStorage.setItem("yui.theme", next); } catch {}
|
|
60
|
-
apply();
|
|
61
|
-
}
|
|
62
|
-
media.addEventListener("change", function () { if (preference === "system") apply(); });
|
|
63
|
-
render();
|
|
64
|
-
return {
|
|
65
|
-
resolved: resolved,
|
|
66
|
-
render: render,
|
|
67
|
-
set: set,
|
|
68
|
-
subscribe: function (listener) { listeners.add(listener); }
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
`;
|
package/dist/web/assets/shell.js
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { iconSvg } from "./icons.js";
|
|
2
|
-
// Static application frame. Everything inside #detail, #task-list and the dock
|
|
3
|
-
// panes is rendered by the client modules; this file only fixes the regions
|
|
4
|
-
// and the controls whose identity must survive re-renders.
|
|
5
|
-
export const DASHBOARD_HTML = `<!doctype html>
|
|
6
|
-
<html lang="en" data-theme="sumi">
|
|
7
|
-
<head>
|
|
8
|
-
<meta charset="utf-8">
|
|
9
|
-
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
10
|
-
<meta name="color-scheme" content="dark light">
|
|
11
|
-
<meta name="yui-web-token" content="__YUI_WEB_TOKEN__">
|
|
12
|
-
<link rel="icon" href="data:,">
|
|
13
|
-
<title>Yui</title>
|
|
14
|
-
<link rel="preload" href="/assets/fonts/inter-500.woff2" as="font" type="font/woff2" crossorigin>
|
|
15
|
-
<link rel="preload" href="/assets/fonts/inter-600.woff2" as="font" type="font/woff2" crossorigin>
|
|
16
|
-
<link rel="stylesheet" href="/assets/css/fonts.css">
|
|
17
|
-
<link rel="stylesheet" href="/assets/css/tokens.css">
|
|
18
|
-
<link rel="stylesheet" href="/assets/css/base.css">
|
|
19
|
-
<link rel="stylesheet" href="/assets/css/layout.css">
|
|
20
|
-
<link rel="stylesheet" href="/assets/css/components.css">
|
|
21
|
-
<link rel="stylesheet" href="/assets/css/views.css">
|
|
22
|
-
<link rel="stylesheet" href="/assets/css/markdown.css">
|
|
23
|
-
<link rel="stylesheet" href="/assets/css/responsive.css">
|
|
24
|
-
<link rel="stylesheet" href="/assets/vendor/xterm.css">
|
|
25
|
-
</head>
|
|
26
|
-
<body>
|
|
27
|
-
<a class="skip-link" href="#center" data-i18n="a11y.skip">Skip to task details</a>
|
|
28
|
-
<div class="app">
|
|
29
|
-
<aside class="sidebar" aria-label="Tasks" data-i18n-aria-label="sidebar.label">
|
|
30
|
-
<header class="side-head">
|
|
31
|
-
<div class="brand">
|
|
32
|
-
<span class="brand-mark" aria-hidden="true">結</span>
|
|
33
|
-
<span class="brand-name">Yui</span>
|
|
34
|
-
</div>
|
|
35
|
-
<span class="sync" id="sync-state" title="Last sync" data-i18n-title="sync.label">
|
|
36
|
-
<i aria-hidden="true"></i><time id="last-sync">—</time>
|
|
37
|
-
</span>
|
|
38
|
-
<button id="refresh" class="icon-btn" type="button" aria-label="Refresh" data-i18n-aria-label="actions.refresh" title="Refresh · R">${iconSvg("refresh")}</button>
|
|
39
|
-
</header>
|
|
40
|
-
<label class="search-field">
|
|
41
|
-
${iconSvg("search")}
|
|
42
|
-
<span class="sr-only" data-i18n="search.label">Search tasks</span>
|
|
43
|
-
<input id="search" type="search" autocomplete="off" spellcheck="false" placeholder="Search tasks" data-i18n-placeholder="search.placeholder">
|
|
44
|
-
<kbd>/</kbd>
|
|
45
|
-
</label>
|
|
46
|
-
<div id="attention-bar" class="attention-bar" aria-live="polite"></div>
|
|
47
|
-
<div id="status-filters" class="status-tabs" role="group" aria-label="Filter by status" data-i18n-aria-label="filters.label"></div>
|
|
48
|
-
<div id="task-list" class="task-list" aria-label="Tasks" data-i18n-aria-label="sidebar.label" aria-live="polite"></div>
|
|
49
|
-
<div id="catalog-controls" class="pager" aria-live="polite">
|
|
50
|
-
<button id="catalog-reset" class="pager-btn" type="button" data-i18n="catalog.first">First page</button>
|
|
51
|
-
<span id="catalog-count" class="pager-count"></span>
|
|
52
|
-
<button id="catalog-next" class="pager-btn" type="button" data-i18n="catalog.next" disabled>Next page</button>
|
|
53
|
-
<button id="catalog-attention-reset" class="pager-clear" type="button" data-i18n="catalog.clearAttention" hidden>Clear attention filter</button>
|
|
54
|
-
</div>
|
|
55
|
-
<footer class="side-foot">
|
|
56
|
-
<button id="operator-terminal" class="foot-btn" type="button" title="Operator session · O">
|
|
57
|
-
${iconSvg("terminal")}<span data-i18n="actions.operator">Operator</span><kbd>O</kbd>
|
|
58
|
-
</button>
|
|
59
|
-
<button id="global-input-open" class="foot-btn" type="button" title="Global input" data-i18n-title="global.open">
|
|
60
|
-
${iconSvg("broadcast")}<span data-i18n="global.open">Global input</span>
|
|
61
|
-
</button>
|
|
62
|
-
<button id="settings-open" class="icon-btn" type="button" aria-label="Settings" data-i18n-aria-label="settings.title" title="Settings">${iconSvg("settings")}</button>
|
|
63
|
-
</footer>
|
|
64
|
-
</aside>
|
|
65
|
-
<div id="sidebar-divider" class="sidebar-divider" role="separator" tabindex="0" aria-orientation="vertical" aria-valuemin="240" aria-valuemax="560" aria-valuenow="264" aria-label="Resize task list" data-i18n-aria-label="sidebar.resize" title="Drag to resize · double-click to reset" data-i18n-title="sidebar.resizeHint"><span aria-hidden="true"></span></div>
|
|
66
|
-
<main id="center" class="center" tabindex="-1">
|
|
67
|
-
<div id="detail" class="detail"></div>
|
|
68
|
-
</main>
|
|
69
|
-
<div id="dock-divider" class="dock-divider" role="separator" tabindex="0" aria-orientation="vertical" aria-valuemin="320" aria-valuemax="720" aria-valuenow="440" aria-label="Resize session panel" data-i18n-aria-label="dock.resize" hidden><span aria-hidden="true"></span></div>
|
|
70
|
-
<aside id="dock" class="dock" aria-label="Session" data-i18n-aria-label="dock.label" hidden>
|
|
71
|
-
<header class="dock-head">
|
|
72
|
-
<div class="seg" role="tablist" aria-label="Session view" data-i18n-aria-label="dock.label">
|
|
73
|
-
<button id="dock-tab-discussion" class="seg-btn" type="button" role="tab" aria-selected="true" aria-controls="dock-discussion">${iconSvg("chat")}<span data-i18n="dock.discussion">Discussion</span></button>
|
|
74
|
-
<button id="dock-tab-session" class="seg-btn" type="button" role="tab" aria-selected="false" aria-controls="dock-session">${iconSvg("terminal")}<span data-i18n="dock.session">Live session</span></button>
|
|
75
|
-
</div>
|
|
76
|
-
<div class="dock-actions">
|
|
77
|
-
<button id="dock-swap" class="icon-btn" type="button" aria-label="Swap with task details" data-i18n-aria-label="dock.swap" title="Swap with task details">${iconSvg("swap")}</button>
|
|
78
|
-
<button id="dock-close" class="icon-btn" type="button" aria-label="Hide session panel" data-i18n-aria-label="dock.hide" title="Hide · D">${iconSvg("close")}</button>
|
|
79
|
-
</div>
|
|
80
|
-
</header>
|
|
81
|
-
<section id="dock-discussion" class="dock-pane dock-discussion" role="tabpanel" aria-labelledby="dock-tab-discussion"></section>
|
|
82
|
-
<section id="dock-session" class="dock-pane dock-session" role="tabpanel" aria-labelledby="dock-tab-session" hidden>
|
|
83
|
-
<div class="session-bar">
|
|
84
|
-
<div id="session-targets" class="session-targets" role="group" aria-label="Session target" data-i18n-aria-label="dock.target"></div>
|
|
85
|
-
<span id="terminal-state" class="conn" data-state="idle"><i aria-hidden="true"></i><span data-i18n="terminal.idle">Not connected</span></span>
|
|
86
|
-
</div>
|
|
87
|
-
<div id="terminal-host" class="terminal-host"></div>
|
|
88
|
-
<div id="terminal-empty" class="terminal-empty">
|
|
89
|
-
${iconSvg("terminal", "icon icon-xl")}
|
|
90
|
-
<p class="terminal-empty-title" data-i18n="terminal.emptyTitle">Attach to a native Session</p>
|
|
91
|
-
<p class="terminal-empty-text" data-i18n="terminal.emptyText">Pick a Role above. The panel shows the Session's current screen; attaching never starts or restarts an Agent.</p>
|
|
92
|
-
</div>
|
|
93
|
-
<footer class="session-foot">
|
|
94
|
-
<span data-i18n="terminal.cliHint">Full terminal</span>
|
|
95
|
-
<code id="terminal-cli">yui operator enter</code>
|
|
96
|
-
</footer>
|
|
97
|
-
</section>
|
|
98
|
-
</aside>
|
|
99
|
-
</div>
|
|
100
|
-
<dialog id="settings-dialog" class="dialog settings-dialog" aria-labelledby="settings-title">
|
|
101
|
-
<form method="dialog" class="dialog-body">
|
|
102
|
-
<header class="dialog-head">
|
|
103
|
-
<h2 id="settings-title" data-i18n="settings.title">Settings</h2>
|
|
104
|
-
<button class="icon-btn" value="close" aria-label="Close" data-i18n-aria-label="actions.close">${iconSvg("close")}</button>
|
|
105
|
-
</header>
|
|
106
|
-
<fieldset class="field">
|
|
107
|
-
<legend data-i18n="settings.theme">Theme</legend>
|
|
108
|
-
<div id="theme-options" class="theme-options"></div>
|
|
109
|
-
</fieldset>
|
|
110
|
-
<label class="field">
|
|
111
|
-
<span data-i18n="settings.language">Language</span>
|
|
112
|
-
<select id="locale-select">
|
|
113
|
-
<option value="en">English</option>
|
|
114
|
-
<option value="zh-CN">简体中文</option>
|
|
115
|
-
</select>
|
|
116
|
-
</label>
|
|
117
|
-
<div class="field">
|
|
118
|
-
<span data-i18n="settings.shortcuts">Keyboard</span>
|
|
119
|
-
<dl class="shortcut-list">
|
|
120
|
-
<dt><kbd>/</kbd></dt><dd data-i18n="shortcut.search">Search tasks</dd>
|
|
121
|
-
<dt><kbd>R</kbd></dt><dd data-i18n="shortcut.refresh">Refresh</dd>
|
|
122
|
-
<dt><kbd>D</kbd></dt><dd data-i18n="shortcut.dock">Show or hide the session panel</dd>
|
|
123
|
-
<dt><kbd>O</kbd></dt><dd data-i18n="shortcut.operator">Operator session</dd>
|
|
124
|
-
<dt><kbd>1</kbd>–<kbd>5</kbd></dt><dd data-i18n="shortcut.tabs">Switch task sections</dd>
|
|
125
|
-
<dt><kbd>Esc</kbd></dt><dd data-i18n="shortcut.escape">Close panel / leave task</dd>
|
|
126
|
-
</dl>
|
|
127
|
-
</div>
|
|
128
|
-
</form>
|
|
129
|
-
</dialog>
|
|
130
|
-
<dialog id="global-input-dialog" class="dialog" aria-labelledby="global-input-title">
|
|
131
|
-
<form id="global-input-form" class="dialog-body">
|
|
132
|
-
<header class="dialog-head">
|
|
133
|
-
<div>
|
|
134
|
-
<h2 id="global-input-title" data-i18n="global.title">Global Role input</h2>
|
|
135
|
-
<p class="dialog-sub" data-i18n="global.help">Queue is the default. A cancel request does not prove the Turn stopped.</p>
|
|
136
|
-
</div>
|
|
137
|
-
<button id="global-input-close" class="icon-btn" type="button" aria-label="Close" data-i18n-aria-label="actions.close">${iconSvg("close")}</button>
|
|
138
|
-
</header>
|
|
139
|
-
<div class="field-row">
|
|
140
|
-
<label class="field"><span data-i18n="global.role">Role</span><input id="global-input-role" value="operator" required pattern="[A-Za-z0-9_-]+"></label>
|
|
141
|
-
<label class="field"><span data-i18n="control.action">Action</span><select id="global-input-action">
|
|
142
|
-
<option value="queue" data-i18n="control.queue">Queue</option>
|
|
143
|
-
<option value="steer" data-i18n="control.steer">Steer</option>
|
|
144
|
-
<option value="interrupt" data-i18n="control.interrupt">Interrupt</option>
|
|
145
|
-
</select></label>
|
|
146
|
-
</div>
|
|
147
|
-
<label id="global-input-body-label" class="field"><span data-i18n="control.message">Message</span><textarea id="global-input-body" maxlength="8000" required rows="4"></textarea></label>
|
|
148
|
-
<label id="global-input-target-label" class="field" hidden><span data-i18n="control.expectedTurn">Expected current Turn</span><input id="global-input-target" class="mono"></label>
|
|
149
|
-
<label id="global-input-then-label" class="field" hidden><span data-i18n="control.then">Then-message reference</span><input id="global-input-then" class="mono"></label>
|
|
150
|
-
<div class="dialog-actions">
|
|
151
|
-
<button id="global-input-inspect" type="button" class="btn" data-i18n="global.inspect">Read state</button>
|
|
152
|
-
<button id="global-input-submit" type="submit" class="btn btn-primary" data-i18n="actions.submit">Submit</button>
|
|
153
|
-
</div>
|
|
154
|
-
<p id="global-input-receipt" role="status" class="receipt" data-i18n="receipt.notSubmitted">Not submitted</p>
|
|
155
|
-
<pre id="global-input-state" class="code-block" hidden></pre>
|
|
156
|
-
</form>
|
|
157
|
-
</dialog>
|
|
158
|
-
<div id="toast" class="toast" role="status" aria-live="polite"></div>
|
|
159
|
-
<script type="module" src="/assets/app.js"></script>
|
|
160
|
-
</body>
|
|
161
|
-
</html>`;
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* COMPONENTS — reusable controls and primitives: buttons, segmented
|
|
3
|
-
* controls, badges, dots, chips, cards, disclosures, key/value lists, empty
|
|
4
|
-
* states, metrics, dialogs and the toast. Colour comes only from tokens.
|
|
5
|
-
*
|
|
6
|
-
* Task and overview surfaces are one reading column of flat panels: a card
|
|
7
|
-
* head (icon tile, title, count, hint, actions) above a hairline, then the
|
|
8
|
-
* body. List cards divide their rows with hairlines instead of nesting boxes.
|
|
9
|
-
*/
|
|
10
|
-
export const COMPONENT_STYLES = `
|
|
11
|
-
/* Tones: one semantic colour per tone, used by dots, badges and signals */
|
|
12
|
-
.tone-info{--tone:var(--info);--tone-soft:var(--info-soft)}
|
|
13
|
-
.tone-ok{--tone:var(--ok);--tone-soft:var(--ok-soft)}
|
|
14
|
-
.tone-warn{--tone:var(--warn);--tone-soft:var(--warn-soft)}
|
|
15
|
-
.tone-bad{--tone:var(--bad);--tone-soft:var(--bad-soft)}
|
|
16
|
-
.tone-idle{--tone:var(--idle);--tone-soft:var(--idle-soft)}
|
|
17
|
-
.tone-accent{--tone:var(--accent);--tone-soft:var(--accent-soft)}
|
|
18
|
-
|
|
19
|
-
/* Buttons */
|
|
20
|
-
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 12px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface-2);color:var(--ink);font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background var(--t-fast),border-color var(--t-fast),color var(--t-fast),transform var(--t-fast)}
|
|
21
|
-
.btn:hover:not(:disabled){border-color:var(--line-3);background:var(--surface-3)}
|
|
22
|
-
.btn:active:not(:disabled){transform:translateY(1px)}
|
|
23
|
-
.btn:disabled{opacity:.45}
|
|
24
|
-
.btn .icon{width:15px;height:15px}
|
|
25
|
-
.btn-primary{background:var(--accent);border-color:transparent;color:var(--accent-ink);font-weight:600}
|
|
26
|
-
.btn-primary:hover:not(:disabled){background:var(--accent);border-color:transparent;filter:brightness(1.08)}
|
|
27
|
-
.btn-ghost{background:transparent;border-color:transparent;color:var(--ink-2)}
|
|
28
|
-
.btn-ghost:hover:not(:disabled){background:var(--surface-3);border-color:transparent;color:var(--ink)}
|
|
29
|
-
.btn-ghost[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent)}
|
|
30
|
-
.btn-link{height:auto;padding:2px 0;border:0;background:transparent;color:var(--accent);font-weight:500}
|
|
31
|
-
.btn-link:hover:not(:disabled){background:transparent;text-decoration:underline;text-underline-offset:3px}
|
|
32
|
-
.link-btn{justify-self:start;padding:0;border:0;background:none;color:var(--accent);font-size:var(--fs-xs);font-weight:500}
|
|
33
|
-
.link-btn:hover{text-decoration:underline;text-underline-offset:3px}
|
|
34
|
-
.icon-btn{display:inline-grid;place-items:center;width:32px;height:32px;flex:none;padding:0;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink-3);transition:background var(--t-fast),color var(--t-fast)}
|
|
35
|
-
.icon-btn:hover:not(:disabled){background:var(--surface-3);color:var(--ink)}
|
|
36
|
-
.icon-btn[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent)}
|
|
37
|
-
.icon-btn:disabled{opacity:.4}
|
|
38
|
-
.icon-btn .icon{width:17px;height:17px}
|
|
39
|
-
|
|
40
|
-
/* Segmented control */
|
|
41
|
-
.seg{display:inline-flex;gap:2px;padding:3px;border-radius:var(--r-md);background:var(--sunken);border:1px solid var(--line)}
|
|
42
|
-
.seg-btn{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink-3);font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background var(--t-fast),color var(--t-fast),box-shadow var(--t-fast)}
|
|
43
|
-
.seg-btn:hover:not(:disabled){color:var(--ink)}
|
|
44
|
-
.seg-btn[aria-selected="true"],.seg-btn[aria-checked="true"]{background:var(--surface-2);color:var(--ink);box-shadow:var(--shadow-1),0 0 0 1px var(--line-2)}
|
|
45
|
-
.seg-btn:disabled{opacity:.4}
|
|
46
|
-
.seg-btn .icon{width:15px;height:15px}
|
|
47
|
-
.seg-sm .seg-btn{height:24px;padding:0 9px;font-size:var(--fs-xs)}
|
|
48
|
-
|
|
49
|
-
/* Badges, dots, chips */
|
|
50
|
-
.badge{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 8px;border-radius:var(--r-pill);background:var(--tone-soft,var(--idle-soft));color:var(--tone,var(--ink-2));font-size:var(--fs-xs);font-weight:600;white-space:nowrap;line-height:1}
|
|
51
|
-
.badge-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
|
|
52
|
-
.dot{display:inline-block;width:8px;height:8px;flex:none;border-radius:50%;background:var(--tone,var(--idle));box-shadow:0 0 0 3px var(--tone-soft,transparent)}
|
|
53
|
-
.chip{display:inline-flex;align-items:center;height:20px;padding:0 7px;border-radius:var(--r-xs);background:var(--surface-3);color:var(--ink-2);font-size:var(--fs-2xs);font-weight:500;white-space:nowrap}
|
|
54
|
-
.chip-strong{color:var(--ink);background:var(--line-2)}
|
|
55
|
-
.chip-row{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px}
|
|
56
|
-
code.id{padding:1px 6px;border-radius:var(--r-xs);background:var(--surface-3);color:var(--ink-2);font-size:var(--fs-2xs);white-space:nowrap}
|
|
57
|
-
.when{color:var(--ink-3);font-size:var(--fs-xs);white-space:nowrap}
|
|
58
|
-
.count{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:var(--r-pill);background:var(--surface-3);color:var(--ink-3);font-size:10.5px;font-weight:600;line-height:1}
|
|
59
|
-
.spacer{flex:1}
|
|
60
|
-
.small{font-size:var(--fs-xs)}
|
|
61
|
-
.mono-line{font-family:var(--font-mono);font-size:var(--fs-2xs);overflow-wrap:anywhere}
|
|
62
|
-
|
|
63
|
-
/* Chip tabs (local filters) */
|
|
64
|
-
.chip-tabs{display:flex;flex-wrap:wrap;gap:6px}
|
|
65
|
-
.chip-tab{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;border:1px solid var(--line-2);border-radius:var(--r-pill);background:transparent;color:var(--ink-3);font-size:var(--fs-xs);font-weight:500}
|
|
66
|
-
.chip-tab:hover{color:var(--ink);border-color:var(--line-3)}
|
|
67
|
-
.chip-tab[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);color:var(--canvas)}
|
|
68
|
-
.chip-tab[aria-pressed="true"] .count{background:rgba(127,127,127,.25);color:inherit}
|
|
69
|
-
|
|
70
|
-
/* Cards: flat panels. Actions sit beside the heading and wrap below it when
|
|
71
|
-
the column is too narrow for both. */
|
|
72
|
-
.card{display:flex;flex-direction:column;min-width:0;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface)}
|
|
73
|
-
.card-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 16px;padding:12px 16px}
|
|
74
|
-
.card-heading{display:grid;gap:3px;flex:1 1 260px;min-width:0}
|
|
75
|
-
.card-title{display:flex;align-items:center;gap:10px;min-width:0;font-size:var(--fs-md);font-weight:600;color:var(--ink)}
|
|
76
|
-
.card-title>span:not(.card-icon):not(.count){min-width:0;overflow-wrap:anywhere}
|
|
77
|
-
.card-icon{display:grid;place-items:center;width:24px;height:24px;flex:none;border-radius:var(--r-sm);background:var(--surface-3);color:var(--ink-3)}
|
|
78
|
-
.card-icon .icon{width:14px;height:14px}
|
|
79
|
-
.card-hint{color:var(--ink-3);font-size:var(--fs-xs);line-height:1.45}
|
|
80
|
-
.card-heading:has(.card-icon) .card-hint{padding-left:34px}
|
|
81
|
-
.card-actions{display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}
|
|
82
|
-
.card-actions>.btn-ghost:last-child{margin-right:-8px}
|
|
83
|
-
.card-body{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;padding:14px 16px 16px;min-width:0}
|
|
84
|
-
.card-head+.card-body{border-top:1px solid var(--line)}
|
|
85
|
-
.card-body:empty,.card-body:has(> :only-child:empty){display:none}
|
|
86
|
-
.card-body>.btn-link{justify-self:start}
|
|
87
|
-
.card-stack{display:flex;flex-direction:column;gap:16px;min-width:0}
|
|
88
|
-
.stack{display:grid;gap:10px;min-width:0}
|
|
89
|
-
|
|
90
|
-
/* List cards: one row per record, divided by hairlines */
|
|
91
|
-
.list-card{overflow:hidden}
|
|
92
|
-
.list-card>.card-body{padding:0;gap:0}
|
|
93
|
-
.row-stack{display:grid;grid-template-columns:minmax(0,1fr);min-width:0}
|
|
94
|
-
.row-stack>:is(.work-card,.run-card,.review-card,.record,.role-card,.lazy-row){border:0;border-top:1px solid var(--line);border-radius:0;background:transparent;box-shadow:none}
|
|
95
|
-
.row-stack>:is(.work-card,.run-card,.review-card,.record,.role-card,.lazy-row):first-child,
|
|
96
|
-
.row-stack>.row-label+:is(.work-card,.run-card,.review-card,.record,.lazy-row){border-top:0}
|
|
97
|
-
.row-stack>:is(.run-card,.review-card,.record){padding:12px 16px}
|
|
98
|
-
.row-stack>.run-card[data-status="failed"]{box-shadow:inset 3px 0 0 var(--bad)}
|
|
99
|
-
.row-stack>.empty{margin:14px 16px}
|
|
100
|
-
.row-stack>.note{margin:12px 16px}
|
|
101
|
-
.row-stack>.show-more{margin:6px 16px 14px}
|
|
102
|
-
.row-stack>.row-stack{border-top:1px solid var(--line)}
|
|
103
|
-
.row-stack>.row-label{padding:12px 16px 2px;color:var(--ink-4);font-size:var(--fs-2xs);font-weight:600;letter-spacing:.04em}
|
|
104
|
-
.row-stack>.row-label:only-child{padding-bottom:12px}
|
|
105
|
-
.row-stack.boxed{border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);overflow:hidden}
|
|
106
|
-
.row-stack.boxed>:is(.record){padding:10px 14px}
|
|
107
|
-
.list-foot{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;min-width:0}
|
|
108
|
-
.list-foot:empty{display:none}
|
|
109
|
-
.row-stack>.list-foot{padding:8px 16px;border-top:1px solid var(--line)}
|
|
110
|
-
.card-body>.list-foot{padding-top:4px;border-top:1px solid var(--line)}
|
|
111
|
-
.list-foot>.faint{margin-right:auto}
|
|
112
|
-
|
|
113
|
-
/* Lazy rows: a list summary that reads its exact record when opened */
|
|
114
|
-
.lazy-row{min-width:0}
|
|
115
|
-
.lazy-head{display:flex;align-items:center;gap:10px;min-width:0;padding:11px 16px;list-style:none;cursor:pointer;font-size:var(--fs-sm)}
|
|
116
|
-
.lazy-head::-webkit-details-marker{display:none}
|
|
117
|
-
.lazy-head:hover .lazy-title{color:var(--ink)}
|
|
118
|
-
.lazy-head:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-line)}
|
|
119
|
-
.lazy-title{flex:1;min-width:0;color:var(--ink-2);font-weight:500;overflow-wrap:anywhere}
|
|
120
|
-
.lazy-body{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;min-width:0;padding:0 16px 14px 40px}
|
|
121
|
-
.lazy-content{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;min-width:0}
|
|
122
|
-
[data-reading="true"]>.record-actions,.record[data-reading="true"]{opacity:.7}
|
|
123
|
-
|
|
124
|
-
/* Disclosure */
|
|
125
|
-
.disclosure{min-width:0;border-top:1px solid var(--line)}
|
|
126
|
-
.disclosure>summary{display:flex;align-items:center;gap:8px;padding:10px 0;list-style:none;cursor:pointer;color:var(--ink-2);font-size:var(--fs-sm);font-weight:500;user-select:none}
|
|
127
|
-
.disclosure>summary::-webkit-details-marker{display:none}
|
|
128
|
-
.disclosure>summary:hover{color:var(--ink)}
|
|
129
|
-
.disclosure-chevron{width:14px;height:14px;color:var(--ink-4);transition:transform var(--t-med) var(--ease)}
|
|
130
|
-
details[open]>summary .disclosure-chevron{transform:rotate(90deg)}
|
|
131
|
-
.disclosure-meta{margin-left:auto;color:var(--ink-4);font-size:var(--fs-xs);font-weight:400}
|
|
132
|
-
.disclosure-body{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;padding:0 0 12px 22px;min-width:0}
|
|
133
|
-
.card-disclosure{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface)}
|
|
134
|
-
.card-disclosure>summary{gap:10px;padding:12px 16px;border-radius:var(--r-lg);color:var(--ink);font-weight:600;font-size:var(--fs-md)}
|
|
135
|
-
.card-disclosure>summary .disclosure-chevron{box-sizing:content-box;padding:5px;border-radius:var(--r-sm);background:var(--surface-3);color:var(--ink-3)}
|
|
136
|
-
.card-disclosure[open]>summary{border-bottom:1px solid var(--line);border-radius:var(--r-lg) var(--r-lg) 0 0}
|
|
137
|
-
.card-disclosure>.disclosure-body{padding:14px 16px 16px}
|
|
138
|
-
|
|
139
|
-
/* Key/value */
|
|
140
|
-
.kv{display:grid;grid-template-columns:minmax(96px,max-content) minmax(0,1fr);gap:7px 16px;margin:0;font-size:var(--fs-sm)}
|
|
141
|
-
.kv dt{color:var(--ink-3)}
|
|
142
|
-
.kv dd{margin:0;min-width:0;color:var(--ink);overflow-wrap:anywhere}
|
|
143
|
-
.kv dd code.id{white-space:normal;overflow-wrap:anywhere;-webkit-box-decoration-break:clone;box-decoration-break:clone}
|
|
144
|
-
.kv-compact{gap:3px 12px;font-size:var(--fs-xs)}
|
|
145
|
-
|
|
146
|
-
/* Prose */
|
|
147
|
-
.prose-block{display:grid;gap:5px;min-width:0}
|
|
148
|
-
.prose-label{color:var(--ink-3);font-size:var(--fs-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em}
|
|
149
|
-
.prose-block.is-collapsed .md{max-height:180px;overflow:hidden;-webkit-mask-image:linear-gradient(#000 65%,transparent);mask-image:linear-gradient(#000 65%,transparent)}
|
|
150
|
-
.callout{padding:10px 12px;border-radius:var(--r-md);background:var(--tone-soft,var(--surface-3));border-left:2px solid var(--tone,var(--line-3))}
|
|
151
|
-
.bullets{margin:0;padding-left:18px;display:grid;gap:3px;font-size:var(--fs-sm);color:var(--ink-2)}
|
|
152
|
-
.checklist{list-style:none;margin:0;padding:0;display:grid;gap:5px;font-size:var(--fs-sm)}
|
|
153
|
-
.checklist li{display:flex;gap:8px;align-items:flex-start;color:var(--ink-2)}
|
|
154
|
-
.checklist li .icon{margin-top:3px;color:var(--ink-4)}
|
|
155
|
-
.checklist li.is-done .icon{color:var(--ok)}
|
|
156
|
-
|
|
157
|
-
/* Notes, empty states, receipts */
|
|
158
|
-
.note{padding:8px 11px;border-radius:var(--r-sm);background:var(--tone-soft,var(--surface-3));color:var(--ink-2);font-size:var(--fs-xs);line-height:1.5}
|
|
159
|
-
.note.tone-bad{color:var(--bad)}
|
|
160
|
-
.note.tone-warn{color:var(--ink)}
|
|
161
|
-
.empty{display:flex;align-items:center;gap:10px;padding:14px;border:1px dashed var(--line-2);border-radius:var(--r-md);color:var(--ink-3);font-size:var(--fs-sm)}
|
|
162
|
-
.empty .icon{color:var(--ink-4)}
|
|
163
|
-
.receipt{color:var(--ink-3);font-size:var(--fs-xs);overflow-wrap:anywhere}
|
|
164
|
-
.receipt[data-state="pending"]{color:var(--info)}
|
|
165
|
-
.receipt[data-state="ok"]{color:var(--ok)}
|
|
166
|
-
.receipt[data-state="warn"]{color:var(--warn)}
|
|
167
|
-
.receipt[data-state="bad"]{color:var(--bad)}
|
|
168
|
-
.code-block{margin:0;max-height:360px;overflow:auto;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--sunken);color:var(--ink-2);font-size:var(--fs-2xs);line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
169
|
-
.show-more{justify-self:start;display:inline-flex;align-items:center;height:30px;padding:0 12px;border:1px dashed var(--line-3);border-radius:var(--r-sm);background:transparent;color:var(--ink-3);font-size:var(--fs-xs);font-weight:500}
|
|
170
|
-
.show-more:hover{color:var(--accent);border-color:var(--accent-line)}
|
|
171
|
-
.loading-block{display:flex;align-items:center;gap:10px;padding:32px 8px;color:var(--ink-3)}
|
|
172
|
-
.spinner{width:14px;height:14px;border-radius:50%;border:2px solid var(--line-3);border-top-color:var(--accent);animation:spin .8s linear infinite}
|
|
173
|
-
@keyframes spin{to{transform:rotate(360deg)}}
|
|
174
|
-
|
|
175
|
-
/* Metrics */
|
|
176
|
-
.metric{display:grid;gap:4px;align-content:start;min-width:0;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface)}
|
|
177
|
-
.metric-label{color:var(--ink-3);font-size:var(--fs-xs)}
|
|
178
|
-
.metric-value{font-size:var(--fs-xl);font-weight:600;letter-spacing:-.02em;color:var(--tone,var(--ink));font-variant-numeric:tabular-nums;line-height:1.2}
|
|
179
|
-
.metric-note{color:var(--ink-4);font-size:var(--fs-2xs);line-height:1.4}
|
|
180
|
-
.metric-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}
|
|
181
|
-
.usage{display:grid;gap:10px}
|
|
182
|
-
.usage-meta{display:flex;flex-wrap:wrap;gap:4px 16px;color:var(--ink-3);font-size:var(--fs-2xs)}
|
|
183
|
-
|
|
184
|
-
/* Forms */
|
|
185
|
-
.field{display:grid;gap:6px;min-width:0;margin:0;padding:0;border:0;font-size:var(--fs-sm)}
|
|
186
|
-
.field>span,.field>legend{color:var(--ink-2);font-size:var(--fs-xs);font-weight:500;padding:0}
|
|
187
|
-
.field-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
|
|
188
|
-
.form-actions{display:flex;gap:8px;justify-content:flex-end}
|
|
189
|
-
.inline-form{display:grid;gap:8px}
|
|
190
|
-
.inline-row{display:flex;gap:8px}
|
|
191
|
-
.inline-row input{flex:1}
|
|
192
|
-
|
|
193
|
-
/* Dialogs */
|
|
194
|
-
.dialog{width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 48px);padding:0;overflow:auto;border:1px solid var(--line-2);border-radius:var(--r-lg);background:var(--surface);color:var(--ink);box-shadow:var(--shadow-2)}
|
|
195
|
-
.dialog::backdrop{background:rgba(0,0,0,.45);backdrop-filter:blur(2px)}
|
|
196
|
-
.dialog-body{display:grid;gap:16px;padding:20px}
|
|
197
|
-
.dialog-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
|
|
198
|
-
.dialog-head h2{font-size:var(--fs-lg)}
|
|
199
|
-
.dialog-sub{margin-top:4px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
200
|
-
.dialog-actions{display:flex;gap:8px;justify-content:flex-end}
|
|
201
|
-
.settings-dialog{width:min(460px,calc(100vw - 32px))}
|
|
202
|
-
.theme-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
|
|
203
|
-
.theme-option{display:grid;gap:8px;padding:8px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface-2);text-align:left;font-size:var(--fs-sm);font-weight:500}
|
|
204
|
-
.theme-option:hover{border-color:var(--line-3)}
|
|
205
|
-
.theme-option[aria-pressed="true"]{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
|
|
206
|
-
.theme-swatch{display:flex;height:34px;overflow:hidden;border-radius:var(--r-sm);border:1px solid var(--line)}
|
|
207
|
-
.theme-swatch i{flex:2}
|
|
208
|
-
.theme-swatch i[data-part="2"]{flex:1}
|
|
209
|
-
.shortcut-list{display:grid;grid-template-columns:max-content 1fr;gap:6px 14px;margin:0;font-size:var(--fs-sm);color:var(--ink-2)}
|
|
210
|
-
.shortcut-list dt{display:flex;gap:3px;align-items:center}
|
|
211
|
-
.shortcut-list dd{margin:0}
|
|
212
|
-
|
|
213
|
-
/* Toast */
|
|
214
|
-
.toast{position:fixed;left:50%;bottom:24px;z-index:90;max-width:min(520px,calc(100vw - 32px));padding:10px 16px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface-2);color:var(--ink);box-shadow:var(--shadow-2);font-size:var(--fs-sm);opacity:0;transform:translate(-50%,8px);pointer-events:none;transition:opacity var(--t-med),transform var(--t-med) var(--ease)}
|
|
215
|
-
.toast.show{opacity:1;transform:translate(-50%,0)}
|
|
216
|
-
`;
|