@signalcore/ui 1.0.0-beta.2 → 1.0.0-beta.4

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 (99) hide show
  1. package/README.md +126 -21
  2. package/dist/AgentAbout.js +6 -2
  3. package/dist/AgentAbout.js.map +1 -1
  4. package/dist/AgentChat.d.ts +25 -3
  5. package/dist/AgentChat.js +302 -28
  6. package/dist/AgentChat.js.map +1 -1
  7. package/dist/AgentSpace.d.ts +25 -4
  8. package/dist/AgentSpace.js +55 -11
  9. package/dist/AgentSpace.js.map +1 -1
  10. package/dist/Threads.d.ts +73 -0
  11. package/dist/Threads.js +140 -0
  12. package/dist/Threads.js.map +1 -0
  13. package/dist/View.d.ts +48 -0
  14. package/dist/View.js +101 -0
  15. package/dist/View.js.map +1 -0
  16. package/dist/automation/marks.js +7 -3
  17. package/dist/automation/marks.js.map +1 -1
  18. package/dist/automation/messages.d.ts +4 -0
  19. package/dist/automation/messages.js +5 -1
  20. package/dist/automation/messages.js.map +1 -1
  21. package/dist/automation/when.js +8 -0
  22. package/dist/automation/when.js.map +1 -1
  23. package/dist/blocks.d.ts +83 -2
  24. package/dist/client.d.ts +23 -5
  25. package/dist/client.js +8 -2
  26. package/dist/client.js.map +1 -1
  27. package/dist/contract.d.ts +9 -4
  28. package/dist/es.d.ts +2 -0
  29. package/dist/es.js +34 -3
  30. package/dist/es.js.map +1 -1
  31. package/dist/frames.d.ts +7 -1
  32. package/dist/frames.js.map +1 -1
  33. package/dist/index.d.ts +14 -7
  34. package/dist/index.js +11 -4
  35. package/dist/kit/Agenda.d.ts +25 -0
  36. package/dist/kit/Agenda.js +119 -0
  37. package/dist/kit/Agenda.js.map +1 -0
  38. package/dist/kit/Combobox.js +1 -1
  39. package/dist/kit/DateField.js +1 -1
  40. package/dist/kit/Kanban.d.ts +17 -0
  41. package/dist/kit/Kanban.js +157 -0
  42. package/dist/kit/Kanban.js.map +1 -0
  43. package/dist/kit/TimeField.js +1 -1
  44. package/dist/kit/Timeline.d.ts +14 -0
  45. package/dist/kit/Timeline.js +71 -0
  46. package/dist/kit/Timeline.js.map +1 -0
  47. package/dist/kit/context.d.ts +1 -1
  48. package/dist/kit/context.js.map +1 -1
  49. package/dist/kit/messages.d.ts +22 -0
  50. package/dist/kit/messages.js +10 -0
  51. package/dist/kit/messages.js.map +1 -1
  52. package/dist/surface/Form.js +1 -1
  53. package/dist/surface/Placed.d.ts +20 -0
  54. package/dist/surface/Placed.js +70 -0
  55. package/dist/surface/Placed.js.map +1 -0
  56. package/dist/surface/Surface.d.ts +4 -2
  57. package/dist/surface/Surface.js +78 -2
  58. package/dist/surface/Surface.js.map +1 -1
  59. package/dist/surface/places.d.ts +16 -0
  60. package/dist/surface/places.js +15 -0
  61. package/dist/surface/places.js.map +1 -0
  62. package/dist/surface/scope.d.ts +17 -1
  63. package/dist/surface/scope.js +1 -0
  64. package/dist/surface/scope.js.map +1 -1
  65. package/dist/types.d.ts +23 -0
  66. package/dist/types.js.map +1 -1
  67. package/dist/useConversation.d.ts +2 -0
  68. package/dist/useConversation.js +16 -0
  69. package/dist/useConversation.js.map +1 -1
  70. package/dist/widget.js +17 -16
  71. package/package.json +1 -1
  72. package/src/AgentAbout.tsx +4 -0
  73. package/src/AgentChat.tsx +417 -34
  74. package/src/AgentSpace.tsx +106 -14
  75. package/src/Threads.tsx +218 -0
  76. package/src/View.tsx +117 -0
  77. package/src/automation/marks.tsx +7 -0
  78. package/src/automation/messages.ts +8 -0
  79. package/src/automation/when.ts +4 -0
  80. package/src/blocks.ts +100 -2
  81. package/src/client.ts +42 -10
  82. package/src/contract.ts +404 -29
  83. package/src/es.ts +30 -0
  84. package/src/frames.ts +3 -1
  85. package/src/index.ts +36 -3
  86. package/src/kit/Agenda.tsx +161 -0
  87. package/src/kit/Kanban.tsx +182 -0
  88. package/src/kit/Timeline.tsx +58 -0
  89. package/src/kit/context.tsx +45 -1
  90. package/src/kit/messages.ts +31 -0
  91. package/src/styles.css +825 -66
  92. package/src/surface/Placed.tsx +98 -0
  93. package/src/surface/Surface.tsx +92 -1
  94. package/src/surface/places.ts +19 -0
  95. package/src/surface/scope.ts +24 -1
  96. package/src/types.ts +24 -0
  97. package/src/useConversation.ts +10 -0
  98. package/src/widget/element.tsx +54 -7
  99. package/src/widget/widget.css +13 -0
