toolroll 0.9.86 → 0.9.87
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/CHANGELOG.md +59 -0
- package/dist/agents-board.d.ts +12 -0
- package/dist/agents-board.js +26 -0
- package/dist/approval-rules-ui.d.ts +4 -1
- package/dist/approval-rules-ui.js +31 -15
- package/dist/assignment-ui.js +1 -1
- package/dist/backup-ui.d.ts +5 -4
- package/dist/backup-ui.js +65 -32
- package/dist/browser/terminal.css +1 -1
- package/dist/browser/terminal.js +57 -54
- package/dist/browser/workspace.css +2 -2
- package/dist/browser/workspace.js +35 -70
- package/dist/browser-crew.js +1 -1
- package/dist/browser-workspace.d.ts +329 -183
- package/dist/browser-workspace.js +10 -9
- package/dist/chat-controls.d.ts +1 -1
- package/dist/chat-controls.js +1 -1
- package/dist/chat-settings-page.d.ts +29 -9
- package/dist/chat-settings-page.js +59 -28
- package/dist/check-levels-ui.d.ts +2 -1
- package/dist/check-levels-ui.js +67 -58
- package/dist/contracts/cli.d.ts +43 -0
- package/dist/contracts/cli.js +4 -0
- package/dist/contracts/console-api.d.ts +1 -1
- package/dist/contracts/console-api.js +1 -1
- package/dist/credentials-ui.d.ts +5 -3
- package/dist/credentials-ui.js +58 -31
- package/dist/design/kit.css +685 -0
- package/dist/design/kit.d.ts +208 -0
- package/dist/design/kit.js +177 -0
- package/dist/design/tokens.css +19 -1
- package/dist/discord-settings.js +8 -4
- package/dist/export-ui.d.ts +6 -4
- package/dist/export-ui.js +18 -8
- package/dist/flow-changed.d.ts +14 -0
- package/dist/flow-changed.js +53 -0
- package/dist/flow-gallery-ui.d.ts +41 -4
- package/dist/flow-gallery-ui.js +95 -63
- package/dist/flow-starters-ui.d.ts +3 -9
- package/dist/flow-starters-ui.js +12 -23
- package/dist/flow-unattended-words.d.ts +20 -0
- package/dist/flow-unattended-words.js +24 -0
- package/dist/flow-unattended.d.ts +9 -5
- package/dist/flow-unattended.js +45 -23
- package/dist/flows-cli.js +7 -3
- package/dist/flows-ui.d.ts +12 -6
- package/dist/flows-ui.js +141 -30
- package/dist/integrations-ui.d.ts +6 -4
- package/dist/integrations-ui.js +34 -40
- package/dist/integrations.d.ts +2 -2
- package/dist/integrations.js +4 -4
- package/dist/kits-ui.d.ts +8 -10
- package/dist/kits-ui.js +29 -33
- package/dist/kits.js +1 -1
- package/dist/knowledge-ui.js +76 -19
- package/dist/ledger-view.d.ts +2 -0
- package/dist/ledger-view.js +41 -38
- package/dist/models-ui.d.ts +8 -3
- package/dist/models-ui.js +82 -59
- package/dist/monitoring-ui.d.ts +4 -2
- package/dist/monitoring-ui.js +44 -13
- package/dist/needs-you.d.ts +1 -1
- package/dist/needs-you.js +8 -0
- package/dist/operate-remote-arguments.js +1 -0
- package/dist/operate-remote.js +1 -1
- package/dist/operate.d.ts +1 -1
- package/dist/operate.js +38 -4
- package/dist/passwordless.d.ts +1 -1
- package/dist/passwordless.js +1 -1
- package/dist/people-audit-ui.d.ts +2 -1
- package/dist/people-audit-ui.js +25 -23
- package/dist/policy-ui.d.ts +3 -2
- package/dist/policy-ui.js +27 -21
- package/dist/policy.d.ts +3 -0
- package/dist/policy.js +14 -1
- package/dist/project-delete-ui.d.ts +4 -2
- package/dist/project-delete-ui.js +135 -126
- package/dist/project-knowledge.d.ts +10 -10
- package/dist/publish.d.ts +11 -0
- package/dist/publish.js +16 -3
- package/dist/pull-request-ui.d.ts +2 -1
- package/dist/pull-request-ui.js +39 -28
- package/dist/recipe-ui.d.ts +4 -2
- package/dist/recipe-ui.js +14 -4
- package/dist/release-adapters.d.ts +3 -0
- package/dist/release-adapters.js +22 -2
- package/dist/release-cli.js +81 -9
- package/dist/release.d.ts +21 -0
- package/dist/release.js +40 -4
- package/dist/releases.js +1 -1
- package/dist/request-budget-ui.d.ts +4 -2
- package/dist/request-budget-ui.js +30 -19
- package/dist/retention-ui.d.ts +4 -3
- package/dist/retention-ui.js +15 -12
- package/dist/scope.d.ts +3 -0
- package/dist/scope.js +6 -0
- package/dist/serve.d.ts +0 -1
- package/dist/serve.js +51 -7
- package/dist/server/agents-computers.d.ts +9 -0
- package/dist/server/agents-computers.js +67 -0
- package/dist/server/chat.js +16 -16
- package/dist/server/chrome.d.ts +1 -1
- package/dist/server/chrome.js +19 -9
- package/dist/server/console.css +2 -2
- package/dist/server/flows.js +64 -36
- package/dist/server/home.d.ts +35 -0
- package/dist/server/home.js +104 -0
- package/dist/server/http.d.ts +3 -0
- package/dist/server/http.js +5 -0
- package/dist/server/kit-standalone.d.ts +22 -0
- package/dist/server/kit-standalone.js +69 -0
- package/dist/server/kit.d.ts +405 -0
- package/dist/server/kit.js +361 -0
- package/dist/server/pages.d.ts +2 -1
- package/dist/server/pages.js +213 -174
- package/dist/server/people-tokens.js +26 -85
- package/dist/server/render-history.d.ts +51 -0
- package/dist/server/render-history.js +228 -0
- package/dist/server/render-new-task.d.ts +29 -0
- package/dist/server/render-new-task.js +96 -0
- package/dist/server/render-next.d.ts +63 -0
- package/dist/server/render-next.js +109 -0
- package/dist/server/render-pages.d.ts +22 -190
- package/dist/server/render-pages.js +123 -575
- package/dist/server/render-people.d.ts +24 -3
- package/dist/server/render-people.js +93 -72
- package/dist/server/render-projects.d.ts +103 -0
- package/dist/server/render-projects.js +247 -0
- package/dist/server/render-results.d.ts +5 -24
- package/dist/server/render-results.js +48 -185
- package/dist/server/render-settings.d.ts +5 -74
- package/dist/server/render-settings.js +102 -493
- package/dist/server/render-tasks.d.ts +35 -5
- package/dist/server/render-tasks.js +114 -85
- package/dist/server/route-table.js +20 -5
- package/dist/server/settings.js +276 -255
- package/dist/server/task-views.d.ts +8 -0
- package/dist/server/task-views.js +85 -2
- package/dist/server/tasks.d.ts +8 -0
- package/dist/server/tasks.js +95 -40
- package/dist/server/terminals.js +1 -1
- package/dist/server/welcome.d.ts +22 -0
- package/dist/server/welcome.js +69 -0
- package/dist/settings-groups-ui.d.ts +279 -0
- package/dist/settings-groups-ui.js +615 -0
- package/dist/settings-kit.d.ts +42 -6
- package/dist/settings-kit.js +69 -7
- package/dist/setup-guide.d.ts +2 -2
- package/dist/skills-ui.js +59 -7
- package/dist/slack-settings.js +12 -5
- package/dist/spend-ui.d.ts +45 -26
- package/dist/spend-ui.js +124 -56
- package/dist/sso-ui.d.ts +5 -2
- package/dist/sso-ui.js +63 -31
- package/dist/storage-ui.d.ts +3 -2
- package/dist/storage-ui.js +56 -50
- package/dist/store.d.ts +112 -3
- package/dist/store.js +292 -20
- package/dist/surface.js +5 -1
- package/dist/teams-settings.d.ts +2 -1
- package/dist/teams-settings.js +24 -41
- package/dist/telegram-settings.d.ts +0 -4
- package/dist/telegram-settings.js +52 -25
- package/dist/toolroll-update-ui.d.ts +8 -4
- package/dist/toolroll-update-ui.js +55 -45
- package/dist/tools-ui.d.ts +5 -3
- package/dist/tools-ui.js +107 -42
- package/dist/work-index.js +11 -7
- package/dist/workspace-ui.d.ts +1 -1
- package/dist/workspace-ui.js +7 -4
- package/package.json +1 -1
|
@@ -0,0 +1,685 @@
|
|
|
1
|
+
/* The revamp kit (Wave 0): the shared primitives every page builds with, server HTML and React alike.
|
|
2
|
+
*
|
|
3
|
+
* Rules: src/design/KIT.md. Markup: src/server/kit.ts (server pages) and src/browser/kit/ (React views)
|
|
4
|
+
* write the same classes, so one page never has two looks. The server appends this sheet after console.css
|
|
5
|
+
* (chrome.ts STYLE), so every page and the React workspace get one copy.
|
|
6
|
+
*
|
|
7
|
+
* Every class starts with k- so nothing here touches the older console.css and workspace rules that the
|
|
8
|
+
* waves retire page by page. Selectors set every box property they rely on (the console's element rules
|
|
9
|
+
* give bare buttons, labels and paragraphs their own margins and heights). The React workspace's scoped
|
|
10
|
+
* preflight skips any element with a k- class (src/browser/tailwind.css).
|
|
11
|
+
*
|
|
12
|
+
* Colour comes only from --so-* tokens (src/design/system/tokens, generated into tokens.css by youiyoux sync);
|
|
13
|
+
* nothing here redefines one. No resting shadows: floating things get a border, blocking ones a scrim. Phones are
|
|
14
|
+
* 760px and narrower, the console's one breakpoint. */
|
|
15
|
+
|
|
16
|
+
/* ---------- Derived values the kit adds ---------- */
|
|
17
|
+
/* The kit's colours (--so-needs, --so-needs-soft, --so-field-line, --so-overlay-line, --so-ring, --so-scrim) are
|
|
18
|
+
* System tokens, generated into tokens.css from src/design/system/tokens. What follows is derived from tokens and
|
|
19
|
+
* stays here: status words on their soft wash, mixed toward ink so they read at 4.5:1 or better, and the motion
|
|
20
|
+
* vocabulary (three durations, one curve; nothing longer, no bounce). */
|
|
21
|
+
:root {
|
|
22
|
+
--so-needs-ink: color-mix(in srgb, var(--so-needs) 78%, var(--so-ink));
|
|
23
|
+
--so-live-ink: color-mix(in srgb, var(--so-info) 82%, var(--so-ink));
|
|
24
|
+
--so-done-ink: color-mix(in srgb, var(--so-success) 80%, var(--so-ink));
|
|
25
|
+
--so-fail-ink: color-mix(in srgb, var(--so-danger) 85%, var(--so-ink));
|
|
26
|
+
--m-quick: 120ms;
|
|
27
|
+
--m-base: 160ms;
|
|
28
|
+
--m-slow: 220ms;
|
|
29
|
+
--m-ease: var(--so-ease-out);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* ---------- Text, icons, helpers ---------- */
|
|
33
|
+
.k-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; margin: 0; padding: 0; border: 0; }
|
|
34
|
+
.k-mono { font-family: var(--so-font-mono); font-size: 12px; font-weight: 400; }
|
|
35
|
+
.k-num { font-variant-numeric: tabular-nums; }
|
|
36
|
+
.k-muted { color: var(--so-muted); }
|
|
37
|
+
.k-grow { flex: 1; }
|
|
38
|
+
.k-i { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; flex: none; }
|
|
39
|
+
.k-i-sm { width: 14px; height: 14px; }
|
|
40
|
+
.k-link { color: inherit; text-decoration: underline; text-decoration-color: var(--so-field-line); text-underline-offset: 3px; }
|
|
41
|
+
|
|
42
|
+
/* ---------- Buttons ---------- */
|
|
43
|
+
.k-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; box-sizing: border-box; height: 32px; min-height: 0; margin: 0; padding: 0 12px; border-radius: var(--so-radius-md); border: 1px solid transparent; background: transparent; color: var(--so-ink); font: var(--so-typography-label); white-space: nowrap; text-decoration: none; position: relative; cursor: pointer; user-select: none; box-shadow: none; transition: background-color var(--m-quick) var(--m-ease), color var(--m-quick) var(--m-ease), border-color var(--m-quick) var(--m-ease), transform var(--m-quick) var(--m-ease); }
|
|
44
|
+
.k-btn:active:not(:disabled):not([aria-disabled="true"]) { transform: scale(0.97); }
|
|
45
|
+
.k-btn.k-btn-primary { background: var(--so-accent); color: var(--so-on-accent); border-color: var(--so-accent); }
|
|
46
|
+
.k-btn.k-btn-primary.busy { background: var(--so-accent-hover); }
|
|
47
|
+
.k-btn.k-btn-outline { background: var(--so-paper); border-color: var(--so-field-line); }
|
|
48
|
+
.k-btn.k-btn-ghost { color: var(--so-muted); }
|
|
49
|
+
/* An irreversible act: vermilion words on paper, never a filled red button. */
|
|
50
|
+
.k-btn.k-btn-danger { background: var(--so-paper); border-color: color-mix(in srgb, var(--so-danger) 55%, transparent); color: var(--so-fail-ink); }
|
|
51
|
+
.k-btn-sm { height: 28px; padding: 0 10px; font-size: 12.5px; }
|
|
52
|
+
.k-btn-icon { width: 32px; padding: 0; }
|
|
53
|
+
.k-btn-sm.k-btn-icon { width: 28px; }
|
|
54
|
+
.k-btn:disabled, .k-btn[aria-disabled="true"] { cursor: default; opacity: .55; }
|
|
55
|
+
/* An act's three faces: its label, "Starting…" until the outcome is known, then an ink check. */
|
|
56
|
+
.k-face { display: inline-flex; align-items: center; gap: 6px; }
|
|
57
|
+
.k-btn.swap .k-face { animation: k-face var(--m-base) var(--m-ease) both; }
|
|
58
|
+
.k-spin { width: 14px; height: 14px; border-radius: 50%; border: 1.5px solid currentColor; border-right-color: transparent; animation: k-spin 600ms linear infinite; }
|
|
59
|
+
.k-check-draw path { stroke-dasharray: 24; stroke-dashoffset: 24; animation: k-draw var(--m-slow) var(--m-ease) 40ms forwards; }
|
|
60
|
+
@keyframes k-face { from { opacity: 0; transform: translateY(3px); } }
|
|
61
|
+
@keyframes k-spin { to { transform: rotate(360deg); } }
|
|
62
|
+
@keyframes k-draw { to { stroke-dashoffset: 0; } }
|
|
63
|
+
|
|
64
|
+
/* ---------- Status: five words, one tone each ---------- */
|
|
65
|
+
.k-chip { display: inline-flex; align-items: center; gap: 6px; height: 20px; padding: 0 7px; border-radius: 6px; font: var(--so-typography-badge); background: var(--so-neutral-soft); color: var(--so-neutral-ink); white-space: nowrap; flex: none; }
|
|
66
|
+
.k-chip::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--dot, var(--so-muted)); flex: none; }
|
|
67
|
+
.k-chip.needs { background: var(--so-needs-soft); color: var(--so-needs-ink); --dot: var(--so-needs); }
|
|
68
|
+
.k-chip.ask { background: var(--so-neutral-soft); color: var(--so-ink); --dot: var(--so-needs); }
|
|
69
|
+
.k-chip.live { background: var(--so-info-soft); color: var(--so-live-ink); --dot: var(--so-info); }
|
|
70
|
+
.k-chip.done { background: var(--so-success-soft); color: var(--so-done-ink); --dot: var(--so-success); }
|
|
71
|
+
.k-chip.failed { background: var(--so-danger-soft); color: var(--so-fail-ink); --dot: var(--so-danger); }
|
|
72
|
+
.k-chip.nodot::before { display: none; }
|
|
73
|
+
.k-count { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px; font: 500 11px/18px var(--so-font-sans); font-variant-numeric: tabular-nums; background: var(--so-neutral-soft); color: var(--so-neutral-ink); }
|
|
74
|
+
.k-count.ink { background: var(--so-ink); color: var(--so-paper); }
|
|
75
|
+
.k-count.zero { background: transparent; color: var(--so-muted); }
|
|
76
|
+
.k-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--dot, var(--so-muted)); flex: none; display: inline-block; }
|
|
77
|
+
.k-dot.needs { --dot: var(--so-needs); }
|
|
78
|
+
|
|
79
|
+
/* ---------- Segmented filter and tabs ---------- */
|
|
80
|
+
.k-seg { display: inline-flex; padding: 2px; gap: 2px; border-radius: 9px; background: var(--so-raised); }
|
|
81
|
+
.k-seg > a, .k-seg > button { display: inline-flex; align-items: center; gap: 6px; height: 26px; min-height: 0; margin: 0; padding: 0 9px; border: 0; border-radius: 7px; background: transparent; color: var(--so-muted); font: var(--so-typography-label); font-size: 12.5px; white-space: nowrap; text-decoration: none; cursor: pointer; box-shadow: none; }
|
|
82
|
+
.k-seg > [aria-current], .k-seg > [aria-pressed="true"], .k-seg > [aria-selected="true"] { background: var(--so-paper); color: var(--so-ink); box-shadow: inset 0 0 0 1px var(--so-field-line); }
|
|
83
|
+
.k-seg .k-count { background: transparent; padding: 0 1px; min-width: 0; color: inherit; height: auto; line-height: 1; }
|
|
84
|
+
.k-seg .k-count.ink { background: var(--so-ink); color: var(--so-paper); padding: 0 5px; min-width: 18px; height: 18px; line-height: 18px; }
|
|
85
|
+
.k-tabs { display: flex; gap: 20px; border-bottom: 1px solid var(--so-line); margin: 0; padding: 0; }
|
|
86
|
+
.k-tabs > button, .k-tabs > a { display: inline-flex; align-items: center; gap: 6px; min-height: 0; margin: 0 0 -1px; padding: 10px 0; border: 0; border-bottom: 2px solid transparent; border-radius: 0; background: transparent; color: var(--so-muted); font: var(--so-typography-label); text-decoration: none; cursor: pointer; box-shadow: none; transition: color var(--m-quick) var(--m-ease), border-color var(--m-quick) var(--m-ease); }
|
|
87
|
+
.k-tabs > [aria-selected="true"], .k-tabs > [aria-current] { color: var(--so-ink); border-bottom-color: var(--so-ink); }
|
|
88
|
+
.k-tabs .k-count { margin-left: 2px; }
|
|
89
|
+
|
|
90
|
+
/* ---------- Fields ---------- */
|
|
91
|
+
.k-field { display: grid; gap: 6px; margin: 0; min-width: 0; }
|
|
92
|
+
.k-label { display: block; margin: 0; font: var(--so-typography-caption); color: var(--so-ink); }
|
|
93
|
+
.k-hint { margin: 0; font-size: 12px; color: var(--so-muted); line-height: 1.45; }
|
|
94
|
+
.k-input.k-input, .k-textarea.k-textarea { box-sizing: border-box; width: 100%; margin: 0; border: 1px solid var(--so-field-line); border-radius: 8px; background: var(--so-paper); color: var(--so-ink); font: 400 13px/1.4 var(--so-font-sans); box-shadow: none; }
|
|
95
|
+
.k-input.k-input { height: 32px; min-height: 0; padding: 0 10px; }
|
|
96
|
+
.k-textarea.k-textarea { min-height: 72px; padding: 8px 10px; resize: vertical; max-width: 640px; }
|
|
97
|
+
.k-input:focus-visible, .k-textarea:focus-visible { outline: 2px solid var(--so-ring); outline-offset: 1px; box-shadow: none; }
|
|
98
|
+
.k-input[aria-invalid="true"], .k-textarea[aria-invalid="true"], .k-sel[aria-invalid="true"] { border-color: var(--so-danger); }
|
|
99
|
+
.k-err { display: block; margin: 0; font-size: 12px; color: var(--so-fail-ink); line-height: 1.45; }
|
|
100
|
+
.k-err:empty { display: none; }
|
|
101
|
+
/* A native select with the chevron: 32px (sm 28px in a toolbar). */
|
|
102
|
+
.k-selw { position: relative; display: inline-block; min-width: 0; max-width: 100%; }
|
|
103
|
+
.k-selw::after { content: ""; position: absolute; right: 12px; top: 50%; margin-top: -5px; width: 6px; height: 6px; border: solid var(--so-muted); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg); pointer-events: none; }
|
|
104
|
+
.k-sel.k-sel { appearance: none; -webkit-appearance: none; box-sizing: border-box; width: 100%; height: 32px; min-height: 0; margin: 0; padding: 0 30px 0 10px; border: 1px solid var(--so-field-line); border-radius: 8px; background: var(--so-paper); color: var(--so-ink); font: 400 13px/1 var(--so-font-sans); text-overflow: ellipsis; cursor: pointer; box-shadow: none; }
|
|
105
|
+
.k-sel:focus-visible { outline: 2px solid var(--so-ring); outline-offset: 1px; }
|
|
106
|
+
.k-sel:disabled { color: var(--so-muted); cursor: default; }
|
|
107
|
+
.k-selw.sm .k-sel { height: 28px; font: 500 12.5px/1 var(--so-font-sans); padding: 0 26px 0 9px; }
|
|
108
|
+
.k-selw.sm::after { right: 10px; }
|
|
109
|
+
.k-selw.wide { display: block; width: 100%; }
|
|
110
|
+
/* Switch: a button[role=switch] that says its state, or a checkbox[role=switch] for a form. */
|
|
111
|
+
.k-switch { position: relative; display: inline-flex; align-items: center; gap: 8px; min-height: 28px; margin: 0; padding: 0; border: 0; background: transparent; font: 500 12.5px/1 var(--so-font-sans); color: var(--so-muted); cursor: pointer; box-shadow: none; }
|
|
112
|
+
.k-trk { position: relative; width: 32px; height: 18px; border-radius: 9px; border: 1px solid var(--so-field-line); background: var(--so-paper); transition: background-color var(--m-quick) var(--m-ease), border-color var(--m-quick) var(--m-ease); flex: none; box-sizing: border-box; }
|
|
113
|
+
.k-trk::after { content: ""; position: absolute; top: 2px; left: 2px; width: 12px; height: 12px; border-radius: 50%; background: var(--so-muted); transition: transform var(--m-quick) var(--m-ease), background-color var(--m-quick) var(--m-ease); }
|
|
114
|
+
.k-switch[aria-checked="true"], .k-switch:has(input:checked) { color: var(--so-ink); }
|
|
115
|
+
.k-switch[aria-checked="true"] .k-trk, .k-switch input:checked + .k-trk { background: var(--so-ink); border-color: var(--so-ink); }
|
|
116
|
+
.k-switch[aria-checked="true"] .k-trk::after, .k-switch input:checked + .k-trk::after { transform: translateX(14px); background: var(--so-paper); }
|
|
117
|
+
.k-switch .k-switch-input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; z-index: 1; }
|
|
118
|
+
.k-switch:focus-visible, .k-switch:has(input:focus-visible) { outline: 2px solid var(--so-ring); outline-offset: 3px; border-radius: 4px; }
|
|
119
|
+
/* Radio cards and checkboxes */
|
|
120
|
+
.k-radios { display: grid; gap: 8px; grid-template-columns: 1fr 1fr; margin: 0; padding: 0; border: 0; min-width: 0; }
|
|
121
|
+
.k-opt { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 12px; align-items: start; margin: 0; padding: 11px 14px; border: 1px solid var(--so-field-line); border-radius: 10px; font: var(--so-typography-body); cursor: pointer; }
|
|
122
|
+
.k-opt input { margin: 3px 0 0; accent-color: var(--so-ink); }
|
|
123
|
+
.k-opt > span { display: grid; gap: 3px; }
|
|
124
|
+
.k-opt > span > span { font-size: 12.5px; color: var(--so-muted); }
|
|
125
|
+
.k-opt:has(input:checked) { border-color: var(--so-ink); box-shadow: inset 0 0 0 1px var(--so-ink); }
|
|
126
|
+
.k-checks { display: flex; flex-wrap: wrap; gap: 8px 18px; font-size: 13px; }
|
|
127
|
+
.k-checks label { display: inline-flex; gap: 8px; align-items: center; min-height: 28px; margin: 0; font: var(--so-typography-body); }
|
|
128
|
+
.k-checks input { accent-color: var(--so-ink); width: 15px; height: 15px; margin: 0; }
|
|
129
|
+
/* Form row: label and one muted line | the control. */
|
|
130
|
+
.k-frow { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 300px); gap: 8px 24px; align-items: center; min-height: 52px; padding: 10px 0; border-bottom: 1px solid var(--so-line); }
|
|
131
|
+
.k-frow.wide { grid-template-columns: minmax(0, 1fr); }
|
|
132
|
+
.k-frow.top { align-items: start; }
|
|
133
|
+
.k-frow-l { display: grid; gap: 2px; min-width: 0; }
|
|
134
|
+
.k-frow-t { margin: 0; font-weight: 500; font-size: 13px; display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; color: var(--so-ink); }
|
|
135
|
+
.k-frow-h { font-size: 12.5px; color: var(--so-muted); line-height: 1.45; }
|
|
136
|
+
.k-frow-c { display: flex; align-items: center; justify-content: flex-end; gap: 8px; min-width: 0; flex-wrap: wrap; }
|
|
137
|
+
.k-frow-c .k-input, .k-frow-c .k-selw { max-width: 300px; width: 100%; }
|
|
138
|
+
.k-frow-c .k-seg { flex: none; }
|
|
139
|
+
.k-frow .k-err { width: 100%; text-align: right; }
|
|
140
|
+
.k-frow.wide .k-frow-c { justify-content: flex-start; }
|
|
141
|
+
.k-frow.wide .k-frow-c > * { flex: 1; min-width: 0; }
|
|
142
|
+
.k-frow.wide .k-frow-c > .k-btn, .k-frow.wide .k-frow-c > .k-switch { flex: none; }
|
|
143
|
+
|
|
144
|
+
/* ---------- Blocks ---------- */
|
|
145
|
+
.k-acts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
|
|
146
|
+
.k-facts { display: grid; grid-template-columns: 112px minmax(0, 1fr); gap: 10px 16px; margin: 0; font-size: 12.5px; line-height: 1.45; }
|
|
147
|
+
.k-facts dt { color: var(--so-muted); margin: 0; }
|
|
148
|
+
.k-facts dd { min-width: 0; margin: 0; overflow-wrap: anywhere; }
|
|
149
|
+
.k-facts a { color: inherit; text-decoration: underline; text-decoration-color: var(--so-field-line); text-underline-offset: 3px; }
|
|
150
|
+
.k-note { margin: 0; font-size: 12px; color: var(--so-muted); line-height: 1.45; }
|
|
151
|
+
/* A refusal or problem line: where it happened, with what didn't change. */
|
|
152
|
+
.k-notice { display: flex; gap: 8px; align-items: flex-start; margin: 0; font-size: 12.5px; color: var(--so-fail-ink); line-height: 1.45; }
|
|
153
|
+
.k-notice .k-i { margin-top: 1px; }
|
|
154
|
+
/* One system line that is not a failure (a builder offline, an update): neutral fill. */
|
|
155
|
+
.k-notice.info { color: var(--so-ink); background: var(--so-raised); border-radius: 7px; padding: 8px 10px; }
|
|
156
|
+
.k-empty { display: grid; justify-items: start; gap: 10px; padding: 28px 24px; }
|
|
157
|
+
.k-empty-t { color: var(--so-ink); font-weight: 600; font-size: 14px; margin: 0; }
|
|
158
|
+
.k-empty-x { color: var(--so-muted); font-size: 13px; margin: 0; max-width: 60ch; }
|
|
159
|
+
/* Inside a reading column, a settings page, a drawer or a tab, an empty state lines up with the text. */
|
|
160
|
+
.k-doc .k-empty, .k-sbody .k-empty, .k-drawer .k-empty, .k-tabbody .k-empty { padding: 16px 0; }
|
|
161
|
+
.k-terms { margin: 0; font-size: 13px; font-weight: 500; padding: 8px 10px; background: var(--so-raised); border-radius: 7px; justify-self: start; }
|
|
162
|
+
.k-disclose > summary { cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: 6px; min-height: 0; margin: 0; padding: 0; font-size: 12.5px; font-weight: 400; color: var(--so-ink); text-decoration: underline; text-decoration-color: var(--so-field-line); text-underline-offset: 3px; }
|
|
163
|
+
.k-disclose > summary::-webkit-details-marker { display: none; }
|
|
164
|
+
.k-disclose > summary::before { content: ""; width: 6px; height: 6px; border: solid currentColor; border-width: 0 1.5px 1.5px 0; transform: rotate(-45deg); transition: transform var(--m-quick) var(--m-ease); margin-right: 2px; }
|
|
165
|
+
.k-disclose[open] > summary::before { transform: rotate(45deg); }
|
|
166
|
+
.k-disclose { margin: 0; padding: 0; border: 0; }
|
|
167
|
+
|
|
168
|
+
/* ---------- Lists: rows between hairlines under group headings ---------- */
|
|
169
|
+
.k-grp { display: flex; align-items: center; gap: 8px; height: 36px; margin: 8px 0 0; padding: 0 24px; font: 600 12.5px/1 var(--so-font-sans); border-bottom: 1px solid var(--so-line); color: var(--so-ink); }
|
|
170
|
+
.k-row { display: grid; grid-template-columns: 96px minmax(160px, 30%) minmax(0, 1fr) auto 124px; align-items: center; gap: 16px; min-height: 48px; padding: 6px 24px; border-bottom: 1px solid var(--so-line); position: relative; }
|
|
171
|
+
.k-row-t { font-weight: 500; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--so-ink); text-decoration: none; }
|
|
172
|
+
.k-row.wait .k-row-t { font-weight: 600; }
|
|
173
|
+
/* The title link stretches over the row, so the whole row is one target; the action sits above it. */
|
|
174
|
+
.k-row-t::before { content: ""; position: absolute; inset: 0; }
|
|
175
|
+
/* A row with no page of its own (a computer): the title is text, the action is the way in. */
|
|
176
|
+
.k-row.k-row-static .k-row-t::before { content: none; }
|
|
177
|
+
.k-row-d { color: var(--so-muted); font-size: 12.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
178
|
+
.k-row-m { display: flex; gap: 12px; color: var(--so-muted); font-size: 12px; white-space: nowrap; }
|
|
179
|
+
.k-row-a { display: flex; justify-content: flex-end; }
|
|
180
|
+
.k-row-a .k-btn { min-width: 108px; }
|
|
181
|
+
.k-row-c, .k-row-a, .k-row-msg { position: relative; z-index: 1; }
|
|
182
|
+
.k-row-msg { grid-column: 2 / -1; }
|
|
183
|
+
|
|
184
|
+
/* ---------- List tools: the text filter, the List / Board switch, the phone's tool row ---------- */
|
|
185
|
+
.k-filter { display: inline-flex; align-items: center; gap: 6px; box-sizing: border-box; height: 28px; width: 168px; margin: 0; padding: 0 8px; border: 1px solid var(--so-field-line); border-radius: var(--so-radius-md); background: var(--so-paper); color: var(--so-muted); cursor: text; }
|
|
186
|
+
.k-filter > input { flex: 1; min-width: 0; height: 100%; margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; outline: none; color: var(--so-ink); font: 400 12.5px/1 var(--so-font-sans); }
|
|
187
|
+
.k-filter > input::placeholder { color: var(--so-muted); }
|
|
188
|
+
.k-filter > input::-webkit-search-cancel-button { display: none; }
|
|
189
|
+
.k-filter:focus-within { border-color: var(--so-ink); box-shadow: inset 0 0 0 1px var(--so-ink); }
|
|
190
|
+
.k-seg.k-seg-icons > a, .k-seg.k-seg-icons > button { padding: 0 6px; }
|
|
191
|
+
/* The phone's tool row under its header: project, filter and view, all visible at once. Hidden at a desk. */
|
|
192
|
+
.k-tbp { display: none; }
|
|
193
|
+
/* A quiet line under a list: what else waits elsewhere, a link on. */
|
|
194
|
+
.k-foot { margin: 0; padding: 12px 24px; font-size: 12.5px; color: var(--so-muted); }
|
|
195
|
+
.k-foot a { color: var(--so-ink); text-decoration: underline; text-decoration-color: var(--so-field-line); text-underline-offset: 3px; }
|
|
196
|
+
|
|
197
|
+
/* ---------- Board: the same rows as columns (Needs you · Queued · Running · Finished) ---------- */
|
|
198
|
+
.k-board { display: grid; grid-template-columns: repeat(var(--k-cols, 4), minmax(0, 1fr)); align-items: stretch; flex: 1; min-height: 0; }
|
|
199
|
+
.k-col { min-width: 0; border-right: 1px solid var(--so-line); }
|
|
200
|
+
.k-col:last-child { border-right: 0; }
|
|
201
|
+
.k-col-h { display: flex; align-items: center; gap: 8px; height: 40px; margin: 0; padding: 0 16px; border-bottom: 1px solid var(--so-line); font: 600 12.5px/1 var(--so-font-sans); color: var(--so-ink); }
|
|
202
|
+
.k-col-h.needs::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--so-needs); flex: none; }
|
|
203
|
+
.k-card { display: grid; gap: 5px; padding: 11px 16px; border-bottom: 1px solid var(--so-line); color: var(--so-ink); text-decoration: none; outline-offset: -2px; }
|
|
204
|
+
.k-card-t { font-weight: 500; font-size: 13px; line-height: 1.35; overflow-wrap: anywhere; }
|
|
205
|
+
.k-card-m { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; color: var(--so-muted); font-size: 12px; }
|
|
206
|
+
.k-col-e { margin: 0; padding: 12px 16px; font-size: 12.5px; color: var(--so-muted); }
|
|
207
|
+
.k-colpager { display: none; }
|
|
208
|
+
.k-colpager > .k-seg { display: flex; width: 100%; }
|
|
209
|
+
|
|
210
|
+
/* ---------- Page headers ---------- */
|
|
211
|
+
/* List pages: the desk top bar (48px). */
|
|
212
|
+
.k-tb { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; min-height: 48px; padding: 8px 24px; border-bottom: 1px solid var(--so-line); position: sticky; top: 0; z-index: 6; background: var(--so-paper); }
|
|
213
|
+
.k-tb h1 { margin: 0; font: 600 15px/1.3 var(--so-font-sans); letter-spacing: -0.01em; }
|
|
214
|
+
.k-tb-ctx { color: var(--so-muted); font-size: 12.5px; }
|
|
215
|
+
/* Filters beside a list's title (src/design/KIT.md "List tools"): the tracks sit in its context, 8px apart. */
|
|
216
|
+
.k-tb-ctx > .k-seg { vertical-align: middle; }
|
|
217
|
+
.k-tb-ctx > .k-seg + .k-seg { margin-left: 8px; }
|
|
218
|
+
/* Phone header: menu or back · title · one trailing action. Hidden at a desk. */
|
|
219
|
+
.k-ph { display: none; }
|
|
220
|
+
/* Reading pages: one 760px column, a back link and the doc header. */
|
|
221
|
+
.k-doc { box-sizing: border-box; width: 100%; max-width: 760px; margin: 0 auto; padding: 22px 28px 120px; display: grid; grid-template-columns: minmax(0, 1fr); gap: 22px; align-content: start; }
|
|
222
|
+
.k-backlink { display: inline-flex; align-items: center; gap: 6px; color: var(--so-muted); font: var(--so-typography-label); justify-self: start; min-height: 24px; text-decoration: none; }
|
|
223
|
+
.k-dh { display: flex; align-items: flex-start; gap: 6px; }
|
|
224
|
+
.k-dh > div { flex: 1; display: grid; gap: 6px; min-width: 0; }
|
|
225
|
+
.k-dh h1 { margin: 0; font: 600 24px/1.3 var(--so-font-sans); letter-spacing: -0.02em; color: var(--so-ink); }
|
|
226
|
+
/* A title can be data (a project or folder name): never re-cased, even inside the workspace's native region. */
|
|
227
|
+
.k-dh h1::first-letter { text-transform: none; }
|
|
228
|
+
.k-dh-meta { margin: 0; font-size: 12.5px; color: var(--so-muted); }
|
|
229
|
+
/* A title the phone header already shows stays for assistive tech but is drawn once. */
|
|
230
|
+
.k-same { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
|
|
231
|
+
@media (min-width: 761px) { .k-same { position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; } }
|
|
232
|
+
.k-sec { display: grid; gap: 10px; }
|
|
233
|
+
.k-sec h3, .k-secthead h3 { margin: 0; font: 600 13px/1.3 var(--so-font-sans); }
|
|
234
|
+
.k-secthead { display: flex; align-items: center; gap: 8px; padding-bottom: 8px; border-bottom: 1px solid var(--so-line); }
|
|
235
|
+
.k-secthead h3 { flex: 1; display: flex; align-items: center; gap: 8px; }
|
|
236
|
+
|
|
237
|
+
/* ---------- Progress line: a few named steps, filled up to where the work is ---------- */
|
|
238
|
+
.k-steps { --k-n: 5; position: relative; display: grid; grid-template-columns: repeat(var(--k-n), minmax(0, 1fr)); margin: 0; padding: 2px 0 0; list-style: none; }
|
|
239
|
+
.k-steps::before, .k-steps-fill { content: ""; position: absolute; top: 8px; left: calc(50% / var(--k-n)); right: calc(50% / var(--k-n)); height: 1.5px; background: var(--so-line); }
|
|
240
|
+
.k-steps-fill { background: var(--so-success); transform-origin: left center; transform: scaleX(var(--k-fill, 0)); transition: transform var(--m-slow) var(--m-ease); }
|
|
241
|
+
.k-step { position: relative; z-index: 1; display: grid; justify-items: center; align-content: start; gap: 7px; min-width: 0; margin: 0; padding: 0; text-align: center; font-size: 12px; color: var(--so-muted); }
|
|
242
|
+
.k-step > b { display: block; position: relative; box-sizing: border-box; width: 13px; height: 13px; margin-top: 2px; border-radius: 50%; border: 1.5px solid var(--so-field-line); background: var(--so-paper); }
|
|
243
|
+
.k-step.done > b { border-color: var(--so-success); background: var(--so-success); }
|
|
244
|
+
.k-step.done > b::before { content: ""; position: absolute; left: 3px; top: 1px; width: 3px; height: 6px; border: solid var(--so-paper); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg); }
|
|
245
|
+
.k-step.now, .k-step.live, .k-step.failed { color: var(--so-ink); font-weight: 600; }
|
|
246
|
+
.k-step.now > b { border-color: var(--so-needs); background: var(--so-needs); box-shadow: inset 0 0 0 2.5px var(--so-paper); }
|
|
247
|
+
.k-step.live > b { border-color: var(--so-info); background: var(--so-info); box-shadow: inset 0 0 0 2.5px var(--so-paper); }
|
|
248
|
+
.k-step.failed > b { border-color: var(--so-danger); background: var(--so-danger); }
|
|
249
|
+
.k-step-l { line-height: 1.2; white-space: nowrap; }
|
|
250
|
+
.k-step-s { margin-top: -4px; min-height: 1.3em; font-size: 11.5px; font-weight: 400; line-height: 1.3; color: var(--so-muted); white-space: nowrap; }
|
|
251
|
+
|
|
252
|
+
/* ---------- Approval: four fixed slots in every state ---------- */
|
|
253
|
+
.k-slots { border: 1px solid var(--so-line); border-radius: var(--so-radius-card); padding: 16px 18px; display: grid; gap: 10px; background: var(--so-paper); transition: border-color var(--m-slow) var(--m-ease); }
|
|
254
|
+
.k-slots.wait { border-color: var(--so-needs); }
|
|
255
|
+
.k-slot-status { display: flex; align-items: center; gap: 10px; min-height: 24px; flex-wrap: wrap; }
|
|
256
|
+
.k-slot-status h2 { margin: 0; font: 600 15px/1.35 var(--so-font-sans); }
|
|
257
|
+
.k-slot-text { margin: 0; color: var(--so-muted); font-size: 13px; line-height: 1.5; min-height: 1.5em; }
|
|
258
|
+
.k-slot-acts { min-height: 32px; }
|
|
259
|
+
.k-slot-acts .k-btn { min-width: 136px; }
|
|
260
|
+
.k-slot-acts .k-btn.k-btn-ghost { min-width: 0; }
|
|
261
|
+
.k-slot-terms { margin: 0; font-size: 12px; color: var(--so-muted); line-height: 1.5; min-height: 1.5em; }
|
|
262
|
+
.k-slot-err:empty { display: none; }
|
|
263
|
+
/* The choice an act takes (radio cards, a note), between the text and the actions. */
|
|
264
|
+
.k-slot-body { display: grid; gap: 12px; min-width: 0; }
|
|
265
|
+
/* A short tag on a radio card (Recommended): the card's third column. */
|
|
266
|
+
.k-opt > .k-chip { align-self: start; }
|
|
267
|
+
/* The password a step-up asks for, inside the slots' form: label above, never a placeholder in its place. */
|
|
268
|
+
.k-reauth { display: grid; gap: 6px; max-width: 320px; }
|
|
269
|
+
/* The Needs-you panel: waits that aren't tasks, on their own page. */
|
|
270
|
+
.k-needs { border: 1px solid var(--so-needs); border-radius: var(--so-radius-card); background: var(--so-paper); }
|
|
271
|
+
.k-needs-h { display: flex; align-items: center; gap: 8px; margin: 0; padding: 12px 16px; border-bottom: 1px solid var(--so-line); font: 600 13px/1.3 var(--so-font-sans); }
|
|
272
|
+
.k-needs-h::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--so-needs); }
|
|
273
|
+
.k-needs-item { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 16px; align-items: center; padding: 12px 16px; }
|
|
274
|
+
.k-needs-item + .k-needs-item { border-top: 1px solid var(--so-line); }
|
|
275
|
+
.k-needs-item b { font-weight: 600; }
|
|
276
|
+
.k-needs-item p { margin: 2px 0 0; font-size: 12.5px; color: var(--so-muted); line-height: 1.45; }
|
|
277
|
+
.k-needs-item .k-acts .k-btn { min-width: 124px; }
|
|
278
|
+
|
|
279
|
+
/* ---------- Floating: popover, drawer, sheet, menu (bordered, never a shadow) ---------- */
|
|
280
|
+
.k-scrim { position: fixed; inset: 0; z-index: 25; background: transparent; animation: k-fade var(--m-slow) var(--m-ease) both; }
|
|
281
|
+
.k-scrim.dim { background: var(--so-scrim); }
|
|
282
|
+
.k-pop { position: fixed; z-index: 40; box-sizing: border-box; width: 336px; max-width: calc(100vw - 16px); padding: 14px; border-radius: 10px; background: var(--so-paper); color: var(--so-ink); border: 1px solid var(--so-overlay-line); display: grid; gap: 10px; }
|
|
283
|
+
.k-pop-h { display: flex; align-items: center; gap: 8px; margin: -4px -6px 0 0; }
|
|
284
|
+
.k-pop-h h3 { margin: 0; font: var(--so-typography-title-sm); flex: 1; }
|
|
285
|
+
.k-pop p { margin: 0; font-size: 12.5px; color: var(--so-muted); line-height: 1.5; }
|
|
286
|
+
.k-pop .k-pop-terms { color: var(--so-ink); font-weight: 500; font-size: 13px; padding: 8px 10px; background: var(--so-raised); border-radius: 7px; }
|
|
287
|
+
.k-pop .k-pop-foot { font-size: 12px; border-top: 1px solid var(--so-line); padding-top: 10px; }
|
|
288
|
+
.k-pop .k-input { height: 36px; }
|
|
289
|
+
.k-pop.k-pop-menu { width: 240px; }
|
|
290
|
+
.k-drawer { position: fixed; top: 8px; right: 8px; bottom: 8px; width: 400px; max-width: calc(100vw - 16px); z-index: 30; background: var(--so-paper); color: var(--so-ink); border-radius: 12px; border: 1px solid var(--so-overlay-line); overflow: auto; display: flex; flex-direction: column; }
|
|
291
|
+
.k-drawer-h { display: flex; align-items: center; gap: 6px; padding: 10px 10px 10px 20px; border-bottom: 1px solid var(--so-line); position: sticky; top: 0; background: var(--so-paper); }
|
|
292
|
+
.k-drawer-h h2 { margin: 0; font: 600 14px/1.3 var(--so-font-sans); flex: 1; }
|
|
293
|
+
.k-drawer-b { padding: 18px 20px 28px; display: grid; gap: 22px; align-content: start; }
|
|
294
|
+
.k-sheet { position: fixed; left: 8px; right: 8px; bottom: calc(8px + env(safe-area-inset-bottom)); z-index: 45; max-height: calc(100dvh - 16px); display: flex; flex-direction: column; background: var(--so-paper); color: var(--so-ink); border-radius: 14px; border: 1px solid var(--so-overlay-line); }
|
|
295
|
+
.k-sheet-h { display: flex; align-items: center; gap: 8px; padding: 6px 6px 8px 16px; border-bottom: 1px solid var(--so-line); flex: none; }
|
|
296
|
+
.k-sheet-ht { flex: 1; min-width: 0; display: grid; gap: 2px; padding-top: 4px; }
|
|
297
|
+
.k-sheet-h h2 { margin: 0; font: 600 15px/1.3 var(--so-font-sans); display: flex; gap: 8px; align-items: center; white-space: nowrap; }
|
|
298
|
+
.k-sheet-b { overflow: auto; padding: 0 0 12px; }
|
|
299
|
+
.k-pop:focus, .k-drawer:focus, .k-sheet:focus { outline: none; }
|
|
300
|
+
.k-pop[hidden], .k-drawer[hidden], .k-sheet[hidden] { display: none; }
|
|
301
|
+
/* An approval asked from inside a drawer, sheet or popover opens over it. */
|
|
302
|
+
.k-scrim.stacked { z-index: 48; }
|
|
303
|
+
.k-pop.stacked, .k-sheet.stacked, .k-drawer.stacked { z-index: 50; }
|
|
304
|
+
.k-menu { display: grid; gap: 1px; margin: 0 -6px; }
|
|
305
|
+
.k-menu > button, .k-menu > a { display: flex; align-items: center; box-sizing: border-box; width: 100%; min-height: 32px; margin: 0; padding: 0 8px; border: 0; border-radius: 6px; background: transparent; color: var(--so-ink); font: var(--so-typography-label); text-align: left; text-decoration: none; cursor: pointer; box-shadow: none; }
|
|
306
|
+
.k-menu > [aria-current="true"] { font-weight: 600; }
|
|
307
|
+
.k-sheet .k-menu { margin: 0; padding: 6px 8px 4px; }
|
|
308
|
+
.k-grow-in { transform-origin: var(--origin, top left); animation: k-grow var(--m-base) var(--m-ease) both; }
|
|
309
|
+
.k-drawer.k-grow-in, .k-sheet.k-grow-in { animation-duration: var(--m-slow); }
|
|
310
|
+
@keyframes k-grow { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: none; } }
|
|
311
|
+
@keyframes k-fade { from { opacity: 0; } }
|
|
312
|
+
.k-msg-in { animation: k-msg var(--m-base) var(--m-ease) both; }
|
|
313
|
+
@keyframes k-msg { from { opacity: 0; transform: translateY(-3px); } }
|
|
314
|
+
.k-swap-in { animation: k-swap var(--m-base) var(--m-ease) both; }
|
|
315
|
+
@keyframes k-swap { from { opacity: 0; transform: translateY(4px); } }
|
|
316
|
+
|
|
317
|
+
/* ---------- Composer: one soft rounded box; the textarea grows 1 → 8 lines; one bottom row inside ---------- */
|
|
318
|
+
.k-composer { --c-r: 22px; box-sizing: border-box; border: 1px solid var(--so-field-line); border-radius: var(--c-r); background: var(--so-paper); display: grid; padding: 4px 6px 6px; outline: 3px solid transparent; outline-offset: 0; transition: border-color var(--m-quick) var(--m-ease), outline-color var(--m-quick) var(--m-ease); }
|
|
319
|
+
.k-composer:focus-within { border-color: var(--so-ink); outline-color: color-mix(in srgb, var(--so-ink) 10%, transparent); }
|
|
320
|
+
.k-composer.off { border-color: var(--so-line); background: var(--so-raised); }
|
|
321
|
+
.k-composer-ta.k-composer-ta { box-sizing: border-box; width: 100%; min-height: 40px; margin: 0; padding: 10px 10px 6px; border: 0; border-radius: 0; outline: none; resize: none; background: transparent; box-shadow: none; color: var(--so-ink); font: var(--so-typography-body-reading); line-height: 1.5; overflow-y: hidden; scrollbar-width: thin; }
|
|
322
|
+
.k-composer-ta::placeholder { color: var(--so-muted); }
|
|
323
|
+
.k-composer-ta:focus, .k-composer-ta:focus-visible { outline: none; box-shadow: none; }
|
|
324
|
+
.k-composer:has(.k-composer-ta[aria-invalid="true"]) { border-color: var(--so-danger); outline-color: transparent; }
|
|
325
|
+
.k-composer + .k-err { margin-top: 6px; }
|
|
326
|
+
.k-composer-bar { display: flex; align-items: center; gap: 6px; padding: 2px 0 0 2px; flex-wrap: wrap; min-height: 36px; }
|
|
327
|
+
.k-composer-plus { box-sizing: border-box; width: 32px; height: 32px; min-height: 0; margin: 0; padding: 0; border-radius: 50%; display: grid; place-items: center; color: var(--so-muted); border: 1px solid var(--so-line); background: transparent; cursor: pointer; box-shadow: none; transition: background-color var(--m-quick) var(--m-ease), color var(--m-quick) var(--m-ease); }
|
|
328
|
+
.k-composer-chip { box-sizing: border-box; height: 32px; min-height: 0; margin: 0; display: inline-flex; align-items: center; gap: 4px; padding: 0 8px 0 10px; border: 0; border-radius: 999px; font: 500 12.5px/1 var(--so-font-sans); color: var(--so-muted); background: transparent; cursor: pointer; box-shadow: none; transition: background-color var(--m-quick) var(--m-ease), color var(--m-quick) var(--m-ease); }
|
|
329
|
+
.k-composer-plus:disabled, .k-composer-chip:disabled { opacity: .5; pointer-events: none; }
|
|
330
|
+
/* The round send: ink with text, muted until then; Stop takes its place while the work runs. */
|
|
331
|
+
.k-send-slot { position: relative; display: inline-grid; width: 34px; height: 34px; flex: none; }
|
|
332
|
+
.k-send-slot .k-send { grid-area: 1 / 1; position: relative; box-sizing: border-box; width: 34px; height: 34px; min-height: 0; margin: 0; padding: 0; border-radius: 50%; display: grid; place-items: center; background: var(--so-ink); color: var(--so-paper); border: 0; cursor: pointer; box-shadow: none; transition: background-color var(--m-quick) var(--m-ease), color var(--m-quick) var(--m-ease), transform var(--m-base) var(--m-ease); }
|
|
333
|
+
.k-send::before { content: ""; position: absolute; inset: -5px; }
|
|
334
|
+
.k-send .k-i { width: 17px; height: 17px; stroke-width: 2.2; }
|
|
335
|
+
.k-send[aria-disabled="true"], .k-composer:not(.has-text) .k-send:not(.k-stop) { background: var(--so-raised); color: var(--so-muted); }
|
|
336
|
+
.k-send[aria-disabled="true"] { cursor: default; }
|
|
337
|
+
.k-send:not([aria-disabled="true"]):active { transform: scale(.94); }
|
|
338
|
+
.k-stop { visibility: hidden; }
|
|
339
|
+
.k-stop .k-i { fill: currentColor; width: 12px; height: 12px; }
|
|
340
|
+
.k-composer.working .k-send:not(.k-stop) { visibility: hidden; }
|
|
341
|
+
.k-composer.working .k-stop { visibility: visible; }
|
|
342
|
+
.k-composer.working .k-stop .k-i, .k-composer.was-working:not(.working) .k-send:not(.k-stop) .k-i { animation: k-morph var(--m-base) var(--m-ease); }
|
|
343
|
+
@keyframes k-morph { from { opacity: 0; transform: scale(.82); } }
|
|
344
|
+
.k-send:focus-visible { outline: 2px solid var(--so-ring); outline-offset: 2px; }
|
|
345
|
+
.k-composer-files { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 8px; }
|
|
346
|
+
.k-composer-files:empty { display: none; }
|
|
347
|
+
.k-composer-file { display: inline-flex; align-items: center; gap: 6px; height: 28px; margin-top: 6px; padding: 0 4px 0 10px; border: 1px solid var(--so-line); border-radius: 999px; font-size: 12px; }
|
|
348
|
+
.k-composer-file button { width: 22px; height: 22px; min-height: 0; margin: 0; padding: 0; display: grid; place-items: center; border: 0; border-radius: 50%; background: transparent; color: var(--so-muted); }
|
|
349
|
+
.k-composer-note { padding: 2px 10px 6px; }
|
|
350
|
+
.k-composer-err { padding: 2px 10px 6px; }
|
|
351
|
+
.k-composer-err:empty { display: none; }
|
|
352
|
+
/* One line: the text and the send share a row. */
|
|
353
|
+
.k-composer.line { grid-template-columns: minmax(0, 1fr) auto; align-items: end; padding: 4px 6px 4px 8px; }
|
|
354
|
+
.k-composer.line .k-composer-ta { padding: 8px 6px; min-height: 36px; }
|
|
355
|
+
.k-composer.line .k-composer-bar { padding: 0 0 1px; min-height: 0; }
|
|
356
|
+
.k-composer.line .k-composer-bar .k-grow { display: none; }
|
|
357
|
+
.k-composer.line .k-composer-files, .k-composer.line .k-composer-err, .k-composer.line .k-composer-note { grid-column: 1 / -1; }
|
|
358
|
+
/* A composer docked to the bottom rides above the phone keyboard (kit behaviour sets html.kb-open and --kb). */
|
|
359
|
+
.k-composer-dock { position: sticky; bottom: 0; z-index: 4; padding: 12px 24px 14px; background: var(--so-paper); border-top: 1px solid var(--so-line); }
|
|
360
|
+
|
|
361
|
+
/* ---------- Timing rows: steps on one elapsed-time axis ---------- */
|
|
362
|
+
.k-timing { border: 1px solid var(--so-line); border-radius: var(--so-radius-card); background: var(--so-paper); overflow: hidden; }
|
|
363
|
+
.k-timing-h { display: flex; align-items: center; gap: 10px; min-height: 52px; padding: 8px 10px 8px 16px; border-bottom: 1px solid var(--so-line); }
|
|
364
|
+
.k-timing-h h2 { margin: 0; font: 600 13.5px/1.3 var(--so-font-sans); }
|
|
365
|
+
.k-timing-h .k-timing-state { margin-left: auto; display: flex; gap: 8px; align-items: center; }
|
|
366
|
+
.k-timing-b { padding: 12px 16px; display: grid; gap: 2px; }
|
|
367
|
+
.k-timing-f { padding: 10px 16px 12px; border-top: 1px solid var(--so-line); font-size: 12px; color: var(--so-muted); display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
|
|
368
|
+
.k-timing-f:empty { display: none; }
|
|
369
|
+
.k-crow { display: grid; grid-template-columns: 16px 220px minmax(0, 1fr) 62px 60px; gap: 10px; align-items: center; min-height: 40px; font-size: 13px; }
|
|
370
|
+
.k-crow.head { min-height: 20px; font-size: 11.5px; color: var(--so-muted); }
|
|
371
|
+
.k-crow-i { display: grid; place-items: center; width: 16px; height: 16px; }
|
|
372
|
+
.k-crow-i .k-qd { width: 10px; height: 10px; border-radius: 50%; border: 1.5px dashed var(--so-field-line); box-sizing: border-box; }
|
|
373
|
+
.k-crow-i .k-rund { width: 10px; height: 10px; border-radius: 50%; border: 2px solid var(--so-info); background: color-mix(in srgb, var(--so-info) 30%, transparent); box-sizing: border-box; }
|
|
374
|
+
.k-crow-i .k-wd { width: 9px; height: 9px; border-radius: 50%; background: var(--so-needs); }
|
|
375
|
+
.k-crow-i svg { width: 14px; height: 14px; }
|
|
376
|
+
.k-crow.ok .k-crow-i { color: var(--so-success); }
|
|
377
|
+
.k-crow.bad .k-crow-i { color: var(--so-danger); }
|
|
378
|
+
.k-crow-n { min-width: 0; white-space: normal; line-height: 1.3; }
|
|
379
|
+
.k-crow-n .k-crow-sub { display: block; font-size: 11.5px; color: var(--so-muted); font-weight: 400; }
|
|
380
|
+
.k-crow-w { font-size: 12px; color: var(--so-muted); }
|
|
381
|
+
.k-crow.bad .k-crow-w { color: var(--so-fail-ink); font-weight: 500; }
|
|
382
|
+
.k-crow.run .k-crow-w { color: var(--so-live-ink); }
|
|
383
|
+
.k-crow.wait .k-crow-w { color: var(--so-needs-ink); font-weight: 600; }
|
|
384
|
+
.k-crow.now .k-crow-n, .k-crow.now .k-crow-w { font-weight: 600; }
|
|
385
|
+
.k-crow-lane { position: relative; height: 14px; }
|
|
386
|
+
.k-crow-bar { position: absolute; top: 4px; height: 6px; border-radius: 3px; background: var(--so-info); min-width: 3px; transition: width var(--m-base) linear, background-color var(--m-slow) var(--m-ease); }
|
|
387
|
+
.k-crow.ok .k-crow-bar { background: var(--so-success); }
|
|
388
|
+
.k-crow.bad .k-crow-bar { background: var(--so-danger); }
|
|
389
|
+
.k-crow.wait .k-crow-bar { background: var(--so-needs); }
|
|
390
|
+
.k-crow-s { text-align: right; color: var(--so-muted); font-size: 12px; font-variant-numeric: tabular-nums; }
|
|
391
|
+
|
|
392
|
+
/* ---------- Not found, inside the shell ---------- */
|
|
393
|
+
.k-nf .k-empty { padding: 40px 24px; }
|
|
394
|
+
.k-nf .k-empty-t { font-size: 15px; }
|
|
395
|
+
|
|
396
|
+
/* ---------- Settings frame: section nav + one 760px column ---------- */
|
|
397
|
+
.k-settings { display: grid; grid-template-columns: 200px minmax(0, 1fr); flex: 1; }
|
|
398
|
+
.k-snav { border-right: 1px solid var(--so-line); padding: 14px 10px; display: grid; gap: 1px; align-content: start; }
|
|
399
|
+
.k-nav { display: flex; align-items: center; gap: 9px; height: 30px; padding: 0 8px; border-radius: 6px; color: var(--so-nav-ink); font: 500 13px/1 var(--so-font-sans); text-decoration: none; }
|
|
400
|
+
.k-nav[aria-current] { background: var(--so-nav-hover); color: var(--so-ink); }
|
|
401
|
+
.k-nav > .k-nav-l { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
402
|
+
.k-nav-top { margin-bottom: 8px; }
|
|
403
|
+
.k-nav-flag { width: 6px; height: 6px; border-radius: 50%; background: var(--so-needs); flex: none; }
|
|
404
|
+
.k-sbody { box-sizing: border-box; max-width: 760px; width: 100%; padding: 24px 32px 80px; display: grid; gap: 24px; align-content: start; }
|
|
405
|
+
.k-sbody > header h2 { margin: 0; font: 600 20px/1.3 var(--so-font-sans); letter-spacing: -0.015em; }
|
|
406
|
+
.k-sbody > header p { margin: 4px 0 0; color: var(--so-muted); }
|
|
407
|
+
.k-crumbs { display: inline-flex; align-items: center; gap: 6px; min-width: 0; }
|
|
408
|
+
.k-crumbs a { color: var(--so-muted); text-decoration: none; }
|
|
409
|
+
.k-crumbs .k-sep { color: var(--so-field-line); }
|
|
410
|
+
.k-crumbs b { font-weight: 500; color: var(--so-ink); }
|
|
411
|
+
|
|
412
|
+
/* ---------- Hover: only where a pointer hovers (a tap never leaves a control lit) ---------- */
|
|
413
|
+
@media (hover: hover) and (pointer: fine) {
|
|
414
|
+
.k-link:hover { text-decoration-color: var(--so-ink); }
|
|
415
|
+
.k-btn.k-btn-primary:hover { background: var(--so-accent-hover); border-color: var(--so-accent-hover); }
|
|
416
|
+
.k-btn.k-btn-outline:hover { background: var(--so-soft); }
|
|
417
|
+
.k-btn.k-btn-ghost:hover { background: var(--so-soft); color: var(--so-ink); }
|
|
418
|
+
.k-btn.k-btn-danger:hover { background: var(--so-danger-soft); }
|
|
419
|
+
.k-seg > a:hover, .k-seg > button:hover { color: var(--so-ink); }
|
|
420
|
+
.k-tabs > button:hover, .k-tabs > a:hover { color: var(--so-ink); }
|
|
421
|
+
.k-switch:hover { background: transparent; }
|
|
422
|
+
.k-opt:hover { border-color: var(--so-ink); }
|
|
423
|
+
.k-row:hover { background: color-mix(in srgb, var(--so-raised) 60%, transparent); }
|
|
424
|
+
.k-row.k-row-static:hover { background: transparent; }
|
|
425
|
+
.k-card:hover { background: color-mix(in srgb, var(--so-raised) 60%, transparent); }
|
|
426
|
+
.k-backlink:hover { color: var(--so-ink); }
|
|
427
|
+
.k-menu > button:hover, .k-menu > a:hover { background: var(--so-soft); }
|
|
428
|
+
.k-composer-plus:hover { background: var(--so-raised); color: var(--so-ink); }
|
|
429
|
+
.k-composer-chip:hover { background: var(--so-raised); color: var(--so-ink); }
|
|
430
|
+
.k-nav:hover { background: var(--so-nav-hover); color: var(--so-ink); }
|
|
431
|
+
.k-crumbs a:hover { color: var(--so-ink); }
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* ---------- Code to copy: a command or a one-time secret, selected whole with one click ---------- */
|
|
435
|
+
.k-code { display: inline-block; max-width: 100%; box-sizing: border-box; margin: 0; padding: 6px 10px; border-radius: 7px; background: var(--so-raised); color: var(--so-ink); font: 12.5px/1.45 var(--so-font-mono); overflow-wrap: anywhere; user-select: all; }
|
|
436
|
+
|
|
437
|
+
/* ---------- Phone dock: the Needs-you button and the screen's one primary ---------- */
|
|
438
|
+
.k-dock { display: none; }
|
|
439
|
+
/* The Needs-you button (the app shell's dock): a dot, the words, the ink count, and which projects it covers. */
|
|
440
|
+
.k-dock-needs { display: grid; align-content: center; gap: 1px; box-sizing: border-box; width: 136px; min-height: 48px; margin: 0; padding: 0 12px; border-radius: 8px; border: 1px solid var(--so-field-line); background: var(--so-paper); color: var(--so-ink); text-align: left; white-space: nowrap; cursor: pointer; box-shadow: none; }
|
|
441
|
+
.k-dock-needs-l { display: inline-flex; align-items: center; gap: 7px; font: 500 14px/1.2 var(--so-font-sans); }
|
|
442
|
+
.k-dock-needs-s { overflow: hidden; text-overflow: ellipsis; font-size: 11.5px; color: var(--so-muted); padding-left: 14px; }
|
|
443
|
+
.k-dock-needs:focus-visible { outline: 2px solid var(--so-ring); outline-offset: 2px; }
|
|
444
|
+
|
|
445
|
+
/* ---------- Phone (760px and narrower) ---------- */
|
|
446
|
+
@media (max-width: 760px) {
|
|
447
|
+
.k-desk-only { display: none !important; }
|
|
448
|
+
.k-btn, .k-btn-sm { height: 44px; padding: 0 16px; font-size: 14px; }
|
|
449
|
+
.k-btn-icon, .k-btn-sm.k-btn-icon { width: 44px; padding: 0; }
|
|
450
|
+
.k-input.k-input, .k-textarea.k-textarea, .k-sel.k-sel { font-size: 16px; }
|
|
451
|
+
.k-input.k-input, .k-pop .k-input.k-input, .k-sel.k-sel, .k-selw.sm .k-sel { height: 44px; }
|
|
452
|
+
.k-selw::after { right: 13px; }
|
|
453
|
+
.k-seg > a, .k-seg > button { height: 44px; font-size: 13.5px; }
|
|
454
|
+
.k-tabs > button, .k-tabs > a { min-height: 44px; }
|
|
455
|
+
.k-disclose > summary { min-height: 44px; }
|
|
456
|
+
.k-facts a { display: inline-flex; align-items: center; min-height: 44px; }
|
|
457
|
+
.k-checks label, .k-switch { min-height: 44px; }
|
|
458
|
+
.k-opt { padding: 13px 14px; }
|
|
459
|
+
.k-radios { grid-template-columns: 1fr; }
|
|
460
|
+
.k-facts { grid-template-columns: 1fr; gap: 3px; }
|
|
461
|
+
.k-facts dd { margin-bottom: 8px; }
|
|
462
|
+
.k-tb { display: none; }
|
|
463
|
+
.k-ph { display: flex; align-items: center; gap: 2px; height: 52px; padding: 0 4px; position: sticky; top: 0; z-index: 8; background: var(--so-paper); border-bottom: 1px solid var(--so-line); }
|
|
464
|
+
.k-ph-t { flex: 1; min-width: 0; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 600 16px/1.2 var(--so-font-sans); padding-left: 4px; }
|
|
465
|
+
.k-grp { padding: 0 16px; }
|
|
466
|
+
.k-row { grid-template-columns: minmax(0, 1fr) auto; gap: 6px 12px; padding: 12px 16px; }
|
|
467
|
+
.k-row-c { grid-row: 2; grid-column: 1; display: flex; gap: 8px; align-items: center; min-width: 0; }
|
|
468
|
+
.k-row-t { grid-row: 1; grid-column: 1; white-space: normal; font-size: 14px; }
|
|
469
|
+
.k-row-d { grid-row: 3; grid-column: 1 / -1; white-space: normal; }
|
|
470
|
+
.k-row-m { display: none; }
|
|
471
|
+
.k-row-a { grid-row: 1 / 3; grid-column: 2; }
|
|
472
|
+
.k-row-a .k-btn { min-width: 0; padding: 0 12px; font-size: 13.5px; }
|
|
473
|
+
.k-row-a:empty { display: none; }
|
|
474
|
+
.k-row-msg { grid-column: 1 / -1; }
|
|
475
|
+
.k-tbp { display: flex; gap: 8px; align-items: center; padding: 10px 16px; border-bottom: 1px solid var(--so-line); background: var(--so-paper); }
|
|
476
|
+
.k-tbp > .k-selw { flex: 1; min-width: 0; }
|
|
477
|
+
.k-tbp { flex-wrap: wrap; }
|
|
478
|
+
.k-tbp > .k-filter { flex: 1 1 100%; width: auto; height: 44px; order: 2; }
|
|
479
|
+
.k-filter > input { font-size: 16px; }
|
|
480
|
+
.k-foot { padding: 12px 16px; }
|
|
481
|
+
.k-foot a { display: inline-flex; align-items: center; min-height: 44px; }
|
|
482
|
+
.k-colpager { display: block; margin: 10px 16px 0; overflow-x: auto; scrollbar-width: none; }
|
|
483
|
+
.k-colpager .k-seg > button, .k-colpager .k-seg > a { flex: 1; justify-content: center; padding: 0 8px; }
|
|
484
|
+
.k-board { grid-template-columns: minmax(0, 1fr); margin-top: 8px; }
|
|
485
|
+
.k-col { border-right: 0; display: none; }
|
|
486
|
+
.k-col.on { display: block; }
|
|
487
|
+
.k-col-h { display: none; }
|
|
488
|
+
.k-card { padding: 12px 16px; }
|
|
489
|
+
.k-step { font-size: 11px; }
|
|
490
|
+
.k-step-s { font-size: 10.5px; white-space: normal; }
|
|
491
|
+
.k-doc { padding: 14px 16px 40px; gap: 18px; }
|
|
492
|
+
.k-dh h1 { font-size: 20px; }
|
|
493
|
+
.k-backlink { display: none; }
|
|
494
|
+
/* The dock owns the screen's one primary; the card keeps the outcome and its context. */
|
|
495
|
+
.k-slot-acts .k-btn.k-btn-primary.k-docked { display: none; }
|
|
496
|
+
.k-slot-acts { min-height: 44px; }
|
|
497
|
+
.k-needs-item { grid-template-columns: minmax(0, 1fr); }
|
|
498
|
+
.k-needs-item .k-acts .k-btn { width: 100%; }
|
|
499
|
+
.k-pop { width: auto; }
|
|
500
|
+
.k-pop.as-sheet { left: 8px !important; right: 8px; top: auto !important; bottom: calc(8px + env(safe-area-inset-bottom)); border-radius: 14px; padding: 16px; max-height: calc(100dvh - 16px); overflow: auto; }
|
|
501
|
+
.k-pop .k-acts .k-btn { flex: 1; }
|
|
502
|
+
.k-drawer { top: auto; left: 8px; right: 8px; bottom: 8px; width: auto; max-height: calc(100dvh - 16px); }
|
|
503
|
+
.k-menu > button, .k-menu > a { min-height: 44px; font-size: 15px; }
|
|
504
|
+
.k-frow { grid-template-columns: minmax(0, 1fr); gap: 10px; padding: 12px 0; }
|
|
505
|
+
.k-frow.inline { grid-template-columns: minmax(0, 1fr) auto; }
|
|
506
|
+
.k-frow-c { justify-content: flex-start; }
|
|
507
|
+
.k-frow.inline .k-frow-c { justify-content: flex-end; }
|
|
508
|
+
.k-frow-c .k-input, .k-frow-c .k-selw { max-width: none; }
|
|
509
|
+
.k-frow .k-err { text-align: left; }
|
|
510
|
+
.k-frow-c .k-seg { width: 100%; }
|
|
511
|
+
.k-frow-c .k-seg > button { flex: 1; justify-content: center; }
|
|
512
|
+
.k-composer-ta.k-composer-ta { font-size: 16px; }
|
|
513
|
+
.k-composer-bar .k-btn-sm { height: 44px; }
|
|
514
|
+
/* Every composer control is a real 44px target; the circles stay drawn at 36px inside it. */
|
|
515
|
+
.k-send-slot, .k-send-slot .k-send { width: 44px; height: 44px; }
|
|
516
|
+
.k-send-slot .k-send { background: radial-gradient(circle, var(--so-ink) 17.5px, transparent 18px); }
|
|
517
|
+
.k-send[aria-disabled="true"], .k-composer:not(.has-text) .k-send:not(.k-stop) { background: radial-gradient(circle, var(--so-raised) 17.5px, transparent 18px); }
|
|
518
|
+
.k-send::before { content: none; }
|
|
519
|
+
.k-composer-plus { width: 44px; height: 44px; border: 0; background: radial-gradient(circle, transparent 15.5px, var(--so-line) 16px, var(--so-line) 16.5px, transparent 17px); }
|
|
520
|
+
.k-composer-chip { height: 44px; }
|
|
521
|
+
.k-composer-bar { gap: 2px; }
|
|
522
|
+
.k-composer-file button { width: 32px; height: 32px; }
|
|
523
|
+
.k-composer-dock { padding: 12px 16px 16px; }
|
|
524
|
+
html.kb-open .k-composer-dock { position: fixed; left: 0; right: 0; bottom: var(--kb, 0px); z-index: 13; }
|
|
525
|
+
html.kb-open .k-dock { display: none; }
|
|
526
|
+
.k-crow { grid-template-columns: 14px minmax(0, 1fr) 52px 48px; gap: 6px; font-size: 12.5px; }
|
|
527
|
+
.k-crow-lane { display: none; }
|
|
528
|
+
.k-timing.show-chart .k-crow { grid-template-columns: 14px 112px minmax(0, 1fr) 46px 44px; }
|
|
529
|
+
.k-timing.show-chart .k-crow-lane { display: block; }
|
|
530
|
+
.k-crow-w, .k-crow-s { font-size: 11.5px; }
|
|
531
|
+
.k-nf .k-empty { padding: 28px 16px; }
|
|
532
|
+
.k-settings { display: block; }
|
|
533
|
+
.k-snav { display: none; }
|
|
534
|
+
.k-sbody { padding: 18px 16px 40px; }
|
|
535
|
+
.k-dock { display: flex; gap: 8px; align-items: stretch; position: fixed; left: 0; right: 0; bottom: 0; z-index: 12; padding: 10px 12px calc(10px + env(safe-area-inset-bottom)); background: var(--so-paper); border-top: 1px solid var(--so-line); }
|
|
536
|
+
.k-dock-primary { flex: 1; display: flex; }
|
|
537
|
+
.k-dock-primary .k-btn { width: 100%; }
|
|
538
|
+
}
|
|
539
|
+
@media (min-width: 761px) { .k-phone-only { display: none !important; } }
|
|
540
|
+
|
|
541
|
+
/* ---------- Pages outside the shell: sign in, first account, invite, an error (Wave E) ---------- */
|
|
542
|
+
/* One narrow column on paper: the brand, the one h1, the form or the facts, a foot line under a hairline. */
|
|
543
|
+
body:has(.k-out) { background: var(--so-paper); }
|
|
544
|
+
main:has(> .k-out) { max-width: none; margin: 0; padding: 0; }
|
|
545
|
+
.k-out { box-sizing: border-box; min-height: 100dvh; display: grid; align-content: center; justify-items: center; gap: 20px; padding: 48px 16px 64px; }
|
|
546
|
+
.k-out-c { box-sizing: border-box; width: 100%; max-width: 380px; display: grid; gap: 18px; min-width: 0; }
|
|
547
|
+
.k-out-brand { display: inline-flex; align-items: center; gap: 8px; justify-self: start; margin: 0 0 10px; color: var(--so-ink); font: 600 14px/1 var(--so-font-sans); letter-spacing: -0.01em; text-decoration: none; }
|
|
548
|
+
.k-out h1 { margin: 0; font: 600 24px/1.3 var(--so-font-sans); letter-spacing: -0.02em; color: var(--so-ink); }
|
|
549
|
+
.k-out-sub { margin: -8px 0 0; color: var(--so-muted); font-size: 13px; line-height: 1.5; }
|
|
550
|
+
.k-out-sub b { color: var(--so-ink); font-weight: 600; }
|
|
551
|
+
.k-out-note { margin: -6px 0 0; padding: 8px 10px; border-radius: 7px; background: var(--so-raised); font-size: 13px; line-height: 1.5; color: var(--so-ink); }
|
|
552
|
+
.k-out-f { box-sizing: border-box; width: 100%; max-width: 380px; margin: 0; padding-top: 14px; border-top: 1px solid var(--so-line); color: var(--so-muted); font-size: 12px; line-height: 1.6; }
|
|
553
|
+
.k-out-f code, .k-out .k-mono { font-family: var(--so-font-mono); font-size: 12px; }
|
|
554
|
+
.k-out .k-facts { padding: 12px 0; border-top: 1px solid var(--so-line); border-bottom: 1px solid var(--so-line); grid-template-columns: 96px minmax(0, 1fr); }
|
|
555
|
+
.k-out .k-slots { padding: 16px; }
|
|
556
|
+
.k-out .k-slot-acts:empty, .k-out .k-slot-terms:empty { display: none; }
|
|
557
|
+
.k-form { display: grid; gap: 14px; margin: 0; min-width: 0; }
|
|
558
|
+
.k-form .k-input.k-input { height: 36px; }
|
|
559
|
+
.k-btn.k-wide { width: 100%; height: 36px; }
|
|
560
|
+
.k-out .k-disclose > summary { min-height: 32px; }
|
|
561
|
+
|
|
562
|
+
/* A refusal's words come from many callers; its first letter is always a capital. */
|
|
563
|
+
.k-refusal .k-empty-t::first-letter, .k-refusal .k-notice > span::first-letter { text-transform: uppercase; }
|
|
564
|
+
|
|
565
|
+
/* A composer's note can follow its switch: k-on-note while it is on, k-off-note while it is off (no script). */
|
|
566
|
+
.k-composer .k-off-note { display: none; }
|
|
567
|
+
.k-composer:has(.k-switch-input):not(:has(.k-switch-input:checked)) .k-on-note { display: none; }
|
|
568
|
+
.k-composer:has(.k-switch-input):not(:has(.k-switch-input:checked)) .k-off-note { display: inline; }
|
|
569
|
+
|
|
570
|
+
/* The composer's focus is the box's (KIT.md): the workspace's own :focus-visible ring never lands on its textarea. */
|
|
571
|
+
.k-composer .k-composer-ta.k-composer-ta:focus-visible { outline: none; box-shadow: none; }
|
|
572
|
+
|
|
573
|
+
/* An approval form that carries its terms fills the slots' actions row. */
|
|
574
|
+
.k-slot-acts > form.k-approve.k-form { flex: 1 1 100%; min-width: 0; }
|
|
575
|
+
|
|
576
|
+
/* ---------- Guided steps: the first run's checklist (Wave E) ---------- */
|
|
577
|
+
.k-check { display: grid; margin: 0; padding: 0; list-style: none; border-top: 1px solid var(--so-line); }
|
|
578
|
+
.k-check-row { display: grid; grid-template-columns: 20px minmax(0, 1fr) auto; gap: 12px; align-items: center; min-height: 56px; margin: 0; padding: 10px 0; border-bottom: 1px solid var(--so-line); }
|
|
579
|
+
.k-check-mark { box-sizing: border-box; width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid var(--so-field-line); display: grid; place-items: center; background: var(--so-paper); }
|
|
580
|
+
.k-check-mark.ok { background: var(--so-success); border-color: var(--so-success); color: var(--so-paper); }
|
|
581
|
+
.k-check-mark.ok .k-i { width: 11px; height: 11px; stroke-width: 3; }
|
|
582
|
+
.k-check-mark.run { border-color: var(--so-info); background: color-mix(in srgb, var(--so-info) 22%, transparent); }
|
|
583
|
+
.k-check-t { display: grid; gap: 2px; min-width: 0; }
|
|
584
|
+
.k-check-t b { font-weight: 600; font-size: 13.5px; color: var(--so-ink); }
|
|
585
|
+
.k-check-row.done .k-check-t b { font-weight: 500; color: var(--so-muted); }
|
|
586
|
+
.k-check-t > span { font-size: 12.5px; line-height: 1.45; color: var(--so-muted); overflow-wrap: anywhere; }
|
|
587
|
+
.k-check-a { display: flex; justify-content: flex-end; }
|
|
588
|
+
.k-check-a .k-btn { min-width: 108px; }
|
|
589
|
+
.k-hello { display: grid; gap: 6px; }
|
|
590
|
+
.k-hello h1, .k-hello h2 { margin: 0; font: 600 20px/1.3 var(--so-font-sans); letter-spacing: -0.015em; color: var(--so-ink); }
|
|
591
|
+
.k-hello p { margin: 0; font-size: 13px; color: var(--so-muted); }
|
|
592
|
+
|
|
593
|
+
/* ---------- Ideas: one tap drafts the words into the composer above (Wave E) ---------- */
|
|
594
|
+
.k-ideas { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; padding: 0; }
|
|
595
|
+
.k-btn.k-idea { height: auto; min-height: 36px; padding: 6px 14px; border-radius: 999px; border-color: var(--so-line); font-weight: 400; white-space: normal; text-align: left; }
|
|
596
|
+
@media (pointer: coarse) { .k-btn.k-idea { min-height: 44px; } }
|
|
597
|
+
|
|
598
|
+
@media (max-width: 760px) {
|
|
599
|
+
.k-out { align-content: start; padding-top: 32px; }
|
|
600
|
+
.k-form .k-input.k-input, .k-btn.k-wide { height: 44px; }
|
|
601
|
+
.k-out-brand { min-height: 44px; margin-bottom: 0; }
|
|
602
|
+
.k-out .k-facts { grid-template-columns: 1fr; }
|
|
603
|
+
.k-out .k-disclose > summary { min-height: 44px; }
|
|
604
|
+
.k-check-row { grid-template-columns: 20px minmax(0, 1fr); }
|
|
605
|
+
.k-check-a { grid-column: 2; justify-content: flex-start; }
|
|
606
|
+
.k-check-a:empty, .k-check-a:not(:has(.k-btn:not(.k-docked))) { display: none; }
|
|
607
|
+
.k-btn.k-idea { min-height: 44px; padding: 10px 14px; font-size: 14px; }
|
|
608
|
+
/* The dock carries the screen's one primary: the step's copy of it hides, and the column clears the dock. */
|
|
609
|
+
.k-check-a .k-btn.k-docked { display: none; }
|
|
610
|
+
.k-doc:has(~ .k-dock) { padding-bottom: 96px; }
|
|
611
|
+
/* A form whose send the phone dock carries: the box keeps its words, the dock its one primary. */
|
|
612
|
+
.k-dock-send .k-composer .k-send-slot { display: none; }
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/* ---------- Reduced motion changes presentation only ---------- */
|
|
616
|
+
@media (prefers-reduced-motion: reduce) {
|
|
617
|
+
.k-btn, .k-send, .k-composer, .k-composer-plus, .k-composer-chip, .k-trk, .k-trk::after, .k-tabs > *, .k-slots, .k-crow-bar { transition: none; }
|
|
618
|
+
.k-steps-fill { transition: none; }
|
|
619
|
+
.k-grow-in, .k-msg-in, .k-swap-in, .k-scrim, .k-btn.swap .k-face, .k-check-draw path, .k-composer .k-i { animation: none !important; }
|
|
620
|
+
.k-check-draw path { stroke-dashoffset: 0; }
|
|
621
|
+
.k-spin { animation: none; border-right-color: currentColor; opacity: .5; }
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/* ---------- Settings pages (wave D): sections, link rows, records, section saves ---------- */
|
|
625
|
+
.k-ssec { display: grid; align-content: start; min-width: 0; scroll-margin-top: 64px; }
|
|
626
|
+
.k-ssec-state { font-weight: 400; font-size: 12.5px; color: var(--so-muted); }
|
|
627
|
+
.k-ssec-lead { margin: 0; padding: 10px 0 2px; font-size: 12.5px; color: var(--so-muted); line-height: 1.5; max-width: 66ch; }
|
|
628
|
+
.k-ssec > .k-note, .k-ssec > .k-notice { margin-top: 10px; }
|
|
629
|
+
.k-slinks { display: grid; }
|
|
630
|
+
.k-slink { display: grid; grid-template-columns: 20px minmax(0, 1fr) auto 16px; gap: 4px 12px; align-items: center; min-height: 56px; padding: 10px 0; border-bottom: 1px solid var(--so-line); color: var(--so-ink); text-decoration: none; }
|
|
631
|
+
.k-slink.noico { grid-template-columns: minmax(0, 1fr) auto 16px; }
|
|
632
|
+
.k-slink > .k-i { color: var(--so-muted); }
|
|
633
|
+
.k-sl { display: grid; gap: 3px; min-width: 0; }
|
|
634
|
+
.k-sl-t { display: inline-flex; align-items: center; gap: 8px 10px; flex-wrap: wrap; font-weight: 500; font-size: 13px; min-width: 0; overflow-wrap: anywhere; }
|
|
635
|
+
.k-sl-h { font-size: 12.5px; color: var(--so-muted); line-height: 1.45; overflow-wrap: anywhere; }
|
|
636
|
+
.k-slink-r { display: flex; align-items: center; gap: 8px; }
|
|
637
|
+
.k-chev { width: 7px; height: 7px; border: solid var(--so-muted); border-width: 1.5px 1.5px 0 0; transform: rotate(45deg); justify-self: center; }
|
|
638
|
+
.k-sflag { display: inline-flex; align-items: center; gap: 6px; font: 500 12px/1 var(--so-font-sans); color: var(--so-neutral-ink); }
|
|
639
|
+
.k-sflag::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--so-needs); }
|
|
640
|
+
.k-srec { display: grid; grid-template-columns: minmax(0, 1fr) auto 124px; gap: 4px 16px; align-items: center; min-height: 52px; padding: 10px 0; border-bottom: 1px solid var(--so-line); }
|
|
641
|
+
.k-srec-when { font-size: 12px; color: var(--so-muted); white-space: nowrap; }
|
|
642
|
+
.k-srec-a { display: flex; justify-content: flex-end; gap: 8px; }
|
|
643
|
+
.k-srec-a .k-btn { min-width: 108px; }
|
|
644
|
+
.k-srec-more { grid-column: 1 / -1; min-width: 0; }
|
|
645
|
+
.k-srec-more:empty { display: none; }
|
|
646
|
+
.k-scode { display: block; justify-self: start; max-width: 100%; box-sizing: border-box; margin: 8px 0 0; padding: 8px 10px; border-radius: 7px; background: var(--so-raised); font: 12px/1.5 var(--so-font-mono); overflow-wrap: anywhere; user-select: all; }
|
|
647
|
+
.k-sform { display: grid; min-width: 0; margin: 0; }
|
|
648
|
+
.k-sform fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
|
|
649
|
+
.k-ssave { display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 8px 0; background: var(--so-paper); }
|
|
650
|
+
.k-ssave-said { flex: 1; min-width: 0; font-size: 12.5px; color: var(--so-muted); }
|
|
651
|
+
.k-ssave .k-btn { min-width: 96px; }
|
|
652
|
+
.k-sform[data-dirty] .k-ssave { position: sticky; bottom: 0; z-index: 2; border-top: 1px solid var(--so-line); }
|
|
653
|
+
.k-sform[data-dirty] .k-ssave-said { color: var(--so-ink); font-weight: 500; }
|
|
654
|
+
.k-ssave-err:empty { display: none; }
|
|
655
|
+
.k-ssave-err .k-notice { margin: 0 0 8px; }
|
|
656
|
+
.k-sproof label, .k-sproof .k-field { display: grid; gap: 6px; margin: 8px 0 0; font: var(--so-typography-caption); color: var(--so-ink); max-width: 320px; }
|
|
657
|
+
.k-sproof input[type="password"] { box-sizing: border-box; width: 100%; height: 32px; min-height: 0; margin: 0; padding: 0 10px; border: 1px solid var(--so-field-line); border-radius: 8px; background: var(--so-paper); color: var(--so-ink); font: 400 13px/1.4 var(--so-font-sans); box-shadow: none; }
|
|
658
|
+
.k-pop .k-sproof label { margin: 0; max-width: none; }
|
|
659
|
+
html.k-js .k-sform > .k-sproof { display: none; }
|
|
660
|
+
html.k-js .k-sform[data-k-gate]:not([data-dirty]) .k-ssave .k-btn { display: none; }
|
|
661
|
+
html.k-js .k-sform[data-k-gate]:not([data-dirty]) .k-ssave:has(.k-ssave-said:empty) { display: none; }
|
|
662
|
+
.k-sopts { display: grid; gap: 8px; padding: 10px 0; }
|
|
663
|
+
.k-sopt { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 10px; align-items: start; min-height: 32px; font-size: 13px; color: var(--so-ink); cursor: pointer; }
|
|
664
|
+
.k-sopt input { margin: 2px 0 0; accent-color: var(--so-ink); }
|
|
665
|
+
.k-sopt b { display: block; font-weight: 500; }
|
|
666
|
+
.k-sopt span span { display: block; color: var(--so-muted); font-size: 12.5px; line-height: 1.45; }
|
|
667
|
+
.k-secret-val { display: block; padding: 8px 10px; border-radius: 7px; background: var(--so-raised); font: 12.5px/1.4 var(--so-font-mono); overflow-wrap: anywhere; user-select: all; }
|
|
668
|
+
@media (hover: hover) and (pointer: fine) {
|
|
669
|
+
.k-slink:hover .k-sl-t > span:first-child { text-decoration: underline; text-decoration-color: var(--so-field-line); text-underline-offset: 3px; }
|
|
670
|
+
}
|
|
671
|
+
@media (max-width: 760px) {
|
|
672
|
+
.k-slink { min-height: 64px; padding: 12px 0; }
|
|
673
|
+
.k-srec { grid-template-columns: minmax(0, 1fr) auto; }
|
|
674
|
+
.k-srec-when { grid-column: 1; }
|
|
675
|
+
.k-srec-a { grid-column: 2; grid-row: 1 / span 2; }
|
|
676
|
+
.k-srec-a .k-btn { min-width: 0; }
|
|
677
|
+
.k-ssave .k-btn { min-height: 44px; }
|
|
678
|
+
.k-sproof input[type="password"] { height: 44px; font-size: 16px; }
|
|
679
|
+
.k-sproof label { max-width: none; }
|
|
680
|
+
.k-sopt { min-height: 44px; }
|
|
681
|
+
}
|
|
682
|
+
.k-srec-a .k-sform { display: block; }
|
|
683
|
+
.k-srec-a .k-ssave { min-height: 0; padding: 0; background: none; }
|
|
684
|
+
.k-srec-a .k-ssave-said:empty { display: none; }
|
|
685
|
+
pre.k-scode { white-space: pre-wrap; }
|