@k2b/cloud 0.37.0 → 0.39.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 (149) hide show
  1. package/package.json +8 -3
  2. package/scripts/build-canvas-workers.ts +109 -29
  3. package/scripts/build.ts +3 -5
  4. package/src/_internal/app-path.ts +25 -0
  5. package/src/_internal/app-presentation.ts +4 -0
  6. package/src/_internal/canvas-worker.ts +5 -3
  7. package/src/_internal/define-app.ts +28 -2
  8. package/src/_internal/help-catalog.ts +123 -4
  9. package/src/_internal/help.ts +27 -6
  10. package/src/_internal/panel-cookie.ts +39 -0
  11. package/src/_internal/registry-validation.ts +21 -26
  12. package/src/_internal/runtime-context.ts +1 -0
  13. package/src/access/PermissionEditor.browser-harness.tsx +57 -38
  14. package/src/access/PermissionEditor.tsx +30 -5
  15. package/src/access/ResourceApiKeys.tsx +5 -1
  16. package/src/account/Avatar.tsx +20 -2
  17. package/src/account/ui.ts +1 -1
  18. package/src/ai/approval-routes.ts +5 -2
  19. package/src/ai/approvals.ts +139 -28
  20. package/src/ai/browser.ts +11 -0
  21. package/src/ai/chart-block.ts +44 -13
  22. package/src/ai/chat/action-sentences.ts +1 -44
  23. package/src/ai/chat/chart-block.tsx +2 -11
  24. package/src/ai/chat/messages.ts +10 -0
  25. package/src/ai/chat/turn-view.tsx +35 -3
  26. package/src/ai/chat/view-block.tsx +7 -2
  27. package/src/ai/chat/web-tools.tsx +23 -6
  28. package/src/ai/chat-task-contracts.ts +28 -3
  29. package/src/ai/chat-task-reasons-migrate.ts +68 -0
  30. package/src/ai/chat-task-reasons.ts +92 -0
  31. package/src/ai/chat-tasks.ts +460 -66
  32. package/src/ai/default-tool-contracts.ts +30 -13
  33. package/src/ai/fetch-file-tool.ts +37 -3
  34. package/src/ai/index.ts +12 -0
  35. package/src/ai/migrate.ts +46 -3
  36. package/src/ai/readable-html.ts +1057 -0
  37. package/src/ai/request-context.ts +7 -1
  38. package/src/ai/routes.ts +27 -1
  39. package/src/ai/runtime.ts +12 -27
  40. package/src/ai/store.ts +5 -3
  41. package/src/ai/timeline.ts +9 -1
  42. package/src/ai/tool-wording.ts +45 -0
  43. package/src/ai/turn-abort.ts +33 -0
  44. package/src/ai/types.ts +12 -1
  45. package/src/api/admin-core-settings.ts +190 -139
  46. package/src/api/admin-outgoing-mail.ts +4 -2
  47. package/src/api/app-approval.ts +9 -2
  48. package/src/api/approvals.ts +1 -1
  49. package/src/api/help.ts +23 -4
  50. package/src/api/index.ts +2 -1
  51. package/src/api/mcp.ts +8 -2
  52. package/src/browser/CloudResourceSearch.tsx +10 -6
  53. package/src/browser/FileChooser.tsx +11 -3
  54. package/src/browser/app-approval.ts +7 -2
  55. package/src/browser/choose-files.browser-harness.tsx +4 -1
  56. package/src/browser/composer-catalog.ts +103 -0
  57. package/src/browser/composer-insert-messages.ts +31 -0
  58. package/src/browser/composer-insert.ts +150 -0
  59. package/src/browser/file-chooser-messages.ts +4 -0
  60. package/src/browser/file-providers.ts +14 -1
  61. package/src/browser/panel-messages.ts +24 -0
  62. package/src/browser/panel-slot.ts +354 -0
  63. package/src/browser/panel.ts +28 -0
  64. package/src/browser/provider-folder.tsx +58 -5
  65. package/src/browser/resource-picker.tsx +17 -2
  66. package/src/cli/admin/workflows.ts +1 -0
  67. package/src/config/env.ts +14 -0
  68. package/src/contracts/app-approval.ts +49 -9
  69. package/src/contracts/app.ts +14 -0
  70. package/src/contracts/file-provider.ts +48 -1
  71. package/src/contracts/outgoing-mail.ts +8 -1
  72. package/src/contracts/registry.ts +3 -1
  73. package/src/contracts/shared.ts +2 -0
  74. package/src/server/help.ts +136 -10
  75. package/src/server/services/access.ts +5 -1
  76. package/src/server/services/geo.ts +21 -4
  77. package/src/services/accounts/posix.ts +2 -1
  78. package/src/services/allowed-network-fetch.ts +189 -0
  79. package/src/services/app-approval.ts +158 -38
  80. package/src/services/approvals/device.ts +2 -0
  81. package/src/services/help/index.ts +46 -5
  82. package/src/services/help/store.ts +26 -5
  83. package/src/services/help/types.ts +10 -2
  84. package/src/services/index.ts +22 -3
  85. package/src/services/notifications/browser.ts +16 -5
  86. package/src/services/outgoing-mail/dispatcher.ts +7 -2
  87. package/src/services/outgoing-mail/resolve-host.ts +39 -0
  88. package/src/services/outgoing-mail/test-send.ts +18 -3
  89. package/src/services/outgoing-mail/transport.ts +24 -13
  90. package/src/services/pdf/image-protocol.ts +135 -0
  91. package/src/services/pdf/image-variants.ts +124 -0
  92. package/src/services/pdf/image-worker.ts +31 -0
  93. package/src/services/pdf/image.ts +109 -0
  94. package/src/services/pdf/index.ts +9 -0
  95. package/src/services/settings/api.ts +11 -6
  96. package/src/services/settings/app.ts +5 -4
  97. package/src/services/settings/core-settings.ts +4 -3
  98. package/src/services/settings/index.ts +67 -43
  99. package/src/services/settings/namespace.ts +2 -1
  100. package/src/services/settings/store.ts +83 -11
  101. package/src/shared/ai-platform-prompt.ts +1 -1
  102. package/src/shared/app-presentation.ts +1 -0
  103. package/src/shared/help.ts +41 -0
  104. package/src/shared/index.ts +9 -1
  105. package/src/shared/markdown/extensions/guided-help.ts +208 -64
  106. package/src/shared/markdown/formula.ts +8 -8
  107. package/src/shared/markdown/index.ts +72 -11
  108. package/src/shared/redirect.ts +12 -0
  109. package/src/ssr/CloudShell.island.tsx +86 -9
  110. package/src/ssr/Layout.tsx +62 -11
  111. package/src/ssr/LayoutHeader.tsx +15 -9
  112. package/src/ssr/LayoutHelp.browser-harness.tsx +130 -27
  113. package/src/ssr/LayoutHelp.tsx +569 -410
  114. package/src/ssr/LayoutRail.tsx +2 -2
  115. package/src/ssr/LayoutTabBar.tsx +29 -0
  116. package/src/ssr/PanelLayout.tsx +27 -0
  117. package/src/ssr/PanelRuntime.island.tsx +87 -0
  118. package/src/ssr/PanelSlot.tsx +108 -0
  119. package/src/ssr/PanelTrigger.tsx +49 -0
  120. package/src/ssr/ShellRuntime.island.tsx +72 -25
  121. package/src/ssr/app-appearance.ts +3 -2
  122. package/src/ssr/app-color.ts +100 -0
  123. package/src/ssr/app-launchpad.tsx +18 -1
  124. package/src/ssr/app-navigation.ts +15 -0
  125. package/src/ssr/compact-shell.baseline.json +5270 -0
  126. package/src/ssr/compact-shell.browser-harness.ts +431 -0
  127. package/src/ssr/help-messages.ts +60 -38
  128. package/src/ssr/help.ts +3 -0
  129. package/src/ssr/index.ts +3 -0
  130. package/src/ssr/layout-help-article.ts +41 -0
  131. package/src/ssr/layout-help-navigation.ts +0 -12
  132. package/src/ssr/layout-help-registry.tsx +4 -11
  133. package/src/ssr/layout-help-search.ts +9 -12
  134. package/src/ssr/layout-help-start.ts +68 -0
  135. package/src/ssr/panel-slot.browser-harness.tsx +110 -0
  136. package/src/ssr/platform-messages.ts +34 -0
  137. package/src/ssr/rail-navigation.ts +44 -0
  138. package/src/ssr/shell-data.tsx +11 -0
  139. package/src/ssr/shell-shortcuts.ts +19 -0
  140. package/src/styles/effects.css +689 -185
  141. package/src/styles/global.css +269 -55
  142. package/src/styles/panel.css +373 -0
  143. package/src/styles/resource-search.css +25 -0
  144. package/src/styles/tokens.css +23 -6
  145. package/src/styles/utilities-navigation.css +5 -21
  146. package/src/workflows/store/events.ts +24 -0
  147. package/src/workflows/store/index.ts +8 -0
  148. package/src/workflows/store/observability.ts +6 -1
  149. package/src/workflows/store/retention.ts +157 -0