package/src/styles.css CHANGED
@@ -633,6 +633,45 @@
633
633
  line-height: 1.375;
634
634
  }
635
635
 
636
+ /* Several actions waiting for the person's leave, in one card: a row for each, its box ticked
637
+ and what it would take under it, editable; one button at the foot. */
638
+ .sc-chat__requests > ul {
639
+ display: flex;
640
+ flex-direction: column;
641
+ margin: 0;
642
+ padding: 0;
643
+ list-style: none;
644
+ }
645
+
646
+ .sc-chat__ask {
647
+ display: flex;
648
+ flex-direction: column;
649
+ gap: calc(var(--_space) * 2.5);
650
+ padding: calc(var(--_space) * 3) calc(var(--_space) * 4);
651
+ }
652
+
653
+ .sc-chat__ask + .sc-chat__ask {
654
+ border-top: 1px solid var(--_line);
655
+ }
656
+
657
+ .sc-chat__ask > .sc-check > span {
658
+ font-weight: var(--_font-weight-medium);
659
+ line-height: 1.375;
660
+ }
661
+
662
+ .sc-chat__ask-fields {
663
+ display: grid;
664
+ gap: calc(var(--_space) * 2.5);
665
+ padding-left: calc(var(--_space) * 6.5);
666
+ }
667
+
668
+ .sc-chat__requests > footer {
669
+ display: flex;
670
+ justify-content: flex-end;
671
+ padding: calc(var(--_space) * 3) calc(var(--_space) * 4);
672
+ border-top: 1px solid var(--_line);
673
+ }
674
+
636
675
  /* On a person's page, in place of the approval card: what waits for the business's yes, a quiet
637
676
  line under the steps; the person has nothing to press. */
638
677
  .sc-chat__confirming {
@@ -675,6 +714,124 @@
675
714
  height: 14px;
676
715
  }
677
716
 
717
+ /* Where the agent put what it showed apart: a quiet line in its reply, its glyph and words, that
718
+ opens it again; the one open reads in the ink. */
719
+ .sc-chat__placed {
720
+ display: inline-flex;
721
+ align-items: center;
722
+ gap: calc(var(--_space) * 2);
723
+ align-self: flex-start;
724
+ margin: calc(var(--_space) * 2) 0 0;
725
+ padding: 2px 0;
726
+ border: 0;
727
+ background: none;
728
+ color: var(--_muted);
729
+ font: inherit;
730
+ font-size: var(--_font-size-sm);
731
+ text-align: left;
732
+ white-space: normal;
733
+ cursor: pointer;
734
+ }
735
+
736
+ .sc-chat__placed:hover {
737
+ color: var(--_fg);
738
+ }
739
+
740
+ .sc-chat__placed:hover > span {
741
+ text-decoration: underline;
742
+ text-decoration-color: var(--_line-hover);
743
+ text-underline-offset: 3px;
744
+ }
745
+
746
+ .sc-chat__placed:focus-visible {
747
+ outline: 2px solid var(--_accent);
748
+ outline-offset: 2px;
749
+ }
750
+
751
+ .sc-chat__placed--open {
752
+ color: var(--_fg);
753
+ }
754
+
755
+ .sc-chat__placed > svg {
756
+ flex-shrink: 0;
757
+ width: 15px;
758
+ height: 15px;
759
+ }
760
+
761
+ /* A surface apart: its title and close over it, the surface scrolling under them. A panel stands
762
+ at the chat's right edge, the conversation beside it (under it, where the chat is narrow); a
763
+ modal over the page, on a dimmed backdrop. */
764
+ .sc-placed {
765
+ display: flex;
766
+ flex-direction: column;
767
+ min-height: 0;
768
+ color: var(--_fg);
769
+ background: var(--_surface);
770
+ }
771
+
772
+ .sc-placed__head {
773
+ display: flex;
774
+ flex-shrink: 0;
775
+ align-items: center;
776
+ justify-content: space-between;
777
+ gap: 12px;
778
+ padding: 10px 10px 10px 16px;
779
+ border-bottom: 1px solid var(--_hair);
780
+ }
781
+
782
+ .sc-placed__title {
783
+ margin: 0;
784
+ overflow: hidden;
785
+ font-size: var(--_font-size);
786
+ font-weight: var(--_font-weight-bold);
787
+ text-overflow: ellipsis;
788
+ white-space: nowrap;
789
+ }
790
+
791
+ .sc-placed__title::first-letter {
792
+ text-transform: uppercase;
793
+ }
794
+
795
+ .sc-placed__body {
796
+ flex: 1;
797
+ min-height: 0;
798
+ padding: 16px;
799
+ overflow-y: auto;
800
+ overscroll-behavior: contain;
801
+ }
802
+
803
+ .sc-placed--panel {
804
+ position: absolute;
805
+ inset: 0 0 0 auto;
806
+ z-index: 2;
807
+ width: min(440px, 100%);
808
+ border-left: 1px solid var(--_line);
809
+ }
810
+
811
+ /* The conversation beside an open panel: what is left of the chat's width (none, where the panel
812
+ takes it all). */
813
+ .sc-chat--placed {
814
+ padding-right: min(440px, 100%);
815
+ }
816
+
817
+ .sc-placed--modal {
818
+ width: min(600px, calc(100vw - 32px));
819
+ max-height: min(720px, calc(100dvh - 48px));
820
+ padding: 0;
821
+ overflow: hidden;
822
+ border: 1px solid var(--_line);
823
+ border-radius: var(--_radius);
824
+ box-shadow: var(--_shadow-overlay);
825
+ }
826
+
827
+ .sc-placed--modal[open] {
828
+ display: flex;
829
+ }
830
+
831
+ .sc-placed--modal::backdrop {
832
+ background: rgb(0 0 0 / 0.32);
833
+ }
834
+
678
835
  /* Where who answers the conversation changed: the same quiet line, what changed and why centred
679
836
  between the hairlines (a long reason wraps there), and when, quieter still. */
