@skillcdn/console 0.4.4 → 0.4.5

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 (192) hide show
  1. package/README.md +3 -3
  2. package/dist/api.d.ts +3 -3
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +3 -3
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli/cli.d.ts.map +1 -1
  7. package/dist/cli/cli.js +162 -15
  8. package/dist/cli/cli.js.map +1 -1
  9. package/dist/cli/format.d.ts +16 -3
  10. package/dist/cli/format.d.ts.map +1 -1
  11. package/dist/cli/format.js +68 -19
  12. package/dist/cli/format.js.map +1 -1
  13. package/dist/cli/help.d.ts.map +1 -1
  14. package/dist/cli/help.js +26 -5
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/client.d.ts +28 -1
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +12 -2
  19. package/dist/client.js.map +1 -1
  20. package/dist/compat.js +1 -1
  21. package/dist/components/board.d.ts.map +1 -1
  22. package/dist/components/board.js +46 -15
  23. package/dist/components/board.js.map +1 -1
  24. package/dist/components/decision-form.d.ts +0 -3
  25. package/dist/components/decision-form.d.ts.map +1 -1
  26. package/dist/components/decision-form.js +3 -15
  27. package/dist/components/decision-form.js.map +1 -1
  28. package/dist/components/event-feed.d.ts.map +1 -1
  29. package/dist/components/event-feed.js +30 -10
  30. package/dist/components/event-feed.js.map +1 -1
  31. package/dist/components/my-decisions.d.ts +20 -3
  32. package/dist/components/my-decisions.d.ts.map +1 -1
  33. package/dist/components/my-decisions.js +14 -1
  34. package/dist/components/my-decisions.js.map +1 -1
  35. package/dist/components/people.d.ts +43 -1
  36. package/dist/components/people.d.ts.map +1 -1
  37. package/dist/components/people.js +117 -9
  38. package/dist/components/people.js.map +1 -1
  39. package/dist/components/picker.d.ts +8 -0
  40. package/dist/components/picker.d.ts.map +1 -1
  41. package/dist/components/picker.js +2 -2
  42. package/dist/components/picker.js.map +1 -1
  43. package/dist/components/plugin-frame.d.ts +0 -1
  44. package/dist/components/plugin-frame.d.ts.map +1 -1
  45. package/dist/components/plugin-frame.js +22 -1
  46. package/dist/components/plugin-frame.js.map +1 -1
  47. package/dist/components/plugin-settings.d.ts +5 -1
  48. package/dist/components/plugin-settings.d.ts.map +1 -1
  49. package/dist/components/plugin-settings.js +143 -30
  50. package/dist/components/plugin-settings.js.map +1 -1
  51. package/dist/components/projects.d.ts.map +1 -1
  52. package/dist/components/projects.js +3 -1
  53. package/dist/components/projects.js.map +1 -1
  54. package/dist/components/searches.d.ts +11 -0
  55. package/dist/components/searches.d.ts.map +1 -0
  56. package/dist/components/searches.js +30 -0
  57. package/dist/components/searches.js.map +1 -0
  58. package/dist/components/task-form.d.ts.map +1 -1
  59. package/dist/components/task-form.js +6 -5
  60. package/dist/components/task-form.js.map +1 -1
  61. package/dist/components/ui.d.ts +16 -0
  62. package/dist/components/ui.d.ts.map +1 -1
  63. package/dist/components/ui.js +10 -0
  64. package/dist/components/ui.js.map +1 -1
  65. package/dist/console.css +362 -67
  66. package/dist/console.d.ts +2 -1
  67. package/dist/console.d.ts.map +1 -1
  68. package/dist/console.js +90 -14
  69. package/dist/console.js.map +1 -1
  70. package/dist/data.d.ts +14 -1
  71. package/dist/data.d.ts.map +1 -1
  72. package/dist/data.js +36 -1
  73. package/dist/data.js.map +1 -1
  74. package/dist/i18n/en.d.ts +89 -0
  75. package/dist/i18n/en.d.ts.map +1 -1
  76. package/dist/i18n/en.js +87 -2
  77. package/dist/i18n/en.js.map +1 -1
  78. package/dist/i18n/ko.d.ts.map +1 -1
  79. package/dist/i18n/ko.js +87 -3
  80. package/dist/i18n/ko.js.map +1 -1
  81. package/dist/index.d.ts +3 -2
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +3 -2
  84. package/dist/index.js.map +1 -1
  85. package/dist/limits.d.ts +6 -0
  86. package/dist/limits.d.ts.map +1 -1
  87. package/dist/limits.js +6 -0
  88. package/dist/limits.js.map +1 -1
  89. package/dist/plugin/args.d.ts +6 -1
  90. package/dist/plugin/args.d.ts.map +1 -1
  91. package/dist/plugin/args.js +16 -11
  92. package/dist/plugin/args.js.map +1 -1
  93. package/dist/plugin/bridge.d.ts +20 -1
  94. package/dist/plugin/bridge.d.ts.map +1 -1
  95. package/dist/plugin/bridge.js +28 -0
  96. package/dist/plugin/bridge.js.map +1 -1
  97. package/dist/plugin/capabilities.d.ts +1 -1
  98. package/dist/plugin/capabilities.d.ts.map +1 -1
  99. package/dist/plugin/capabilities.js +10 -0
  100. package/dist/plugin/capabilities.js.map +1 -1
  101. package/dist/plugin/context.d.ts +158 -13
  102. package/dist/plugin/context.d.ts.map +1 -1
  103. package/dist/plugin/define.d.ts +13 -1
  104. package/dist/plugin/define.d.ts.map +1 -1
  105. package/dist/plugin/define.js +17 -1
  106. package/dist/plugin/define.js.map +1 -1
  107. package/dist/plugin/limits.d.ts +4 -0
  108. package/dist/plugin/limits.d.ts.map +1 -1
  109. package/dist/plugin/limits.js +4 -0
  110. package/dist/plugin/limits.js.map +1 -1
  111. package/dist/plugin/manifest.d.ts +15 -0
  112. package/dist/plugin/manifest.d.ts.map +1 -1
  113. package/dist/plugin/manifest.js +61 -4
  114. package/dist/plugin/manifest.js.map +1 -1
  115. package/dist/plugin/rest-schemas.d.ts +44 -0
  116. package/dist/plugin/rest-schemas.d.ts.map +1 -1
  117. package/dist/plugin/rest-schemas.js +55 -3
  118. package/dist/plugin/rest-schemas.js.map +1 -1
  119. package/dist/plugin/testing.d.ts +15 -1
  120. package/dist/plugin/testing.d.ts.map +1 -1
  121. package/dist/plugin/testing.js +40 -4
  122. package/dist/plugin/testing.js.map +1 -1
  123. package/dist/plugin/web.d.ts +6 -0
  124. package/dist/plugin/web.d.ts.map +1 -1
  125. package/dist/plugin/web.js +10 -1
  126. package/dist/plugin/web.js.map +1 -1
  127. package/dist/plugin.d.ts +1 -1
  128. package/dist/plugin.d.ts.map +1 -1
  129. package/dist/plugin.js +1 -1
  130. package/dist/plugin.js.map +1 -1
  131. package/dist/router.d.ts +19 -0
  132. package/dist/router.d.ts.map +1 -1
  133. package/dist/router.js +18 -0
  134. package/dist/router.js.map +1 -1
  135. package/dist/routes.d.ts +11 -2
  136. package/dist/routes.d.ts.map +1 -1
  137. package/dist/routes.js +14 -1
  138. package/dist/routes.js.map +1 -1
  139. package/dist/schemas.d.ts +367 -0
  140. package/dist/schemas.d.ts.map +1 -1
  141. package/dist/schemas.js +62 -2
  142. package/dist/schemas.js.map +1 -1
  143. package/dist/vocabulary.d.ts +1 -1
  144. package/dist/vocabulary.d.ts.map +1 -1
  145. package/dist/vocabulary.js +6 -0
  146. package/dist/vocabulary.js.map +1 -1
  147. package/docs/specs/cli.md +7 -4
  148. package/docs/specs/plugins.md +47 -39
  149. package/docs/specs/rest.md +22 -5
  150. package/package.json +1 -1
  151. package/skills/building-a-plugin/SKILL.md +8 -6
  152. package/skills/working-the-board/SKILL.md +1 -1
  153. package/src/api.ts +17 -0
  154. package/src/cli/cli.ts +200 -12
  155. package/src/cli/format.ts +82 -19
  156. package/src/cli/help.ts +30 -5
  157. package/src/client.ts +70 -0
  158. package/src/compat.ts +1 -1
  159. package/src/components/board.tsx +83 -42
  160. package/src/components/decision-form.tsx +13 -32
  161. package/src/components/event-feed.tsx +36 -9
  162. package/src/components/my-decisions.tsx +50 -5
  163. package/src/components/people.tsx +394 -37
  164. package/src/components/picker.tsx +11 -2
  165. package/src/components/plugin-frame.tsx +23 -0
  166. package/src/components/plugin-settings.tsx +346 -137
  167. package/src/components/projects.tsx +14 -14
  168. package/src/components/searches.ts +47 -0
  169. package/src/components/task-form.tsx +23 -28
  170. package/src/components/ui.tsx +36 -0
  171. package/src/console.tsx +229 -40
  172. package/src/data.ts +53 -1
  173. package/src/i18n/en.ts +98 -2
  174. package/src/i18n/ko.ts +95 -3
  175. package/src/index.ts +11 -0
  176. package/src/limits.ts +6 -0
  177. package/src/plugin/args.ts +16 -11
  178. package/src/plugin/bridge.ts +45 -0
  179. package/src/plugin/capabilities.ts +11 -0
  180. package/src/plugin/context.ts +170 -10
  181. package/src/plugin/define.ts +34 -0
  182. package/src/plugin/limits.ts +4 -0
  183. package/src/plugin/manifest.ts +74 -3
  184. package/src/plugin/rest-schemas.ts +62 -5
  185. package/src/plugin/testing.ts +61 -5
  186. package/src/plugin/web.ts +17 -0
  187. package/src/plugin.ts +1 -0
  188. package/src/router.ts +25 -0
  189. package/src/routes.ts +17 -2
  190. package/src/schemas.ts +81 -2
  191. package/src/styles/console.css +362 -67
  192. package/src/vocabulary.ts +6 -0
