@skillcdn/console 0.4.3 → 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 (268) hide show
  1. package/README.md +6 -6
  2. package/dist/api.d.ts +4 -4
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +4 -4
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli/cli.d.ts.map +1 -1
  7. package/dist/cli/cli.js +255 -33
  8. package/dist/cli/cli.js.map +1 -1
  9. package/dist/cli/format.d.ts +20 -5
  10. package/dist/cli/format.d.ts.map +1 -1
  11. package/dist/cli/format.js +98 -26
  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 +39 -15
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/cli/plugin-check.d.ts +5 -1
  17. package/dist/cli/plugin-check.d.ts.map +1 -1
  18. package/dist/cli/plugin-check.js +23 -4
  19. package/dist/cli/plugin-check.js.map +1 -1
  20. package/dist/cli/plugin-cli.d.ts.map +1 -1
  21. package/dist/cli/plugin-cli.js +10 -1
  22. package/dist/cli/plugin-cli.js.map +1 -1
  23. package/dist/cli/plugin-init.d.ts +2 -0
  24. package/dist/cli/plugin-init.d.ts.map +1 -1
  25. package/dist/cli/plugin-init.js +6 -0
  26. package/dist/cli/plugin-init.js.map +1 -1
  27. package/dist/client.d.ts +32 -1
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +14 -2
  30. package/dist/client.js.map +1 -1
  31. package/dist/compat.js +1 -1
  32. package/dist/components/board.d.ts +8 -0
  33. package/dist/components/board.d.ts.map +1 -1
  34. package/dist/components/board.js +49 -18
  35. package/dist/components/board.js.map +1 -1
  36. package/dist/components/decision-form.d.ts +6 -3
  37. package/dist/components/decision-form.d.ts.map +1 -1
  38. package/dist/components/decision-form.js +24 -18
  39. package/dist/components/decision-form.js.map +1 -1
  40. package/dist/components/decision-list.d.ts +5 -1
  41. package/dist/components/decision-list.d.ts.map +1 -1
  42. package/dist/components/decision-list.js +25 -5
  43. package/dist/components/decision-list.js.map +1 -1
  44. package/dist/components/event-feed.d.ts.map +1 -1
  45. package/dist/components/event-feed.js +34 -8
  46. package/dist/components/event-feed.js.map +1 -1
  47. package/dist/components/goals.d.ts.map +1 -1
  48. package/dist/components/goals.js +2 -2
  49. package/dist/components/goals.js.map +1 -1
  50. package/dist/components/home.d.ts +35 -0
  51. package/dist/components/home.d.ts.map +1 -0
  52. package/dist/components/home.js +326 -0
  53. package/dist/components/home.js.map +1 -0
  54. package/dist/components/my-decisions.d.ts +20 -3
  55. package/dist/components/my-decisions.d.ts.map +1 -1
  56. package/dist/components/my-decisions.js +14 -1
  57. package/dist/components/my-decisions.js.map +1 -1
  58. package/dist/components/pack-connect.d.ts.map +1 -1
  59. package/dist/components/pack-connect.js +5 -4
  60. package/dist/components/pack-connect.js.map +1 -1
  61. package/dist/components/people.d.ts +45 -1
  62. package/dist/components/people.d.ts.map +1 -1
  63. package/dist/components/people.js +125 -4
  64. package/dist/components/people.js.map +1 -1
  65. package/dist/components/picker.d.ts +8 -0
  66. package/dist/components/picker.d.ts.map +1 -1
  67. package/dist/components/picker.js +2 -2
  68. package/dist/components/picker.js.map +1 -1
  69. package/dist/components/plugin-frame.d.ts +3 -13
  70. package/dist/components/plugin-frame.d.ts.map +1 -1
  71. package/dist/components/plugin-frame.js +75 -21
  72. package/dist/components/plugin-frame.js.map +1 -1
  73. package/dist/components/plugin-settings.d.ts +5 -1
  74. package/dist/components/plugin-settings.d.ts.map +1 -1
  75. package/dist/components/plugin-settings.js +283 -45
  76. package/dist/components/plugin-settings.js.map +1 -1
  77. package/dist/components/projects.d.ts +0 -8
  78. package/dist/components/projects.d.ts.map +1 -1
  79. package/dist/components/projects.js +4 -14
  80. package/dist/components/projects.js.map +1 -1
  81. package/dist/components/searches.d.ts +11 -0
  82. package/dist/components/searches.d.ts.map +1 -0
  83. package/dist/components/searches.js +30 -0
  84. package/dist/components/searches.js.map +1 -0
  85. package/dist/components/task-form.d.ts.map +1 -1
  86. package/dist/components/task-form.js +6 -5
  87. package/dist/components/task-form.js.map +1 -1
  88. package/dist/components/task-view.d.ts.map +1 -1
  89. package/dist/components/task-view.js +2 -1
  90. package/dist/components/task-view.js.map +1 -1
  91. package/dist/components/ui.d.ts +16 -0
  92. package/dist/components/ui.d.ts.map +1 -1
  93. package/dist/components/ui.js +15 -2
  94. package/dist/components/ui.js.map +1 -1
  95. package/dist/connect-page.d.ts.map +1 -1
  96. package/dist/connect-page.js +5 -6
  97. package/dist/connect-page.js.map +1 -1
  98. package/dist/console.css +1123 -258
  99. package/dist/console.d.ts +12 -4
  100. package/dist/console.d.ts.map +1 -1
  101. package/dist/console.js +123 -27
  102. package/dist/console.js.map +1 -1
  103. package/dist/data.d.ts +18 -3
  104. package/dist/data.d.ts.map +1 -1
  105. package/dist/data.js +41 -1
  106. package/dist/data.js.map +1 -1
  107. package/dist/docs-page.d.ts.map +1 -1
  108. package/dist/docs-page.js +6 -5
  109. package/dist/docs-page.js.map +1 -1
  110. package/dist/home-tiles.d.ts +92 -0
  111. package/dist/home-tiles.d.ts.map +1 -0
  112. package/dist/home-tiles.js +294 -0
  113. package/dist/home-tiles.js.map +1 -0
  114. package/dist/i18n/en.d.ts +264 -1
  115. package/dist/i18n/en.d.ts.map +1 -1
  116. package/dist/i18n/en.js +260 -1
  117. package/dist/i18n/en.js.map +1 -1
  118. package/dist/i18n/index.d.ts +4 -2
  119. package/dist/i18n/index.d.ts.map +1 -1
  120. package/dist/i18n/index.js +10 -11
  121. package/dist/i18n/index.js.map +1 -1
  122. package/dist/i18n/ko.d.ts.map +1 -1
  123. package/dist/i18n/ko.js +255 -4
  124. package/dist/i18n/ko.js.map +1 -1
  125. package/dist/index.d.ts +7 -5
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +7 -5
  128. package/dist/index.js.map +1 -1
  129. package/dist/limits.d.ts +12 -0
  130. package/dist/limits.d.ts.map +1 -1
  131. package/dist/limits.js +12 -0
  132. package/dist/limits.js.map +1 -1
  133. package/dist/plugin/args.d.ts +6 -1
  134. package/dist/plugin/args.d.ts.map +1 -1
  135. package/dist/plugin/args.js +16 -11
  136. package/dist/plugin/args.js.map +1 -1
  137. package/dist/plugin/bridge.d.ts +63 -3
  138. package/dist/plugin/bridge.d.ts.map +1 -1
  139. package/dist/plugin/bridge.js +54 -0
  140. package/dist/plugin/bridge.js.map +1 -1
  141. package/dist/plugin/capabilities.d.ts +7 -1
  142. package/dist/plugin/capabilities.d.ts.map +1 -1
  143. package/dist/plugin/capabilities.js +24 -1
  144. package/dist/plugin/capabilities.js.map +1 -1
  145. package/dist/plugin/context.d.ts +174 -12
  146. package/dist/plugin/context.d.ts.map +1 -1
  147. package/dist/plugin/define.d.ts +14 -1
  148. package/dist/plugin/define.d.ts.map +1 -1
  149. package/dist/plugin/define.js +18 -2
  150. package/dist/plugin/define.js.map +1 -1
  151. package/dist/plugin/limits.d.ts +9 -2
  152. package/dist/plugin/limits.d.ts.map +1 -1
  153. package/dist/plugin/limits.js +9 -2
  154. package/dist/plugin/limits.js.map +1 -1
  155. package/dist/plugin/manifest.d.ts +98 -6
  156. package/dist/plugin/manifest.d.ts.map +1 -1
  157. package/dist/plugin/manifest.js +171 -10
  158. package/dist/plugin/manifest.js.map +1 -1
  159. package/dist/plugin/rest-schemas.d.ts +120 -0
  160. package/dist/plugin/rest-schemas.d.ts.map +1 -1
  161. package/dist/plugin/rest-schemas.js +78 -5
  162. package/dist/plugin/rest-schemas.js.map +1 -1
  163. package/dist/plugin/sandbox.d.ts +4 -3
  164. package/dist/plugin/sandbox.d.ts.map +1 -1
  165. package/dist/plugin/sandbox.js +33 -6
  166. package/dist/plugin/sandbox.js.map +1 -1
  167. package/dist/plugin/semver.d.ts +26 -0
  168. package/dist/plugin/semver.d.ts.map +1 -0
  169. package/dist/plugin/semver.js +76 -0
  170. package/dist/plugin/semver.js.map +1 -0
  171. package/dist/plugin/testing.d.ts +15 -1
  172. package/dist/plugin/testing.d.ts.map +1 -1
  173. package/dist/plugin/testing.js +42 -5
  174. package/dist/plugin/testing.js.map +1 -1
  175. package/dist/plugin/web.d.ts +16 -1
  176. package/dist/plugin/web.d.ts.map +1 -1
  177. package/dist/plugin/web.js +44 -1
  178. package/dist/plugin/web.js.map +1 -1
  179. package/dist/plugin.d.ts +3 -2
  180. package/dist/plugin.d.ts.map +1 -1
  181. package/dist/plugin.js +3 -2
  182. package/dist/plugin.js.map +1 -1
  183. package/dist/router.d.ts +19 -0
  184. package/dist/router.d.ts.map +1 -1
  185. package/dist/router.js +18 -0
  186. package/dist/router.js.map +1 -1
  187. package/dist/routes.d.ts +11 -2
  188. package/dist/routes.d.ts.map +1 -1
  189. package/dist/routes.js +14 -1
  190. package/dist/routes.js.map +1 -1
  191. package/dist/rules.d.ts +2 -2
  192. package/dist/rules.js +3 -3
  193. package/dist/schemas.d.ts +864 -2
  194. package/dist/schemas.d.ts.map +1 -1
  195. package/dist/schemas.js +156 -9
  196. package/dist/schemas.js.map +1 -1
  197. package/dist/use-action.d.ts +8 -2
  198. package/dist/use-action.d.ts.map +1 -1
  199. package/dist/use-action.js +13 -6
  200. package/dist/use-action.js.map +1 -1
  201. package/dist/vocabulary.d.ts +3 -1
  202. package/dist/vocabulary.d.ts.map +1 -1
  203. package/dist/vocabulary.js +9 -0
  204. package/dist/vocabulary.js.map +1 -1
  205. package/docs/specs/cli.md +10 -6
  206. package/docs/specs/plugins.md +83 -62
  207. package/docs/specs/rest.md +34 -16
  208. package/package.json +1 -1
  209. package/skills/building-a-plugin/SKILL.md +15 -12
  210. package/skills/planning-the-board/references/setting-up.md +2 -1
  211. package/skills/working-the-board/SKILL.md +3 -3
  212. package/src/api.ts +23 -0
  213. package/src/cli/cli.ts +323 -30
  214. package/src/cli/format.ts +122 -26
  215. package/src/cli/help.ts +43 -14
  216. package/src/cli/plugin-check.ts +41 -2
  217. package/src/cli/plugin-cli.ts +10 -1
  218. package/src/cli/plugin-init.ts +8 -0
  219. package/src/client.ts +78 -0
  220. package/src/compat.ts +1 -1
  221. package/src/components/board.tsx +86 -45
  222. package/src/components/decision-form.tsx +73 -36
  223. package/src/components/decision-list.tsx +45 -13
  224. package/src/components/event-feed.tsx +40 -7
  225. package/src/components/goals.tsx +4 -1
  226. package/src/components/home.tsx +615 -0
  227. package/src/components/my-decisions.tsx +50 -5
  228. package/src/components/pack-connect.tsx +5 -4
  229. package/src/components/people.tsx +500 -61
  230. package/src/components/picker.tsx +11 -2
  231. package/src/components/plugin-frame.tsx +85 -63
  232. package/src/components/plugin-settings.tsx +735 -185
  233. package/src/components/projects.tsx +14 -69
  234. package/src/components/searches.ts +47 -0
  235. package/src/components/task-form.tsx +23 -28
  236. package/src/components/task-view.tsx +7 -0
  237. package/src/components/ui.tsx +42 -2
  238. package/src/connect-page.tsx +5 -6
  239. package/src/console.tsx +303 -64
  240. package/src/data.ts +62 -3
  241. package/src/docs-page.tsx +6 -5
  242. package/src/home-tiles.ts +438 -0
  243. package/src/i18n/en.ts +274 -0
  244. package/src/i18n/index.ts +17 -14
  245. package/src/i18n/ko.ts +267 -4
  246. package/src/index.ts +18 -5
  247. package/src/limits.ts +12 -0
  248. package/src/plugin/args.ts +16 -11
  249. package/src/plugin/bridge.ts +122 -1
  250. package/src/plugin/capabilities.ts +28 -1
  251. package/src/plugin/context.ts +186 -9
  252. package/src/plugin/define.ts +38 -1
  253. package/src/plugin/limits.ts +9 -2
  254. package/src/plugin/manifest.ts +228 -13
  255. package/src/plugin/rest-schemas.ts +89 -6
  256. package/src/plugin/sandbox.ts +36 -8
  257. package/src/plugin/semver.ts +89 -0
  258. package/src/plugin/testing.ts +63 -6
  259. package/src/plugin/web.ts +66 -0
  260. package/src/plugin.ts +19 -0
  261. package/src/router.ts +25 -0
  262. package/src/routes.ts +17 -2
  263. package/src/rules.ts +3 -3
  264. package/src/schemas.ts +197 -10
  265. package/src/styles/console.css +1123 -258
  266. package/src/use-action.ts +16 -7
  267. package/src/vocabulary.ts +10 -0
  268. package/template/plugin/console-plugin.json +3 -1