680
837
  .sc-chat__handover {
@@ -2149,99 +2306,532 @@ button.sc-tile__main:focus-visible {
2149
2306
  color: var(--_fg);
2150
2307
  font-size: var(--_font-size-sm);
2151
2308
  font-weight: var(--_font-weight-medium);
2152
- text-align: right;
2153
- }
2154
-
2155
- .sc-chart--line {
2156
- display: flex;
2157
- flex-direction: column;
2158
- gap: 4px;
2309
+ text-align: right;
2310
+ }
2311
+
2312
+ .sc-chart--line {
2313
+ display: flex;
2314
+ flex-direction: column;
2315
+ gap: 4px;
2316
+ }
2317
+
2318
+ .sc-chart__top,
2319
+ .sc-chart__ends {
2320
+ color: var(--_subtle);
2321
+ font-size: var(--_font-size-xs);
2322
+ }
2323
+
2324
+ .sc-chart__ends {
2325
+ display: flex;
2326
+ justify-content: space-between;
2327
+ gap: 12px;
2328
+ }
2329
+
2330
+ .sc-chart__plot {
2331
+ position: relative;
2332
+ height: 160px;
2333
+ touch-action: pan-y;
2334
+ }
2335
+
2336
+ .sc-chart__plot > svg {
2337
+ display: block;
2338
+ width: 100%;
2339
+ height: 100%;
2340
+ overflow: visible;
2341
+ }
2342
+
2343
+ .sc-chart__wash {
2344
+ stop-color: var(--_chart);
2345
+ stop-opacity: 0.1;
2346
+ }
2347
+
2348
+ .sc-chart__axis {
2349
+ stroke: var(--_line);
2350
+ stroke-width: 1px;
2351
+ vector-effect: non-scaling-stroke;
2352
+ }
2353
+
2354
+ .sc-chart__line {
2355
+ fill: none;
2356
+ stroke: var(--_chart);
2357
+ stroke-width: 2px;
2358
+ stroke-linecap: round;
2359
+ stroke-linejoin: round;
2360
+ vector-effect: non-scaling-stroke;
2361
+ }
2362
+
2363
+ .sc-chart__dot {
2364
+ position: absolute;
2365
+ width: 10px;
2366
+ height: 10px;
2367
+ border: 2px solid var(--_surface);
2368
+ border-radius: var(--_radius-full);
2369
+ background: var(--_chart);
2370
+ pointer-events: none;
2371
+ translate: -50% -50%;
2372
+ }
2373
+
2374
+ .sc-chart__tip {
2375
+ position: absolute;
2376
+ bottom: calc(100% + 4px);
2377
+ display: flex;
2378
+ gap: 8px;
2379
+ padding: 4px 8px;
2380
+ border: 1px solid var(--_line);
2381
+ border-radius: calc(var(--_radius) - 4px);
2382
+ background: var(--_surface);
2383
+ box-shadow: var(--_shadow-raised);
2384
+ color: var(--_muted);
2385
+ font-size: var(--_font-size-sm);
2386
+ white-space: nowrap;
2387
+ pointer-events: none;
2388
+ }
2389
+
2390
+ .sc-chart__tip > strong {
2391
+ color: var(--_fg);
2392
+ font-weight: var(--_font-weight-medium);
2393
+ }
2394
+
2395
+ .sc-chart__data {
2396
+ position: absolute;
2397
+ width: 1px;
2398
+ height: 1px;
2399
+ overflow: hidden;
2400
+ clip-path: inset(50%);
2401
+ white-space: nowrap;
2402
+ }
2403
+
2404
+ /* A calendar: its days one under another, each its weekday and number at the left of its events
2405
+ (today's in the accent), an empty day a single quiet line; wide enough, the week stands as
2406
+ seven columns. Each event its hours in figures that line up, its title, a quiet line of detail;
2407
+ one to open or press lights under the pointer. */
2408
+ .sc-agenda {
2409
+ min-width: 0;
2410
+ container-type: inline-size;
2411
+ font-variant-numeric: tabular-nums;
2412
+ }
2413
+
2414
+ .sc-agenda__days {
2415
+ display: flex;
2416
+ flex-direction: column;
2417
+ }
2418
+
2419
+ .sc-agenda__day {
2420
+ display: grid;
2421
+ grid-template-columns: 44px minmax(0, 1fr);
2422
+ gap: 12px;
2423
+ padding: 10px 0;
2424
+ }
2425
+
2426
+ .sc-agenda__day + .sc-agenda__day {
2427
+ border-top: 1px solid var(--_hair);
2428
+ }
2429
+
2430
+ .sc-agenda--day .sc-agenda__day {
2431
+ grid-template-columns: minmax(0, 1fr);
2432
+ padding: 0;
2433
+ }
2434
+
2435
+ .sc-agenda__date {
2436
+ display: flex;
2437
+ flex-direction: column;
2438
+ align-items: flex-start;
2439
+ margin: 0;
2440
+ font-weight: var(--_font-weight);
2441
+ line-height: 1.2;
2442
+ }
2443
+
2444
+ .sc-agenda__weekday {
2445
+ color: var(--_subtle);
2446
+ font-size: var(--_font-size-xs);
2447
+ text-transform: capitalize;
2448
+ }
2449
+
2450
+ .sc-agenda__number {
2451
+ color: var(--_fg);
2452
+ font-size: var(--_font-size-lg);
2453
+ font-weight: var(--_font-weight-medium);
2454
+ }
2455
+
2456
+ .sc-agenda__day--today .sc-agenda__weekday,
2457
+ .sc-agenda__day--today .sc-agenda__number {
2458
+ color: var(--_accent);
2459
+ }
2460
+
2461
+ .sc-agenda__events {
2462
+ display: flex;
2463
+ flex-direction: column;
2464
+ gap: 2px;
2465
+ min-width: 0;
2466
+ margin: 0;
2467
+ padding: 0;
2468
+ list-style: none;
2469
+ }
2470
+
2471
+ .sc-agenda__event {
2472
+ display: grid;
2473
+ grid-template-columns: calc(var(--_font-size) * 7) minmax(0, 1fr);
2474
+ gap: 12px;
2475
+ align-items: baseline;
2476
+ width: 100%;
2477
+ margin: 0 -8px;
2478
+ padding: 6px 8px;
2479
+ border: 0;
2480
+ border-radius: var(--_inner);
2481
+ background: none;
2482
+ color: inherit;
2483
+ font: inherit;
2484
+ text-align: left;
2485
+ text-decoration: none;
2486
+ box-sizing: content-box;
2487
+ }
2488
+
2489
+ :is(a, button).sc-agenda__event {
2490
+ cursor: pointer;
2491
+ transition: background-color 0.12s;
2492
+ }
2493
+
2494
+ :is(a, button).sc-agenda__event:hover:not(:disabled) {
2495
+ background: var(--_wash);
2496
+ }
2497
+
2498
+ :is(a, button).sc-agenda__event:focus-visible {
2499
+ outline: 2px solid var(--_accent);
2500
+ outline-offset: -2px;
2501
+ }
2502
+
2503
+ button.sc-agenda__event:disabled {
2504
+ cursor: default;
2505
+ }
2506
+
2507
+ .sc-agenda__time {
2508
+ color: var(--_muted);
2509
+ font-size: var(--_font-size-sm);
2510
+ }
2511
+
2512
+ .sc-agenda__time > span {
2513
+ white-space: nowrap;
2514
+ }
2515
+
2516
+ .sc-agenda__what {
2517
+ display: flex;
2518
+ flex-direction: column;
2519
+ min-width: 0;
2520
+ }
2521
+
2522
+ .sc-agenda__title {
2523
+ overflow-wrap: anywhere;
2524
+ font-weight: var(--_font-weight-medium);
2525
+ }
2526
+
2527
+ .sc-agenda__detail,
2528
+ .sc-agenda__empty {
2529
+ color: var(--_muted);
2530
+ font-size: var(--_font-size-sm);
2531
+ }
2532
+
2533
+ .sc-agenda__empty {
2534
+ margin: 0;
2535
+ padding: 2px 0;
2536
+ color: var(--_subtle);
2537
+ }
2538
+
2539
+ .sc-agenda__day--empty {
2540
+ align-items: center;
2541
+ }
2542
+
2543
+ @container (min-width: 680px) {
2544
+ .sc-agenda:not(.sc-agenda--day) > .sc-agenda__days {
2545
+ display: grid;
2546
+ grid-template-columns: repeat(7, minmax(0, 1fr));
2547
+ border: 1px solid var(--_hair);
2548
+ border-radius: var(--_inner);
2549
+ }
2550
+
2551
+ .sc-agenda:not(.sc-agenda--day) .sc-agenda__day {
2552
+ grid-template-columns: minmax(0, 1fr);
2553
+ align-content: start;
2554
+ gap: 8px;
2555
+ min-height: 140px;
2556
+ padding: 10px;
2557
+ border-top: 0;
2558
+ }
2559
+
2560
+ .sc-agenda:not(.sc-agenda--day) .sc-agenda__day + .sc-agenda__day {
2561
+ border-left: 1px solid var(--_hair);
2562
+ }
2563
+
2564
+ .sc-agenda:not(.sc-agenda--day) .sc-agenda__event {
2565
+ grid-template-columns: minmax(0, 1fr);
2566
+ gap: 0;
2567
+ margin: 0 -6px;
2568
+ padding: 4px 6px;
2569
+ }
2570
+
2571
+ .sc-agenda:not(.sc-agenda--day) .sc-agenda__time {
2572
+ font-size: var(--_font-size-xs);
2573
+ }
2574
+
2575
+ .sc-agenda:not(.sc-agenda--day) .sc-agenda__empty {
2576
+ display: none;
2577
+ }
2578
+ }
2579
+
2580
+ /* A timeline: a hairline down the left, a dot on it for each thing (hollow, or filled in its
2581
+ tone), its title with where it stands in a quiet word at its right, when under it, a line
2582
+ about it. */
2583
+ .sc-timeline {
2584
+ --_rail: 7px;
2585
+
2586
+ display: flex;
2587
+ flex-direction: column;
2588
+ min-width: 0;
2589
+ margin: 0;
2590
+ padding: 0;
2591
+ list-style: none;
2592
+ }
2593
+
2594
+ .sc-timeline__item {
2595
+ --_dot: var(--_line-hover);
2596
+
2597
+ position: relative;
2598
+ display: grid;
2599
+ grid-template-columns: 16px minmax(0, 1fr);
2600
+ gap: 10px;
2601
+ padding-bottom: 14px;
2602
+ }
2603
+
2604
+ .sc-timeline__item:last-child {
2605
+ padding-bottom: 0;
2606
+ }
2607
+
2608
+ .sc-timeline__item::before {
2609
+ content: "";
2610
+ position: absolute;
2611
+ top: 14px;
2612
+ bottom: -2px;
2613
+ left: var(--_rail);
2614
+ width: 1px;
2615
+ background: var(--_line);
2616
+ }
2617
+
2618
+ .sc-timeline__item:last-child::before {
2619
+ display: none;
2620
+ }
2621
+
2622
+ .sc-timeline__item--info {
2623
+ --_dot: var(--_accent);
2624
+ }
2625
+
2626
+ .sc-timeline__item--success {
2627
+ --_dot: var(--_success);
2628
+ }
2629
+
2630
+ .sc-timeline__item--warning {
2631
+ --_dot: var(--_warning);
2632
+ }
2633
+
2634
+ .sc-timeline__item--danger {
2635
+ --_dot: var(--_danger);
2636
+ }
2637
+
2638
+ .sc-timeline__dot {
2639
+ width: 9px;
2640
+ height: 9px;
2641
+ margin: 6px 0 0 3px;
2642
+ border: 2px solid var(--_dot);
2643
+ border-radius: var(--_radius-full);
2644
+ background: var(--_surface);
2645
+ }
2646
+
2647
+ [class*="sc-timeline__item--"] > .sc-timeline__dot {
2648
+ background: var(--_dot);
2649
+ }
2650
+
2651
+ .sc-timeline__body {
2652
+ display: flex;
2653
+ flex-direction: column;
2654
+ min-width: 0;
2655
+ }
2656
+
2657
+ .sc-timeline__head {
2658
+ display: flex;
2659
+ align-items: baseline;
2660
+ justify-content: space-between;
2661
+ gap: 12px;
2662
+ margin: 0;
2663
+ }
2664
+
2665
+ .sc-timeline__title {
2666
+ min-width: 0;
2667
+ overflow-wrap: anywhere;
2668
+ font-weight: var(--_font-weight-medium);
2669
+ }
2670
+
2671
+ .sc-timeline__status {
2672
+ flex-shrink: 0;
2673
+ color: var(--_muted);
2674
+ font-size: var(--_font-size-sm);
2675
+ }
2676
+
2677
+ .sc-timeline__when {
2678
+ color: var(--_subtle);
2679
+ font-size: var(--_font-size-xs);
2680
+ font-variant-numeric: tabular-nums;
2681
+ }
2682
+
2683
+ .sc-timeline__text {
2684
+ margin: 2px 0 0;
2685
+ color: var(--_muted);
2686
+ font-size: var(--_font-size-sm);
2687
+ }
2688
+
2689
+ /* A board: its columns side by side on a sunken ground, scrolling across inside their own box
2690
+ when they don't fit, each its title and count over its cards; a card lifts a hair off the
2691
+ column, a moving one fades where it was, and the column it would land in lights. */
2692
+ .sc-board {
2693
+ display: grid;
2694
+ grid-auto-columns: minmax(200px, 1fr);
2695
+ grid-auto-flow: column;
2696
+ gap: 8px;
2697
+ min-width: 0;
2698
+ overflow-x: auto;
2699
+ overscroll-behavior-x: contain;
2700
+ scroll-snap-type: x proximity;
2701
+ }
2702
+
2703
+ .sc-board__column {
2704
+ display: flex;
2705
+ flex-direction: column;
2706
+ gap: 8px;
2707
+ min-width: 0;
2708
+ padding: 10px;
2709
+ border: 1px solid transparent;
2710
+ border-radius: var(--_inner);
2711
+ background: var(--_sunken);
2712
+ scroll-snap-align: start;
2713
+ }
2714
+
2715
+ .sc-board__column--over {
2716
+ border-color: color-mix(in srgb, var(--_accent) 40%, transparent);
2717
+ background: var(--_picked);
2718
+ }
2719
+
2720
+ .sc-board__head {
2721
+ display: flex;
2722
+ align-items: baseline;
2723
+ justify-content: space-between;
2724
+ gap: 8px;
2725
+ margin: 0;
2726
+ padding: 0 2px;
2727
+ font-size: var(--_font-size-sm);
2728
+ font-weight: var(--_font-weight-medium);
2159
2729
  }
2160
2730
 
2161
- .sc-chart__top,
2162
- .sc-chart__ends {
2731
+ .sc-board__count {
2163
2732
  color: var(--_subtle);
2164
- font-size: var(--_font-size-xs);
2733
+ font-weight: var(--_font-weight);
2734
+ font-variant-numeric: tabular-nums;
2165
2735
  }
2166
2736
 
2167
- .sc-chart__ends {
2737
+ .sc-board__cards {
2168
2738
  display: flex;
2169
- justify-content: space-between;
2170
- gap: 12px;
2739
+ flex-direction: column;
2740
+ gap: 6px;
2741
+ margin: 0;
2742
+ padding: 0;
2743
+ list-style: none;
2171
2744
  }
2172
2745
 
2173
- .sc-chart__plot {
2746
+ .sc-board__card {
2174
2747
  position: relative;
2175
- height: 160px;
2176
- touch-action: pan-y;
2748
+ display: flex;
2749
+ flex-direction: column;
2750
+ gap: 2px;
2751
+ padding: 10px 12px;
2752
+ border: 1px solid var(--_line);
2753
+ border-radius: var(--_inner);
2754
+ background: var(--_surface);
2755
+ box-shadow: var(--_shadow);
2177
2756
  }
2178
2757
 
2179
- .sc-chart__plot > svg {
2180
- display: block;
2181
- width: 100%;
2182
- height: 100%;
2183
- overflow: visible;
2758
+ .sc-board__card[draggable="true"] {
2759
+ padding-right: 36px;
2760
+ cursor: grab;
2184
2761
  }
2185
2762
 
2186
- .sc-chart__wash {
2187
- stop-color: var(--_chart);
2188
- stop-opacity: 0.1;
2763
+ .sc-board__card--dragging {
2764
+ opacity: 0.45;
2189
2765
  }
2190
2766
 
2191
- .sc-chart__axis {
2192
- stroke: var(--_line);
2193
- stroke-width: 1px;
2194
- vector-effect: non-scaling-stroke;
2767
+ .sc-board__card-title {
2768
+ overflow-wrap: anywhere;
2769
+ font-weight: var(--_font-weight-medium);
2195
2770
  }
2196
2771
 
2197
- .sc-chart__line {
2198
- fill: none;
2199
- stroke: var(--_chart);
2200
- stroke-width: 2px;
2201
- stroke-linecap: round;
2202
- stroke-linejoin: round;
2203
- vector-effect: non-scaling-stroke;
2772
+ .sc-board__card-subtitle {
2773
+ color: var(--_muted);
2774
+ font-size: var(--_font-size-sm);
2204
2775
  }
2205
2776
 
2206
- .sc-chart__dot {
2207
- position: absolute;
2208
- width: 10px;
2209
- height: 10px;
2210
- border: 2px solid var(--_surface);
2211
- border-radius: var(--_radius-full);
2212
- background: var(--_chart);
2213
- pointer-events: none;
2214
- translate: -50% -50%;
2777
+ .sc-board__card-meta {
2778
+ margin-top: 4px;
2779
+ color: var(--_muted);
2780
+ font-size: var(--_font-size-xs);
2781
+ font-variant-numeric: tabular-nums;
2215
2782
  }
2216
2783
 
2217
- .sc-chart__tip {
2218
- position: absolute;
2219
- bottom: calc(100% + 4px);
2220
- display: flex;
2221
- gap: 8px;
2222
- padding: 4px 8px;
2223
- border: 1px solid var(--_line);
2224
- border-radius: calc(var(--_radius) - 4px);
2225
- background: var(--_surface);
2226
- box-shadow: var(--_shadow-raised);
2227
- color: var(--_muted);
2784
+ .sc-board__empty {
2785
+ margin: 0;
2786
+ padding: 2px;
2787
+ color: var(--_subtle);
2228
2788
  font-size: var(--_font-size-sm);
2229
- white-space: nowrap;
2230
- pointer-events: none;
2231
2789
  }
2232
2790
 
2233
- .sc-chart__tip > strong {
2791
+ .sc-board__move {
2792
+ position: absolute;
2793
+ top: 6px;
2794
+ right: 6px;
2795
+ display: grid;
2796
+ place-items: center;
2797
+ width: 26px;
2798
+ height: 26px;
2799
+ padding: 0;
2800
+ border: 0;
2801
+ border-radius: calc(var(--_inner) - 2px);
2802
+ background: none;
2803
+ color: var(--_subtle);
2804
+ cursor: pointer;
2805
+ }
2806
+
2807
+ .sc-board__move:hover,
2808
+ .sc-board__move[aria-expanded="true"] {
2809
+ background: var(--_wash);
2234
2810
  color: var(--_fg);
2235
- font-weight: var(--_font-weight-medium);
2236
2811
  }
2237
2812
 
2238
- .sc-chart__data {
2239
- position: absolute;
2240
- width: 1px;
2241
- height: 1px;
2242
- overflow: hidden;
2243
- clip-path: inset(50%);
2244
- white-space: nowrap;
2813
+ .sc-board__move:focus-visible {
2814
+ outline: 2px solid var(--_accent);
2815
+ outline-offset: 0;
2816
+ }
2817
+
2818
+ .sc-board__move > svg {
2819
+ width: 15px;
2820
+ height: 15px;
2821
+ }
2822
+
2823
+ .sc-board__menu {
2824
+ display: flex;
2825
+ flex-direction: column;
2826
+ min-width: 160px;
2827
+ padding: 4px;
2828
+ }
2829
+
2830
+ .sc-board__menu > p {
2831
+ margin: 0;
2832
+ padding: 4px 8px 6px;
2833
+ color: var(--_subtle);
2834
+ font-size: var(--_font-size-xs);
2245
2835
  }
2246
2836
 
2247
2837
  /* A note: its tone's mark and the words on a wash of it, edged by it. */
@@ -5172,6 +5762,23 @@ button.sc-attachment__main:focus-visible {
5172
5762
  color: var(--_fg);
5173
5763
  }
5174
5764
 
5765
+ /* A host's block this page doesn't draw: its words in a quiet hairline box where it would be. */
5766
+ .sc-surface__host {
5767
+ padding: 12px 14px;
5768
+ border: 1px solid var(--_line);
5769
+ border-radius: var(--_inner);
5770
+ background: var(--_surface);
5771
+ color: var(--_muted);
5772
+ }
5773
+
5774
+ .sc-surface__host > :first-child {
5775
+ margin-top: 0;
5776
+ }
5777
+
5778
+ .sc-surface__host > :last-child {
5779
+ margin-bottom: 0;
5780
+ }
5781
+
5175
5782
  /* An automation that is not there any more: a quiet line in a dashed box where it would be. */
5176
5783
  .sc-automation--gone {
5177
5784
  margin: 0;
@@ -6427,6 +7034,158 @@ button.sc-attachment__main:focus-visible {
6427
7034
  outline-offset: -2px;
6428
7035
  }
6429
7036
 
7037
+ /* Over the chat, one line: the way to the person's threads (a dot when another has something
7038
+ for them) and, at its end, their tasks. */
7039
+ .sc-space__bar {
7040
+ display: flex;
7041
+ flex-shrink: 0;
7042
+ align-items: stretch;
7043
+ border-bottom: 1px solid var(--_line);
7044
+ }
7045
+
7046
+ .sc-space__bar > .sc-space__threads,
7047
+ .sc-space__bar > .sc-space__tasks {
7048
+ width: auto;
7049
+ border-bottom: 0;
7050
+ }
7051
+
7052
+ .sc-space__bar > .sc-space__tasks:not(:only-child) {
7053
+ margin-left: auto;
7054
+ text-align: right;
7055
+ }
7056
+
7057
+ /* The way to the person's threads; a dot when another thread has something for them. */
7058
+ .sc-space__threads {
7059
+ display: flex;
7060
+ flex-shrink: 0;
7061
+ align-items: center;
7062
+ gap: calc(var(--_space) * 1.5);
7063
+ width: 100%;
7064
+ padding: calc(var(--_space) * 2) calc(var(--_space) * 3.5);
7065
+ border: 0;
7066
+ border-bottom: 1px solid var(--_line);
7067
+ background: transparent;
7068
+ color: var(--_muted);
7069
+ font: inherit;
7070
+ font-size: var(--_font-size-xs);
7071
+ font-weight: var(--_font-weight-medium);
7072
+ text-align: left;
7073
+ cursor: pointer;
7074
+ transition:
7075
+ background-color 0.12s,
7076
+ color 0.12s;
7077
+ }
7078
+
7079
+ .sc-space__threads:hover {
7080
+ background: var(--_wash);
7081
+ color: var(--_fg);
7082
+ }
7083
+
7084
+ .sc-space__threads:focus-visible {
7085
+ outline: 2px solid var(--_accent);
7086
+ outline-offset: -2px;
7087
+ }
7088
+
7089
+ .sc-space__dot,
7090
+ .sc-threads__dot {
7091
+ flex-shrink: 0;
7092
+ width: 7px;
7093
+ height: 7px;
7094
+ border-radius: var(--_radius-full);
7095
+ background: var(--_accent);
7096
+ }
7097
+
7098
+ /* The person's threads in the chat's place: the way back, their title and another to start, then
7099
+ each by its title with what is unread. */
7100
+ .sc-threads {
7101
+ display: flex;
7102
+ flex: 1;
7103
+ flex-direction: column;
7104
+ min-height: 0;
7105
+ overflow-y: auto;
7106
+ }
7107
+
7108
+ .sc-threads__head {
7109
+ display: flex;
7110
+ flex-shrink: 0;
7111
+ align-items: center;
7112
+ gap: calc(var(--_space) * 1.5);
7113
+ padding: calc(var(--_space) * 2) calc(var(--_space) * 3);
7114
+ border-bottom: 1px solid var(--_line);
7115
+ }
7116
+
7117
+ .sc-threads__title {
7118
+ flex: 1;
7119
+ margin: 0;
7120
+ font-size: var(--_font-size);
7121
+ font-weight: var(--_font-weight-bold);
7122
+ }
7123
+
7124
+ .sc-threads__list {
7125
+ display: flex;
7126
+ flex-direction: column;
7127
+ margin: 0;
7128
+ padding: calc(var(--_space) * 1.5);
7129
+ list-style: none;
7130
+ }
7131
+
7132
+ .sc-threads__item {
7133
+ display: flex;
7134
+ align-items: center;
7135
+ gap: calc(var(--_space) * 2);
7136
+ width: 100%;
7137
+ padding: calc(var(--_space) * 2.5) calc(var(--_space) * 2.5);
7138
+ border: 0;
7139
+ border-radius: var(--_radius);
7140
+ background: transparent;
7141
+ color: var(--_fg);
7142
+ font: inherit;
7143
+ text-align: left;
7144
+ cursor: pointer;
7145
+ transition: background-color 0.12s;
7146
+ }
7147
+
7148
+ .sc-threads__item:hover {
7149
+ background: var(--_wash);
7150
+ }
7151
+
7152
+ .sc-threads__item:focus-visible {
7153
+ outline: 2px solid var(--_accent);
7154
+ outline-offset: -2px;
7155
+ }
7156
+
7157
+ .sc-threads__item--current {
7158
+ background: var(--_wash);
7159
+ font-weight: var(--_font-weight-medium);
7160
+ }
7161
+
7162
+ .sc-threads__name {
7163
+ flex: 1;
7164
+ min-width: 0;
7165
+ overflow: hidden;
7166
+ text-overflow: ellipsis;
7167
+ white-space: nowrap;
7168
+ }
7169
+
7170
+ .sc-threads__badge {
7171
+ flex-shrink: 0;
7172
+ min-width: 20px;
7173
+ padding: 1px calc(var(--_space) * 1.5);
7174
+ border-radius: var(--_radius-full);
7175
+ background: var(--_accent);
7176
+ color: var(--_accent-fg);
7177
+ font-size: var(--_font-size-xs);
7178
+ font-variant-numeric: tabular-nums;
7179
+ font-weight: var(--_font-weight-medium);
7180
+ text-align: center;
7181
+ }
7182
+
7183
+ .sc-threads__empty {
7184
+ margin: 0;
7185
+ padding: calc(var(--_space) * 4) calc(var(--_space) * 3.5);
7186
+ color: var(--_muted);
7187
+ }
7188
+
6430
7189
  /* The tasks in the chat's place: the way back and their title, then each as an automation
6431
7190
  reads, a hairline between them. */
6432
7191
  .sc-tasks {