@k2b/cloud 0.38.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/README.md +8 -0
  2. package/package.json +12 -5
  3. package/scripts/build-canvas-workers.ts +109 -29
  4. package/scripts/build.ts +3 -5
  5. package/src/_internal/app-favicon.ts +4 -2
  6. package/src/_internal/app-path.ts +25 -0
  7. package/src/_internal/app-presentation.ts +4 -0
  8. package/src/_internal/canvas-worker.ts +5 -3
  9. package/src/_internal/capabilities.ts +72 -48
  10. package/src/_internal/capability-reviews.ts +81 -0
  11. package/src/_internal/capability-schemas.ts +29 -0
  12. package/src/_internal/capability-sentences.ts +216 -1
  13. package/src/_internal/capability-streams.ts +7 -0
  14. package/src/_internal/define-app.ts +63 -16
  15. package/src/_internal/font-preloads.ts +2 -1
  16. package/src/_internal/panel-cookie.ts +39 -0
  17. package/src/_internal/registry-validation.ts +21 -26
  18. package/src/_internal/runtime-context.ts +1 -0
  19. package/src/_internal/runtime-watcher.ts +6 -0
  20. package/src/_internal/static-assets.ts +52 -3
  21. package/src/_internal/status-preserving-ssr.ts +2 -0
  22. package/src/access/PermissionEditor.browser-harness.tsx +57 -38
  23. package/src/access/PermissionEditor.tsx +32 -7
  24. package/src/access/ResourceApiKeys.tsx +5 -1
  25. package/src/account/EntitySearch.tsx +1 -1
  26. package/src/ai/action-review.ts +101 -0
  27. package/src/ai/approval-routes.ts +5 -2
  28. package/src/ai/approvals.ts +139 -28
  29. package/src/ai/background-review.ts +72 -0
  30. package/src/ai/browser.ts +10 -0
  31. package/src/ai/capabilities.ts +29 -11
  32. package/src/ai/capability-execution.ts +76 -43
  33. package/src/ai/capability-result.ts +95 -0
  34. package/src/ai/chat/action-card.ts +398 -0
  35. package/src/ai/chat/action-messages.ts +129 -0
  36. package/src/ai/chat/action-question.browser-harness.tsx +245 -0
  37. package/src/ai/chat/action-question.fixtures.ts +733 -0
  38. package/src/ai/chat/action-question.tsx +669 -0
  39. package/src/ai/chat/action-sentences.ts +1 -44
  40. package/src/ai/chat/blocks.tsx +19 -25
  41. package/src/ai/chat/message-actions.tsx +6 -0
  42. package/src/ai/chat/tool-action.tsx +481 -0
  43. package/src/ai/chat/turn-view.tsx +45 -163
  44. package/src/ai/chat/view-block.tsx +22 -7
  45. package/src/ai/chat-task-contracts.ts +31 -3
  46. package/src/ai/chat-task-reasons-migrate.ts +75 -0
  47. package/src/ai/chat-task-reasons.ts +92 -0
  48. package/src/ai/chat-tasks.ts +438 -78
  49. package/src/ai/client/controller.ts +59 -0
  50. package/src/ai/default-tools.ts +9 -1
  51. package/src/ai/executor.ts +190 -39
  52. package/src/ai/index.ts +14 -0
  53. package/src/ai/migrate.ts +39 -4
  54. package/src/ai/projects-routes.ts +3 -0
  55. package/src/ai/protocol.ts +14 -2
  56. package/src/ai/recent-resources.ts +240 -0
  57. package/src/ai/recent-sent-refs.ts +38 -0
  58. package/src/ai/request-context.ts +7 -1
  59. package/src/ai/routes.ts +172 -2
  60. package/src/ai/runtime.ts +13 -27
  61. package/src/ai/skills-routes.ts +3 -0
  62. package/src/ai/skills.ts +10 -1
  63. package/src/ai/store.ts +232 -27
  64. package/src/ai/timeline.ts +9 -1
  65. package/src/ai/tool-audit.ts +8 -0
  66. package/src/ai/tool-wording.ts +67 -0
  67. package/src/ai/turn-abort.ts +33 -0
  68. package/src/ai/types.ts +40 -4
  69. package/src/api/accounts-entities.ts +2 -1
  70. package/src/api/admin-ai-projects.ts +2 -0
  71. package/src/api/admin-ai-skills.ts +2 -0
  72. package/src/api/admin-ai-usage.ts +2 -0
  73. package/src/api/admin-core-settings.ts +190 -139
  74. package/src/api/admin-geoip.ts +80 -0
  75. package/src/api/admin-identity.ts +3 -0
  76. package/src/api/admin-lifecycle.ts +3 -0
  77. package/src/api/admin-outgoing-mail.ts +6 -2
  78. package/src/api/app-approval.ts +54 -6
  79. package/src/api/approvals-loader.ts +23 -1
  80. package/src/api/approvals.ts +3 -1
  81. package/src/api/auth.ts +25 -6
  82. package/src/api/capabilities.ts +44 -11
  83. package/src/api/capability-streams.ts +12 -0
  84. package/src/api/help.ts +4 -28
  85. package/src/api/index.ts +7 -1
  86. package/src/api/lasting-access-messages.ts +17 -0
  87. package/src/api/mcp.ts +3 -0
  88. package/src/api/me-panel-consent.ts +71 -0
  89. package/src/api/me.ts +80 -33
  90. package/src/api/search.ts +3 -1
  91. package/src/api/sync-ops.ts +2 -0
  92. package/src/api/widgets.ts +3 -0
  93. package/src/approvals/Approvals.tsx +180 -238
  94. package/src/approvals/messages.ts +12 -24
  95. package/src/browser/CloudResourceSearch.browser-harness.tsx +10 -2
  96. package/src/browser/CloudResourceSearch.tsx +10 -6
  97. package/src/browser/app-approval.ts +60 -6
  98. package/src/browser/commands.ts +22 -6
  99. package/src/browser/composer-catalog.ts +145 -0
  100. package/src/browser/composer-insert-messages.ts +31 -0
  101. package/src/browser/composer-insert.ts +160 -0
  102. package/src/browser/composer-open-messages.ts +17 -0
  103. package/src/browser/composer-open.ts +110 -0
  104. package/src/browser/discoverable-command.ts +6 -0
  105. package/src/browser/hints.ts +6 -0
  106. package/src/browser/live-connection.ts +26 -2
  107. package/src/browser/navigation-apps.ts +7 -0
  108. package/src/browser/panel-context-bridge.ts +30 -0
  109. package/src/browser/panel-context-receiver.ts +53 -0
  110. package/src/browser/panel-menu.tsx +56 -0
  111. package/src/browser/panel-messages.ts +35 -0
  112. package/src/browser/panel-shortcuts.ts +31 -0
  113. package/src/browser/panel-slot.ts +756 -0
  114. package/src/browser/panel.ts +65 -0
  115. package/src/browser/resource-picker.tsx +12 -1
  116. package/src/browser/search-commands.ts +6 -3
  117. package/src/capabilities/client.ts +8 -2
  118. package/src/capabilities/reviews.ts +205 -0
  119. package/src/capabilities/server.ts +10 -3
  120. package/src/capabilities/testing.ts +47 -0
  121. package/src/capabilities/types.ts +2 -2
  122. package/src/cli/account.ts +13 -3
  123. package/src/cli/admin/geoip.ts +115 -0
  124. package/src/cli/admin/index.ts +3 -0
  125. package/src/contracts/app-approval.ts +159 -12
  126. package/src/contracts/app.ts +14 -0
  127. package/src/contracts/approvals.ts +2 -2
  128. package/src/contracts/capabilities.ts +410 -18
  129. package/src/contracts/geoip.ts +42 -0
  130. package/src/contracts/index.ts +3 -0
  131. package/src/contracts/panel-context-plain.ts +99 -0
  132. package/src/contracts/panel-context.ts +93 -0
  133. package/src/contracts/registry.ts +3 -1
  134. package/src/contracts/seen-hints.ts +35 -0
  135. package/src/contracts/shared.ts +2 -0
  136. package/src/server/client-ip.ts +5 -0
  137. package/src/server/help-payload.ts +38 -0
  138. package/src/server/middleware/auth.ts +11 -1
  139. package/src/server/middleware/middleware.ts +9 -0
  140. package/src/server/middleware/no-transform.ts +19 -0
  141. package/src/server/middleware/rate-limit.ts +4 -6
  142. package/src/server/request-context/address.ts +45 -0
  143. package/src/server/request-context/geoip.ts +380 -0
  144. package/src/server/request-context/index.ts +33 -0
  145. package/src/server/request-context/user-agent.ts +95 -0
  146. package/src/server/services/access.ts +5 -1
  147. package/src/services/accounts/posix.ts +2 -1
  148. package/src/services/app-approval.ts +533 -90
  149. package/src/services/approvals/device.ts +9 -5
  150. package/src/services/approvals/index.ts +6 -5
  151. package/src/services/approvals/list.ts +26 -5
  152. package/src/services/auth-flows/notification-sender.ts +3 -0
  153. package/src/services/geoip/index.ts +164 -0
  154. package/src/services/geoip/store.ts +30 -0
  155. package/src/services/geoip/upload.ts +150 -0
  156. package/src/services/identity/routes.ts +5 -1
  157. package/src/services/index.ts +32 -3
  158. package/src/services/known-browsers.ts +312 -0
  159. package/src/services/login-address-store.ts +51 -0
  160. package/src/services/login-context.ts +118 -0
  161. package/src/services/mandates/index.ts +3 -0
  162. package/src/services/mandates/policy.ts +15 -3
  163. package/src/services/notifications/browser.ts +16 -5
  164. package/src/services/notifications/email-frame.ts +1 -1
  165. package/src/services/oauth-tokens.ts +16 -2
  166. package/src/services/panel-context-consent.ts +58 -0
  167. package/src/services/pdf/image-protocol.ts +135 -0
  168. package/src/services/pdf/image-variants.ts +124 -0
  169. package/src/services/pdf/image-worker.ts +31 -0
  170. package/src/services/pdf/image.ts +109 -0
  171. package/src/services/pdf/index.ts +9 -0
  172. package/src/services/service-account-credentials.ts +21 -0
  173. package/src/services/session/index.ts +97 -16
  174. package/src/services/session/recent.ts +13 -0
  175. package/src/services/settings/api.ts +11 -6
  176. package/src/services/settings/app.ts +5 -4
  177. package/src/services/settings/core-settings.ts +4 -3
  178. package/src/services/settings/index.ts +19 -17
  179. package/src/services/settings/namespace.ts +2 -1
  180. package/src/services/settings/store.ts +83 -11
  181. package/src/services/webauthn.ts +12 -0
  182. package/src/shared/ai-platform-prompt.ts +1 -1
  183. package/src/shared/app-presentation.ts +1 -0
  184. package/src/shared/email-html.ts +2 -0
  185. package/src/shared/help.ts +3 -0
  186. package/src/shared/redirect.ts +12 -0
  187. package/src/shared-text/cursor.ts +22 -0
  188. package/src/shared-text/documents.ts +142 -0
  189. package/src/shared-text/events.ts +43 -0
  190. package/src/shared-text/index.ts +12 -0
  191. package/src/shared-text/log.ts +48 -0
  192. package/src/shared-text/text-diff.ts +23 -0
  193. package/src/shared-text/types.ts +41 -0
  194. package/src/ssr/AdminLayout.tsx +2 -0
  195. package/src/ssr/AppLaunchpadPanel.tsx +2 -2
  196. package/src/ssr/CloudShell.island.tsx +95 -10
  197. package/src/ssr/Layout.tsx +66 -10
  198. package/src/ssr/LayoutHeader.tsx +15 -9
  199. package/src/ssr/LayoutHelp.browser-harness.tsx +2 -0
  200. package/src/ssr/LayoutHelp.tsx +435 -274
  201. package/src/ssr/LayoutHelpPanel.browser-harness.tsx +136 -0
  202. package/src/ssr/LayoutHelpTrigger.tsx +27 -2
  203. package/src/ssr/LayoutRail.tsx +2 -2
  204. package/src/ssr/LayoutTabBar.tsx +29 -0
  205. package/src/ssr/MobileNavigation.tsx +2 -2
  206. package/src/ssr/PanelLayout.tsx +35 -0
  207. package/src/ssr/PanelRuntime.island.tsx +94 -0
  208. package/src/ssr/PanelSlot.tsx +158 -0
  209. package/src/ssr/PanelTrigger.tsx +49 -0
  210. package/src/ssr/ShellRuntime.island.tsx +69 -5
  211. package/src/ssr/app-appearance.ts +3 -2
  212. package/src/ssr/app-color.ts +105 -0
  213. package/src/ssr/app-launchpad.tsx +18 -1
  214. package/src/ssr/app-navigation.ts +28 -0
  215. package/src/ssr/compact-shell.baseline.json +5270 -0
  216. package/src/ssr/compact-shell.browser-harness.ts +439 -0
  217. package/src/ssr/dialog-app-colors.browser-harness.tsx +43 -0
  218. package/src/ssr/help-messages.ts +4 -0
  219. package/src/ssr/help.ts +20 -0
  220. package/src/ssr/hints.ts +25 -0
  221. package/src/ssr/index.ts +5 -0
  222. package/src/ssr/islands/index.ts +4 -3
  223. package/src/ssr/layout-context.ts +2 -0
  224. package/src/ssr/layout-help-article.server.ts +50 -0
  225. package/src/ssr/layout-help-start.ts +33 -7
  226. package/src/ssr/panel-consent.ts +29 -0
  227. package/src/ssr/panel-context.ts +10 -0
  228. package/src/ssr/panel-slot.browser-harness.tsx +159 -0
  229. package/src/ssr/platform-messages.ts +48 -0
  230. package/src/ssr/rail-navigation.ts +44 -0
  231. package/src/ssr/shell-data.tsx +5 -0
  232. package/src/ssr/shell-shortcuts.ts +13 -2
  233. package/src/styles/effects.css +201 -11
  234. package/src/styles/file-chooser.css +2 -1
  235. package/src/styles/global.css +314 -63
  236. package/src/styles/panel.css +416 -0
  237. package/src/styles/resource-search.css +6 -2
  238. package/src/styles/tokens.css +36 -13
  239. package/src/styles/utilities-buttons.css +3 -2
  240. package/src/styles/utilities-data.css +2 -1
  241. package/src/styles/utilities-feedback.css +2 -2
  242. package/src/styles/utilities-layout.css +3 -13
  243. package/src/styles/utilities-markdown-editor.css +6 -6
  244. package/src/styles/utilities-navigation.css +22 -43