@@ -890,6 +890,7 @@ html[data-console] body {
890
890
  .sc-tile-pane,
891
891
  .sc-home-bar,
892
892
  .sc-person-card,
893
+ .sc-team-card,
893
894
  .sc-decision,
894
895
  .sc-run,
895
896
  .sc-comment,
@@ -1396,24 +1397,72 @@ select.sc-input {
1396
1397
  justify-self: start;
1397
1398
  }
1398
1399
 
1399
- /* The workers of a task on its form: each a chip with the way to take them off, and the way to add one. */
1400
+ /* Chips: things named among others in a row, a person, a team, an item of a list, a holder of
1401
+ a role, each as low as a line of text and round at its ends, so that a row of them stays light
1402
+ beside the fields of a form; the way to take one out in its end where it can be, a person's
1403
+ face in its start. `Chip` writes one, and every row of things a person adds to and takes from
1404
+ is made of them; the way to add one more stands at the end of the row as one more chip, a
1405
+ picker with `sc-picker-add`. */
1400
1406
  .sc-chips {
1401
1407
  display: flex;
1402
1408
  flex-wrap: wrap;
1403
1409
  align-items: center;
1404
1410
  gap: var(--sc-space-2);
1411
+ min-width: 0;
1405
1412
  }
1406
1413
 
1407
1414
  .sc-chip {
1408
1415
  display: inline-flex;
1409
1416
  align-items: center;
1410
1417
  gap: var(--sc-space-1);
1411
- min-height: var(--sc-control-size);
1412
- padding: 0 var(--sc-space-1) 0 var(--sc-space-2);
1418
+ max-width: 100%;
1419
+ min-height: 1.75rem;
1420
+ padding: 0 var(--sc-space-3);
1413
1421
  border: var(--sc-border);
1414
- border-radius: var(--sc-radius-md);
1415
- background: var(--sc-color-bg-inset);
1422
+ border-radius: var(--sc-radius-full);
1423
+ background: var(--sc-color-sheet);
1424
+ color: var(--sc-color-text);
1416
1425
  font-size: var(--sc-text-sm);
1426
+ line-height: var(--sc-leading-snug);
1427
+ white-space: nowrap;
1428
+ }
1429
+
1430
+ /* What a chip names, cut short where the row has no room for it whole. */
1431
+ .sc-chip-label {
1432
+ min-width: 0;
1433
+ overflow: hidden;
1434
+ text-overflow: ellipsis;
1435
+ }
1436
+
1437
+ .sc-chip-label:has(> .sc-person) {
1438
+ display: flex;
1439
+ align-items: center;
1440
+ gap: var(--sc-space-1);
1441
+ }
1442
+
1443
+ .sc-chip-label > .sc-person {
1444
+ min-width: 0;
1445
+ }
1446
+
1447
+ .sc-chip-label .sc-person-login {
1448
+ min-width: 0;
1449
+ overflow: hidden;
1450
+ font-weight: var(--sc-weight-normal);
1451
+ text-overflow: ellipsis;
1452
+ }
1453
+
1454
+ /* A person's face in the chip's rounded start, and the way out in its end, a hair inside. */
1455
+ .sc-chip:has(.sc-avatar) {
1456
+ padding-inline-start: 0.1875rem;
1457
+ }
1458
+
1459
+ .sc-chip:has(> .sc-chip-remove) {
1460
+ padding-inline-end: 0.1875rem;
1461
+ }
1462
+
1463
+ .sc-chip .sc-avatar-sm {
1464
+ width: 1.375rem;
1465
+ height: 1.375rem;
1417
1466
  }
1418
1467
 
1419
1468
  .sc-chip-remove,
@@ -1421,20 +1470,25 @@ select.sc-input {
1421
1470
  display: inline-grid;
1422
1471
  flex: none;
1423
1472
  place-items: center;
1424
- width: 1.5rem;
1425
- height: 1.5rem;
1473
+ width: 1.375rem;
1474
+ height: 1.375rem;
1475
+ padding: 0;
1426
1476
  border: 0;
1427
- border-radius: var(--sc-radius-sm);
1477
+ border-radius: var(--sc-radius-full);
1428
1478
  background: transparent;
1429
- color: var(--sc-color-text-muted);
1479
+ color: var(--sc-color-text-faint);
1430
1480
  font-size: var(--sc-text-md);
1431
1481
  line-height: 1;
1432
1482
  cursor: pointer;
1483
+ transition:
1484
+ background var(--sc-transition),
1485
+ color var(--sc-transition),
1486
+ opacity var(--sc-transition);
1433
1487
  }
1434
1488
 
1435
1489
  .sc-chip-remove:hover:not(:disabled),
1436
1490
  .sc-picker-clear:hover:not(:disabled) {
1437
- background: var(--sc-color-bg-raised);
1491
+ background: var(--sc-color-bg-inset);
1438
1492
  color: var(--sc-color-text);
1439
1493
  }
1440
1494
 
@@ -1443,9 +1497,10 @@ select.sc-input {
1443
1497
  outline: var(--sc-focus-ring);
1444
1498
  }
1445
1499
 
1446
- .sc-chips .sc-chip-add {
1447
- width: auto;
1448
- min-width: 10rem;
1500
+ .sc-chip-remove:disabled,
1501
+ .sc-picker-clear:disabled {
1502
+ opacity: 0.55;
1503
+ cursor: not-allowed;
1449
1504
  }
1450
1505
 
1451
1506
  /* A picker: the field that searches a listing, its page of results under it, and the choice in its place. */
@@ -1515,6 +1570,107 @@ select.sc-input {
1515
1570
  padding: var(--sc-space-2);
1516
1571
  }
1517
1572
 
1573
+ /* A picker in the board's filters, in the form that adds a member, or among chips without being
1574
+ the way to add to them: wide enough for a name, never the whole row. */
1575
+ .sc-chips .sc-picker:not(.sc-picker-add),
1576
+ .sc-filters .sc-picker,
1577
+ .sc-member-form .sc-picker {
1578
+ flex: 0 1 14rem;
1579
+ min-width: 11rem;
1580
+ }
1581
+
1582
+ /* A picker that reads as what it holds, until the pointer or the focus is on it: a fact changed
1583
+ in place, as low as a line of the facts, as a quiet field is. Its way out stands while the
1584
+ pointer or the focus is on it, where there is a pointer to hover. */
1585
+ .sc-picker-quiet > .sc-input,
1586
+ .sc-picker-quiet.sc-picker-chosen {
1587
+ min-height: 2rem;
1588
+ padding-block: 0;
1589
+ border-color: transparent;
1590
+ background-color: transparent;
1591
+ }
1592
+
1593
+ .sc-picker-quiet > .sc-input {
1594
+ padding-inline: var(--sc-space-2);
1595
+ }
1596
+
1597
+ .sc-picker-quiet.sc-picker-chosen {
1598
+ padding-inline: var(--sc-space-2) 0.1875rem;
1599
+ transition:
1600
+ border-color var(--sc-transition),
1601
+ background var(--sc-transition);
1602
+ }
1603
+
1604
+ .sc-picker-quiet > .sc-input:hover:not(:disabled),
1605
+ .sc-picker-quiet > .sc-input:focus,
1606
+ .sc-picker-quiet.sc-picker-chosen:hover,
1607
+ .sc-picker-quiet.sc-picker-chosen:focus-within {
1608
+ border-color: var(--sc-color-border);
1609
+ background-color: var(--sc-color-sheet);
1610
+ }
1611
+
1612
+ .sc-picker-quiet > .sc-input:focus {
1613
+ border-color: var(--sc-color-accent);
1614
+ }
1615
+
1616
+ @media (hover: hover) {
1617
+ .sc-picker-quiet.sc-picker-chosen:not(:hover):not(:focus-within) .sc-picker-clear {
1618
+ opacity: 0;
1619
+ }
1620
+ }
1621
+
1622
+ /* A picker that adds one more to a row of chips: a chip itself, its line dashed, as wide as its
1623
+ words until it is typed in, and its list as wide as a name needs. */
1624
+ .sc-picker-add {
1625
+ flex: none;
1626
+ }
1627
+
1628
+ .sc-picker.sc-picker-add > .sc-input {
1629
+ width: 8.5rem;
1630
+ min-height: 1.75rem;
1631
+ padding-block: 0;
1632
+ padding-inline: var(--sc-space-3);
1633
+ border-style: dashed;
1634
+ border-radius: var(--sc-radius-full);
1635
+ background: transparent;
1636
+ line-height: var(--sc-leading-snug);
1637
+ transition:
1638
+ width var(--sc-transition),
1639
+ border-color var(--sc-transition),
1640
+ background var(--sc-transition);
1641
+ }
1642
+
1643
+ .sc-picker.sc-picker-add > .sc-input::placeholder {
1644
+ color: var(--sc-color-text-muted);
1645
+ }
1646
+
1647
+ .sc-picker.sc-picker-add > .sc-input:hover:not(:disabled) {
1648
+ background: var(--sc-color-sheet);
1649
+ }
1650
+
1651
+ .sc-picker.sc-picker-add > .sc-input:focus {
1652
+ border-style: solid;
1653
+ background: var(--sc-color-sheet);
1654
+ }
1655
+
1656
+ /* Where the browser sizes a field by what it holds, the way to add is as wide as its words, and
1657
+ grows as a name is typed into it. */
1658
+ @supports (field-sizing: content) {
1659
+ .sc-picker.sc-picker-add > .sc-input {
1660
+ width: auto;
1661
+ min-width: 6rem;
1662
+ max-width: 100%;
1663
+ field-sizing: content;
1664
+ }
1665
+ }
1666
+
1667
+ .sc-picker-add > .sc-picker-list {
1668
+ right: auto;
1669
+ width: max-content;
1670
+ min-width: 100%;
1671
+ max-width: min(22rem, calc(100vw - 2rem));
1672
+ }
1673
+
1518
1674
  /* The workers of a task on a card or a row: pictures side by side, and how many more. */
1519
1675
  .sc-workers {
1520
1676
  display: inline-flex;
@@ -2594,36 +2750,68 @@ select.sc-input {
2594
2750
  overflow-wrap: anywhere;
2595
2751
  }
2596
2752
 
2753
+ /* A person's facts: a column of names and a column of values, every value starting on one line
2754
+ down the card, so that the cards read alike. A fact changed in place is a quiet field whose
2755
+ words stand where a value's words stand, its box drawn out into the gap while the pointer or
2756
+ the focus is on it. */
2597
2757
  .sc-person-facts {
2598
2758
  display: grid;
2599
- gap: var(--sc-space-1);
2759
+ grid-template-columns: max-content minmax(0, 1fr);
2760
+ gap: var(--sc-space-1) var(--sc-space-4);
2600
2761
  margin: 0;
2601
2762
  padding-top: var(--sc-space-3);
2602
2763
  border-top: var(--sc-hairline);
2603
2764
  }
2604
2765
 
2605
2766
  .sc-person-fact {
2767
+ display: grid;
2768
+ grid-column: 1 / -1;
2769
+ grid-template-columns: subgrid;
2770
+ align-items: start;
2771
+ }
2772
+
2773
+ /* A fact's name stands on the first line of its value, however many lines the value takes. */
2774
+ .sc-person-fact dt,
2775
+ .sc-person-fact dd {
2606
2776
  display: flex;
2607
2777
  align-items: center;
2608
- justify-content: space-between;
2609
- gap: var(--sc-space-3);
2610
2778
  min-height: 2rem;
2611
2779
  }
2612
2780
 
2613
2781
  .sc-person-fact dt {
2614
- flex: none;
2615
2782
  color: var(--sc-color-text-muted);
2616
2783
  font-size: var(--sc-text-sm);
2617
2784
  }
2618
2785
 
2619
2786
  .sc-person-fact dd {
2620
- display: flex;
2621
- justify-content: flex-end;
2622
2787
  min-width: 0;
2623
2788
  margin: 0;
2624
2789
  font-size: var(--sc-text-sm);
2625
2790
  }
2626
2791
 
2792
+ /* Whom a person manages: their faces side by side, and how many. */
2793
+ .sc-person-reports {
2794
+ display: inline-flex;
2795
+ align-items: center;
2796
+ gap: var(--sc-space-2);
2797
+ }
2798
+
2799
+ .sc-person-fact dd > .sc-input-quiet,
2800
+ .sc-person-fact dd > .sc-picker-quiet {
2801
+ width: calc(100% + var(--sc-space-2));
2802
+ max-width: none;
2803
+ margin-inline-start: calc(var(--sc-space-2) * -1);
2804
+ }
2805
+
2806
+ .sc-person-fact dd > .sc-chips {
2807
+ padding-block: 0.125rem;
2808
+ }
2809
+
2810
+ .sc-person-email {
2811
+ min-width: 0;
2812
+ overflow-wrap: anywhere;
2813
+ }
2814
+
2627
2815
  /* The ways to a person's work at the foot of the card, the way out across from them. */
2628
2816
  .sc-person-card-ways {
2629
2817
  display: flex;
@@ -2638,25 +2826,40 @@ select.sc-input {
2638
2826
  margin-inline-start: auto;
2639
2827
  }
2640
2828
 
2641
- /* A select that reads as the value it holds, until the pointer or the focus is on it. */
2642
- select.sc-input-quiet {
2643
- width: auto;
2644
- min-width: 0;
2645
- max-width: 100%;
2829
+ /* A field that reads as the value it holds, until the pointer or the focus is on it: a fact
2830
+ changed in place, as low as a line of the facts, its box drawn only then. A select keeps the
2831
+ room for its chevron, drawn only then too where there is a pointer to hover. */
2832
+ .sc-input-quiet {
2646
2833
  min-height: 2rem;
2647
2834
  padding-block: 0;
2648
- padding-inline-start: var(--sc-space-2);
2835
+ padding-inline: var(--sc-space-2);
2649
2836
  border-color: transparent;
2650
2837
  background-color: transparent;
2651
2838
  text-overflow: ellipsis;
2652
2839
  }
2653
2840
 
2654
- select.sc-input-quiet:hover,
2655
- select.sc-input-quiet:focus-visible {
2656
- border-color: var(--sc-color-border);
2841
+ select.sc-input-quiet {
2842
+ width: auto;
2843
+ min-width: 0;
2844
+ max-width: 100%;
2845
+ padding-inline-end: calc(var(--sc-space-3) * 2 + 0.625rem);
2846
+ }
2847
+
2848
+ .sc-input-quiet:hover:not(:disabled),
2849
+ .sc-input-quiet:focus {
2657
2850
  background-color: var(--sc-color-sheet);
2658
2851
  }
2659
2852
 
2853
+ .sc-input-quiet:hover:not(:disabled):not(:focus) {
2854
+ border-color: var(--sc-color-border);
2855
+ }
2856
+
2857
+ @media (hover: hover) {
2858
+ select.sc-input-quiet:not(:hover):not(:focus) {
2859
+ background-image: none;
2860
+ }
2861
+ }
2862
+
2660
2863
  .sc-person-row {
2661
2864
  display: flex;
2662
2865
  flex-wrap: wrap;
@@ -2705,17 +2908,96 @@ select.sc-input-quiet:focus-visible {
2705
2908
  opacity: 0.55;
2706
2909
  }
2707
2910
 
2708
- .sc-listing-form .sc-field-row {
2911
+ .sc-listing-form .sc-field-row,
2912
+ .sc-team-form .sc-field-row {
2709
2913
  align-items: end;
2710
2914
  }
2711
2915
 
2916
+ /* The two views of the people's page, the people and the teams: the page's view switch, with how
2917
+ many each holds beside its name. */
2918
+ .sc-people-views {
2919
+ margin-bottom: var(--sc-space-5);
2920
+ }
2921
+
2922
+ .sc-people-views .sc-tab {
2923
+ align-items: baseline;
2924
+ }
2925
+
2926
+ .sc-tab-count {
2927
+ color: var(--sc-color-text-faint);
2928
+ font-size: var(--sc-text-xs);
2929
+ font-variant-numeric: tabular-nums;
2930
+ }
2931
+
2932
+ .sc-tab-current .sc-tab-count {
2933
+ color: var(--sc-color-text-muted);
2934
+ }
2935
+
2936
+ /* The teams (ADR-0073): a card each in a grid, as the people are; the name and how many at the
2937
+ head, who is in it as chips with the way to add one at the end, the way to delete it at the
2938
+ foot. The name, for an administrator, is a quiet field in the name's own words. */
2939
+ .sc-teams {
2940
+ display: grid;
2941
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 20rem), 1fr));
2942
+ gap: var(--sc-space-4);
2943
+ }
2944
+
2945
+ .sc-team-card {
2946
+ display: flex;
2947
+ flex-direction: column;
2948
+ gap: var(--sc-space-3);
2949
+ min-width: 0;
2950
+ padding: var(--sc-space-4) var(--sc-space-5);
2951
+ border-radius: var(--sc-radius-xl);
2952
+ }
2953
+
2954
+ .sc-team-head {
2955
+ display: flex;
2956
+ align-items: center;
2957
+ gap: var(--sc-space-2);
2958
+ min-width: 0;
2959
+ }
2960
+
2961
+ /* The team's name, and under it its key, what it is called by (ADR-0074). */
2962
+ .sc-team-title {
2963
+ display: grid;
2964
+ flex: 1;
2965
+ min-width: 0;
2966
+ }
2967
+
2968
+ .sc-team-name {
2969
+ min-width: 0;
2970
+ font-size: var(--sc-text-md);
2971
+ font-weight: var(--sc-weight-bold);
2972
+ line-height: var(--sc-leading-snug);
2973
+ overflow-wrap: anywhere;
2974
+ }
2975
+
2976
+ .sc-team-name.sc-input-quiet {
2977
+ margin-inline-start: calc(var(--sc-space-2) * -1);
2978
+ color: var(--sc-color-text);
2979
+ }
2980
+
2981
+ .sc-team-members {
2982
+ padding-top: var(--sc-space-3);
2983
+ border-top: var(--sc-hairline);
2984
+ }
2985
+
2986
+ .sc-team-ways {
2987
+ display: flex;
2988
+ justify-content: flex-end;
2989
+ margin-top: auto;
2990
+ margin-inline: calc(var(--sc-space-2) * -1);
2991
+ }
2992
+
2712
2993
  .sc-field-hint {
2713
2994
  margin-top: var(--sc-space-2);
2714
2995
  color: var(--sc-color-text-muted);
2715
2996
  font-size: var(--sc-text-sm);
2716
2997
  }
2717
2998
 
2718
- .sc-project-key {
2999
+ .sc-project-key,
3000
+ .sc-team-key {
2719
3001
  color: var(--sc-color-text-faint);
2720
3002
  font-size: var(--sc-text-xs);
2721
3003
  }
@@ -5348,6 +5630,11 @@ select.sc-input-quiet:focus-visible {
5348
5630
  width: 100%;
5349
5631
  }
5350
5632
 
5633
+ /* A person or a project chosen in a setting: a field as wide as the others. */
5634
+ .sc-settings-control > .sc-picker:not(.sc-picker-add) {
5635
+ justify-self: stretch;
5636
+ }
5637
+
5351
5638
  .sc-settings-form .sc-form-actions {
5352
5639
  padding-top: var(--sc-space-4);
5353
5640
  border-top: var(--sc-border);
@@ -5974,27 +6261,66 @@ select.sc-input-quiet:focus-visible {
5974
6261
  border: 0;
5975
6262
  }
5976
6263
 
6264
+ /* A choice is a chip that is its own box: the browser's square kept for the keyboard and a
6265
+ screen reader, out of sight; a choice made is lit in the accent, a tick drawn before its word. */
5977
6266
  .sc-toggle-chip {
6267
+ position: relative;
5978
6268
  display: inline-flex;
5979
6269
  align-items: center;
5980
- gap: var(--sc-space-1);
5981
- min-height: var(--sc-control-size);
6270
+ gap: var(--sc-space-2);
6271
+ min-height: 2rem;
5982
6272
  padding: 0 var(--sc-space-3);
5983
6273
  border: var(--sc-border);
5984
6274
  border-radius: var(--sc-radius-full);
5985
- background: var(--sc-color-bg-inset);
6275
+ background: var(--sc-color-sheet);
6276
+ color: var(--sc-color-text-muted);
5986
6277
  font-size: var(--sc-text-sm);
5987
6278
  cursor: pointer;
6279
+ user-select: none;
6280
+ transition:
6281
+ background var(--sc-transition),
6282
+ border-color var(--sc-transition),
6283
+ color var(--sc-transition);
6284
+ }
6285
+
6286
+ .sc-toggle-chip:hover {
6287
+ border-color: var(--sc-color-border-strong);
6288
+ color: var(--sc-color-text);
5988
6289
  }
5989
6290
 
5990
6291
  .sc-toggle-chip input {
6292
+ position: absolute;
6293
+ width: 1px;
6294
+ height: 1px;
5991
6295
  margin: 0;
6296
+ opacity: 0;
6297
+ pointer-events: none;
6298
+ }
6299
+
6300
+ .sc-toggle-chip:has(input:focus-visible) {
6301
+ outline: var(--sc-focus-ring);
6302
+ outline-offset: 2px;
5992
6303
  }
5993
6304
 
5994
6305
  .sc-toggle-chip:has(input:checked) {
5995
- border-color: var(--sc-color-point);
5996
- background: var(--sc-color-point-subtle);
5997
- color: var(--sc-color-point);
6306
+ border-color: color-mix(in srgb, var(--sc-color-accent) 40%, transparent);
6307
+ background: var(--sc-color-accent-subtle);
6308
+ color: var(--sc-color-accent);
6309
+ }
6310
+
6311
+ .sc-toggle-chip:has(input:checked)::before {
6312
+ content: "";
6313
+ width: 0.3125rem;
6314
+ height: 0.5625rem;
6315
+ margin-inline: 0.125rem 0.0625rem;
6316
+ border: solid currentColor;
6317
+ border-width: 0 1.5px 1.5px 0;
6318
+ transform: translateY(-0.0625rem) rotate(45deg);
6319
+ }
6320
+
6321
+ .sc-toggle-chip:has(input:disabled) {
6322
+ opacity: 0.55;
6323
+ cursor: not-allowed;
5998
6324
  }
5999
6325
 
6000
6326
  /* A list of several choices too long for pills: a column of boxes. */
@@ -6099,37 +6425,6 @@ select.sc-input-quiet:focus-visible {
6099
6425
  font-weight: normal;
6100
6426
  }
6101
6427
 
6102
- .sc-plugin-holders {
6103
- display: flex;
6104
- flex-wrap: wrap;
6105
- align-items: center;
6106
- gap: var(--sc-space-2);
6107
- }
6108
-
6109
- /* Who holds a role, a chip each, with the way to revoke a grant in it. */
6110
- .sc-plugin-holder {
6111
- display: inline-flex;
6112
- align-items: center;
6113
- gap: var(--sc-space-1);
6114
- min-height: 2rem;
6115
- padding-inline: var(--sc-space-3) var(--sc-space-1);
6116
- border: var(--sc-border);
6117
- border-radius: var(--sc-radius-full);
6118
- background: var(--sc-color-sheet);
6119
- font-size: var(--sc-text-sm);
6120
- }
6121
-
6122
- .sc-plugin-holder-fixed {
6123
- padding-inline-end: var(--sc-space-3);
6124
- }
6125
-
6126
- .sc-plugin-holder .sc-button {
6127
- min-height: 1.5rem;
6128
- padding-inline: var(--sc-space-2);
6129
- font-size: var(--sc-text-md);
6130
- line-height: 1;
6131
- }
6132
-
6133
6428
  .sc-plugin-grant {
6134
6429
  display: flex;
6135
6430
  flex-wrap: wrap;
package/src/vocabulary.ts CHANGED
@@ -184,6 +184,12 @@ export const EVENT_KINDS = [
184
184
  "person.deactivated",
185
185
  "person.reactivated",
186
186
  "person.manager_changed",
187
+ "person.email_changed",
188
+ "team.created",
189
+ "team.renamed",
190
+ "team.removed",
191
+ "team.member_added",
192
+ "team.member_removed",
187
193
  "workspace.updated",
188
194
  "category.created",
189
195
  "category.updated",