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.
Files changed (171) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/agents-board.d.ts +12 -0
  3. package/dist/agents-board.js +26 -0
  4. package/dist/approval-rules-ui.d.ts +4 -1
  5. package/dist/approval-rules-ui.js +31 -15
  6. package/dist/assignment-ui.js +1 -1
  7. package/dist/backup-ui.d.ts +5 -4
  8. package/dist/backup-ui.js +65 -32
  9. package/dist/browser/terminal.css +1 -1
  10. package/dist/browser/terminal.js +57 -54
  11. package/dist/browser/workspace.css +2 -2
  12. package/dist/browser/workspace.js +35 -70
  13. package/dist/browser-crew.js +1 -1
  14. package/dist/browser-workspace.d.ts +329 -183
  15. package/dist/browser-workspace.js +10 -9
  16. package/dist/chat-controls.d.ts +1 -1
  17. package/dist/chat-controls.js +1 -1
  18. package/dist/chat-settings-page.d.ts +29 -9
  19. package/dist/chat-settings-page.js +59 -28
  20. package/dist/check-levels-ui.d.ts +2 -1
  21. package/dist/check-levels-ui.js +67 -58
  22. package/dist/contracts/cli.d.ts +43 -0
  23. package/dist/contracts/cli.js +4 -0
  24. package/dist/contracts/console-api.d.ts +1 -1
  25. package/dist/contracts/console-api.js +1 -1
  26. package/dist/credentials-ui.d.ts +5 -3
  27. package/dist/credentials-ui.js +58 -31
  28. package/dist/design/kit.css +685 -0
  29. package/dist/design/kit.d.ts +208 -0
  30. package/dist/design/kit.js +177 -0
  31. package/dist/design/tokens.css +19 -1
  32. package/dist/discord-settings.js +8 -4
  33. package/dist/export-ui.d.ts +6 -4
  34. package/dist/export-ui.js +18 -8
  35. package/dist/flow-changed.d.ts +14 -0
  36. package/dist/flow-changed.js +53 -0
  37. package/dist/flow-gallery-ui.d.ts +41 -4
  38. package/dist/flow-gallery-ui.js +95 -63
  39. package/dist/flow-starters-ui.d.ts +3 -9
  40. package/dist/flow-starters-ui.js +12 -23
  41. package/dist/flow-unattended-words.d.ts +20 -0
  42. package/dist/flow-unattended-words.js +24 -0
  43. package/dist/flow-unattended.d.ts +9 -5
  44. package/dist/flow-unattended.js +45 -23
  45. package/dist/flows-cli.js +7 -3
  46. package/dist/flows-ui.d.ts +12 -6
  47. package/dist/flows-ui.js +141 -30
  48. package/dist/integrations-ui.d.ts +6 -4
  49. package/dist/integrations-ui.js +34 -40
  50. package/dist/integrations.d.ts +2 -2
  51. package/dist/integrations.js +4 -4
  52. package/dist/kits-ui.d.ts +8 -10
  53. package/dist/kits-ui.js +29 -33
  54. package/dist/kits.js +1 -1
  55. package/dist/knowledge-ui.js +76 -19
  56. package/dist/ledger-view.d.ts +2 -0
  57. package/dist/ledger-view.js +41 -38
  58. package/dist/models-ui.d.ts +8 -3
  59. package/dist/models-ui.js +82 -59
  60. package/dist/monitoring-ui.d.ts +4 -2
  61. package/dist/monitoring-ui.js +44 -13
  62. package/dist/needs-you.d.ts +1 -1
  63. package/dist/needs-you.js +8 -0
  64. package/dist/operate-remote-arguments.js +1 -0
  65. package/dist/operate-remote.js +1 -1
  66. package/dist/operate.d.ts +1 -1
  67. package/dist/operate.js +38 -4
  68. package/dist/passwordless.d.ts +1 -1
  69. package/dist/passwordless.js +1 -1
  70. package/dist/people-audit-ui.d.ts +2 -1
  71. package/dist/people-audit-ui.js +25 -23
  72. package/dist/policy-ui.d.ts +3 -2
  73. package/dist/policy-ui.js +27 -21
  74. package/dist/policy.d.ts +3 -0
  75. package/dist/policy.js +14 -1
  76. package/dist/project-delete-ui.d.ts +4 -2
  77. package/dist/project-delete-ui.js +135 -126
  78. package/dist/project-knowledge.d.ts +10 -10
  79. package/dist/publish.d.ts +11 -0
  80. package/dist/publish.js +16 -3
  81. package/dist/pull-request-ui.d.ts +2 -1
  82. package/dist/pull-request-ui.js +39 -28
  83. package/dist/recipe-ui.d.ts +4 -2
  84. package/dist/recipe-ui.js +14 -4
  85. package/dist/release-adapters.d.ts +3 -0
  86. package/dist/release-adapters.js +22 -2
  87. package/dist/release-cli.js +81 -9
  88. package/dist/release.d.ts +21 -0
  89. package/dist/release.js +40 -4
  90. package/dist/releases.js +1 -1
  91. package/dist/request-budget-ui.d.ts +4 -2
  92. package/dist/request-budget-ui.js +30 -19
  93. package/dist/retention-ui.d.ts +4 -3
  94. package/dist/retention-ui.js +15 -12
  95. package/dist/scope.d.ts +3 -0
  96. package/dist/scope.js +6 -0
  97. package/dist/serve.d.ts +0 -1
  98. package/dist/serve.js +51 -7
  99. package/dist/server/agents-computers.d.ts +9 -0
  100. package/dist/server/agents-computers.js +67 -0
  101. package/dist/server/chat.js +16 -16
  102. package/dist/server/chrome.d.ts +1 -1
  103. package/dist/server/chrome.js +19 -9
  104. package/dist/server/console.css +2 -2
  105. package/dist/server/flows.js +64 -36
  106. package/dist/server/home.d.ts +35 -0
  107. package/dist/server/home.js +104 -0
  108. package/dist/server/http.d.ts +3 -0
  109. package/dist/server/http.js +5 -0
  110. package/dist/server/kit-standalone.d.ts +22 -0
  111. package/dist/server/kit-standalone.js +69 -0
  112. package/dist/server/kit.d.ts +405 -0
  113. package/dist/server/kit.js +361 -0
  114. package/dist/server/pages.d.ts +2 -1
  115. package/dist/server/pages.js +213 -174
  116. package/dist/server/people-tokens.js +26 -85
  117. package/dist/server/render-history.d.ts +51 -0
  118. package/dist/server/render-history.js +228 -0
  119. package/dist/server/render-new-task.d.ts +29 -0
  120. package/dist/server/render-new-task.js +96 -0
  121. package/dist/server/render-next.d.ts +63 -0
  122. package/dist/server/render-next.js +109 -0
  123. package/dist/server/render-pages.d.ts +22 -190
  124. package/dist/server/render-pages.js +123 -575
  125. package/dist/server/render-people.d.ts +24 -3
  126. package/dist/server/render-people.js +93 -72
  127. package/dist/server/render-projects.d.ts +103 -0
  128. package/dist/server/render-projects.js +247 -0
  129. package/dist/server/render-results.d.ts +5 -24
  130. package/dist/server/render-results.js +48 -185
  131. package/dist/server/render-settings.d.ts +5 -74
  132. package/dist/server/render-settings.js +102 -493
  133. package/dist/server/render-tasks.d.ts +35 -5
  134. package/dist/server/render-tasks.js +114 -85
  135. package/dist/server/route-table.js +20 -5
  136. package/dist/server/settings.js +276 -255
  137. package/dist/server/task-views.d.ts +8 -0
  138. package/dist/server/task-views.js +85 -2
  139. package/dist/server/tasks.d.ts +8 -0
  140. package/dist/server/tasks.js +95 -40
  141. package/dist/server/terminals.js +1 -1
  142. package/dist/server/welcome.d.ts +22 -0
  143. package/dist/server/welcome.js +69 -0
  144. package/dist/settings-groups-ui.d.ts +279 -0
  145. package/dist/settings-groups-ui.js +615 -0
  146. package/dist/settings-kit.d.ts +42 -6
  147. package/dist/settings-kit.js +69 -7
  148. package/dist/setup-guide.d.ts +2 -2
  149. package/dist/skills-ui.js +59 -7
  150. package/dist/slack-settings.js +12 -5
  151. package/dist/spend-ui.d.ts +45 -26
  152. package/dist/spend-ui.js +124 -56
  153. package/dist/sso-ui.d.ts +5 -2
  154. package/dist/sso-ui.js +63 -31
  155. package/dist/storage-ui.d.ts +3 -2
  156. package/dist/storage-ui.js +56 -50
  157. package/dist/store.d.ts +112 -3
  158. package/dist/store.js +292 -20
  159. package/dist/surface.js +5 -1
  160. package/dist/teams-settings.d.ts +2 -1
  161. package/dist/teams-settings.js +24 -41
  162. package/dist/telegram-settings.d.ts +0 -4
  163. package/dist/telegram-settings.js +52 -25
  164. package/dist/toolroll-update-ui.d.ts +8 -4
  165. package/dist/toolroll-update-ui.js +55 -45
  166. package/dist/tools-ui.d.ts +5 -3
  167. package/dist/tools-ui.js +107 -42
  168. package/dist/work-index.js +11 -7
  169. package/dist/workspace-ui.d.ts +1 -1
  170. package/dist/workspace-ui.js +7 -4
  171. 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; }