@@ -104,6 +104,12 @@
104
104
  border-radius: var(--k2b-radius-control);
105
105
  }
106
106
 
107
+ /* An open question stands apart from the place before and after it; consecutive outcome lines stay together. */
108
+ .k2b-ui .ai-turn__action:has(.k2b-chat-decision__card) + .ai-turn__action,
109
+ .k2b-ui .ai-turn__action + .ai-turn__action:has(.k2b-chat-decision__card) {
110
+ margin-top: 1rem;
111
+ }
112
+
107
113
  .k2b-ui .ai-turn__action:focus {
108
114
  outline: none;
109
115
  }
@@ -113,6 +119,60 @@
113
119
  outline-offset: var(--k2b-focus-offset);
114
120
  }
115
121
 
122
+ /* Assistant questions and outcome lines (card v4), built from @k2b/ui Chat.Decision, Chat.Preview, and Chat.Outcome.
123
+ Only what an older review needs lives here: values that keep their line breaks, a Markdown block, and the call's
124
+ raw input on demand. Everything else is the shared primitives' look. */
125
+ .k2b-ui .cloud-action-preview__value {
126
+ white-space: pre-wrap;
127
+ overflow-wrap: anywhere;
128
+ }
129
+
130
+ .k2b-ui .cloud-action-preview__markdown {
131
+ min-width: 0;
132
+ color: var(--k2b-text-secondary);
133
+ font-size: inherit;
134
+ line-height: inherit;
135
+ }
136
+
137
+ .k2b-ui .cloud-action-preview__input {
138
+ display: grid;
139
+ min-width: 0;
140
+ justify-items: start;
141
+ gap: 0.5rem;
142
+ }
143
+
144
+ .k2b-ui .cloud-action-preview__input > [role="region"] {
145
+ width: 100%;
146
+ min-width: 0;
147
+ }
148
+
149
+ .k2b-ui .cloud-action-preview__raw {
150
+ max-height: 13rem;
151
+ margin: 0;
152
+ overflow: auto;
153
+ border-radius: var(--k2b-radius-control);
154
+ padding: 0.5rem;
155
+ color: var(--k2b-text);
156
+ background: var(--k2b-surface-muted);
157
+ box-shadow: var(--ui-control-recess);
158
+ font-size: 0.6875rem;
159
+ line-height: 1.45;
160
+ white-space: pre-wrap;
161
+ }
162
+
163
+ /* The review's other links continue the preview above them instead of starting a new block. */
164
+ .k2b-ui .k2b-chat-decision__card > .k2b-chat-preview + .cloud-action-preview__links {
165
+ margin-top: 0.25rem;
166
+ }
167
+
168
+ /* The approvals page: where a request waits stands above its card, quiet, on the card's edge. */
169
+ .k2b-ui .cloud-approvals .cloud-approval {
170
+ display: grid;
171
+ min-width: 0;
172
+ gap: 0.25rem;
173
+ grid-template-columns: minmax(0, 1fr);
174
+ }
175
+
116
176
  /* A pending approval: a calm tinted card in place 4 that says what will happen. Fields stack on phones and the
117
177
  decision buttons share the width there. */
