@k2b/cloud 0.37.0 → 0.38.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 (64) hide show
  1. package/package.json +4 -2
  2. package/src/_internal/help-catalog.ts +123 -4
  3. package/src/_internal/help.ts +27 -6
  4. package/src/account/Avatar.tsx +20 -2
  5. package/src/account/ui.ts +1 -1
  6. package/src/ai/browser.ts +1 -0
  7. package/src/ai/chart-block.ts +44 -13
  8. package/src/ai/chat/chart-block.tsx +2 -11
  9. package/src/ai/chat/messages.ts +10 -0
  10. package/src/ai/chat/web-tools.tsx +23 -6
  11. package/src/ai/chat-tasks.ts +65 -1
  12. package/src/ai/default-tool-contracts.ts +30 -13
  13. package/src/ai/fetch-file-tool.ts +37 -3
  14. package/src/ai/migrate.ts +19 -2
  15. package/src/ai/readable-html.ts +1057 -0
  16. package/src/api/help.ts +23 -4
  17. package/src/api/mcp.ts +8 -2
  18. package/src/browser/FileChooser.tsx +11 -3
  19. package/src/browser/choose-files.browser-harness.tsx +4 -1
  20. package/src/browser/file-chooser-messages.ts +4 -0
  21. package/src/browser/file-providers.ts +14 -1
  22. package/src/browser/provider-folder.tsx +58 -5
  23. package/src/browser/resource-picker.tsx +5 -1
  24. package/src/cli/admin/workflows.ts +1 -0
  25. package/src/config/env.ts +14 -0
  26. package/src/contracts/file-provider.ts +48 -1
  27. package/src/contracts/outgoing-mail.ts +8 -1
  28. package/src/server/help.ts +136 -10
  29. package/src/server/services/geo.ts +21 -4
  30. package/src/services/allowed-network-fetch.ts +189 -0
  31. package/src/services/help/index.ts +46 -5
  32. package/src/services/help/store.ts +26 -5
  33. package/src/services/help/types.ts +10 -2
  34. package/src/services/index.ts +1 -0
  35. package/src/services/outgoing-mail/dispatcher.ts +7 -2
  36. package/src/services/outgoing-mail/resolve-host.ts +39 -0
  37. package/src/services/outgoing-mail/test-send.ts +18 -3
  38. package/src/services/outgoing-mail/transport.ts +24 -13
  39. package/src/services/settings/index.ts +48 -26
  40. package/src/shared/help.ts +41 -0
  41. package/src/shared/index.ts +9 -1
  42. package/src/shared/markdown/extensions/guided-help.ts +208 -64
  43. package/src/shared/markdown/formula.ts +8 -8
  44. package/src/shared/markdown/index.ts +72 -11
  45. package/src/ssr/Layout.tsx +20 -2
  46. package/src/ssr/LayoutHelp.browser-harness.tsx +130 -27
  47. package/src/ssr/LayoutHelp.tsx +569 -410
  48. package/src/ssr/ShellRuntime.island.tsx +17 -25
  49. package/src/ssr/help-messages.ts +60 -38
  50. package/src/ssr/help.ts +3 -0
  51. package/src/ssr/layout-help-article.ts +41 -0
  52. package/src/ssr/layout-help-navigation.ts +0 -12
  53. package/src/ssr/layout-help-registry.tsx +4 -11
  54. package/src/ssr/layout-help-search.ts +9 -12
  55. package/src/ssr/layout-help-start.ts +68 -0
  56. package/src/ssr/platform-messages.ts +4 -0
  57. package/src/ssr/shell-data.tsx +7 -0
  58. package/src/ssr/shell-shortcuts.ts +8 -0
  59. package/src/styles/effects.css +688 -185
  60. package/src/styles/resource-search.css +25 -0
  61. package/src/workflows/store/events.ts +24 -0
  62. package/src/workflows/store/index.ts +8 -0
  63. package/src/workflows/store/observability.ts +6 -1
  64. package/src/workflows/store/retention.ts +157 -0