@@ -465,7 +465,9 @@ table {
465
465
  align-items: center;
466
466
  gap: var(--sc-space-2);
467
467
  padding: var(--sc-space-2) 0 var(--sc-space-3);
468
+ border: 0;
468
469
  border-bottom: 2px solid transparent;
470
+ background: none;
469
471
  color: var(--sc-color-text-muted);
470
472
  font-size: var(--sc-text-sm);
471
473
  font-weight: var(--sc-weight-medium);
@@ -506,14 +508,44 @@ table {
506
508
  top: 100%;
507
509
  }
508
510
 
509
- /* The sub-tabs of a plugin with several pages, above its frame. */
511
+ /* The pages of a plugin: the header's tabs going on a row lower, on the same gutters, the line
512
+ under them where the page begins. The line is a shadow, so that the current tab's underline lies
513
+ on it, as the header's does on its own line, in a row that scrolls sideways. */
514
+ .sc-page-tabs {
515
+ display: flex;
516
+ flex: none;
517
+ gap: var(--sc-space-5);
518
+ margin: calc(var(--sc-main-top) * -1) calc(var(--sc-main-side) * -1) var(--sc-space-5);
519
+ padding: var(--sc-space-1) var(--sc-main-side) 0;
520
+ background: color-mix(in srgb, var(--sc-color-bg) 45%, transparent);
521
+ box-shadow: inset 0 -1px 0 var(--sc-color-border);
522
+ overflow: auto hidden;
523
+ scrollbar-width: none;
524
+ }
510
525
 
526
+ /* The views within a page, as a plugin has in its frame: the console's view switch, in a tab's
527
+ words, so that the row reads as a level below the tabs. What stands around it is the page's. */
511
528
  .sc-subtabs {
512
529
  display: flex;
513
- gap: var(--sc-space-4);
514
- margin-bottom: var(--sc-space-4);
515
- border-bottom: var(--sc-border);
516
- overflow: auto hidden;
530
+ flex-wrap: wrap;
531
+ gap: var(--sc-space-1);
532
+ }
533
+
534
+ .sc-subtabs .sc-tab {
535
+ padding: var(--sc-space-1) var(--sc-space-3);
536
+ border-bottom: 0;
537
+ border-radius: var(--sc-radius-full);
538
+ cursor: pointer;
539
+ }
540
+
541
+ .sc-subtabs .sc-tab:hover {
542
+ background: var(--sc-color-bg-inset);
543
+ }
544
+
545
+ .sc-subtabs .sc-tab-current {
546
+ background: var(--sc-color-bg-raised);
547
+ box-shadow: 0 0 0 1px var(--sc-color-border);
548
+ color: var(--sc-color-text);
517
549
  }
518
550
 
519
551
  /* A plugin's frame: the width of the page, as tall as the frame says. */
@@ -527,6 +559,14 @@ table {
527
559
  background: transparent;
528
560
  }
529
561
 
562
+ /* A page pads itself by a step, for the shadows of what is in it, which the frame would cut. The
563
+ frame stands that step outside the page's column, so that the page's first words line up with
564
+ the tabs above it, and with every other page's. */
565
+ .sc-plugin-frame-page {
566
+ width: calc(100% + 2 * var(--sc-space-4));
567
+ margin: calc(var(--sc-space-4) * -1);
568
+ }
569
+
530
570
  /* A plugin's frame document, which the console serves marked with data-console: it paints no
531
571
  background and is as tall as its content, so that the box the console draws shows through and
532
572
  the frame shrinks as well as grows; no room is kept for a scrollbar it never shows. */
@@ -541,50 +581,11 @@ html[data-console] body {
541
581
  background: transparent;
542
582
  }
543
583
 
544
- /* The widgets of the front page: a grid of six columns, above or below the projects. The page's
545
- head keeps its own distance above the top ones. */
546
-
547
- .sc-widgets {
548
- display: grid;
549
- grid-template-columns: repeat(6, minmax(0, 1fr));
550
- gap: var(--sc-space-4);
551
- }
552
-
553
- .sc-widgets-top {
554
- margin: 0 0 var(--sc-space-5);
555
- }
556
-
557
- .sc-widgets-bottom {
558
- margin: var(--sc-space-5) 0 0;
559
- }
560
-
561
- .sc-widget {
562
- grid-column: span 6;
563
- padding: var(--sc-space-3) var(--sc-space-4);
564
- border: var(--sc-border);
565
- border-radius: var(--sc-radius-lg);
566
- background: var(--sc-color-bg-raised);
567
- }
568
-
569
- .sc-widget-title {
570
- margin: 0 0 var(--sc-space-2);
571
- font-size: var(--sc-text-sm);
572
- font-weight: var(--sc-weight-medium);
584
+ /* What stands in for a frame that has nothing to show. */
585
+ .sc-plugin-frame-unavailable {
586
+ margin: 0;
573
587
  color: var(--sc-color-text-muted);
574
- }
575
-
576
- @media (min-width: 48rem) {
577
- .sc-widget-third {
578
- grid-column: span 2;
579
- }
580
-
581
- .sc-widget-half {
582
- grid-column: span 3;
583
- }
584
-
585
- .sc-widget-full {
586
- grid-column: span 6;
587
- }
588
+ font-size: var(--sc-text-sm);
588
589
  }
589
590
 
590
591
  /* What waits, beside a tab's name: a count in the point colour, so it reads before the words. */
@@ -772,18 +773,20 @@ html[data-console] body {
772
773
  /* The page is a column of blocks that fills the window below the header, so that a block which
773
774
  wants the rest of the height, the board, can take it. */
774
775
  .sc-main {
776
+ --sc-main-top: var(--sc-space-6);
777
+ --sc-main-side: var(--sc-gutter);
775
778
  display: flex;
776
779
  flex: 1;
777
780
  flex-direction: column;
778
781
  width: 100%;
779
- padding: var(--sc-space-6) var(--sc-gutter) var(--sc-space-8);
782
+ padding: var(--sc-main-top) var(--sc-main-side) var(--sc-space-8);
780
783
  }
781
784
 
782
785
  /* A page as wide as the window: the board, whose columns want every bit of it. It starts at the
783
786
  same height as the other pages and, being as tall as the window, ends with the same room. */
784
787
  .sc-main-wide {
785
788
  max-width: none;
786
- padding: var(--sc-space-6) var(--sc-gutter);
789
+ padding: var(--sc-main-top) var(--sc-main-side);
787
790
  }
788
791
 
789
792
  /* A page that takes the whole window takes the header with it, so that the lockup, the tabs and
@@ -884,7 +887,10 @@ html[data-console] body {
884
887
 
885
888
  .sc-panel,
886
889
  .sc-column,
887
- .sc-project,
890
+ .sc-tile-pane,
891
+ .sc-home-bar,
892
+ .sc-person-card,
893
+ .sc-team-card,
888
894
  .sc-decision,
889
895
  .sc-run,
890
896
  .sc-comment,
@@ -1391,24 +1397,72 @@ select.sc-input {
1391
1397
  justify-self: start;
1392
1398
  }
1393
1399
 
1394
- /* 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`. */
1395
1406
  .sc-chips {
1396
1407
  display: flex;
1397
1408
  flex-wrap: wrap;
1398
1409
  align-items: center;
1399
1410
  gap: var(--sc-space-2);
1411
+ min-width: 0;
1400
1412
  }
1401
1413
 
1402
1414
  .sc-chip {
1403
1415
  display: inline-flex;
1404
1416
  align-items: center;
1405
1417
  gap: var(--sc-space-1);
1406
- min-height: var(--sc-control-size);
1407
- 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);
1408
1421
  border: var(--sc-border);
1409
- border-radius: var(--sc-radius-md);
1410
- 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);
1411
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;
1412
1466
  }
1413
1467
 
1414
1468
  .sc-chip-remove,
@@ -1416,20 +1470,25 @@ select.sc-input {
1416
1470
  display: inline-grid;
1417
1471
  flex: none;
1418
1472
  place-items: center;
1419
- width: 1.5rem;
1420
- height: 1.5rem;
1473
+ width: 1.375rem;
1474
+ height: 1.375rem;
1475
+ padding: 0;
1421
1476
  border: 0;
1422
- border-radius: var(--sc-radius-sm);
1477
+ border-radius: var(--sc-radius-full);
1423
1478
  background: transparent;
1424
- color: var(--sc-color-text-muted);
1479
+ color: var(--sc-color-text-faint);
1425
1480
  font-size: var(--sc-text-md);
1426
1481
  line-height: 1;
1427
1482
  cursor: pointer;
1483
+ transition:
1484
+ background var(--sc-transition),
1485
+ color var(--sc-transition),
1486
+ opacity var(--sc-transition);
1428
1487
  }
1429
1488
 
1430
1489
  .sc-chip-remove:hover:not(:disabled),
1431
1490
  .sc-picker-clear:hover:not(:disabled) {
1432
- background: var(--sc-color-bg-raised);
1491
+ background: var(--sc-color-bg-inset);
1433
1492
  color: var(--sc-color-text);
1434
1493
  }
1435
1494
 
@@ -1438,9 +1497,10 @@ select.sc-input {
1438
1497
  outline: var(--sc-focus-ring);
1439
1498
  }
1440
1499
 
1441
- .sc-chips .sc-chip-add {
1442
- width: auto;
1443
- min-width: 10rem;
1500
+ .sc-chip-remove:disabled,
1501
+ .sc-picker-clear:disabled {
1502
+ opacity: 0.55;
1503
+ cursor: not-allowed;
1444
1504
  }
1445
1505
 
1446
1506
  /* A picker: the field that searches a listing, its page of results under it, and the choice in its place. */
@@ -1510,6 +1570,107 @@ select.sc-input {
1510
1570
  padding: var(--sc-space-2);
1511
1571
  }
1512
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
+
1513
1674
  /* The workers of a task on a card or a row: pictures side by side, and how many more. */
1514
1675
  .sc-workers {
1515
1676
  display: inline-flex;
@@ -2528,184 +2689,317 @@ select.sc-input {
2528
2689
  user-select: all;
2529
2690
  }
2530
2691
 
2531
- /* People: everyone of the board, with what each may do, as cards in a grid: the person on the
2532
- first line, the account and where it came from on the second, what they are and the ways to
2533
- their work on the third. */
2692
+ /* People: everyone of the board as cards in a grid. The person at the head, their account and
2693
+ where it came from under the name; what they are as rows of one shape, so that the cards read
2694
+ alike down a column; the ways to their work at the foot. */
2534
2695
 
2535
2696
  .sc-people {
2536
2697
  display: grid;
2537
- grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
2538
- gap: var(--sc-space-3);
2698
+ grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
2699
+ gap: var(--sc-space-4);
2539
2700
  }
2540
2701
 
2541
- .sc-person-row {
2702
+ .sc-person-card {
2542
2703
  display: flex;
2543
- flex-wrap: wrap;
2544
- align-items: center;
2545
- gap: var(--sc-space-2) var(--sc-space-3);
2546
- padding: var(--sc-space-4);
2547
- border-radius: var(--sc-radius-lg);
2704
+ flex-direction: column;
2705
+ gap: var(--sc-space-4);
2706
+ min-width: 0;
2707
+ padding: var(--sc-space-5);
2708
+ border-radius: var(--sc-radius-xl);
2548
2709
  }
2549
2710
 
2550
- .sc-person-row > .sc-person {
2551
- flex: 0 1 auto;
2711
+ .sc-person-card-head {
2712
+ display: flex;
2713
+ align-items: center;
2714
+ gap: var(--sc-space-3);
2552
2715
  min-width: 0;
2553
2716
  }
2554
2717
 
2555
- /* That this person is the reader: beside the name on the first line. */
2556
- .sc-person-you {
2557
- margin-inline-start: calc(var(--sc-space-1) - var(--sc-space-3));
2558
- color: var(--sc-color-text-faint);
2559
- font-size: var(--sc-text-xs);
2718
+ .sc-person-card-head .sc-avatar {
2719
+ width: 3rem;
2720
+ height: 3rem;
2721
+ font-size: var(--sc-text-lg);
2560
2722
  }
2561
2723
 
2562
- .sc-person-name {
2563
- flex: 1 1 100%;
2724
+ .sc-person-card-who {
2725
+ display: grid;
2726
+ gap: 0.125rem;
2564
2727
  min-width: 0;
2565
- color: var(--sc-color-text-muted);
2566
- font-size: var(--sc-text-sm);
2567
2728
  }
2568
2729
 
2569
- /* What let a person in, when they were deactivated, when a login was let in: beside the name, smaller. */
2570
- .sc-person-note {
2571
- font-size: var(--sc-text-xs);
2730
+ .sc-person-card-name {
2731
+ display: flex;
2732
+ flex-wrap: wrap;
2733
+ align-items: baseline;
2734
+ gap: var(--sc-space-1) var(--sc-space-2);
2735
+ color: var(--sc-color-text);
2736
+ font-size: var(--sc-text-md);
2737
+ font-weight: var(--sc-weight-bold);
2738
+ line-height: var(--sc-leading-snug);
2739
+ overflow-wrap: anywhere;
2572
2740
  }
2573
2741
 
2574
- /* What a person is, or the way to change it: the last line, a step under the account. */
2575
- .sc-person-row > .sc-badge,
2576
- .sc-person-row > .sc-field-inline {
2577
- margin-top: var(--sc-space-1);
2742
+ .sc-person-card-name .sc-person-you {
2743
+ margin: 0;
2744
+ font-weight: var(--sc-weight-normal);
2578
2745
  }
2579
2746
 
2580
- /* Those let in and not signed in yet, and those deactivated: sections below everyone in. */
2581
- .sc-people-section {
2582
- margin-top: var(--sc-space-6);
2747
+ .sc-person-card-note {
2748
+ color: var(--sc-color-text-muted);
2749
+ font-size: var(--sc-text-xs);
2750
+ overflow-wrap: anywhere;
2583
2751
  }
2584
2752
 
2585
- .sc-person-row-out .sc-person {
2586
- opacity: 0.55;
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. */
2757
+ .sc-person-facts {
2758
+ display: grid;
2759
+ grid-template-columns: max-content minmax(0, 1fr);
2760
+ gap: var(--sc-space-1) var(--sc-space-4);
2761
+ margin: 0;
2762
+ padding-top: var(--sc-space-3);
2763
+ border-top: var(--sc-hairline);
2587
2764
  }
2588
2765
 
2589
- .sc-listing-form .sc-field-row {
2590
- align-items: end;
2766
+ .sc-person-fact {
2767
+ display: grid;
2768
+ grid-column: 1 / -1;
2769
+ grid-template-columns: subgrid;
2770
+ align-items: start;
2591
2771
  }
2592
2772
 
2593
- .sc-field-hint {
2594
- margin-top: var(--sc-space-2);
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 {
2776
+ display: flex;
2777
+ align-items: center;
2778
+ min-height: 2rem;
2779
+ }
2780
+
2781
+ .sc-person-fact dt {
2595
2782
  color: var(--sc-color-text-muted);
2596
2783
  font-size: var(--sc-text-sm);
2597
2784
  }
2598
2785
 
2599
- /* Projects: what a person may see, each with what they are in it and what waits in it. */
2600
-
2601
- .sc-projects {
2602
- display: grid;
2603
- grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
2604
- gap: var(--sc-space-4);
2786
+ .sc-person-fact dd {
2787
+ min-width: 0;
2788
+ margin: 0;
2789
+ font-size: var(--sc-text-sm);
2605
2790
  }
2606
2791
 
2607
- .sc-project {
2608
- display: flex;
2609
- flex-direction: column;
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;
2610
2796
  gap: var(--sc-space-2);
2611
- padding: var(--sc-space-5);
2612
- border-radius: var(--sc-radius-xl);
2613
- transition:
2614
- border-color var(--sc-transition),
2615
- background var(--sc-transition),
2616
- box-shadow var(--sc-transition);
2617
2797
  }
2618
2798
 
2619
- .sc-project:hover,
2620
- .sc-project:focus-within {
2621
- border-color: var(--sc-color-accent);
2622
- background: var(--sc-glass-surface-hover);
2623
- box-shadow: var(--sc-glass-sheen), var(--sc-glass-lift), var(--sc-glow);
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);
2624
2804
  }
2625
2805
 
2626
- /* The head of a project reads on three lines: the mark with the name beside it, the key under
2627
- the name, and the badges on a line of their own; the mark floats so that the name and the key
2628
- stack beside it without a box around them. */
2629
- .sc-project-head {
2630
- display: block;
2806
+ .sc-person-fact dd > .sc-chips {
2807
+ padding-block: 0.125rem;
2631
2808
  }
2632
2809
 
2633
- .sc-project-head::after {
2634
- content: "";
2635
- display: block;
2636
- clear: both;
2810
+ .sc-person-email {
2811
+ min-width: 0;
2812
+ overflow-wrap: anywhere;
2637
2813
  }
2638
2814
 
2639
- .sc-project-head > :first-child {
2640
- float: left;
2641
- margin-inline-end: var(--sc-space-3);
2815
+ /* The ways to a person's work at the foot of the card, the way out across from them. */
2816
+ .sc-person-card-ways {
2817
+ display: flex;
2818
+ flex-wrap: wrap;
2819
+ align-items: center;
2820
+ gap: var(--sc-space-1);
2821
+ margin-top: auto;
2822
+ margin-inline: calc(var(--sc-space-2) * -1);
2642
2823
  }
2643
2824
 
2644
- .sc-project-head > .sc-badge {
2645
- margin-top: var(--sc-space-3);
2646
- margin-inline-end: var(--sc-space-1);
2825
+ .sc-person-card-ways button {
2826
+ margin-inline-start: auto;
2647
2827
  }
2648
2828
 
2649
- /* The whole pane is the way in: the name's link stretches over it. */
2650
- .sc-project-name {
2651
- display: block;
2652
- color: var(--sc-color-text);
2653
- font-size: var(--sc-text-lg);
2654
- font-weight: var(--sc-weight-bold);
2655
- line-height: var(--sc-leading-snug);
2656
- text-decoration: none;
2657
- overflow-wrap: anywhere;
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 {
2833
+ min-height: 2rem;
2834
+ padding-block: 0;
2835
+ padding-inline: var(--sc-space-2);
2836
+ border-color: transparent;
2837
+ background-color: transparent;
2838
+ text-overflow: ellipsis;
2658
2839
  }
2659
2840
 
2660
- .sc-project-name::after {
2661
- content: "";
2662
- position: absolute;
2663
- inset: 0;
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);
2664
2846
  }
2665
2847
 
2666
- .sc-project-name:hover {
2667
- color: var(--sc-color-text);
2848
+ .sc-input-quiet:hover:not(:disabled),
2849
+ .sc-input-quiet:focus {
2850
+ background-color: var(--sc-color-sheet);
2668
2851
  }
2669
2852
 
2670
- .sc-project-name:focus-visible {
2671
- outline: none;
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
+
2863
+ .sc-person-row {
2864
+ display: flex;
2865
+ flex-wrap: wrap;
2866
+ align-items: center;
2867
+ gap: var(--sc-space-2) var(--sc-space-3);
2868
+ padding: var(--sc-space-4);
2869
+ border-radius: var(--sc-radius-lg);
2870
+ }
2871
+
2872
+ .sc-person-row > .sc-person {
2873
+ flex: 0 1 auto;
2874
+ min-width: 0;
2672
2875
  }
2673
2876
 
2674
- .sc-project-key {
2877
+ /* That this person is the reader: beside the name on the first line. */
2878
+ .sc-person-you {
2879
+ margin-inline-start: calc(var(--sc-space-1) - var(--sc-space-3));
2675
2880
  color: var(--sc-color-text-faint);
2676
2881
  font-size: var(--sc-text-xs);
2677
2882
  }
2678
2883
 
2679
- /* Under the name, and past the mark: the key ends below the mark, so that the badges after it
2680
- start at the edge. */
2681
- .sc-project-head > .sc-project-key {
2682
- display: block;
2683
- margin-top: var(--sc-space-1);
2884
+ .sc-person-name {
2885
+ flex: 1 1 100%;
2886
+ min-width: 0;
2887
+ color: var(--sc-color-text-muted);
2888
+ font-size: var(--sc-text-sm);
2684
2889
  }
2685
2890
 
2686
- .sc-project-head > .sc-project-key::after {
2687
- content: "";
2688
- display: block;
2689
- clear: both;
2891
+ /* What let a person in, when they were deactivated, when a login was let in: beside the name, smaller. */
2892
+ .sc-person-note {
2893
+ font-size: var(--sc-text-xs);
2690
2894
  }
2691
2895
 
2692
- .sc-project-description {
2896
+ /* What a person is, or the way to change it: the last line, a step under the account. */
2897
+ .sc-person-row > .sc-badge,
2898
+ .sc-person-row > .sc-field-inline {
2693
2899
  margin-top: var(--sc-space-1);
2900
+ }
2901
+
2902
+ /* Those let in and not signed in yet, and those deactivated: sections below everyone in. */
2903
+ .sc-people-section {
2904
+ margin-top: var(--sc-space-6);
2905
+ }
2906
+
2907
+ .sc-person-row-out .sc-person {
2908
+ opacity: 0.55;
2909
+ }
2910
+
2911
+ .sc-listing-form .sc-field-row,
2912
+ .sc-team-form .sc-field-row {
2913
+ align-items: end;
2914
+ }
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 {
2694
2933
  color: var(--sc-color-text-muted);
2695
- font-size: var(--sc-text-sm);
2696
2934
  }
2697
2935
 
2698
- .sc-project-meta {
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 {
2699
2946
  display: flex;
2700
- flex-wrap: wrap;
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;
2701
2957
  gap: var(--sc-space-2);
2702
- margin-top: auto;
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 {
2703
2982
  padding-top: var(--sc-space-3);
2704
2983
  border-top: var(--sc-hairline);
2705
2984
  }
2706
2985
 
2707
- .sc-project-meta:empty {
2708
- display: none;
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
+
2993
+ .sc-field-hint {
2994
+ margin-top: var(--sc-space-2);
2995
+ color: var(--sc-color-text-muted);
2996
+ font-size: var(--sc-text-sm);
2997
+ }
2998
+
2999
+ .sc-project-key,
3000
+ .sc-team-key {
3001
+ color: var(--sc-color-text-faint);
3002
+ font-size: var(--sc-text-xs);
2709
3003
  }
2710
3004
 
2711
3005
  .sc-members {
@@ -3830,11 +4124,12 @@ select.sc-input {
3830
4124
 
3831
4125
  /* The title of a bar with more days in the week runs along the bar as far as its days reach,
3832
4126
  less the room of its end, instead of stopping at the first day's edge: above every piece,
3833
- the one under the pointer included, and under the cards; the pointer goes through it to the
3834
- piece of the day beneath. The days are the first piece's own custom property. */
4127
+ the one under the pointer included, and under the cards and the header, which the page scrolls
4128
+ beneath; the pointer goes through it to the piece of the day beneath. The days are the first
4129
+ piece's own custom property. */
3835
4130
  .sc-calendar-task-title-spanning {
3836
4131
  position: relative;
3837
- z-index: 25;
4132
+ z-index: 2;
3838
4133
  flex: none;
3839
4134
  max-width: calc(var(--sc-span, 1) * 100% - 2.25rem);
3840
4135
  pointer-events: none;
@@ -3918,14 +4213,6 @@ select.sc-input {
3918
4213
 
3919
4214
  /* The mark hangs in the margin, so that what wraps onto a second line, a badge most often,
3920
4215
  starts under the name rather than under the mark. */
3921
- .sc-project-head:has(> .sc-mark-md) {
3922
- padding-inline-start: calc(2rem + var(--sc-space-3));
3923
- }
3924
-
3925
- .sc-project-head > .sc-mark-md {
3926
- margin-inline-start: calc(-2rem - var(--sc-space-3));
3927
- }
3928
-
3929
4216
  .sc-mark-lg {
3930
4217
  width: 3rem;
3931
4218
  height: 3rem;
@@ -4561,7 +4848,13 @@ select.sc-input {
4561
4848
  }
4562
4849
 
4563
4850
  .sc-main {
4564
- padding: var(--sc-space-5) var(--sc-space-4) var(--sc-space-7);
4851
+ --sc-main-top: var(--sc-space-5);
4852
+ --sc-main-side: var(--sc-space-4);
4853
+ padding-bottom: var(--sc-space-7);
4854
+ }
4855
+
4856
+ .sc-page-tabs {
4857
+ gap: var(--sc-space-4);
4565
4858
  }
4566
4859
 
4567
4860
  .sc-page-title,
@@ -5155,13 +5448,14 @@ select.sc-input {
5155
5448
  }
5156
5449
 
5157
5450
  /* A goal's page reads as the board does: the facts in a row at its head, then a switch between
5158
- the views of its tasks, then the view, which takes the rest of the height as the board does. */
5451
+ the views of its tasks, then the view, which takes the rest of the height as the board does. A
5452
+ view that needs more makes the page longer, as on any page: held to the window, it would run out
5453
+ of the shell, and the header, which stays within the shell, would go with the scrolling. */
5159
5454
  .sc-goal-page {
5160
5455
  display: flex;
5161
5456
  flex: 1 1 0;
5162
5457
  flex-direction: column;
5163
5458
  gap: var(--sc-space-4);
5164
- min-height: 0;
5165
5459
  }
5166
5460
 
5167
5461
  .sc-goal-header {
@@ -5251,7 +5545,6 @@ select.sc-input {
5251
5545
  display: flex;
5252
5546
  flex: 1 1 0;
5253
5547
  flex-direction: column;
5254
- min-height: 0;
5255
5548
  }
5256
5549
 
5257
5550
  .sc-goal-view-list {
@@ -5337,6 +5630,11 @@ select.sc-input {
5337
5630
  width: 100%;
5338
5631
  }
5339
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
+
5340
5638
  .sc-settings-form .sc-form-actions {
5341
5639
  padding-top: var(--sc-space-4);
5342
5640
  border-top: var(--sc-border);
@@ -5895,128 +6193,249 @@ select.sc-input {
5895
6193
  margin-top: 0.25em;
5896
6194
  }
5897
6195
 
5898
- .sc-plugin-tick-words {
5899
- display: grid;
5900
- gap: 2px;
5901
- }
5902
-
5903
- .sc-plugin-tick-name {
5904
- font-weight: var(--sc-weight-medium);
5905
- }
5906
-
5907
- .sc-plugin-tick-under {
5908
- color: var(--sc-color-text-muted);
5909
- font-size: var(--sc-text-sm);
6196
+ /* One the plugin requires: on, and not the person's to change, so it does not read as a control. */
6197
+ .sc-plugin-tick-locked {
6198
+ background: transparent;
6199
+ cursor: default;
5910
6200
  }
5911
6201
 
5912
- /* The capabilities an enabled plugin holds, one a line; its commands as words side by side. */
5913
- .sc-plugin-held {
6202
+ /* What a plugin asks, in two lists: what it requires, and what it can go without. */
6203
+ .sc-plugin-capabilities {
5914
6204
  display: grid;
5915
- gap: var(--sc-space-1);
5916
- margin: 0;
5917
- padding: 0;
5918
- list-style: none;
6205
+ gap: var(--sc-space-2);
5919
6206
  }
5920
6207
 
5921
- .sc-plugin-codes {
5922
- display: inline-flex;
5923
- flex-wrap: wrap;
5924
- gap: var(--sc-space-2);
6208
+ .sc-plugin-capabilities + .sc-plugin-capabilities {
6209
+ margin-top: var(--sc-space-3);
5925
6210
  }
5926
6211
 
5927
- /* A field with its buttons on one line: a secret to set, the key to type before a purge. */
5928
- .sc-plugin-line {
6212
+ .sc-plugin-capabilities-head {
5929
6213
  display: flex;
5930
6214
  flex-wrap: wrap;
5931
- gap: var(--sc-space-2);
5932
- width: 100%;
6215
+ align-items: baseline;
6216
+ gap: var(--sc-space-1) var(--sc-space-2);
6217
+ margin: 0;
5933
6218
  }
5934
6219
 
5935
- .sc-plugin-line-input {
5936
- flex: 1 1 8rem;
5937
- width: auto;
6220
+ .sc-plugin-capabilities-name {
6221
+ font-size: var(--sc-text-sm);
6222
+ font-weight: var(--sc-weight-bold);
5938
6223
  }
5939
6224
 
5940
- /* The roles: one a row, its name and what it is for beside who holds it and the way to grant it. */
5941
- .sc-plugin-roles {
5942
- display: grid;
6225
+ .sc-plugin-capabilities-head .sc-settings-hint {
5943
6226
  margin: 0;
5944
- padding: 0;
5945
- list-style: none;
5946
6227
  }
5947
6228
 
5948
- .sc-plugin-role {
6229
+ /* What it can go without, on the page of a plugin that is on: under what it requires, each a box. */
6230
+ .sc-plugin-optional {
5949
6231
  display: grid;
5950
- grid-template-columns: minmax(10rem, 16rem) minmax(0, 1fr);
5951
- gap: var(--sc-space-2) var(--sc-space-5);
5952
- padding: var(--sc-space-4) 0;
5953
- border-top: var(--sc-hairline);
5954
- }
5955
-
5956
- .sc-plugin-role:first-child {
5957
- padding-top: 0;
5958
- border-top: 0;
6232
+ gap: var(--sc-space-1);
6233
+ margin-top: var(--sc-space-3);
5959
6234
  }
5960
6235
 
5961
- .sc-plugin-role:last-child {
5962
- padding-bottom: 0;
6236
+ .sc-plugin-tick-words {
6237
+ display: grid;
6238
+ gap: 2px;
5963
6239
  }
5964
6240
 
5965
- .sc-plugin-role-name {
5966
- display: flex;
6241
+ .sc-plugin-tick-name {
6242
+ display: inline-flex;
5967
6243
  flex-wrap: wrap;
5968
6244
  align-items: center;
5969
6245
  gap: var(--sc-space-2);
5970
6246
  font-weight: var(--sc-weight-medium);
5971
6247
  }
5972
6248
 
5973
- .sc-plugin-role-key {
6249
+ .sc-plugin-tick-under {
5974
6250
  color: var(--sc-color-text-muted);
5975
- font-weight: normal;
6251
+ font-size: var(--sc-text-sm);
5976
6252
  }
5977
6253
 
5978
- .sc-plugin-holders {
6254
+ /* A setting of several choices (a list of an enum): a pill per choice, lit while chosen. */
6255
+ .sc-toggle-chips {
5979
6256
  display: flex;
5980
6257
  flex-wrap: wrap;
5981
- align-items: center;
5982
6258
  gap: var(--sc-space-2);
6259
+ margin: 0;
6260
+ padding: 0;
6261
+ border: 0;
5983
6262
  }
5984
6263
 
5985
- /* Who holds a role, a chip each, with the way to revoke a grant in it. */
5986
- .sc-plugin-holder {
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. */
6266
+ .sc-toggle-chip {
6267
+ position: relative;
5987
6268
  display: inline-flex;
5988
6269
  align-items: center;
5989
- gap: var(--sc-space-1);
6270
+ gap: var(--sc-space-2);
5990
6271
  min-height: 2rem;
5991
- padding-inline: var(--sc-space-3) var(--sc-space-1);
6272
+ padding: 0 var(--sc-space-3);
5992
6273
  border: var(--sc-border);
5993
6274
  border-radius: var(--sc-radius-full);
5994
6275
  background: var(--sc-color-sheet);
6276
+ color: var(--sc-color-text-muted);
5995
6277
  font-size: var(--sc-text-sm);
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);
5996
6284
  }
5997
6285
 
5998
- .sc-plugin-holder-fixed {
5999
- padding-inline-end: var(--sc-space-3);
6286
+ .sc-toggle-chip:hover {
6287
+ border-color: var(--sc-color-border-strong);
6288
+ color: var(--sc-color-text);
6000
6289
  }
6001
6290
 
6002
- .sc-plugin-holder .sc-button {
6003
- min-height: 1.5rem;
6004
- padding-inline: var(--sc-space-2);
6005
- font-size: var(--sc-text-md);
6006
- line-height: 1;
6291
+ .sc-toggle-chip input {
6292
+ position: absolute;
6293
+ width: 1px;
6294
+ height: 1px;
6295
+ margin: 0;
6296
+ opacity: 0;
6297
+ pointer-events: none;
6007
6298
  }
6008
6299
 
6009
- .sc-plugin-grant {
6010
- display: flex;
6011
- flex-wrap: wrap;
6012
- gap: var(--sc-space-2);
6013
- margin-top: var(--sc-space-3);
6300
+ .sc-toggle-chip:has(input:focus-visible) {
6301
+ outline: var(--sc-focus-ring);
6302
+ outline-offset: 2px;
6014
6303
  }
6015
6304
 
6016
- .sc-plugin-grant-input {
6017
- flex: 0 1 20rem;
6018
- width: auto;
6019
- }
6305
+ .sc-toggle-chip:has(input:checked) {
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;
6324
+ }
6325
+
6326
+ /* A list of several choices too long for pills: a column of boxes. */
6327
+ .sc-check-list {
6328
+ display: grid;
6329
+ gap: var(--sc-space-1);
6330
+ margin: 0;
6331
+ padding: 0;
6332
+ list-style: none;
6333
+ }
6334
+
6335
+ /* A list of items typed one by one: the field and its button on one line, the items as chips above. */
6336
+ .sc-chip-input {
6337
+ display: flex;
6338
+ gap: var(--sc-space-2);
6339
+ width: 100%;
6340
+ }
6341
+
6342
+ .sc-chip-input .sc-input {
6343
+ flex: 1;
6344
+ min-width: 0;
6345
+ }
6346
+
6347
+ /* The settings form divided into groups: each a titled block after the ungrouped settings. */
6348
+ .sc-settings-group {
6349
+ padding-top: var(--sc-space-5);
6350
+ }
6351
+
6352
+ .sc-settings-group-title {
6353
+ margin: 0;
6354
+ font-size: var(--sc-text-md);
6355
+ font-weight: var(--sc-weight-medium);
6356
+ }
6357
+
6358
+ .sc-settings-group > .sc-settings-row:first-of-type {
6359
+ border-top: 0;
6360
+ }
6361
+
6362
+ /* The capabilities an enabled plugin holds, one a line; its commands as words side by side. */
6363
+ .sc-plugin-held {
6364
+ display: grid;
6365
+ gap: var(--sc-space-1);
6366
+ margin: 0;
6367
+ padding: 0;
6368
+ list-style: none;
6369
+ }
6370
+
6371
+ .sc-plugin-codes {
6372
+ display: inline-flex;
6373
+ flex-wrap: wrap;
6374
+ gap: var(--sc-space-2);
6375
+ }
6376
+
6377
+ /* A field with its buttons on one line: a secret to set, the key to type before a purge. */
6378
+ .sc-plugin-line {
6379
+ display: flex;
6380
+ flex-wrap: wrap;
6381
+ gap: var(--sc-space-2);
6382
+ width: 100%;
6383
+ }
6384
+
6385
+ .sc-plugin-line-input {
6386
+ flex: 1 1 8rem;
6387
+ width: auto;
6388
+ }
6389
+
6390
+ /* The roles: one a row, its name and what it is for beside who holds it and the way to grant it. */
6391
+ .sc-plugin-roles {
6392
+ display: grid;
6393
+ margin: 0;
6394
+ padding: 0;
6395
+ list-style: none;
6396
+ }
6397
+
6398
+ .sc-plugin-role {
6399
+ display: grid;
6400
+ grid-template-columns: minmax(10rem, 16rem) minmax(0, 1fr);
6401
+ gap: var(--sc-space-2) var(--sc-space-5);
6402
+ padding: var(--sc-space-4) 0;
6403
+ border-top: var(--sc-hairline);
6404
+ }
6405
+
6406
+ .sc-plugin-role:first-child {
6407
+ padding-top: 0;
6408
+ border-top: 0;
6409
+ }
6410
+
6411
+ .sc-plugin-role:last-child {
6412
+ padding-bottom: 0;
6413
+ }
6414
+
6415
+ .sc-plugin-role-name {
6416
+ display: flex;
6417
+ flex-wrap: wrap;
6418
+ align-items: center;
6419
+ gap: var(--sc-space-2);
6420
+ font-weight: var(--sc-weight-medium);
6421
+ }
6422
+
6423
+ .sc-plugin-role-key {
6424
+ color: var(--sc-color-text-muted);
6425
+ font-weight: normal;
6426
+ }
6427
+
6428
+ .sc-plugin-grant {
6429
+ display: flex;
6430
+ flex-wrap: wrap;
6431
+ gap: var(--sc-space-2);
6432
+ margin-top: var(--sc-space-3);
6433
+ }
6434
+
6435
+ .sc-plugin-grant-input {
6436
+ flex: 0 1 20rem;
6437
+ width: auto;
6438
+ }
6020
6439
 
6021
6440
  .sc-plugin-problems {
6022
6441
  margin: 0;
@@ -6028,3 +6447,449 @@ select.sc-input {
6028
6447
  grid-template-columns: minmax(0, 1fr);
6029
6448
  }
6030
6449
  }
6450
+
6451
+ /* The front page (ADR-0061): one grid of square cells, each as wide as the page gives it, a
6452
+ tile's place and shape numbers on its style. A tile stands where a transform puts it, so that
6453
+ it glides to a new place and the frame in it stays loaded. */
6454
+
6455
+ .sc-home {
6456
+ container-type: inline-size;
6457
+ }
6458
+
6459
+ .sc-home-grid {
6460
+ --sc-home-columns: 8;
6461
+ --sc-home-rows: 1;
6462
+ --sc-home-gap: var(--sc-space-4);
6463
+ --sc-home-cell: calc(
6464
+ (100cqi - (var(--sc-home-columns) - 1) * var(--sc-home-gap)) /
6465
+ var(--sc-home-columns)
6466
+ );
6467
+ --sc-home-step: calc(var(--sc-home-cell) + var(--sc-home-gap));
6468
+ position: relative;
6469
+ height: calc(var(--sc-home-rows) * var(--sc-home-step) - var(--sc-home-gap));
6470
+ row-gap: var(--sc-home-gap);
6471
+ margin: 0;
6472
+ padding: 0;
6473
+ list-style: none;
6474
+ }
6475
+
6476
+ .sc-home-grid[data-columns="4"] {
6477
+ --sc-home-gap: var(--sc-space-3);
6478
+ }
6479
+
6480
+ .sc-tile {
6481
+ container: sc-tile / size;
6482
+ --sc-tile-x: 0;
6483
+ --sc-tile-y: 0;
6484
+ --sc-tile-w: 1;
6485
+ --sc-tile-h: 1;
6486
+ --sc-tile-left: 0px;
6487
+ --sc-tile-top: 0px;
6488
+ --sc-tile-wait: 0ms;
6489
+ position: absolute;
6490
+ top: 0;
6491
+ left: 0;
6492
+ width: calc(var(--sc-tile-w) * var(--sc-home-step) - var(--sc-home-gap));
6493
+ height: calc(var(--sc-tile-h) * var(--sc-home-step) - var(--sc-home-gap));
6494
+ /* The property of its own and not `transform`, which the `scale` of a tile in hand would multiply. */
6495
+ translate: calc(var(--sc-tile-x) * var(--sc-home-step))
6496
+ calc(var(--sc-tile-y) * var(--sc-home-step));
6497
+ }
6498
+
6499
+ .sc-tile-pane {
6500
+ width: 100%;
6501
+ height: 100%;
6502
+ border-radius: var(--sc-radius-xl);
6503
+ transition:
6504
+ border-color var(--sc-transition),
6505
+ background var(--sc-transition),
6506
+ box-shadow var(--sc-transition);
6507
+ }
6508
+
6509
+ /* A project as an icon: its mark and its name in the middle of the cell, what waits in the corner.
6510
+ The mark and the room around it follow the cell. What still does not fit stands whole or not at
6511
+ all: its row goes to a second column, past the room the tile cuts off, so that no line of words
6512
+ is ever cut across. */
6513
+ .sc-tile-project {
6514
+ --sc-tile-mark: clamp(1.75rem, 47cqh, 3.25rem);
6515
+ display: flex;
6516
+ flex-flow: column wrap;
6517
+ gap: clamp(0.125rem, 4cqh, 0.5rem) var(--sc-space-7);
6518
+ align-content: flex-start;
6519
+ justify-content: center;
6520
+ padding: clamp(0.25rem, 8cqh, 0.75rem);
6521
+ overflow: hidden;
6522
+ color: var(--sc-color-text);
6523
+ text-align: center;
6524
+ text-decoration: none;
6525
+ }
6526
+
6527
+ .sc-tile-project > :not(.sc-tile-count) {
6528
+ flex: none;
6529
+ width: 100%;
6530
+ }
6531
+
6532
+ .sc-tile-mark {
6533
+ display: flex;
6534
+ justify-content: center;
6535
+ }
6536
+
6537
+ a.sc-tile-project:hover,
6538
+ a.sc-tile-project:focus-visible {
6539
+ border-color: var(--sc-color-accent);
6540
+ background: var(--sc-glass-surface-hover);
6541
+ color: var(--sc-color-text);
6542
+ box-shadow: var(--sc-glass-sheen), var(--sc-glass-lift), var(--sc-glow);
6543
+ }
6544
+
6545
+ .sc-tile-project .sc-mark {
6546
+ width: var(--sc-tile-mark);
6547
+ height: var(--sc-tile-mark);
6548
+ font-size: calc(var(--sc-tile-mark) * 0.42);
6549
+ }
6550
+
6551
+ .sc-tile-name {
6552
+ display: -webkit-box;
6553
+ max-width: 100%;
6554
+ overflow: hidden;
6555
+ font-size: var(--sc-text-sm);
6556
+ font-weight: var(--sc-weight-medium);
6557
+ line-height: var(--sc-leading-snug);
6558
+ overflow-wrap: anywhere;
6559
+ -webkit-box-orient: vertical;
6560
+ -webkit-line-clamp: 2;
6561
+ }
6562
+
6563
+ /* What waits, in the corner: the count a tab shows, where it stands on a tile. */
6564
+ .sc-tile-count {
6565
+ position: absolute;
6566
+ top: var(--sc-space-2);
6567
+ right: var(--sc-space-2);
6568
+ }
6569
+
6570
+ /* On a low cell the name keeps to one line, on the lowest in smaller words. */
6571
+ @container sc-tile (height < 7.75rem) {
6572
+ .sc-tile-project:not(.sc-tile-project-card) .sc-tile-name {
6573
+ -webkit-line-clamp: 1;
6574
+ }
6575
+ }
6576
+
6577
+ @container sc-tile (height < 5.5rem) {
6578
+ .sc-tile-project:not(.sc-tile-project-card) {
6579
+ border-radius: var(--sc-radius-lg);
6580
+ }
6581
+
6582
+ .sc-tile-project:not(.sc-tile-project-card) .sc-tile-name {
6583
+ font-size: var(--sc-text-xs);
6584
+ line-height: var(--sc-leading-tight);
6585
+ }
6586
+ }
6587
+
6588
+ /* A project as a card, read from the corner: its name, what it is at a glance, and as much of its
6589
+ description as the card has room for, the rows lost from the last up. */
6590
+ .sc-tile-project-card {
6591
+ --sc-tile-mark: clamp(2.25rem, 22cqh, 3.25rem);
6592
+ justify-content: flex-start;
6593
+ padding: clamp(0.75rem, 8cqh, 1.25rem);
6594
+ text-align: start;
6595
+ }
6596
+
6597
+ .sc-tile-project-card .sc-tile-mark {
6598
+ justify-content: flex-start;
6599
+ }
6600
+
6601
+ .sc-tile-project-card .sc-tile-name {
6602
+ font-size: var(--sc-text-lg);
6603
+ font-weight: var(--sc-weight-bold);
6604
+ }
6605
+
6606
+ .sc-tile-meta {
6607
+ display: flex;
6608
+ flex-wrap: wrap;
6609
+ gap: var(--sc-space-1) var(--sc-space-2);
6610
+ align-items: center;
6611
+ }
6612
+
6613
+ .sc-tile-about {
6614
+ display: -webkit-box;
6615
+ overflow: hidden;
6616
+ color: var(--sc-color-text-muted);
6617
+ font-size: var(--sc-text-sm);
6618
+ -webkit-box-orient: vertical;
6619
+ -webkit-line-clamp: 3;
6620
+ }
6621
+
6622
+ @container sc-tile (height < 15rem) {
6623
+ .sc-tile-project-card .sc-tile-name {
6624
+ -webkit-line-clamp: 1;
6625
+ }
6626
+
6627
+ .sc-tile-about {
6628
+ -webkit-line-clamp: 2;
6629
+ }
6630
+ }
6631
+
6632
+ @container sc-tile (height < 13rem) {
6633
+ .sc-tile-about {
6634
+ -webkit-line-clamp: 1;
6635
+ }
6636
+ }
6637
+
6638
+ /* A widget: its name, and its frame filling the cells its size gives it. */
6639
+ .sc-tile-widget {
6640
+ display: grid;
6641
+ grid-template-rows: auto minmax(0, 1fr);
6642
+ padding: var(--sc-space-3) var(--sc-space-4);
6643
+ overflow: hidden;
6644
+ }
6645
+
6646
+ .sc-tile-title {
6647
+ margin: 0 0 var(--sc-space-2);
6648
+ overflow: hidden;
6649
+ color: var(--sc-color-text-muted);
6650
+ font-size: var(--sc-text-sm);
6651
+ font-weight: var(--sc-weight-medium);
6652
+ text-overflow: ellipsis;
6653
+ white-space: nowrap;
6654
+ }
6655
+
6656
+ .sc-tile-widget .sc-plugin-frame-widget {
6657
+ height: 100%;
6658
+ min-height: 0;
6659
+ }
6660
+
6661
+ /* While the page is arranged: the cells show as dots, every tile is a thing to take hold of, and
6662
+ what is in a frame stays out of the pointer's way. The bar stays in reach, just under the header
6663
+ and above the tiles that pass beneath it. */
6664
+ .sc-home-bar {
6665
+ position: sticky;
6666
+ top: calc(var(--sc-header-height) + 2.75rem + var(--sc-space-3));
6667
+ z-index: 2;
6668
+ display: flex;
6669
+ flex-wrap: wrap;
6670
+ gap: var(--sc-space-2) var(--sc-space-4);
6671
+ align-items: center;
6672
+ justify-content: space-between;
6673
+ margin-bottom: var(--sc-space-4);
6674
+ padding: var(--sc-space-2) var(--sc-space-2) var(--sc-space-2) var(--sc-space-4);
6675
+ border-radius: var(--sc-radius-lg);
6676
+ }
6677
+
6678
+ .sc-home-hint {
6679
+ margin: 0;
6680
+ color: var(--sc-color-text-muted);
6681
+ font-size: var(--sc-text-sm);
6682
+ }
6683
+
6684
+ .sc-home-bar-actions {
6685
+ display: flex;
6686
+ gap: var(--sc-space-2);
6687
+ align-items: center;
6688
+ }
6689
+
6690
+ .sc-home-tray {
6691
+ display: flex;
6692
+ flex-wrap: wrap;
6693
+ gap: var(--sc-space-2);
6694
+ align-items: center;
6695
+ margin-bottom: var(--sc-space-4);
6696
+ }
6697
+
6698
+ .sc-home-add {
6699
+ padding: var(--sc-space-1) var(--sc-space-3);
6700
+ border: var(--sc-border);
6701
+ border-radius: var(--sc-radius-full);
6702
+ background: var(--sc-color-sheet);
6703
+ color: var(--sc-color-text);
6704
+ font: inherit;
6705
+ font-size: var(--sc-text-sm);
6706
+ cursor: pointer;
6707
+ }
6708
+
6709
+ .sc-home-add:hover {
6710
+ border-color: var(--sc-color-accent);
6711
+ }
6712
+
6713
+ .sc-home-editing .sc-home-grid {
6714
+ background-image: radial-gradient(circle, var(--sc-color-text-faint) 1px, transparent 1.5px);
6715
+ background-position: calc(var(--sc-home-cell) / 2) calc(var(--sc-home-cell) / 2);
6716
+ background-size: var(--sc-home-step) var(--sc-home-step);
6717
+ }
6718
+
6719
+ /* A tile moves with a little give, overshooting its cell and settling on it, and those in the way
6720
+ start one after another, each as the wait in its style says. One put down keeps its place above
6721
+ the others until it has landed. */
6722
+ .sc-home-editing .sc-tile {
6723
+ z-index: 1;
6724
+ cursor: grab;
6725
+ transition:
6726
+ translate 360ms cubic-bezier(0.25, 1.35, 0.4, 1) var(--sc-tile-wait),
6727
+ scale 160ms ease-out,
6728
+ z-index 0s linear 360ms;
6729
+ user-select: none;
6730
+ }
6731
+
6732
+ .sc-home-editing .sc-tile:focus-visible {
6733
+ outline: var(--sc-focus-ring);
6734
+ outline-offset: 2px;
6735
+ }
6736
+
6737
+ .sc-home-editing .sc-tile:hover .sc-tile-pane {
6738
+ border-color: var(--sc-color-accent);
6739
+ }
6740
+
6741
+ .sc-home-editing .sc-plugin-frame {
6742
+ pointer-events: none;
6743
+ }
6744
+
6745
+ /* A finger resting on a tile is neither selecting its words nor asking for the page's menu. */
6746
+ @media (pointer: coarse) {
6747
+ .sc-home-editing .sc-tile {
6748
+ -webkit-touch-callout: none;
6749
+ }
6750
+ }
6751
+
6752
+ /* The tile in hand: lifted off the page, and under the pointer with no delay. */
6753
+ .sc-home-editing .sc-tile-held {
6754
+ z-index: 10;
6755
+ translate: var(--sc-tile-left) var(--sc-tile-top);
6756
+ scale: 1.04;
6757
+ transition: scale 160ms ease-out;
6758
+ }
6759
+
6760
+ .sc-tile-held .sc-tile-pane {
6761
+ box-shadow: var(--sc-glass-sheen), var(--sc-glass-lift), var(--sc-glow);
6762
+ }
6763
+
6764
+ .sc-home-held,
6765
+ .sc-home-held .sc-tile,
6766
+ .sc-home-held .sc-tile * {
6767
+ cursor: grabbing;
6768
+ }
6769
+
6770
+ /* Where it would land: the tile itself, faint, on a pane of the accent's glass, beneath those on
6771
+ their way out of it. */
6772
+ .sc-home-editing .sc-tile-slot {
6773
+ z-index: 0;
6774
+ animation: sc-tile-slot-in 160ms ease-out;
6775
+ pointer-events: none;
6776
+ }
6777
+
6778
+ .sc-tile-slot .sc-tile-pane {
6779
+ border-color: color-mix(in srgb, var(--sc-color-accent-solid) 45%, transparent);
6780
+ background: color-mix(in srgb, var(--sc-color-accent-subtle) 50%, transparent);
6781
+ box-shadow: none;
6782
+ }
6783
+
6784
+ .sc-tile-slot .sc-tile-pane > * {
6785
+ opacity: 0.4;
6786
+ }
6787
+
6788
+ .sc-tile-slot .sc-tile-count {
6789
+ display: none;
6790
+ }
6791
+
6792
+ @keyframes sc-tile-slot-in {
6793
+ from {
6794
+ opacity: 0;
6795
+ }
6796
+ }
6797
+
6798
+ /* The ways on a tile while the page is arranged: off the page at its corner, the sizes across. */
6799
+ .sc-tile-remove {
6800
+ position: absolute;
6801
+ top: calc(var(--sc-space-2) * -1);
6802
+ left: calc(var(--sc-space-2) * -1);
6803
+ z-index: 1;
6804
+ display: inline-flex;
6805
+ align-items: center;
6806
+ justify-content: center;
6807
+ width: 1.5rem;
6808
+ height: 1.5rem;
6809
+ padding: 0;
6810
+ border: var(--sc-border);
6811
+ border-radius: var(--sc-radius-full);
6812
+ background: var(--sc-color-bg-raised);
6813
+ color: var(--sc-color-text);
6814
+ font-size: var(--sc-text-sm);
6815
+ line-height: 1;
6816
+ cursor: pointer;
6817
+ }
6818
+
6819
+ .sc-tile-remove:hover {
6820
+ border-color: var(--sc-color-accent);
6821
+ }
6822
+
6823
+ .sc-tile-sizes {
6824
+ position: absolute;
6825
+ top: var(--sc-space-1);
6826
+ right: var(--sc-space-1);
6827
+ z-index: 1;
6828
+ display: inline-flex;
6829
+ gap: 1px;
6830
+ margin: 0;
6831
+ padding: 1px;
6832
+ border: var(--sc-border);
6833
+ border-radius: var(--sc-radius-md);
6834
+ background: var(--sc-color-bg-raised);
6835
+ }
6836
+
6837
+ .sc-tile-size {
6838
+ display: inline-flex;
6839
+ align-items: center;
6840
+ justify-content: center;
6841
+ min-width: 1.5rem;
6842
+ height: 1.5rem;
6843
+ padding: 0 3px;
6844
+ border: 0;
6845
+ border-radius: var(--sc-radius-sm);
6846
+ background: transparent;
6847
+ color: var(--sc-color-text-muted);
6848
+ cursor: pointer;
6849
+ }
6850
+
6851
+ .sc-tile-size:hover {
6852
+ background: var(--sc-color-bg-inset);
6853
+ }
6854
+
6855
+ .sc-tile-size-on {
6856
+ background: var(--sc-color-accent-subtle);
6857
+ color: var(--sc-color-accent);
6858
+ }
6859
+
6860
+ /* Under the sizes, a widget's name ends short of them; on small cells a project stands lower. */
6861
+ .sc-home-editing .sc-tile-title {
6862
+ padding-inline-end: 4.5rem;
6863
+ }
6864
+
6865
+ .sc-home-editing .sc-home-grid[data-columns="4"] .sc-tile-size,
6866
+ .sc-home-editing .sc-home-grid[data-columns="6"] .sc-tile-size {
6867
+ min-width: 1.25rem;
6868
+ height: 1.25rem;
6869
+ padding: 0 2px;
6870
+ }
6871
+
6872
+ .sc-home-editing .sc-home-grid[data-columns="4"] .sc-tile-project:not(.sc-tile-project-card),
6873
+ .sc-home-editing .sc-home-grid[data-columns="6"] .sc-tile-project:not(.sc-tile-project-card) {
6874
+ justify-content: flex-end;
6875
+ }
6876
+
6877
+ /* The size's shape in small: the cells it takes, a few pixels each. */
6878
+ .sc-tile-size-glyph {
6879
+ display: block;
6880
+ width: calc(var(--sc-tile-w) * 2px + 4px);
6881
+ height: calc(var(--sc-tile-h) * 2px + 4px);
6882
+ border: 1.5px solid currentcolor;
6883
+ border-radius: 2px;
6884
+ }
6885
+
6886
+ @media (prefers-reduced-motion: reduce) {
6887
+ .sc-home-editing .sc-tile,
6888
+ .sc-home-editing .sc-tile-held {
6889
+ transition: none;
6890
+ }
6891
+
6892
+ .sc-home-editing .sc-tile-slot {
6893
+ animation: none;
6894
+ }
6895
+ }