118
178
  .k2b-ui .ai-approval {
@@ -341,10 +401,6 @@
341
401
  /* App help is a reader, not a generic Markdown preview. Keep the measure,
342
402
  hierarchy, and rhythm close to the task-first Help wireframe while reusing
343
403
  the same safe server-rendered Markdown pipeline as the rest of Cloud. */
344
- .help-topic-icon {
345
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 10%, var(--ui-surface-muted));
346
- }
347
-
348
404
  /* Help shell: one head (app tile, "Help for <App>", the menu, and the search) above the start, an article, or
349
405
  results. The head never changes size between them, so the search stays in one place. The start and the head share
350
406
  the article's measure: wide, the article and its contents; narrower, the article column alone. */
@@ -371,6 +427,7 @@
371
427
 
372
428
  /* Above a scroll area the head keeps the same scrollbar gutter, so both centre their measure alike. */
373
429
  .help-shell[data-surface="modal"] .help-head,
430
+ .help-shell[data-surface="panel"] .help-head,
374
431
  .help-shell[data-surface="embedded"] .help-head {
375
432
  overflow: hidden;
376
433
  padding-bottom: 0.25rem;
@@ -384,6 +441,29 @@
384
441
  }
385
442
  }
386
443
 
444
+ /* Help without a panel slot on a phone: the shared bottom sheet at its full height, with its grabber (#858). */
445
+ .k2b-ui .k2b-dialog.cloud-help-sheet {
446
+ height: min(92dvh, var(--k2b-dialog-available-height));
447
+ }
448
+
449
+ .cloud-help-sheet .k2b-bottom-sheet-viewport {
450
+ height: 100%;
451
+ }
452
+
453
+ .cloud-help-sheet .help-shell[data-surface="modal"] {
454
+ height: auto;
455
+ flex: 1 1 auto;
456
+ border: 0;
457
+ border-radius: 0;
458
+ background: transparent;
459
+ box-shadow: none;
460
+ }
461
+
462
+ /* In the panel the slot's own title row sits right above: the Help head follows it closely. */
463
+ .help-shell[data-surface="panel"] .help-head {
464
+ padding-top: 0.25rem;
465
+ }
466
+
387
467
  .help-head-inner {
388
468
  display: flex;
389
469
  flex-direction: column;
@@ -549,7 +629,7 @@
549
629
  }