@@ -345,123 +345,668 @@
345
345
  background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 10%, var(--ui-surface-muted));
346
346
  }
347
347
 
348
- /* The reader's layout steps follow its own width: a dialog, a full page, or
349
- an app's embedded reader, never the window. */
350
- .help-article {
351
- container: help-article / inline-size;
348
+ /* Help shell: one head (app tile, "Help for <App>", the menu, and the search) above the start, an article, or
349
+ results. The head never changes size between them, so the search stays in one place. The start and the head share
350
+ the article's measure: wide, the article and its contents; narrower, the article column alone. */
351
+ .help-shell {
352
+ container: help-shell / inline-size;
352
353
  }
353
354
 
354
- .help-article-toc[data-empty] {
355
- visibility: hidden;
355
+ .help-measure {
356
+ width: 100%;
357
+ max-width: 56.5rem;
358
+ margin-inline: auto;
356
359
  }
357
360
 
358
- .help-article-layout {
359
- display: grid;
360
- grid-template-columns: minmax(10rem, 13rem) minmax(0, 52rem);
361
- justify-content: center;
362
- align-items: start;
363
- gap: clamp(2rem, 4cqi, 4rem);
361
+ @container help-shell (max-width: 58.5rem) {
362
+ .help-measure {
363
+ max-width: 40rem;
364
+ }
364
365
  }
365
366
 
366
- .help-article-copy {
367
- min-width: 0;
367
+ .help-head {
368
+ flex-shrink: 0;
369
+ padding: 1rem 1rem 0;
368
370
  }
369
371
 
370
- .help-article-toc {
371
- position: sticky;
372
- top: 0.25rem;
373
- align-self: start;
374
- min-width: 0;
372
+ /* Above a scroll area the head keeps the same scrollbar gutter, so both centre their measure alike. */
373
+ .help-shell[data-surface="modal"] .help-head,
374
+ .help-shell[data-surface="embedded"] .help-head {
375
+ overflow: hidden;
376
+ padding-bottom: 0.25rem;
377
+ scrollbar-gutter: stable;
375
378
  }
376
379
 
377
- .help-article-toc-label {
378
- margin: 0 0 0.6rem;
379
- color: var(--color-zinc-500);
380
- font-size: 0.6875rem;
381
- font-weight: 650;
382
- letter-spacing: 0.08em;
383
- text-transform: uppercase;
380
+ @media (min-width: 40rem) {
381
+ .help-head {
382
+ padding-inline: 1.25rem;
383
+ padding-top: 1.25rem;
384
+ }
384
385
  }
385
386
 
386
- .help-article-toc ol {
387
- display: grid;
388
- gap: 0.2rem;
389
- margin: 0 !important;
390
- padding: 0 !important;
391
- list-style: none !important;
387
+ .help-head-inner {
388
+ display: flex;
389
+ flex-direction: column;
390
+ gap: 0.75rem;
392
391
  }
393
392
 
394
- .help-article-toc li {
393
+ .help-head-row {
394
+ display: flex;
395
395
  min-width: 0;
396
+ align-items: center;
397
+ gap: 0.625rem;
396
398
  }
397
399
 
398
- .help-article-toc button {
400
+ .help-head-tile,
401
+ .help-head .help-head-back {
399
402
  display: grid;
400
- grid-template-columns: 2.25rem minmax(0, 1fr);
403
+ width: 2.25rem;
404
+ height: 2.25rem;
405
+ flex: 0 0 auto;
406
+ place-items: center;
407
+ border-radius: var(--ui-radius-control);
408
+ }
409
+
410
+ .help-head-tile {
411
+ background: var(--app-accent, var(--color-blue-500));
412
+ color: #fff;
413
+ font-size: 1.25rem;
414
+ }
415
+
416
+ .help-head-title {
417
+ min-width: 0;
418
+ flex: 1 1 auto;
419
+ overflow: hidden;
420
+ margin: 0;
421
+ color: var(--color-zinc-950);
422
+ font-size: 1.0625rem;
423
+ font-weight: 650;
424
+ line-height: 1.5rem;
425
+ text-overflow: ellipsis;
426
+ white-space: nowrap;
427
+ }
428
+
429
+ .dark .help-head-title {
430
+ color: var(--color-zinc-50);
431
+ }
432
+
433
+ .help-head-actions {
434
+ display: flex;
435
+ flex: 0 0 auto;
436
+ align-items: center;
437
+ gap: 0.25rem;
438
+ }
439
+
440
+ .help-head-search {
401
441
  width: 100%;
442
+ max-width: 40rem;
443
+ }
444
+
445
+ /* The start: "For this view", task tiles, the groups by kind, and keyboard shortcuts last. Flat: spacing orders it,
446
+ colour stays in the icons. */
447
+ .help-start {
448
+ display: flex;
449
+ flex-direction: column;
450
+ gap: 2rem;
451
+ }
452
+
453
+ .help-start-section {
454
+ display: flex;
402
455
  min-width: 0;
456
+ flex-direction: column;
457
+ gap: 0.75rem;
458
+ }
459
+
460
+ .help-start-heading,
461
+ .help-start-status {
462
+ display: flex;
463
+ min-height: 1.5rem;
403
464
  align-items: center;
404
- gap: 0.6rem;
405
- border-radius: var(--ui-radius-control);
406
- color: var(--color-zinc-600);
407
- padding: 0.3rem;
408
- text-align: left;
409
- transition:
410
- background-color 140ms ease,
411
- color 140ms ease;
465
+ gap: 0.5rem;
466
+ margin: 0;
467
+ line-height: 1.5rem;
412
468
  }
413
469
 
414
- .help-article-toc button:hover {
415
- color: var(--ui-app-accent-text);
470
+ .help-start-heading {
471
+ color: var(--color-zinc-950);
472
+ font-size: 0.9375rem;
473
+ font-weight: 650;
416
474
  }
417
475
 
418
- .help-article-toc button:focus-visible {
419
- outline: none;
420
- box-shadow: var(--ui-focus);
476
+ .help-start-heading > i {
477
+ color: var(--color-zinc-500);
478
+ font-size: 1.0625rem;
421
479
  }
422
480
 
423
- .help-article-toc button[aria-current="location"] {
424
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 8%, var(--ui-surface-subtle));
425
- color: var(--ui-app-accent-text);
481
+ .dark .help-start-heading {
482
+ color: var(--color-zinc-50);
483
+ }
484
+
485
+ .dark .help-start-heading > i,
486
+ .help-start-status {
487
+ color: var(--color-zinc-400);
488
+ }
489
+
490
+ .help-start-status {
491
+ color: var(--color-zinc-500);
492
+ font-size: 0.8125rem;
493
+ font-weight: 600;
494
+ }
495
+
496
+ .help-start-status-warning {
497
+ display: inline-flex;
498
+ align-items: center;
499
+ gap: 0.25rem;
500
+ color: var(--color-amber-700);
501
+ }
502
+
503
+ .dark .help-start-status-warning {
504
+ color: var(--color-amber-400);
505
+ }
506
+
507
+ .help-start .help-start-status-retry {
508
+ height: 1.5rem;
509
+ min-height: 0;
426
510
  }
427
511
 
428
- .help-article-toc-icon {
512
+ .help-start-tiles,
513
+ .help-start-rows,
514
+ .help-shortcut-group > ul {
515
+ margin: 0;
516
+ padding: 0;
517
+ list-style: none;
518
+ }
519
+
520
+ .help-start-tiles {
521
+ display: grid;
522
+ grid-template-columns: repeat(2, minmax(0, 1fr));
523
+ gap: 0.5rem;
524
+ }
525
+
526
+ @container help-shell (min-width: 58.5rem) {
527
+ .help-start-tiles {
528
+ grid-template-columns: repeat(3, minmax(0, 1fr));
529
+ }
530
+ }
531
+
532
+ .help-start-tiles > li {
533
+ display: flex;
534
+ min-width: 0;
535
+ }
536
+
537
+ .help-start-tile {
538
+ display: flex;
539
+ width: 100%;
540
+ min-width: 0;
541
+ flex-direction: column;
542
+ align-items: flex-start;
543
+ gap: 0.25rem;
544
+ border-radius: var(--ui-radius-surface);
545
+ background: var(--ui-surface-subtle);
546
+ padding: 1rem;
547
+ text-align: start;
548
+ transition: background-color 140ms ease;
549
+ }
550
+
551
+ .help-start-tile:hover {
552
+ background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 6%, var(--ui-surface-subtle));
553
+ }
554
+
555
+ .help-start-tile-icon,
556
+ .help-start-row-icon {
429
557
  display: grid;
430
558
  width: 2.25rem;
431
559
  height: 2.25rem;
560
+ flex: 0 0 auto;
432
561
  place-items: center;
433
562
  border-radius: var(--ui-radius-control);
434
- background: var(--ui-surface-muted);
435
- color: inherit;
436
- font-size: 0.95rem;
563
+ background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 14%, var(--ui-surface-muted));
564
+ font-size: 1.125rem;
565
+ }
566
+
567
+ .help-start-tile-icon {
568
+ margin-bottom: 0.5rem;
437
569
  }
438
570
 
439
- .help-article-toc button[aria-current="location"] .help-article-toc-icon {
440
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 13%, var(--ui-surface-muted));
571
+ .help-start-tile-title {
572
+ max-width: 100%;
573
+ color: var(--color-zinc-950);
574
+ font-size: 0.9375rem;
575
+ font-weight: 600;
576
+ line-height: 1.3;
577
+ overflow-wrap: anywhere;
441
578
  }
442
579
 
443
- .help-article-toc-title {
580
+ .help-start-tile-description {
581
+ display: -webkit-box;
582
+ max-width: 100%;
444
583
  overflow: hidden;
584
+ color: var(--color-zinc-600);
585
+ font-size: 0.8125rem;
586
+ line-height: 1.45;
587
+ overflow-wrap: anywhere;
588
+ -webkit-box-orient: vertical;
589
+ -webkit-line-clamp: 3;
590
+ }
591
+
592
+ .dark .help-start-tile-title {
593
+ color: var(--color-zinc-50);
594
+ }
595
+
596
+ .dark .help-start-tile-description {
597
+ color: var(--color-zinc-400);
598
+ }
599
+
600
+ .help-start-rows {
601
+ display: flex;
602
+ flex-direction: column;
603
+ gap: 0.125rem;
604
+ }
605
+
606
+ .help-start-row {
607
+ display: flex;
608
+ width: calc(100% + 1rem);
609
+ min-width: 0;
610
+ align-items: center;
611
+ gap: 0.75rem;
612
+ margin-inline: -0.5rem;
613
+ border-radius: var(--ui-radius-control);
614
+ padding: 0.5rem;
615
+ text-align: start;
616
+ transition: background-color 140ms ease;
617
+ }
618
+
619
+ .help-start-row:hover {
620
+ background: var(--ui-surface-subtle);
621
+ }
622
+
623
+ .help-start-row .help-article-link-copy {
624
+ flex: 1 1 auto;
625
+ }
626
+
627
+ .help-start-row-arrow {
628
+ flex: 0 0 auto;
629
+ color: var(--color-zinc-400);
630
+ font-size: 0.875rem;
631
+ }
632
+
633
+ .help-start-groups {
634
+ display: grid;
635
+ grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
636
+ gap: 2rem;
637
+ }
638
+
639
+ /* The browser adds the page's own shortcuts after the server rendered the shell's. The groups reserve the height of a
640
+ usual set, so the ones that arrive fill space that is already there. */
641
+ .help-shortcut-groups {
642
+ display: grid;
643
+ min-height: 19rem;
644
+ grid-template-columns: minmax(0, 1fr);
645
+ align-content: start;
646
+ gap: 1.25rem 2rem;
647
+ }
648
+
649
+ /* From two columns each group keeps a fixed cell, so a group that arrives late does not take another one's column.
650
+ The dialog reads the commands when it opens; only commands that change while Help is open can arrive late. */
651
+ @container help-shell (min-width: 34rem) {
652
+ .help-shortcut-groups {
653
+ min-height: 17rem;
654
+ grid-template-columns: repeat(2, minmax(0, 1fr));
655
+ grid-template-areas: "everywhere app" "selection .";
656
+ }
657
+ }
658
+
659
+ @container help-shell (min-width: 58.5rem) {
660
+ .help-shortcut-groups {
661
+ min-height: 11rem;
662
+ grid-template-columns: repeat(3, minmax(0, 1fr));
663
+ grid-template-areas: "everywhere app selection";
664
+ }
665
+ }
666
+
667
+ @container help-shell (min-width: 34rem) {
668
+ .help-shortcut-group[data-help-shortcut-group="everywhere"] {
669
+ grid-area: everywhere;
670
+ }
671
+
672
+ .help-shortcut-group[data-help-shortcut-group="app"] {
673
+ grid-area: app;
674
+ }
675
+
676
+ .help-shortcut-group[data-help-shortcut-group="selection"] {
677
+ grid-area: selection;
678
+ }
679
+ }
680
+
681
+ .help-shortcut-group {
682
+ min-width: 0;
683
+ }
684
+
685
+ .help-shortcut-group-title {
686
+ margin: 0 0 0.25rem;
687
+ color: var(--color-zinc-500);
445
688
  font-size: 0.75rem;
689
+ font-weight: 600;
690
+ line-height: 1.25rem;
691
+ }
692
+
693
+ .dark .help-shortcut-group-title {
694
+ color: var(--color-zinc-400);
695
+ }
696
+
697
+ .help-shortcut {
698
+ display: flex;
699
+ min-height: 2rem;
700
+ align-items: center;
701
+ justify-content: space-between;
702
+ gap: 1rem;
703
+ color: var(--color-zinc-700);
704
+ font-size: 0.875rem;
705
+ }
706
+
707
+ .dark .help-shortcut {
708
+ color: var(--color-zinc-300);
709
+ }
710
+
711
+ .help-shortcut-title {
712
+ min-width: 0;
713
+ overflow-wrap: anywhere;
714
+ }
715
+
716
+ .help-shortcut > .k2b-kbd {
717
+ flex: 0 0 auto;
718
+ }
719
+
720
+ /* One reader for the dialog, the full page, and an app's embedded reader. Its
721
+ layout steps follow its own width, never the window. Wide: the article and a
722
+ text table of contents beside it. Narrow: one column, and the contents become
723
+ an "On this page" menu under the head. */
724
+ .help-article {
725
+ container: help-article / inline-size;
726
+ }
727
+
728
+ .help-article-layout {
729
+ display: grid;
730
+ grid-template-columns: minmax(0, 40rem) minmax(10rem, 13rem);
731
+ justify-content: center;
732
+ gap: 3.5rem;
733
+ }
734
+
735
+ .help-article-main {
736
+ min-width: 0;
737
+ }
738
+
739
+ .help-article-aside {
740
+ min-width: 0;
741
+ }
742
+
743
+ .help-article-aside-sticky {
744
+ position: sticky;
745
+ top: 1rem;
746
+ display: flex;
747
+ flex-direction: column;
748
+ align-items: flex-start;
749
+ gap: 1rem;
750
+ padding-top: 0.25rem;
751
+ }
752
+
753
+ .help-article-head {
754
+ display: flex;
755
+ flex-direction: column;
756
+ align-items: flex-start;
757
+ gap: 0.75rem;
758
+ margin-bottom: 2rem;
759
+ }
760
+
761
+ .help-article-path {
762
+ display: flex;
763
+ min-width: 0;
764
+ align-items: center;
765
+ gap: 0.375rem;
766
+ margin: 0;
767
+ color: var(--color-zinc-500);
768
+ font-size: 0.8125rem;
446
769
  font-weight: 550;
770
+ line-height: 1.25rem;
771
+ }
772
+
773
+ .help-article-path > i {
774
+ font-size: 0.75rem;
775
+ }
776
+
777
+ .help-article-path-link {
778
+ border-radius: var(--ui-radius-control);
779
+ color: inherit;
780
+ }
781
+
782
+ .help-article-path-link:hover {
783
+ color: var(--ui-app-accent-text);
784
+ }
785
+
786
+ .help-article-title {
787
+ margin: 0;
788
+ border-radius: var(--ui-radius-control);
789
+ color: var(--color-zinc-950);
790
+ font-size: 1.75rem;
791
+ font-weight: 650;
792
+ letter-spacing: -0.022em;
793
+ line-height: 1.2;
794
+ overflow-wrap: anywhere;
795
+ }
796
+
797
+ .dark .help-article-title {
798
+ color: var(--color-zinc-50);
799
+ }
800
+
801
+ /* The short answer: the article's first paragraph, one step larger than the body. */
802
+ .help-article-lead,
803
+ .help-document.help-article-lead {
804
+ margin: 0;
805
+ color: var(--color-zinc-700);
806
+ font-size: 1.125rem;
807
+ line-height: 1.55;
808
+ }
809
+
810
+ .help-document.help-article-lead > p {
811
+ margin: 0;
812
+ }
813
+
814
+ .dark :is(.help-article-lead, .help-document.help-article-lead) {
815
+ color: var(--color-zinc-300);
816
+ }
817
+
818
+ .help-article-facts {
819
+ display: flex;
820
+ flex-wrap: wrap;
821
+ gap: 0.5rem;
822
+ margin: 0.25rem 0 0;
823
+ padding: 0;
824
+ list-style: none;
825
+ }
826
+
827
+ .help-article-fact {
828
+ display: inline-flex;
829
+ min-height: 1.75rem;
830
+ align-items: center;
831
+ gap: 0.375rem;
832
+ border-radius: 999px;
833
+ background: var(--ui-surface-muted);
834
+ color: var(--color-zinc-700);
835
+ padding: 0 0.75rem;
836
+ font-size: 0.8125rem;
837
+ line-height: 1.25;
838
+ }
839
+
840
+ .help-article-fact > i {
841
+ color: var(--ui-app-accent-text);
842
+ font-size: 0.9375rem;
843
+ }
844
+
845
+ .help-article-fact strong {
846
+ color: var(--color-zinc-950);
847
+ font-weight: 650;
848
+ }
849
+
850
+ .dark .help-article-fact {
851
+ color: var(--color-zinc-300);
852
+ }
853
+
854
+ .dark .help-article-fact strong {
855
+ color: var(--color-zinc-50);
856
+ }
857
+
858
+ /* Narrow readers only: the section menu and the copy action under the head. */
859
+ .help-article-tools {
860
+ display: none;
861
+ width: 100%;
862
+ align-items: center;
863
+ gap: 0.5rem;
864
+ }
865
+
866
+ .help-article-tools-copy {
867
+ margin-inline-start: auto;
868
+ }
869
+
870
+ /* The end of an article: one large "Next" tile, then related articles. */
871
+ .help-article-end {
872
+ display: flex;
873
+ flex-direction: column;
874
+ gap: 2rem;
875
+ margin-top: 3.5rem;
876
+ }
877
+
878
+ .help-article-next {
879
+ display: flex;
880
+ flex-direction: column;
881
+ gap: 0.5rem;
882
+ border-radius: var(--ui-radius-surface);
883
+ /* Both fills are computed with the app ink, so its label stays at AA. */
884
+ background: var(--ui-app-selected);
885
+ padding: 1.25rem 1.25rem 1.375rem;
886
+ text-decoration: none;
887
+ transition: background-color 140ms ease;
888
+ }
889
+
890
+ .help-article-next:hover {
891
+ background: var(--ui-app-selected-nav);
892
+ }
893
+
894
+ .help-article-next-label {
895
+ color: var(--ui-app-accent-text);
896
+ font-size: 0.8125rem;
897
+ font-weight: 650;
898
+ }
899
+
900
+ .help-article-next-row {
901
+ display: flex;
902
+ min-width: 0;
903
+ align-items: flex-start;
904
+ gap: 0.75rem;
905
+ }
906
+
907
+ .help-article-next-icon {
908
+ margin-top: 0.125rem;
909
+ color: var(--ui-app-accent-text);
910
+ font-size: 1.375rem;
911
+ }
912
+
913
+ .help-article-next-arrow {
914
+ margin-top: 0.25rem;
915
+ margin-inline-start: auto;
916
+ color: var(--ui-app-accent-text);
917
+ font-size: 1.25rem;
918
+ }
919
+
920
+ .help-article-next .help-article-link-title {
921
+ font-size: 1.125rem;
922
+ }
923
+
924
+ .help-article-link-copy {
925
+ display: flex;
926
+ min-width: 0;
927
+ flex-direction: column;
928
+ gap: 0.125rem;
929
+ }
930
+
931
+ .help-article-link-title {
932
+ color: var(--color-zinc-950);
933
+ font-size: 0.9375rem;
934
+ font-weight: 600;
447
935
  line-height: 1.35;
448
- text-overflow: ellipsis;
449
- white-space: nowrap;
450
936
  }
451
937
 
452
- .dark .help-article-toc button {
938
+ .help-article-link-description {
939
+ color: var(--color-zinc-600);
940
+ font-size: 0.875rem;
941
+ line-height: 1.45;
942
+ }
943
+
944
+ .dark .help-article-link-title {
945
+ color: var(--color-zinc-50);
946
+ }
947
+
948
+ .dark .help-article-link-description {
453
949
  color: var(--color-zinc-400);
454
950
  }
455
951
 
456
- .dark .help-article-toc button:hover,
457
- .dark .help-article-toc button[aria-current="location"] {
458
- color: var(--ui-app-accent-text);
952
+ .help-article-related > h4 {
953
+ margin: 0 0 0.5rem;
954
+ color: var(--color-zinc-600);
955
+ font-size: 0.8125rem;
956
+ font-weight: 650;
957
+ }
958
+
959
+ .dark .help-article-related > h4 {
960
+ color: var(--color-zinc-400);
961
+ }
962
+
963
+ .help-article-related > ul {
964
+ display: flex;
965
+ flex-direction: column;
966
+ gap: 0.125rem;
967
+ margin: 0;
968
+ padding: 0;
969
+ list-style: none;
970
+ }
971
+
972
+ .help-article-related-link {
973
+ display: flex;
974
+ min-width: 0;
975
+ align-items: center;
976
+ gap: 0.75rem;
977
+ border-radius: var(--ui-radius-control);
978
+ padding: 0.5rem;
979
+ margin-inline: -0.5rem;
980
+ text-decoration: none;
981
+ transition: background-color 140ms ease;
982
+ }
983
+
984
+ .help-article-related-link:hover {
985
+ background: var(--ui-surface-subtle);
986
+ }
987
+
988
+ .help-article-related-icon {
989
+ display: grid;
990
+ width: 2.25rem;
991
+ height: 2.25rem;
992
+ flex: 0 0 auto;
993
+ place-items: center;
994
+ border-radius: var(--ui-radius-control);
995
+ font-size: 1.0625rem;
996
+ }
997
+
998
+ .help-article-related-app {
999
+ flex: 0 0 auto;
1000
+ margin-inline-start: auto;
1001
+ font-size: 0.75rem;
1002
+ font-weight: 600;
459
1003
  }
460
1004
 
461
1005
  .help-document {
1006
+ max-width: 40rem;
462
1007
  color: var(--color-zinc-800);
463
- font-size: 0.9375rem;
464
- line-height: 1.65;
1008
+ font-size: 1rem;
1009
+ line-height: 1.6;
465
1010
  }
466
1011
 
467
1012
  .dark .help-document {
@@ -491,37 +1036,23 @@
491
1036
  color: var(--color-zinc-100);
492
1037
  }
493
1038
 
494
- .help-document :where(h2, h3) {
495
- margin: 2.5rem 0 0.75rem;
1039
+ .help-document :where(h3) {
1040
+ margin: 2rem 0 0.5rem;
496
1041
  font-size: 1.125rem;
497
1042
  line-height: 1.35;
498
1043
  }
499
1044
 
500
- .help-document .help-section-title {
501
- display: flex;
502
- align-items: center;
503
- gap: 0.8rem;
504
- margin: 3.75rem 0 1.25rem;
505
- scroll-margin-top: 4rem;
1045
+ .help-document :where(h2) {
1046
+ margin: 2.5rem 0 0.75rem;
1047
+ scroll-margin-top: 1rem;
506
1048
  font-size: 1.25rem;
1049
+ line-height: 1.3;
507
1050
  }
508
1051
 
509
- .help-document .help-section-title:first-child {
1052
+ .help-document > :where(h2:first-child) {
510
1053
  margin-top: 0;
511
1054
  }
512
1055
 
513
- .help-section-icon {
514
- display: grid;
515
- width: 2.625rem;
516
- height: 2.625rem;
517
- flex: 0 0 auto;
518
- place-items: center;
519
- border-radius: var(--ui-radius-control);
520
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 11%, var(--ui-surface-muted));
521
- color: var(--ui-app-accent-text);
522
- font-size: 1.05rem;
523
- }
524
-
525
1056
  .help-document :where(h4) {
526
1057
  margin: 1.75rem 0 0.5rem;
527
1058
  font-size: 0.9375rem;
@@ -587,9 +1118,9 @@
587
1118
  }
588
1119
 
589
1120
  .help-document .help-reference > ul {
590
- display: grid;
591
- grid-template-columns: repeat(2, minmax(0, 1fr));
592
- gap: 1.25rem 2rem;
1121
+ display: flex;
1122
+ flex-direction: column;
1123
+ gap: 0.75rem;
593
1124
  margin: 0 !important;
594
1125
  padding: 0 !important;
595
1126
  list-style: none;
@@ -600,11 +1131,14 @@
600
1131
  margin: 0;
601
1132
  }
602
1133
 
1134
+ /* One column: the term leads its line, its explanation follows on the same line. */
603
1135
  .help-document .help-reference > ul > li > strong:first-child {
604
- display: block;
605
- margin-bottom: 0.2rem;
606
- color: var(--ui-app-accent-text);
607
- font-size: 0.875rem;
1136
+ color: var(--color-zinc-950);
1137
+ font-weight: 650;
1138
+ }
1139
+
1140
+ .dark .help-document .help-reference > ul > li > strong:first-child {
1141
+ color: var(--color-zinc-50);
608
1142
  }
609
1143
 
610
1144
  /* Tailwind Typography decorates inline code with visible backticks. Help
@@ -614,66 +1148,75 @@
614
1148
  content: none !important;
615
1149
  }
616
1150
 
1151
+ /* Steps use the shared @k2b/ui look: no surface, large numbers in the app colour. */
617
1152
  .help-document .help-steps {
618
- margin: 1rem 0 2rem;
619
- border-radius: var(--ui-radius-surface);
620
- background: var(--ui-surface-subtle);
621
- padding: 0.25rem 1.25rem;
1153
+ margin: 1rem 0 1.75rem;
622
1154
  }
623
1155
 
624
- .help-document .help-steps > ol {
1156
+ .help-document .help-steps > ol.k2b-steps {
625
1157
  margin: 0 !important;
626
1158
  padding: 0 !important;
627
- list-style: none;
628
- counter-reset: help-step;
629
1159
  }
630
1160
 
631
- .help-document .help-steps > ol > li {
632
- position: relative;
633
- min-height: 3rem;
634
- margin: 0;
635
- padding: 1rem 0 1rem 3.25rem;
636
- counter-increment: help-step;
1161
+ .help-document .help-steps > ol.k2b-steps > li + li {
1162
+ margin-top: 0;
637
1163
  }
638
1164
 
639
- .help-document .help-steps > ol > li::before {
640
- position: absolute;
641
- top: 1rem;
642
- left: 0;
643
- z-index: 1;
644
- display: grid;
645
- width: 2.25rem;
646
- height: 2.25rem;
647
- place-items: center;
648
- border-radius: 999px;
649
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 13%, var(--ui-surface-muted));
650
- color: var(--ui-app-accent-text);
651
- content: counter(help-step);
652
- font-size: 0.75rem;
653
- font-weight: 650;
1165
+ /* A step's first bold words often name it ("Choose:"); keep them in the text colour. */
1166
+ .help-document .help-steps > ol > li > strong:first-child,
1167
+ .help-document .help-steps > ol > li > p:first-child > strong:first-child {
1168
+ color: var(--color-zinc-950);
654
1169
  }
655
1170
 
656
- .help-document .help-steps > ol > li:not(:last-child)::after {
657
- position: absolute;
658
- top: 3.25rem;
659
- /* Reach the next item's marker despite the next row's top padding. */
660
- bottom: -1rem;
661
- left: 1.1rem;
662
- width: 1px;
663
- background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 20%, var(--ui-border));
664
- content: "";
1171
+ .dark .help-document .help-steps > ol > li > strong:first-child,
1172
+ .dark .help-document .help-steps > ol > li > p:first-child > strong:first-child {
1173
+ color: var(--color-zinc-50);
665
1174
  }
666
1175
 
667
- .help-document .help-steps > ol > li > strong:first-child,
668
- .help-document .help-steps > ol > li > p:first-child > strong:first-child {
1176
+ /* A bold menu path: label chips joined by ›. */
1177
+ .help-document .help-menu-path {
1178
+ white-space: normal;
1179
+ }
1180
+
1181
+ .help-document .help-menu-path-separator {
1182
+ margin-inline: 0.3em;
1183
+ color: var(--color-zinc-500);
1184
+ }
1185
+
1186
+ /* Details: reasons and special cases, collapsed, read at body size. They stay
1187
+ flat when open: the text continues on the page, not in a box. The selectors
1188
+ outrank the shared Disclosure surface rules. */
1189
+ .help-document details.help-details[data-surface] {
1190
+ margin: 1rem 0 1.25rem;
1191
+ padding: 0;
1192
+ /* Disclosure tints the whole open block while its summary is hovered. */
1193
+ background: transparent !important;
1194
+ }
1195
+
1196
+ .help-document details.help-details > summary:hover {
1197
+ background: var(--ui-surface-subtle);
1198
+ }
1199
+
1200
+ .help-document details.help-details > summary {
1201
+ min-height: 2.75rem;
1202
+ margin-inline: -0.5rem;
1203
+ padding-inline: 0.5rem;
669
1204
  color: var(--color-zinc-900);
1205
+ font-size: 1rem;
1206
+ font-weight: 600;
670
1207
  }
671
1208
 
672
- .dark .help-document .help-steps > ol > li > strong:first-child,
673
- .dark .help-document .help-steps > ol > li > p:first-child > strong:first-child {
1209
+ .dark .help-document details.help-details > summary {
674
1210
  color: var(--color-zinc-100);
675
1211
  }
676
1212
 
1213
+ .help-document details.help-details > .k2b-disclosure__content {
1214
+ padding: 0.25rem 0;
1215
+ color: inherit;
1216
+ font-size: inherit;
1217
+ line-height: inherit;
1218
+ }
1219
+
677
1220
  .help-document .help-compare {
678
1221
  margin: 1rem 0 2rem;
679
1222
  }
@@ -860,14 +1403,14 @@
860
1403
  overflow-wrap: break-word;
861
1404
  /* The row fill and column band reach as far past the text on every side. */
862
1405
  padding: var(--md-table-bleed);
863
- font-size: 0.78rem;
1406
+ font-size: 0.875rem;
864
1407
  line-height: 1.45;
865
1408
  word-break: normal;
866
1409
  }
867
1410
 
868
1411
  .help-document .md-table thead .md-table-cell {
869
1412
  color: var(--color-zinc-700);
870
- font-size: 0.75rem;
1413
+ font-size: 0.8125rem;
871
1414
  font-weight: 650;
872
1415
  }
873
1416
 
@@ -904,64 +1447,25 @@
904
1447
 
905
1448
  @container help-article (max-width: 56rem) {
906
1449
  .help-article-layout {
907
- grid-template-columns: 3.25rem minmax(0, 52rem);
908
- gap: 2rem;
909
- }
910
-
911
- .help-article-toc-label,
912
- .help-article-toc-title {
913
- position: absolute;
914
- width: 1px;
915
- height: 1px;
916
- padding: 0;
917
- overflow: hidden;
918
- clip: rect(0, 0, 0, 0);
919
- white-space: nowrap;
920
- border: 0;
921
- }
922
-
923
- .help-article-toc button {
924
- display: grid;
925
- width: 2.85rem;
926
- height: 2.85rem;
927
- grid-template-columns: 1fr;
928
- place-items: center;
929
- }
930
- }
931
-
932
- @container help-article (max-width: 40rem) {
933
- .help-article-layout {
934
- grid-template-columns: minmax(0, 1fr);
935
- gap: 1.5rem;
936
- }
937
-
938
- .help-article-toc {
939
- z-index: 2;
940
- top: 0;
941
- overflow-x: auto;
942
- border-radius: var(--ui-radius-surface);
943
- background: color-mix(in srgb, var(--ui-surface-raised) 90%, transparent);
944
- box-shadow: var(--ui-shadow-hover);
945
- backdrop-filter: blur(12px);
946
- scrollbar-width: none;
1450
+ grid-template-columns: minmax(0, 40rem);
1451
+ gap: 0;
947
1452
  }
948
1453
 
949
- .help-article-toc::-webkit-scrollbar {
1454
+ .help-article-aside {
950
1455
  display: none;
951
1456
  }
952
1457
 
953
- .help-article-toc ol {
1458
+ .help-article-tools {
954
1459
  display: flex;
955
- width: max-content;
956
- padding: 0.35rem !important;
957
1460
  }
1461
+ }
958
1462
 
959
- .help-document .help-section-title {
960
- margin-top: 3rem;
961
- scroll-margin-top: 4.5rem;
1463
+ @container help-article (max-width: 40rem) {
1464
+ .help-article-head {
1465
+ margin-bottom: 1.5rem;
962
1466
  }
963
1467
 
964
- .help-document .help-reference > ul,
1468
+ /* Two columns leave a phone about 140 px per alternative. */
965
1469
  .help-document .help-compare > ul {
966
1470
  grid-template-columns: minmax(0, 1fr);
967
1471
  }