@@ -345,123 +345,667 @@
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
+ background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 9%, var(--ui-surface-subtle));
884
+ padding: 1.25rem 1.25rem 1.375rem;
885
+ text-decoration: none;
886
+ transition: background-color 140ms ease;
887
+ }
888
+
889
+ .help-article-next:hover {
890
+ background: color-mix(in srgb, var(--app-accent, var(--color-blue-500)) 15%, var(--ui-surface-subtle));
891
+ }
892
+
893
+ .help-article-next-label {
894
+ color: var(--ui-app-accent-text);
895
+ font-size: 0.8125rem;
896
+ font-weight: 650;
897
+ }
898
+
899
+ .help-article-next-row {
900
+ display: flex;
901
+ min-width: 0;
902
+ align-items: flex-start;
903
+ gap: 0.75rem;
904
+ }
905
+
906
+ .help-article-next-icon {
907
+ margin-top: 0.125rem;
908
+ color: var(--ui-app-accent-text);
909
+ font-size: 1.375rem;
910
+ }
911
+
912
+ .help-article-next-arrow {
913
+ margin-top: 0.25rem;
914
+ margin-inline-start: auto;
915
+ color: var(--ui-app-accent-text);
916
+ font-size: 1.25rem;
917
+ }
918
+
919
+ .help-article-next .help-article-link-title {
920
+ font-size: 1.125rem;
921
+ }
922
+
923
+ .help-article-link-copy {
924
+ display: flex;
925
+ min-width: 0;
926
+ flex-direction: column;
927
+ gap: 0.125rem;
928
+ }
929
+
930
+ .help-article-link-title {
931
+ color: var(--color-zinc-950);
932
+ font-size: 0.9375rem;
933
+ font-weight: 600;
447
934
  line-height: 1.35;
448
- text-overflow: ellipsis;
449
- white-space: nowrap;
450
935
  }
451
936
 