550
630
 
551
631
  .help-start-tile:hover {
552
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 6%, var(--ui-surface-subtle));
632
+ background: var(--ui-surface-muted);
553
633
  }
554
634
 
555
635
  .help-start-tile-icon,
@@ -559,8 +639,6 @@
559
639
  height: 2.25rem;
560
640
  flex: 0 0 auto;
561
641
  place-items: center;
562
- border-radius: var(--ui-radius-control);
563
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 14%, var(--ui-surface-muted));
564
642
  font-size: 1.125rem;
565
643
  }
566
644
 
@@ -568,6 +646,32 @@
568
646
  margin-bottom: 0.5rem;
569
647
  }
570
648
 
649
+ /* A narrow reader, such as the panel column at 20-23 rem, has no room for two tiles side by side: each task keeps
650
+ its tile, one per row, with the icon beside its title. */
651
+ @container help-shell (max-width: 23rem) {
652
+ .help-start-tiles {
653
+ grid-template-columns: minmax(0, 1fr);
654
+ }
655
+
656
+ .help-start-tile {
657
+ display: grid;
658
+ grid-template-columns: auto minmax(0, 1fr);
659
+ column-gap: 0.75rem;
660
+ row-gap: 0.125rem;
661
+ align-items: start;
662
+ padding: 0.75rem;
663
+ }
664
+
665
+ .help-start-tile-icon {
666
+ grid-row: span 2;
667
+ margin-bottom: 0;
668
+ }
669
+
670
+ .help-start-tile-description {
671
+ -webkit-line-clamp: 2;
672
+ }
673
+ }
674
+
571
675
  .help-start-tile-title {
572
676
  max-width: 100%;
573
677
  color: var(--color-zinc-950);
@@ -750,12 +854,56 @@
750
854
  padding-top: 0.25rem;
751
855
  }
