@oharness/server 0.11.0 → 0.14.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/dist/i18n.js +294 -4
- package/dist/i18n.js.map +1 -1
- package/dist/icons.d.ts +3 -0
- package/dist/icons.js +68 -3
- package/dist/icons.js.map +1 -1
- package/dist/page/client/base.js +2 -0
- package/dist/page/client/base.js.map +1 -1
- package/dist/page/client/composer.js +530 -40
- package/dist/page/client/composer.js.map +1 -1
- package/dist/page/client/events.js +8 -3
- package/dist/page/client/events.js.map +1 -1
- package/dist/page/client/panels.js +225 -1
- package/dist/page/client/panels.js.map +1 -1
- package/dist/page/client/routines.js +67 -4
- package/dist/page/client/routines.js.map +1 -1
- package/dist/page/client/shell.js +8 -1
- package/dist/page/client/shell.js.map +1 -1
- package/dist/page/client/state.js +15 -2
- package/dist/page/client/state.js.map +1 -1
- package/dist/page/client/tasks.js +153 -7
- package/dist/page/client/tasks.js.map +1 -1
- package/dist/page/client/usage.js +6 -1
- package/dist/page/client/usage.js.map +1 -1
- package/dist/page/style.js +182 -3
- package/dist/page/style.js.map +1 -1
- package/dist/page.js +1 -0
- package/dist/page.js.map +1 -1
- package/dist/server.js +303 -8
- package/dist/server.js.map +1 -1
- package/dist/terminal.d.ts +7 -0
- package/dist/terminal.js +15 -1
- package/dist/terminal.js.map +1 -1
- package/dist/tool-icons.d.ts +12 -0
- package/dist/tool-icons.js +16 -0
- package/dist/tool-icons.js.map +1 -0
- package/package.json +2 -2
|
@@ -16,11 +16,135 @@ let taskOpen = null;
|
|
|
16
16
|
let taskSheet = null;
|
|
17
17
|
/** Bumped per paint, so a slow answer never draws over a newer one. */
|
|
18
18
|
let taskPaintSeq = 0;
|
|
19
|
+
const taskDrafts = new Map();
|
|
20
|
+
const taskSending = new Set();
|
|
21
|
+
const taskKey = (session, id) => JSON.stringify([session, id]);
|
|
22
|
+
function saveTaskDraft() {
|
|
23
|
+
if (taskOpen && taskSheet) taskDrafts.set(taskKey(taskOpen.session, taskOpen.id), taskSheet.querySelector(".task-input").value);
|
|
24
|
+
}
|
|
19
25
|
|
|
20
26
|
/**
|
|
21
27
|
* Running ones first, then the newest. Ended tasks stay listed, quieter, so
|
|
22
28
|
* what they said is a click away and they can still be sent a follow-up.
|
|
23
29
|
*/
|
|
30
|
+
// Sidebar summaries deliberately do not allocate transcript panes.
|
|
31
|
+
const sidebarTasks = new Map();
|
|
32
|
+
let sidebarTaskRevision = 0;
|
|
33
|
+
let sessionListRequest = 0;
|
|
34
|
+
const taskTreeMore = new Set();
|
|
35
|
+
const TASK_TREE_ENDED = 3;
|
|
36
|
+
const taskTreeOpen = (() => {
|
|
37
|
+
try {
|
|
38
|
+
const value = JSON.parse(localStorage.getItem("oharness.taskTree") || "{}");
|
|
39
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
40
|
+
} catch { return {}; }
|
|
41
|
+
})();
|
|
42
|
+
function saveTaskTreeOpen() {
|
|
43
|
+
try { localStorage.setItem("oharness.taskTree", JSON.stringify(taskTreeOpen)); } catch {}
|
|
44
|
+
}
|
|
45
|
+
function sessionBlock(s, nested) {
|
|
46
|
+
const block = el("div", "session-block" + (nested ? " nested" : ""));
|
|
47
|
+
block.dataset.session = s.id;
|
|
48
|
+
const row = sessionRow(s, nested);
|
|
49
|
+
const toggle = el("button", "task-tree-toggle");
|
|
50
|
+
toggle.type = "button";
|
|
51
|
+
toggle.appendChild(svgIcon("chevronRight"));
|
|
52
|
+
const list = el("div", "task-tree");
|
|
53
|
+
list.id = "task-tree-" + s.id;
|
|
54
|
+
toggle.setAttribute("aria-controls", list.id);
|
|
55
|
+
toggle.addEventListener("click", (e) => {
|
|
56
|
+
e.stopPropagation();
|
|
57
|
+
taskTreeOpen[s.id] = toggle.getAttribute("aria-expanded") !== "true";
|
|
58
|
+
saveTaskTreeOpen();
|
|
59
|
+
paintTaskTree(block, s);
|
|
60
|
+
});
|
|
61
|
+
toggle.addEventListener("mousedown", (e) => e.stopPropagation());
|
|
62
|
+
toggle.draggable = false;
|
|
63
|
+
// In the row's left inset, which every row in the list keeps, so titles
|
|
64
|
+
// start at one place whether or not their conversation has tasks.
|
|
65
|
+
row.prepend(toggle);
|
|
66
|
+
const count = el("span", "task-tree-count");
|
|
67
|
+
row.insertBefore(count, row.querySelector(".sub"));
|
|
68
|
+
block.append(row, list);
|
|
69
|
+
paintTaskTree(block, s);
|
|
70
|
+
return block;
|
|
71
|
+
}
|
|
72
|
+
function paintTaskTree(block, s) {
|
|
73
|
+
const tasks = sortedTasks((sidebarTasks.get(s.id) || {}).tasks).filter((task) => !task.dismissed);
|
|
74
|
+
const live = tasks.filter((task) => TASK_LIVE.has(task.status)).length;
|
|
75
|
+
// Only infer a default once live work appears in the current conversation.
|
|
76
|
+
if (!(s.id in taskTreeOpen) && s.id === activeId && live) {
|
|
77
|
+
taskTreeOpen[s.id] = true;
|
|
78
|
+
saveTaskTreeOpen();
|
|
79
|
+
}
|
|
80
|
+
const open = taskTreeOpen[s.id] === true;
|
|
81
|
+
const toggle = block.querySelector(".task-tree-toggle");
|
|
82
|
+
toggle.hidden = !tasks.length;
|
|
83
|
+
toggle.classList.toggle("open", open);
|
|
84
|
+
toggle.title = t(open ? "tasks.collapse" : "tasks.expand");
|
|
85
|
+
toggle.setAttribute("aria-label", toggle.title);
|
|
86
|
+
toggle.setAttribute("aria-expanded", String(open));
|
|
87
|
+
toggle.classList.toggle("quiet", !live);
|
|
88
|
+
// Only live work earns a badge; ended tasks would otherwise leave a number
|
|
89
|
+
// on every conversation that ever started one.
|
|
90
|
+
const count = block.querySelector(".task-tree-count");
|
|
91
|
+
count.hidden = !live;
|
|
92
|
+
count.textContent = t("tasks.liveCount", { n: live });
|
|
93
|
+
count.title = t("tasks.title");
|
|
94
|
+
const list = block.querySelector(".task-tree");
|
|
95
|
+
list.hidden = !open || !tasks.length;
|
|
96
|
+
if (list.hidden) return;
|
|
97
|
+
// Live tasks, then the few that ended last; older ones wait behind a button.
|
|
98
|
+
// Patch existing buttons so activity updates preserve keyboard focus.
|
|
99
|
+
const shown = taskTreeMore.has(s.id) ? tasks : tasks.slice(0, live + TASK_TREE_ENDED);
|
|
100
|
+
const keep = new Set(shown.map((task) => task.id));
|
|
101
|
+
for (const node of [...list.children]) {
|
|
102
|
+
if (!keep.has(node.dataset.task)) node.remove();
|
|
103
|
+
}
|
|
104
|
+
shown.forEach((task, index) => {
|
|
105
|
+
let button = [...list.children].find((node) => node.dataset.task === task.id);
|
|
106
|
+
if (!button) {
|
|
107
|
+
button = el("button", "task-tree-row");
|
|
108
|
+
button.type = "button";
|
|
109
|
+
button.dataset.task = task.id;
|
|
110
|
+
button.append(el("span", "task-tree-mark"), el("span", "task-tree-name"), el("span", "task-tree-status"));
|
|
111
|
+
button.addEventListener("click", async () => {
|
|
112
|
+
button.disabled = true;
|
|
113
|
+
try {
|
|
114
|
+
// Resume through the existing project-aware path, restoring task
|
|
115
|
+
// conversations before opening their input box.
|
|
116
|
+
if (activeId !== s.id) await openSession(s.id, s.cwd);
|
|
117
|
+
if (activeId === s.id) openTask(s.id, task.id);
|
|
118
|
+
} catch (err) { addNotice(String(err.message || err), "err"); }
|
|
119
|
+
finally { button.disabled = false; }
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
button.className = "task-tree-row task-" + task.status;
|
|
123
|
+
button.classList.toggle("selected", !!taskOpen && taskOpen.session === s.id && taskOpen.id === task.id);
|
|
124
|
+
button.setAttribute("aria-pressed", String(!!taskOpen && taskOpen.session === s.id && taskOpen.id === task.id));
|
|
125
|
+
button.querySelector(".task-tree-name").textContent = task.description;
|
|
126
|
+
// A dot is the same shape running and done, so the word says which.
|
|
127
|
+
const status = t("tasks.status." + task.status);
|
|
128
|
+
button.querySelector(".task-tree-status").textContent = status;
|
|
129
|
+
button.setAttribute("aria-label", task.description + ", " + status);
|
|
130
|
+
button.title = task.description + " · " + status + (task.activity ? " · " + task.activity : "");
|
|
131
|
+
if (list.children[index] !== button) list.insertBefore(button, list.children[index] || null);
|
|
132
|
+
});
|
|
133
|
+
if (shown.length < tasks.length) {
|
|
134
|
+
const more = el("button", "task-tree-more", t("tasks.older", { n: tasks.length - shown.length }));
|
|
135
|
+
more.type = "button";
|
|
136
|
+
more.addEventListener("click", () => { taskTreeMore.add(s.id); paintTaskTree(block, s); });
|
|
137
|
+
list.appendChild(more);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function refreshTaskTrees(session) {
|
|
141
|
+
for (const block of sessionList.querySelectorAll(".session-block")) {
|
|
142
|
+
if (session && block.dataset.session !== session) continue;
|
|
143
|
+
const s = sessionRows.find((row) => row.id === block.dataset.session);
|
|
144
|
+
if (s) paintTaskTree(block, s);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
24
148
|
function sortedTasks(tasks) {
|
|
25
149
|
return (tasks || []).slice().sort((a, b) =>
|
|
26
150
|
(Number(TASK_LIVE.has(b.status)) - Number(TASK_LIVE.has(a.status))) || (b.queuedAt - a.queuedAt));
|
|
@@ -89,21 +213,30 @@ function taskCard(tasks) {
|
|
|
89
213
|
|
|
90
214
|
/** A conversation's tasks changed: redraw what shows them. */
|
|
91
215
|
function tasksChanged(session, tasks) {
|
|
92
|
-
|
|
216
|
+
sidebarTasks.set(session, { tasks: tasks || [], revision: ++sidebarTaskRevision });
|
|
217
|
+
refreshTaskTrees(session);
|
|
218
|
+
if (panes.has(session)) panes.get(session).tasks = tasks || [];
|
|
93
219
|
if (session === activeId) renderQueued();
|
|
94
220
|
if (taskOpen && taskOpen.session === session) void paintTask();
|
|
95
221
|
}
|
|
96
222
|
|
|
97
223
|
function openTask(session, id) {
|
|
224
|
+
saveTaskDraft();
|
|
98
225
|
taskOpen = { session, id, stick: true };
|
|
99
226
|
ensureTaskSheet();
|
|
227
|
+
taskSheet.querySelector(".task-input").value = taskDrafts.get(taskKey(session, id)) || "";
|
|
228
|
+
taskSheet.querySelector(".task-input").disabled = false;
|
|
229
|
+
taskSheet.querySelector(".task-send").disabled = true;
|
|
230
|
+
refreshTaskTrees();
|
|
100
231
|
taskSheet.hidden = false;
|
|
101
232
|
void paintTask();
|
|
102
233
|
taskSheet.querySelector(".task-input").focus();
|
|
103
234
|
}
|
|
104
235
|
|
|
105
236
|
function closeTask() {
|
|
237
|
+
saveTaskDraft();
|
|
106
238
|
taskOpen = null;
|
|
239
|
+
refreshTaskTrees();
|
|
107
240
|
if (taskSheet) taskSheet.hidden = true;
|
|
108
241
|
}
|
|
109
242
|
|
|
@@ -187,16 +320,29 @@ async function sendTask(input) {
|
|
|
187
320
|
const text = input.value.trim();
|
|
188
321
|
if (!text || !taskOpen) return;
|
|
189
322
|
const { session, id } = taskOpen;
|
|
323
|
+
const key = taskKey(session, id);
|
|
324
|
+
if (taskSending.has(key)) return;
|
|
325
|
+
const draft = input.value;
|
|
326
|
+
taskSending.add(key);
|
|
327
|
+
taskDrafts.set(key, draft);
|
|
190
328
|
input.disabled = true;
|
|
329
|
+
taskSheet.querySelector(".task-send").disabled = true;
|
|
191
330
|
const body = await api("/task", { session, id, action: "message", text });
|
|
331
|
+
taskSending.delete(key);
|
|
332
|
+
if (!body.error && taskDrafts.get(key) === draft) taskDrafts.delete(key);
|
|
333
|
+
// A response for A must never clear or disable the input now showing B.
|
|
334
|
+
if (!taskOpen || taskOpen.session !== session || taskOpen.id !== id) {
|
|
335
|
+
if (body.error) addNotice(body.error, "err");
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
192
338
|
input.disabled = false;
|
|
193
339
|
if (body.error) {
|
|
194
340
|
taskSheet.querySelector(".task-log").appendChild(el("div", "task-error", body.error));
|
|
195
|
-
|
|
341
|
+
} else {
|
|
342
|
+
if (input.value === draft) input.value = "";
|
|
343
|
+
input.focus();
|
|
344
|
+
taskOpen.stick = true;
|
|
196
345
|
}
|
|
197
|
-
input.value = "";
|
|
198
|
-
input.focus();
|
|
199
|
-
if (taskOpen) taskOpen.stick = true;
|
|
200
346
|
void paintTask();
|
|
201
347
|
}
|
|
202
348
|
|
|
@@ -285,8 +431,8 @@ async function paintTask() {
|
|
|
285
431
|
|
|
286
432
|
const input = taskSheet.querySelector(".task-input");
|
|
287
433
|
const stopped = task.status === "cancelled";
|
|
288
|
-
input.disabled = stopped;
|
|
289
|
-
taskSheet.querySelector(".task-send").disabled =
|
|
434
|
+
input.disabled = stopped || taskSending.has(taskKey(session, id));
|
|
435
|
+
taskSheet.querySelector(".task-send").disabled = input.disabled;
|
|
290
436
|
input.placeholder = t(stopped ? "tasks.placeholder.stopped" : TASK_LIVE.has(task.status) ? "tasks.placeholder.running" : "tasks.placeholder.ended");
|
|
291
437
|
}
|
|
292
438
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/page/client/tasks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/page/client/tasks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8a9B,CAAC"}
|
|
@@ -987,7 +987,11 @@ const usageMoved = (row) => usageSent(row) + (row.output || 0);
|
|
|
987
987
|
function usageSessionRow(entry) {
|
|
988
988
|
const row = el("div", "row-card usage-session");
|
|
989
989
|
const line = el("div", "row-head");
|
|
990
|
-
|
|
990
|
+
// A day of background calls, not a conversation: named for what it was, and
|
|
991
|
+
// opening the page that explains it rather than a transcript.
|
|
992
|
+
const background = entry.background;
|
|
993
|
+
line.appendChild(el("span", "row-title", background ? t("usage.background." + background) : entry.title || t("session.untitled")));
|
|
994
|
+
if (background) line.appendChild(el("span", "tag", t("usage.background")));
|
|
991
995
|
if (entry.current) line.appendChild(el("span", "tag", t("usage.thisSession")));
|
|
992
996
|
line.appendChild(el("span", "muted small usage-amount", "$" + (entry.costUsd || 0).toFixed(4)));
|
|
993
997
|
row.appendChild(line);
|
|
@@ -999,6 +1003,7 @@ function usageSessionRow(entry) {
|
|
|
999
1003
|
row.tabIndex = 0;
|
|
1000
1004
|
row.setAttribute("role", "button");
|
|
1001
1005
|
const open = () => {
|
|
1006
|
+
if (background === "dreaming") { setNav("dreaming"); void showDreaming(); return; }
|
|
1002
1007
|
setNav(null);
|
|
1003
1008
|
if (panes.has(entry.id)) void focusTab(entry.id);
|
|
1004
1009
|
else void openSession(entry.id, entry.cwd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/page/client/usage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/page/client/usage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuxC3B,CAAC"}
|
package/dist/page/style.js
CHANGED
|
@@ -218,6 +218,53 @@ aside header{display:none;padding:8px 14px;min-height:44px;gap:8px;align-items:c
|
|
|
218
218
|
height:30px;padding:0 8px;border-radius:7px;cursor:pointer;
|
|
219
219
|
display:flex;align-items:center;gap:8px;
|
|
220
220
|
}
|
|
221
|
+
.session-block + .fold-row{margin-top:6px}
|
|
222
|
+
/*
|
|
223
|
+
* A session's background tasks. The chevron sits in the row's left inset —
|
|
224
|
+
* one every row in the list keeps, flat or nested — so titles share a left
|
|
225
|
+
* edge whether or not a row has tasks. The tasks hang under the title with no
|
|
226
|
+
* rule, each status mark under the title's first letter.
|
|
227
|
+
*
|
|
228
|
+
* The marks stay quiet: a dashed ring for work still waiting, and a dot for
|
|
229
|
+
* everything else — breathing while it runs, still once done, fainter when
|
|
230
|
+
* stopped. Only a failure takes a colour.
|
|
231
|
+
*/
|
|
232
|
+
.session-block .session{position:relative}
|
|
233
|
+
/* Two lit rows — the open one and the one under the pointer — must not
|
|
234
|
+
touch, or they read as one block. */
|
|
235
|
+
.session-block + .session-block{margin-top:2px}
|
|
236
|
+
.task-tree-row + .task-tree-row{margin-top:1px}
|
|
237
|
+
.session-block:not(.nested) .session,.show-more:not(.nested){padding-left:20px}
|
|
238
|
+
.task-tree-toggle{position:absolute;left:5px;top:50%;width:12px;height:16px;margin-top:-8px;display:grid;place-items:center;padding:0;border:0;background:none;color:var(--dim);cursor:pointer;opacity:.7}
|
|
239
|
+
.session-block.nested .task-tree-toggle{left:14px}
|
|
240
|
+
/* Above #side-panel's thinning of every 1.5 stroke, which these lose at this size. */
|
|
241
|
+
#side-panel .task-tree-toggle svg{width:10px;height:10px;stroke-width:1.75;transition:transform .15s ease}
|
|
242
|
+
.task-tree-toggle.open svg{transform:rotate(90deg)}
|
|
243
|
+
.task-tree-toggle:hover,.session:hover .task-tree-toggle{opacity:1;color:var(--fg)}
|
|
244
|
+
.task-tree-toggle.quiet{opacity:.6}
|
|
245
|
+
.task-tree-toggle:focus{outline:none}
|
|
246
|
+
.task-tree-count{flex:0 0 auto;font-size:10px;color:var(--dim)}
|
|
247
|
+
.task-tree{margin:0 0 4px 12px}
|
|
248
|
+
.session-block.nested .task-tree{margin-left:24px}
|
|
249
|
+
.task-tree-row,.task-tree-more{display:flex;align-items:center;gap:7px;width:calc(100% - 4px);height:26px;padding:0 8px;border:0;border-radius:7px;background:transparent;color:var(--dim);text-align:left;cursor:pointer;font:inherit;font-size:12px}
|
|
250
|
+
.task-tree-more{padding-left:29px}
|
|
251
|
+
.task-tree-row:hover,.task-tree-more:hover{background:var(--hover);color:var(--fg)}
|
|
252
|
+
.task-tree-row.selected{background:var(--sel);color:var(--fg)}
|
|
253
|
+
.task-tree-row.task-running,.task-tree-row.task-queued{color:var(--fg)}
|
|
254
|
+
.task-tree-mark{flex:0 0 14px;width:14px;height:14px;display:grid;place-items:center}
|
|
255
|
+
.task-tree-mark::after{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
|
|
256
|
+
.task-queued .task-tree-mark::after{width:10px;height:10px;box-sizing:border-box;background:none;border:1.25px dashed currentColor;opacity:.8}
|
|
257
|
+
.task-running .task-tree-mark::after{background:var(--fg);animation:task-breathe 1.6s ease-in-out infinite}
|
|
258
|
+
.task-completed .task-tree-mark::after{opacity:.7}
|
|
259
|
+
.task-cancelled .task-tree-mark::after{opacity:.35}
|
|
260
|
+
.task-failed .task-tree-mark::after{background:var(--err)}
|
|
261
|
+
@keyframes task-breathe{50%{opacity:.25;transform:scale(.8)}}
|
|
262
|
+
@media (prefers-reduced-motion:reduce){.task-running .task-tree-mark::after{animation:none}}
|
|
263
|
+
.task-tree-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
264
|
+
.task-tree-status{font-size:10px;flex:0 0 auto;opacity:.8}
|
|
265
|
+
.task-tree-row.task-running .task-tree-status{color:var(--fg);opacity:1}
|
|
266
|
+
.task-tree-toggle:focus-visible,.task-tree-row:focus-visible,.task-tree-more:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
|
|
267
|
+
.task-tree[hidden],.task-tree-toggle[hidden],.task-tree-count[hidden]{display:none}
|
|
221
268
|
.session:hover{background:var(--hover)}
|
|
222
269
|
.session.active{background:var(--sel)}
|
|
223
270
|
.session .title{
|
|
@@ -1586,6 +1633,36 @@ button.ghost.theme-apply:disabled{opacity:.4;cursor:default}
|
|
|
1586
1633
|
.memory-recent>div{padding:2px 0 2px 15px}
|
|
1587
1634
|
.memory-backup{display:flex;align-items:center;gap:12px;padding:8px 0 8px 15px}
|
|
1588
1635
|
.memory-backup-text{flex:1 1 auto;min-width:0;overflow-wrap:anywhere}
|
|
1636
|
+
.dream-card .row-head{align-items:center;gap:8px}
|
|
1637
|
+
.dream-head{display:flex;align-items:center;gap:10px}
|
|
1638
|
+
.dream-head h2{margin:0}
|
|
1639
|
+
.dream-spacer{flex:1 1 auto}
|
|
1640
|
+
.dream-auto{display:flex;align-items:center;gap:8px;color:var(--dim);cursor:pointer}
|
|
1641
|
+
.dream-auto-slot{display:inline-flex;align-items:center;flex:0 0 auto}
|
|
1642
|
+
.dream-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin:14px 0 6px}
|
|
1643
|
+
.dream-metric{background:var(--panel);border-radius:10px;padding:10px 12px}
|
|
1644
|
+
.dream-metric-value{font-size:20px;font-weight:600;margin:2px 0}
|
|
1645
|
+
.dream-section{margin:20px 0 6px;font-size:14px}
|
|
1646
|
+
.dream-line{display:flex;align-items:center;gap:8px;overflow-wrap:anywhere}
|
|
1647
|
+
.dream-run>summary,.dream-change>summary{cursor:pointer;padding:8px 4px;border-radius:8px}
|
|
1648
|
+
.dream-run>summary:hover,.dream-change>summary:hover{background:var(--hover)}
|
|
1649
|
+
.dream-run{margin:2px 0}
|
|
1650
|
+
.dream-run>:not(summary){margin-left:18px}
|
|
1651
|
+
.dream-change{padding:4px 0}
|
|
1652
|
+
.dream-grow{flex:1 1 auto;min-width:0}
|
|
1653
|
+
.dream-when{flex:0 0 auto;min-width:96px;color:var(--dim);font-size:12px}
|
|
1654
|
+
.dream-small{font-size:12px;padding:2px 8px}
|
|
1655
|
+
.dream-diff{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin:6px 0}
|
|
1656
|
+
.memory-dream-heading{margin:14px 0 4px;font-size:13px;color:var(--dim);font-weight:600}
|
|
1657
|
+
.memory-dream-op{padding:6px 0 6px 15px}
|
|
1658
|
+
.memory-dream-op+.memory-dream-op{margin-top:4px}
|
|
1659
|
+
.memory-dream-op>summary{cursor:pointer;display:flex;gap:8px;align-items:baseline;overflow-wrap:anywhere}
|
|
1660
|
+
.memory-dream-tag{flex:0 0 auto;font-size:12px;padding:1px 6px;border-radius:6px;background:var(--field);color:var(--dim)}
|
|
1661
|
+
.memory-dream-tag.apply{color:var(--ok)}
|
|
1662
|
+
.memory-dream-tag.review{color:var(--warn)}
|
|
1663
|
+
.memory-dream-body{margin:4px 0 8px;background:var(--field);border-radius:8px;padding:8px 10px;font:inherit;font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
1664
|
+
.memory-dream-body.before{color:var(--dim)}
|
|
1665
|
+
.memory-dream-evidence{margin:4px 0 0;padding-left:18px;color:var(--dim)}
|
|
1589
1666
|
.memory-versions{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:10px 0}
|
|
1590
1667
|
.memory-version h4{margin:0 0 6px}
|
|
1591
1668
|
.memory-version pre{margin:0;background:var(--field);border-radius:8px;padding:10px 12px;overflow-wrap:anywhere}
|
|
@@ -1648,6 +1725,13 @@ details.setting>summary:focus-visible{outline:none;background:var(--hover)}
|
|
|
1648
1725
|
title 30px in, and a body that started at the card's edge read as a
|
|
1649
1726
|
paragraph the row had dropped rather than the inside of it. */
|
|
1650
1727
|
.setting-body{padding:4px 14px 16px 30px}
|
|
1728
|
+
.setting-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px}
|
|
1729
|
+
.setting-stat{background:var(--field);border-radius:10px;padding:10px 12px;min-width:0}
|
|
1730
|
+
.setting-stat-label{font-size:12px;color:var(--dim)}
|
|
1731
|
+
.setting-stat-value{font-size:15px;font-weight:600;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
1732
|
+
.setting-stat-sub{font-size:12px;color:var(--dim);margin-top:2px;overflow-wrap:anywhere}
|
|
1733
|
+
.setting-stat.ok .setting-stat-value{color:var(--ok)}
|
|
1734
|
+
.setting-stat.warn .setting-stat-value{color:var(--warn)}
|
|
1651
1735
|
/* The shared .small breaks anywhere, which is right for a path and wrong for
|
|
1652
1736
|
a sentence: the hint here came back as "the trail is never s / ynced". The
|
|
1653
1737
|
prose breaks at spaces; the paths under it keep breaking anywhere. */
|
|
@@ -2357,6 +2441,25 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2357
2441
|
#market{width:min(860px,94vw);max-width:min(860px,94vw);max-height:76vh}
|
|
2358
2442
|
#market[open]{display:flex;flex-direction:column}
|
|
2359
2443
|
.mk-head{padding:18px 20px 10px;position:relative}
|
|
2444
|
+
/* The list and the import beside it, as tabs: a row of two under the title,
|
|
2445
|
+
the chosen one on a raised chip that slides over when the other is picked. */
|
|
2446
|
+
.mk-tabs{display:flex;gap:4px;margin-top:12px;padding:3px;border-radius:10px;background:var(--field);width:max-content;max-width:100%}
|
|
2447
|
+
.mk-tabs[hidden]{display:none}
|
|
2448
|
+
.mk-tab{
|
|
2449
|
+
display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 12px;border:0;border-radius:8px;
|
|
2450
|
+
background:transparent;color:var(--dim);font:inherit;font-size:12.5px;font-weight:500;cursor:pointer;
|
|
2451
|
+
transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;
|
|
2452
|
+
}
|
|
2453
|
+
.mk-tab:hover{color:var(--fg)}
|
|
2454
|
+
.mk-tab.on{background:var(--bg);color:var(--fg);box-shadow:0 1px 2px #00000026}
|
|
2455
|
+
.mk-tab .vendor-mark{width:14px;height:14px}
|
|
2456
|
+
.mk-tab .vendor-mark + .vendor-mark{margin-left:-2px}
|
|
2457
|
+
.mk-tab-count{
|
|
2458
|
+
min-width:18px;height:18px;padding:0 5px;border-radius:999px;display:inline-grid;place-items:center;
|
|
2459
|
+
background:var(--accent);color:var(--bg);font-size:10.5px;font-weight:600;
|
|
2460
|
+
}
|
|
2461
|
+
/* A tab switch repaints the list; it fades in rather than snapping. */
|
|
2462
|
+
#mk-list.swap{animation:row-in .18s cubic-bezier(.2,.8,.2,1)}
|
|
2360
2463
|
#mk-list{overflow-y:auto;padding:2px 12px 14px;flex:1}
|
|
2361
2464
|
/* Where every other window puts it. A "Done" under the list meant scrolling
|
|
2362
2465
|
past eighty rows to leave, for a dialog that changes nothing on the way out. */
|
|
@@ -2375,6 +2478,8 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2375
2478
|
.mk-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:0 10px}
|
|
2376
2479
|
.mk-item{display:flex;align-items:flex-start;gap:11px;padding:10px 8px;border-radius:9px}
|
|
2377
2480
|
.mk-item:hover{background:var(--hover)}
|
|
2481
|
+
/* A skill switched off: still listed, so it can be switched back on. */
|
|
2482
|
+
.mk-item.off .mk-naming,.mk-item.off .ico-sm{opacity:.5}
|
|
2378
2483
|
.mk-item .ico-sm{
|
|
2379
2484
|
width:28px;height:28px;margin-top:1px;padding:6px;box-sizing:border-box;
|
|
2380
2485
|
border-radius:7px;background:var(--sel);opacity:.75;
|
|
@@ -2408,6 +2513,10 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2408
2513
|
.mk-naming{flex:1;min-width:0}
|
|
2409
2514
|
.mk-name{font-size:13.5px;font-weight:500}
|
|
2410
2515
|
.mk-desc{font-size:12px;color:var(--dim);margin-top:2px;line-height:1.45}
|
|
2516
|
+
/* Three lines at most: a skill written for another tool can carry a whole
|
|
2517
|
+
paragraph of triggers, and one row should not fill the dialog. The full
|
|
2518
|
+
text is on the row's tooltip. */
|
|
2519
|
+
.mk-naming .mk-desc{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
|
|
2411
2520
|
.mk-desc.warn{color:var(--warn)}
|
|
2412
2521
|
.mk-acts{display:flex;align-items:center;gap:6px;flex:0 0 auto;margin-top:1px}
|
|
2413
2522
|
.mk-state{font-size:11.5px;color:var(--dim)}
|
|
@@ -3400,8 +3509,16 @@ textarea.boxed:focus{outline:none;background:var(--field-focus)}
|
|
|
3400
3509
|
At rest the marks take the section labels' grey; a row in play — under the
|
|
3401
3510
|
pointer, under the keyboard cursor, or switched on — lights its mark to the
|
|
3402
3511
|
label's own colour. */
|
|
3403
|
-
|
|
3404
|
-
|
|
3512
|
+
/* Every mark in the label's own colour, at rest as much as under the pointer:
|
|
3513
|
+
grey glyphs beside white words read as rows that are switched off. The
|
|
3514
|
+
count and the chevron stay a step quieter, as solid mixes of the two theme
|
|
3515
|
+
colours rather than translucency, so they hold their tone in both themes. */
|
|
3516
|
+
#attach-picker .menu-item .ico-sm{opacity:1;color:var(--fg)}
|
|
3517
|
+
#attach-picker .menu-item .sub{color:color-mix(in srgb,var(--fg) 70%,var(--bg))}
|
|
3518
|
+
#attach-picker .menu-item .chev{opacity:1;color:color-mix(in srgb,var(--fg) 60%,var(--bg))}
|
|
3519
|
+
/* Two vendor marks side by side, for the row that imports from both. */
|
|
3520
|
+
#attach-picker .menu-item .mark-pair{display:flex;align-items:center;gap:3px;flex:0 0 auto}
|
|
3521
|
+
#attach-picker .menu-item .mark-pair .vendor-mark{width:16px;height:16px}
|
|
3405
3522
|
/* The stacked rows carry a name over a sentence, so they are already two lines
|
|
3406
3523
|
tall; the mark beside them is a label for the kind, not an illustration, and
|
|
3407
3524
|
at 16px it was the widest thing in a row whose job is the words. */
|
|
@@ -3500,11 +3617,16 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
|
|
|
3500
3617
|
/* An update question, in place of the OS's message box: the version is the
|
|
3501
3618
|
title, the release notes scroll if there are many, and Later stays quiet. */
|
|
3502
3619
|
.upd-dialog{width:min(440px,92vw);padding-bottom:16px}
|
|
3620
|
+
/* Notes get room to be read; the questions without them stay compact. */
|
|
3621
|
+
.upd-dialog:has(.upd-notes){width:min(560px,92vw)}
|
|
3503
3622
|
.upd-head{display:flex;align-items:center;gap:12px;padding:22px 24px 8px}
|
|
3504
3623
|
.upd-mark{flex:none;display:grid;place-items:center;width:30px;height:30px;border-radius:9px;background:var(--sel);color:var(--fg);font-size:15px;font-weight:600}
|
|
3505
3624
|
.upd-dialog.important .upd-mark{background:var(--accent);color:var(--bg)}
|
|
3506
3625
|
.upd-title{font-size:16px;font-weight:600;line-height:1.35}
|
|
3507
|
-
.upd-notes{margin:6px 24px 10px;padding:
|
|
3626
|
+
.upd-notes{margin:6px 24px 10px;padding:14px 16px;max-height:min(440px,55vh);overflow-y:auto;border-radius:10px;background:var(--hover);font-size:13px;line-height:1.55}
|
|
3627
|
+
/* release-notes.md is wrapped at 76 columns; a paragraph reflows to the dialog. */
|
|
3628
|
+
.upd-notes .md-p{white-space:normal}
|
|
3629
|
+
.upd-notes .md>:last-child{margin-bottom:0}
|
|
3508
3630
|
.upd-body{padding:0 24px;color:var(--dim);font-size:13.5px;line-height:1.5;word-break:break-word}
|
|
3509
3631
|
.upd-body.mono{font-size:12.5px}
|
|
3510
3632
|
.upd-dialog .dlg-actions{justify-content:flex-end;padding:18px 20px 4px}
|
|
@@ -3818,5 +3940,62 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
|
|
|
3818
3940
|
panel's width already selects, without the built-in browser. The person's
|
|
3819
3941
|
own browser is the rest of the window. */
|
|
3820
3942
|
.embed #browser-pane,.embed #browser-scrim,.embed .tab-browser{display:none!important}
|
|
3943
|
+
|
|
3944
|
+
/* Motion for the + menu, the pickers beside it and the dialogs they open.
|
|
3945
|
+
A menu grows out of the button it hangs from, a screen inside it slides the
|
|
3946
|
+
way it was entered, and a dialog settles in and fades out. All of it short
|
|
3947
|
+
enough that nothing waits on it, and none of it for someone who asked the
|
|
3948
|
+
system for less motion. */
|
|
3949
|
+
.menu:not([hidden]){animation:menu-in .16s cubic-bezier(.2,.8,.2,1);transform-origin:bottom left}
|
|
3950
|
+
@keyframes menu-in{from{opacity:0;transform:translateY(6px) scale(.97)}to{opacity:1;transform:none}}
|
|
3951
|
+
.menu-body.slide-in{animation:slide-in .2s cubic-bezier(.2,.8,.2,1)}
|
|
3952
|
+
.menu-body.slide-back{animation:slide-back .2s cubic-bezier(.2,.8,.2,1)}
|
|
3953
|
+
@keyframes slide-in{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:none}}
|
|
3954
|
+
@keyframes slide-back{from{opacity:0;transform:translateX(-16px)}to{opacity:1;transform:none}}
|
|
3955
|
+
/* While the height glides the rows stay put against the edge that does not
|
|
3956
|
+
move — the bottom, where the menu hangs from the + — and the top edge
|
|
3957
|
+
uncovers or covers them, rather than the whole list sliding with it. */
|
|
3958
|
+
.menu.resizing{overflow:hidden;justify-content:flex-end}
|
|
3959
|
+
.menu-item{transition:background-color .12s ease}
|
|
3960
|
+
.menu-item:active{transform:scale(.985)}
|
|
3961
|
+
|
|
3962
|
+
#attach-picker .menu-item:hover .chev,#attach-picker .menu-item.cursor .chev{transform:translateX(2px)}
|
|
3963
|
+
dialog[open]{animation:dialog-in .22s cubic-bezier(.2,.8,.2,1)}
|
|
3964
|
+
dialog[open]::backdrop{animation:backdrop-in .22s ease-out}
|
|
3965
|
+
dialog.closing{animation:dialog-out .14s ease-in forwards}
|
|
3966
|
+
dialog.closing::backdrop{animation:backdrop-out .14s ease-in forwards}
|
|
3967
|
+
@keyframes dialog-in{from{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:none}}
|
|
3968
|
+
@keyframes dialog-out{to{opacity:0;transform:translateY(6px) scale(.985)}}
|
|
3969
|
+
@keyframes backdrop-in{from{opacity:0}}
|
|
3970
|
+
@keyframes backdrop-out{to{opacity:0}}
|
|
3971
|
+
.mk-item{transition:background-color .12s ease,opacity .2s ease}
|
|
3972
|
+
.mk-btn,.mk-icon-btn{transition:background-color .12s ease,transform .1s ease,opacity .15s ease}
|
|
3973
|
+
.mk-btn:not(:disabled):active,.mk-icon-btn:active{transform:scale(.96)}
|
|
3974
|
+
/* Rows arrive with the list, a little after one another, the first time a
|
|
3975
|
+
dialog opens; a repaint for a keystroke in the search box does not replay it. */
|
|
3976
|
+
#market.fresh .mk-grid>.mk-item{animation:row-in .22s cubic-bezier(.2,.8,.2,1) both}
|
|
3977
|
+
#market.fresh .mk-grid>.mk-item:nth-child(2){animation-delay:.02s}
|
|
3978
|
+
#market.fresh .mk-grid>.mk-item:nth-child(3){animation-delay:.04s}
|
|
3979
|
+
#market.fresh .mk-grid>.mk-item:nth-child(4){animation-delay:.06s}
|
|
3980
|
+
#market.fresh .mk-grid>.mk-item:nth-child(n+5){animation-delay:.08s}
|
|
3981
|
+
@keyframes row-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
|
|
3982
|
+
/* Claude Code's and Codex's marks: a glyph beside the name it belongs to. */
|
|
3983
|
+
.vendor-mark{width:14px;height:14px;flex:0 0 auto;display:block;position:relative}
|
|
3984
|
+
.vendor-mark img{width:100%;height:100%;display:block;border-radius:24%}
|
|
3985
|
+
|
|
3986
|
+
.vendor-chip{
|
|
3987
|
+
display:inline-flex;align-items:center;gap:5px;margin-left:8px;padding:1px 7px 1px 4px;
|
|
3988
|
+
border-radius:999px;background:var(--sel);color:var(--fg);
|
|
3989
|
+
font-size:11px;font-weight:500;vertical-align:1px;line-height:18px;white-space:nowrap;
|
|
3990
|
+
}
|
|
3991
|
+
.vendor-chip .vendor-mark{width:12px;height:12px}
|
|
3992
|
+
.mk-empty{padding:18px 8px}
|
|
3993
|
+
@media (prefers-reduced-motion:reduce){
|
|
3994
|
+
.menu:not([hidden]),.menu-body.slide-in,.menu-body.slide-back,dialog[open],dialog[open]::backdrop,
|
|
3995
|
+
dialog.closing,dialog.closing::backdrop,#market.fresh .mk-grid>.mk-item,#mk-list.swap{animation:none}
|
|
3996
|
+
.mk-tab{transition:none}
|
|
3997
|
+
.menu-item,.chev,.mk-item,.mk-btn,.mk-icon-btn{transition:none}
|
|
3998
|
+
.menu-item:active,.mk-btn:not(:disabled):active,.mk-icon-btn:active{transform:none}
|
|
3999
|
+
}
|
|
3821
4000
|
`;
|
|
3822
4001
|
//# sourceMappingURL=style.js.map
|
package/dist/page/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;EAC7B,SAAS
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;EAC7B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA45HV,CAAC"}
|
package/dist/page.js
CHANGED
|
@@ -401,6 +401,7 @@ ${ANALYTICS_STUB}
|
|
|
401
401
|
<div class="mk-head">
|
|
402
402
|
<div id="mk-title" class="cn-title"></div>
|
|
403
403
|
<div id="mk-note" class="row-desc"></div>
|
|
404
|
+
<div id="mk-tabs" class="mk-tabs" role="tablist" hidden></div>
|
|
404
405
|
<input id="mk-search" class="mk-search" type="text" autocomplete="off" spellcheck="false">
|
|
405
406
|
<button id="mk-close" class="mk-close" type="button"></button>
|
|
406
407
|
</div>
|
package/dist/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;;;;GAWG;AAGH;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;;;;;yCAKyB,CAAC;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;4CAOwB,kBAAkB,CAAC,OAAO,CAAC;SAC9D,KAAK;EACZ,cAAc
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;;;;GAWG;AAGH;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;;;;;yCAKyB,CAAC;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;4CAOwB,kBAAkB,CAAC,OAAO,CAAC;SAC9D,KAAK;EACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAyfK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;qBACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;EAC1C,aAAa;EACb,UAAU;EACV,gBAAgB;;;QAGV,CAAC"}
|