452
- .dark .help-article-toc button {
937
+ .help-article-link-description {
938
+ color: var(--color-zinc-600);
939
+ font-size: 0.875rem;
940
+ line-height: 1.45;
941
+ }
942
+
943
+ .dark .help-article-link-title {
944
+ color: var(--color-zinc-50);
945
+ }
946
+
947
+ .dark .help-article-link-description {
453
948
  color: var(--color-zinc-400);
454
949
  }
455
950
 
456
- .dark .help-article-toc button:hover,
457
- .dark .help-article-toc button[aria-current="location"] {
458
- color: var(--ui-app-accent-text);
951
+ .help-article-related > h4 {
952
+ margin: 0 0 0.5rem;
953
+ color: var(--color-zinc-600);
954
+ font-size: 0.8125rem;
955
+ font-weight: 650;
956
+ }
957
+
958
+ .dark .help-article-related > h4 {
959
+ color: var(--color-zinc-400);
960
+ }
961
+
962
+ .help-article-related > ul {
963
+ display: flex;
964
+ flex-direction: column;
965
+ gap: 0.125rem;
966
+ margin: 0;
967
+ padding: 0;
968
+ list-style: none;
969
+ }
970
+
971
+ .help-article-related-link {
972
+ display: flex;
973
+ min-width: 0;
974
+ align-items: center;
975
+ gap: 0.75rem;
976
+ border-radius: var(--ui-radius-control);
977
+ padding: 0.5rem;
978
+ margin-inline: -0.5rem;
979
+ text-decoration: none;
980
+ transition: background-color 140ms ease;
981
+ }
982
+
983
+ .help-article-related-link:hover {
984
+ background: var(--ui-surface-subtle);
985
+ }
986
+
987
+ .help-article-related-icon {
988
+ display: grid;
989
+ width: 2.25rem;
990
+ height: 2.25rem;
991
+ flex: 0 0 auto;
992
+ place-items: center;
993
+ border-radius: var(--ui-radius-control);
994
+ font-size: 1.0625rem;
995
+ }
996
+
997
+ .help-article-related-app {
998
+ flex: 0 0 auto;
999
+ margin-inline-start: auto;
1000
+ font-size: 0.75rem;
1001
+ font-weight: 600;
459
1002
  }
460
1003
 
461
1004
  .help-document {
1005
+ max-width: 40rem;
462
1006
  color: var(--color-zinc-800);
463
- font-size: 0.9375rem;
464
- line-height: 1.65;
1007
+ font-size: 1rem;
1008
+ line-height: 1.6;
465
1009
  }
466
1010
 
467
1011
  .dark .help-document {
@@ -491,37 +1035,23 @@
491
1035
  color: var(--color-zinc-100);
492
1036
  }
493
1037
 
494
- .help-document :where(h2, h3) {
495
- margin: 2.5rem 0 0.75rem;
1038
+ .help-document :where(h3) {
1039
+ margin: 2rem 0 0.5rem;
496
1040
  font-size: 1.125rem;
497
1041
  line-height: 1.35;
498
1042
  }
499
1043
 
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;
1044
+ .help-document :where(h2) {
1045
+ margin: 2.5rem 0 0.75rem;
1046
+ scroll-margin-top: 1rem;
506
1047
  font-size: 1.25rem;
1048
+ line-height: 1.3;
507
1049
  }
508
1050
 
509
- .help-document .help-section-title:first-child {
1051
+ .help-document > :where(h2:first-child) {
510
1052
  margin-top: 0;
511
1053
  }
512
1054
 
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
1055
  .help-document :where(h4) {
526
1056
  margin: 1.75rem 0 0.5rem;
527
1057
  font-size: 0.9375rem;
@@ -587,9 +1117,9 @@
587
1117
  }
588
1118
 
589
1119
  .help-document .help-reference > ul {
590
- display: grid;
591
- grid-template-columns: repeat(2, minmax(0, 1fr));
592
- gap: 1.25rem 2rem;
1120
+ display: flex;
1121
+ flex-direction: column;
1122
+ gap: 0.75rem;
593
1123
  margin: 0 !important;
594
1124
  padding: 0 !important;
595
1125
  list-style: none;
@@ -600,11 +1130,14 @@
600
1130
  margin: 0;
601
1131
  }
602
1132
 
1133
+ /* One column: the term leads its line, its explanation follows on the same line. */
603
1134
  .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;
1135
+ color: var(--color-zinc-950);
1136
+ font-weight: 650;
1137
+ }
1138
+
1139
+ .dark .help-document .help-reference > ul > li > strong:first-child {
1140
+ color: var(--color-zinc-50);
608
1141
  }
609
1142
 
610
1143
  /* Tailwind Typography decorates inline code with visible backticks. Help
@@ -614,66 +1147,75 @@
614
1147
  content: none !important;
615
1148
  }
616
1149
 
1150
+ /* Steps use the shared @k2b/ui look: no surface, large numbers in the app colour. */
617
1151
  .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;
1152
+ margin: 1rem 0 1.75rem;
622
1153
  }
623
1154
 
624
- .help-document .help-steps > ol {
1155
+ .help-document .help-steps > ol.k2b-steps {
625
1156
  margin: 0 !important;
626
1157
  padding: 0 !important;
627
- list-style: none;
628
- counter-reset: help-step;
629
1158
  }
630
1159
 
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;
1160
+ .help-document .help-steps > ol.k2b-steps > li + li {
1161
+ margin-top: 0;
637
1162
  }
638
1163
 
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;
1164
+ /* A step's first bold words often name it ("Choose:"); keep them in the text colour. */
1165
+ .help-document .help-steps > ol > li > strong:first-child,
1166
+ .help-document .help-steps > ol > li > p:first-child > strong:first-child {
1167
+ color: var(--color-zinc-950);
654
1168
  }
655
1169
 
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: "";
1170
+ .dark .help-document .help-steps > ol > li > strong:first-child,
1171
+ .dark .help-document .help-steps > ol > li > p:first-child > strong:first-child {
1172
+ color: var(--color-zinc-50);
665
1173
  }
666
1174
 
667
- .help-document .help-steps > ol > li > strong:first-child,
668
- .help-document .help-steps > ol > li > p:first-child > strong:first-child {
1175
+ /* A bold menu path: label chips joined by ›. */
1176
+ .help-document .help-menu-path {
1177
+ white-space: normal;
1178
+ }
1179
+
1180
+ .help-document .help-menu-path-separator {
1181
+ margin-inline: 0.3em;
1182
+ color: var(--color-zinc-500);
1183
+ }
1184
+
1185
+ /* Details: reasons and special cases, collapsed, read at body size. They stay
1186
+ flat when open: the text continues on the page, not in a box. The selectors
1187
+ outrank the shared Disclosure surface rules. */
1188
+ .help-document details.help-details[data-surface] {
1189
+ margin: 1rem 0 1.25rem;
1190
+ padding: 0;
1191
+ /* Disclosure tints the whole open block while its summary is hovered. */
1192
+ background: transparent !important;
1193
+ }
1194
+
1195
+ .help-document details.help-details > summary:hover {
1196
+ background: var(--ui-surface-subtle);
1197
+ }
1198
+
1199
+ .help-document details.help-details > summary {
1200
+ min-height: 2.75rem;
1201
+ margin-inline: -0.5rem;
1202
+ padding-inline: 0.5rem;
669
1203
  color: var(--color-zinc-900);
1204
+ font-size: 1rem;
1205
+ font-weight: 600;
670
1206
  }
671
1207
 
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 {
1208
+ .dark .help-document details.help-details > summary {
674
1209
  color: var(--color-zinc-100);
675
1210
  }
676
1211
 
1212
+ .help-document details.help-details > .k2b-disclosure__content {
1213
+ padding: 0.25rem 0;
1214
+ color: inherit;
1215
+ font-size: inherit;
1216
+ line-height: inherit;
1217
+ }
1218
+
677
1219
  .help-document .help-compare {
678
1220
  margin: 1rem 0 2rem;
679
1221
  }
@@ -860,14 +1402,14 @@
860
1402
  overflow-wrap: break-word;
861
1403
  /* The row fill and column band reach as far past the text on every side. */
862
1404
  padding: var(--md-table-bleed);
863
- font-size: 0.78rem;
1405
+ font-size: 0.875rem;
864
1406
  line-height: 1.45;
865
1407
  word-break: normal;
866
1408
  }
867
1409
 
868
1410
  .help-document .md-table thead .md-table-cell {
869
1411
  color: var(--color-zinc-700);
870
- font-size: 0.75rem;
1412
+ font-size: 0.8125rem;
871
1413
  font-weight: 650;
872
1414
  }
873
1415
 
@@ -904,64 +1446,25 @@
904
1446
 
905
1447
  @container help-article (max-width: 56rem) {
906
1448
  .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;
1449
+ grid-template-columns: minmax(0, 40rem);
1450
+ gap: 0;
947
1451
  }
948
1452
 
949
- .help-article-toc::-webkit-scrollbar {
1453
+ .help-article-aside {
950
1454
  display: none;
951
1455
  }
952
1456
 
953
- .help-article-toc ol {
1457
+ .help-article-tools {
954
1458
  display: flex;
955
- width: max-content;
956
- padding: 0.35rem !important;
957
1459
  }
1460
+ }
958
1461
 
959
- .help-document .help-section-title {
960
- margin-top: 3rem;
961
- scroll-margin-top: 4.5rem;
1462
+ @container help-article (max-width: 40rem) {
1463
+ .help-article-head {
1464
+ margin-bottom: 1.5rem;
962
1465
  }
963
1466
 
964
- .help-document .help-reference > ul,
1467
+ /* Two columns leave a phone about 140 px per alternative. */
965
1468
  .help-document .help-compare > ul {
966
1469
  grid-template-columns: minmax(0, 1fr);
967
1470
  }