752
856
 
857
+ /* The article head names the app whose Help this is: the app's own canvas gradient (the same tokens and strength as
858
+ the app background, over the reader's surface), without a border or a shadow, and the article's icon in the flat
859
+ shared tile. Without app colours it stays the plain surface. The embedded readers (Grids, Pulse) sit inside the
860
+ app's own chrome, which already names the app: their head stays flat. Text sits on this gradient, so its tint stays at
861
+ most 30 % light and 15 % dark, as on the phone shell: then the title and the lead read at 4.5:1 on any app colour. */
753
862
  .help-article-head {
863
+ margin-bottom: 2rem;
864
+ }
865
+
866
+ .help-article:not([data-surface="embedded"]) .help-article-head {
867
+ display: grid;
868
+ grid-template-columns: minmax(0, 1fr) auto;
869
+ align-items: center;
870
+ gap: 1.5rem;
871
+ border-radius: var(--ui-radius-surface);
872
+ padding: 1.5rem;
873
+ background: linear-gradient(
874
+ var(--app-canvas-angle, 135deg),
875
+ color-mix(in srgb, var(--app-canvas-from, var(--k2b-surface)) min(var(--app-canvas-strength, 0%), 30%), var(--k2b-surface)),
876
+ color-mix(in srgb, var(--app-canvas-via, var(--k2b-surface)) min(var(--app-canvas-strength, 0%), 30%), var(--k2b-surface)) 50%,
877
+ color-mix(in srgb, var(--app-canvas-to, var(--k2b-surface)) min(var(--app-canvas-strength, 0%), 30%), var(--k2b-surface))
878
+ );
879
+ }
880
+
881
+ .dark .help-article:not([data-surface="embedded"]) .help-article-head {
882
+ background: linear-gradient(
883
+ var(--app-canvas-angle, 135deg),
884
+ color-mix(in srgb, var(--app-canvas-from, var(--k2b-surface)) min(var(--app-canvas-dark-strength, 0%), 15%), var(--k2b-surface)),
885
+ var(--k2b-surface) 50%,
886
+ color-mix(in srgb, var(--app-canvas-to, var(--k2b-surface)) min(var(--app-canvas-dark-strength, 0%), 15%), var(--k2b-surface))
887
+ );
888
+ }
889
+
890
+ .help-article-head-copy {
754
891
  display: flex;
892
+ min-width: 0;
755
893
  flex-direction: column;
756
894
  align-items: flex-start;
757
895
  gap: 0.75rem;
758
- margin-bottom: 2rem;
896
+ }
897
+
898
+ .help-article-icon {
899
+ width: 4.5rem;
900
+ height: 4.5rem;
901
+ font-size: 2.25rem;
902
+ }
903
+
904
+ /* Over the gradient the chips keep their own quiet fill, so they read as facts and not as part of the colour. */
905
+ .help-article:not([data-surface="embedded"]) .help-article-head .help-article-fact {
906
+ background: color-mix(in srgb, var(--k2b-surface) 72%, transparent);
759
907
  }
760
908
 
761
909
  .help-article-path {
@@ -880,14 +1028,15 @@
880
1028
  flex-direction: column;
881
1029
  gap: 0.5rem;
882
1030
  border-radius: var(--ui-radius-surface);
883
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 9%, var(--ui-surface-subtle));
1031
+ /* Both fills are computed with the app ink, so its label stays at AA. */
1032
+ background: var(--ui-app-selected);
884
1033
  padding: 1.25rem 1.25rem 1.375rem;
885
1034
  text-decoration: none;
886
1035
  transition: background-color 140ms ease;
887
1036
  }
888
1037
 
889
1038
  .help-article-next:hover {
890
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 15%, var(--ui-surface-subtle));
1039
+ background: var(--ui-app-selected-nav);
891
1040
  }
892
1041
 
893
1042
  .help-article-next-label {
@@ -1103,7 +1252,7 @@
1103
1252
  }
1104
1253
 
1105
1254
  .help-document :where(ul > li)::marker {
1106
- color: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 75%, var(--color-zinc-400));
1255
+ color: var(--ui-text-secondary);
1107
1256
  }
1108
1257
 
1109
1258
  .help-document :where(ol > li)::marker {
@@ -1459,11 +1608,52 @@
1459
1608
  }
1460
1609
  }
1461
1610
 
1611
+ /* Narrow: the tile stands before the title, and the path, the short answer, and the chips use the full width. */
1462
1612
  @container help-article (max-width: 40rem) {
1463
1613
  .help-article-head {
1464
1614
  margin-bottom: 1.5rem;
1465
1615
  }
1466
1616
 
1617
+ .help-article:not([data-surface="embedded"]) .help-article-head {
1618
+ grid-template-columns: auto minmax(0, 1fr);
1619
+ column-gap: 0.75rem;
1620
+ row-gap: 0;
1621
+ padding: 1.25rem 1rem;
1622
+ }
1623
+
1624
+ .help-article:not([data-surface="embedded"]) .help-article-head-copy {
1625
+ display: contents;
1626
+ }
1627
+
1628
+ .help-article:not([data-surface="embedded"]) .help-article-path {
1629
+ grid-column: 1 / -1;
1630
+ grid-row: 1;
1631
+ margin-bottom: 0.75rem;
1632
+ }
1633
+
1634
+ .help-article-icon {
1635
+ grid-column: 1;
1636
+ grid-row: 2;
1637
+ width: 2.75rem;
1638
+ height: 2.75rem;
1639
+ font-size: 1.375rem;
1640
+ }
1641
+
1642
+ .help-article:not([data-surface="embedded"]) .help-article-title {
1643
+ grid-column: 2;
1644
+ grid-row: 2;
1645
+ }
1646
+
1647
+ .help-article:not([data-surface="embedded"]) .help-article-head-copy > :not(.help-article-path, .help-article-title) {
1648
+ grid-column: 1 / -1;
1649
+ margin-top: 0.75rem;
1650
+ }
1651
+
1652
+ /* The panel article has no path row (the panel head names the app), so the tile and the title open the head. */
1653
+ .help-article[data-surface="panel"] :is(.help-article-icon, .help-article-title) {
1654
+ grid-row: 1;
1655
+ }
1656
+
1467
1657
  /* Two columns leave a phone about 140 px per alternative. */
1468
1658
  .help-document .help-compare > ul {
1469
1659
  grid-template-columns: minmax(0, 1fr);
@@ -68,8 +68,9 @@
68
68
  color: var(--k2b-text-secondary);
69
69
  }
70
70
 
71
+ /* A picked file is an object row: its check carries the app ink. */
71
72
  .cloud-file-chooser__icon[data-selected="true"] {
72
- color: var(--k2b-action);
73
+ color: var(--ui-app-accent-text);
73
74
  }
74
75
 
75
76
  .cloud-file-chooser__meta {