@skillcdn/console 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/README.md +4 -4
  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 +120 -33
  8. package/dist/cli/cli.js.map +1 -1
  9. package/dist/cli/format.d.ts +4 -2
  10. package/dist/cli/format.d.ts.map +1 -1
  11. package/dist/cli/format.js +38 -10
  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 +22 -15
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/cli/plugin-check.d.ts +10 -1
  17. package/dist/cli/plugin-check.d.ts.map +1 -1
  18. package/dist/cli/plugin-check.js +45 -4
  19. package/dist/cli/plugin-check.js.map +1 -1
  20. package/dist/cli/plugin-cli.d.ts +1 -1
  21. package/dist/cli/plugin-cli.d.ts.map +1 -1
  22. package/dist/cli/plugin-cli.js +80 -5
  23. package/dist/cli/plugin-cli.js.map +1 -1
  24. package/dist/cli/plugin-init.d.ts +19 -0
  25. package/dist/cli/plugin-init.d.ts.map +1 -1
  26. package/dist/cli/plugin-init.js +141 -3
  27. package/dist/cli/plugin-init.js.map +1 -1
  28. package/dist/client.d.ts +7 -2
  29. package/dist/client.d.ts.map +1 -1
  30. package/dist/client.js +18 -5
  31. package/dist/client.js.map +1 -1
  32. package/dist/compat.js +1 -1
  33. package/dist/components/board.d.ts +8 -0
  34. package/dist/components/board.d.ts.map +1 -1
  35. package/dist/components/board.js +3 -3
  36. package/dist/components/board.js.map +1 -1
  37. package/dist/components/comments.d.ts.map +1 -1
  38. package/dist/components/comments.js +1 -1
  39. package/dist/components/comments.js.map +1 -1
  40. package/dist/components/decision-form.d.ts +8 -1
  41. package/dist/components/decision-form.d.ts.map +1 -1
  42. package/dist/components/decision-form.js +57 -7
  43. package/dist/components/decision-form.js.map +1 -1
  44. package/dist/components/decision-list.d.ts +9 -1
  45. package/dist/components/decision-list.d.ts.map +1 -1
  46. package/dist/components/decision-list.js +53 -7
  47. package/dist/components/decision-list.js.map +1 -1
  48. package/dist/components/event-feed.d.ts.map +1 -1
  49. package/dist/components/event-feed.js +7 -1
  50. package/dist/components/event-feed.js.map +1 -1
  51. package/dist/components/goals.d.ts.map +1 -1
  52. package/dist/components/goals.js +2 -2
  53. package/dist/components/goals.js.map +1 -1
  54. package/dist/components/home.d.ts +35 -0
  55. package/dist/components/home.d.ts.map +1 -0
  56. package/dist/components/home.js +326 -0
  57. package/dist/components/home.js.map +1 -0
  58. package/dist/components/my-decisions.d.ts +2 -0
  59. package/dist/components/my-decisions.d.ts.map +1 -1
  60. package/dist/components/my-decisions.js +2 -2
  61. package/dist/components/my-decisions.js.map +1 -1
  62. package/dist/components/pack-connect.d.ts.map +1 -1
  63. package/dist/components/pack-connect.js +5 -4
  64. package/dist/components/pack-connect.js.map +1 -1
  65. package/dist/components/people.d.ts +2 -0
  66. package/dist/components/people.d.ts.map +1 -1
  67. package/dist/components/people.js +15 -2
  68. package/dist/components/people.js.map +1 -1
  69. package/dist/components/plugin-frame.d.ts +3 -12
  70. package/dist/components/plugin-frame.d.ts.map +1 -1
  71. package/dist/components/plugin-frame.js +53 -20
  72. package/dist/components/plugin-frame.js.map +1 -1
  73. package/dist/components/plugin-settings.d.ts.map +1 -1
  74. package/dist/components/plugin-settings.js +151 -26
  75. package/dist/components/plugin-settings.js.map +1 -1
  76. package/dist/components/projects.d.ts +0 -8
  77. package/dist/components/projects.d.ts.map +1 -1
  78. package/dist/components/projects.js +1 -13
  79. package/dist/components/projects.js.map +1 -1
  80. package/dist/components/task-view.d.ts +2 -1
  81. package/dist/components/task-view.d.ts.map +1 -1
  82. package/dist/components/task-view.js +2 -1
  83. package/dist/components/task-view.js.map +1 -1
  84. package/dist/components/ui.d.ts.map +1 -1
  85. package/dist/components/ui.js +5 -2
  86. package/dist/components/ui.js.map +1 -1
  87. package/dist/connect-page.d.ts.map +1 -1
  88. package/dist/connect-page.js +5 -6
  89. package/dist/connect-page.js.map +1 -1
  90. package/dist/console.css +764 -192
  91. package/dist/console.d.ts +10 -3
  92. package/dist/console.d.ts.map +1 -1
  93. package/dist/console.js +49 -28
  94. package/dist/console.js.map +1 -1
  95. package/dist/data.d.ts +6 -3
  96. package/dist/data.d.ts.map +1 -1
  97. package/dist/data.js +31 -7
  98. package/dist/data.js.map +1 -1
  99. package/dist/docs-page.d.ts.map +1 -1
  100. package/dist/docs-page.js +6 -5
  101. package/dist/docs-page.js.map +1 -1
  102. package/dist/home-tiles.d.ts +92 -0
  103. package/dist/home-tiles.d.ts.map +1 -0
  104. package/dist/home-tiles.js +294 -0
  105. package/dist/home-tiles.js.map +1 -0
  106. package/dist/i18n/en.d.ts +180 -0
  107. package/dist/i18n/en.d.ts.map +1 -1
  108. package/dist/i18n/en.js +181 -1
  109. package/dist/i18n/en.js.map +1 -1
  110. package/dist/i18n/index.d.ts +4 -2
  111. package/dist/i18n/index.d.ts.map +1 -1
  112. package/dist/i18n/index.js +10 -11
  113. package/dist/i18n/index.js.map +1 -1
  114. package/dist/i18n/ko.d.ts.map +1 -1
  115. package/dist/i18n/ko.js +176 -3
  116. package/dist/i18n/ko.js.map +1 -1
  117. package/dist/index.d.ts +4 -3
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +4 -3
  120. package/dist/index.js.map +1 -1
  121. package/dist/limits.d.ts +8 -0
  122. package/dist/limits.d.ts.map +1 -1
  123. package/dist/limits.js +8 -0
  124. package/dist/limits.js.map +1 -1
  125. package/dist/plugin/bridge.d.ts +44 -3
  126. package/dist/plugin/bridge.d.ts.map +1 -1
  127. package/dist/plugin/bridge.js +26 -0
  128. package/dist/plugin/bridge.js.map +1 -1
  129. package/dist/plugin/capabilities.d.ts +7 -1
  130. package/dist/plugin/capabilities.d.ts.map +1 -1
  131. package/dist/plugin/capabilities.js +14 -1
  132. package/dist/plugin/capabilities.js.map +1 -1
  133. package/dist/plugin/context.d.ts +24 -1
  134. package/dist/plugin/context.d.ts.map +1 -1
  135. package/dist/plugin/define.d.ts +1 -0
  136. package/dist/plugin/define.d.ts.map +1 -1
  137. package/dist/plugin/define.js +1 -1
  138. package/dist/plugin/define.js.map +1 -1
  139. package/dist/plugin/limits.d.ts +5 -2
  140. package/dist/plugin/limits.d.ts.map +1 -1
  141. package/dist/plugin/limits.js +5 -2
  142. package/dist/plugin/limits.js.map +1 -1
  143. package/dist/plugin/manifest.d.ts +83 -6
  144. package/dist/plugin/manifest.d.ts.map +1 -1
  145. package/dist/plugin/manifest.js +111 -7
  146. package/dist/plugin/manifest.js.map +1 -1
  147. package/dist/plugin/rest-schemas.d.ts +76 -0
  148. package/dist/plugin/rest-schemas.d.ts.map +1 -1
  149. package/dist/plugin/rest-schemas.js +23 -2
  150. package/dist/plugin/rest-schemas.js.map +1 -1
  151. package/dist/plugin/sandbox.d.ts +4 -3
  152. package/dist/plugin/sandbox.d.ts.map +1 -1
  153. package/dist/plugin/sandbox.js +33 -6
  154. package/dist/plugin/sandbox.js.map +1 -1
  155. package/dist/plugin/semver.d.ts +26 -0
  156. package/dist/plugin/semver.d.ts.map +1 -0
  157. package/dist/plugin/semver.js +76 -0
  158. package/dist/plugin/semver.js.map +1 -0
  159. package/dist/plugin/testing.d.ts.map +1 -1
  160. package/dist/plugin/testing.js +2 -1
  161. package/dist/plugin/testing.js.map +1 -1
  162. package/dist/plugin/web.d.ts +10 -1
  163. package/dist/plugin/web.d.ts.map +1 -1
  164. package/dist/plugin/web.js +34 -0
  165. package/dist/plugin/web.js.map +1 -1
  166. package/dist/plugin.d.ts +3 -2
  167. package/dist/plugin.d.ts.map +1 -1
  168. package/dist/plugin.js +3 -2
  169. package/dist/plugin.js.map +1 -1
  170. package/dist/rules.d.ts +2 -2
  171. package/dist/rules.js +3 -3
  172. package/dist/schemas.d.ts +574 -11
  173. package/dist/schemas.d.ts.map +1 -1
  174. package/dist/schemas.js +154 -25
  175. package/dist/schemas.js.map +1 -1
  176. package/dist/use-action.d.ts +8 -2
  177. package/dist/use-action.d.ts.map +1 -1
  178. package/dist/use-action.js +13 -6
  179. package/dist/use-action.js.map +1 -1
  180. package/dist/vocabulary.d.ts +3 -1
  181. package/dist/vocabulary.d.ts.map +1 -1
  182. package/dist/vocabulary.js +3 -0
  183. package/dist/vocabulary.js.map +1 -1
  184. package/docs/specs/cli.md +4 -3
  185. package/docs/specs/plugins.md +49 -35
  186. package/docs/specs/rest.md +20 -18
  187. package/package.json +7 -7
  188. package/skills/building-a-plugin/SKILL.md +10 -9
  189. package/skills/planning-the-board/references/setting-up.md +2 -1
  190. package/skills/working-the-board/SKILL.md +3 -3
  191. package/src/api.ts +10 -0
  192. package/src/cli/cli.ts +162 -39
  193. package/src/cli/format.ts +54 -10
  194. package/src/cli/help.ts +23 -14
  195. package/src/cli/plugin-check.ts +68 -2
  196. package/src/cli/plugin-cli.ts +104 -6
  197. package/src/cli/plugin-init.ts +178 -3
  198. package/src/client.ts +36 -9
  199. package/src/compat.ts +1 -1
  200. package/src/components/board.tsx +3 -3
  201. package/src/components/comments.tsx +1 -0
  202. package/src/components/decision-form.tsx +166 -29
  203. package/src/components/decision-list.tsx +116 -15
  204. package/src/components/event-feed.tsx +7 -1
  205. package/src/components/goals.tsx +4 -1
  206. package/src/components/home.tsx +615 -0
  207. package/src/components/my-decisions.tsx +4 -1
  208. package/src/components/pack-connect.tsx +5 -4
  209. package/src/components/people.tsx +136 -54
  210. package/src/components/plugin-frame.tsx +62 -63
  211. package/src/components/plugin-settings.tsx +428 -87
  212. package/src/components/projects.tsx +0 -55
  213. package/src/components/task-view.tsx +9 -1
  214. package/src/components/ui.tsx +6 -2
  215. package/src/connect-page.tsx +5 -6
  216. package/src/console.tsx +98 -42
  217. package/src/data.ts +41 -11
  218. package/src/docs-page.tsx +6 -5
  219. package/src/home-tiles.ts +438 -0
  220. package/src/i18n/en.ts +185 -0
  221. package/src/i18n/index.ts +17 -14
  222. package/src/i18n/ko.ts +181 -3
  223. package/src/index.ts +7 -5
  224. package/src/limits.ts +8 -0
  225. package/src/plugin/bridge.ts +77 -1
  226. package/src/plugin/capabilities.ts +17 -1
  227. package/src/plugin/context.ts +24 -2
  228. package/src/plugin/define.ts +4 -1
  229. package/src/plugin/limits.ts +5 -2
  230. package/src/plugin/manifest.ts +154 -10
  231. package/src/plugin/rest-schemas.ts +27 -1
  232. package/src/plugin/sandbox.ts +36 -8
  233. package/src/plugin/semver.ts +89 -0
  234. package/src/plugin/testing.ts +2 -1
  235. package/src/plugin/web.ts +49 -0
  236. package/src/plugin.ts +18 -0
  237. package/src/rules.ts +3 -3
  238. package/src/schemas.ts +190 -28
  239. package/src/styles/console.css +764 -192
  240. package/src/use-action.ts +16 -7
  241. package/src/vocabulary.ts +4 -0
  242. package/template/plugin/console-plugin.json +3 -1
  243. package/template/plugin/package.json +3 -3
package/dist/console.css CHANGED
@@ -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,9 @@ 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,
888
893
  .sc-decision,
889
894
  .sc-run,
890
895
  .sc-comment,
@@ -2528,14 +2533,128 @@ select.sc-input {
2528
2533
  user-select: all;
2529
2534
  }
2530
2535
 
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. */
2536
+ /* People: everyone of the board as cards in a grid. The person at the head, their account and
2537
+ where it came from under the name; what they are as rows of one shape, so that the cards read
2538
+ alike down a column; the ways to their work at the foot. */
2534
2539
 
2535
2540
  .sc-people {
2536
2541
  display: grid;
2537
- grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
2542
+ grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
2543
+ gap: var(--sc-space-4);
2544
+ }
2545
+
2546
+ .sc-person-card {
2547
+ display: flex;
2548
+ flex-direction: column;
2549
+ gap: var(--sc-space-4);
2550
+ min-width: 0;
2551
+ padding: var(--sc-space-5);
2552
+ border-radius: var(--sc-radius-xl);
2553
+ }
2554
+
2555
+ .sc-person-card-head {
2556
+ display: flex;
2557
+ align-items: center;
2558
+ gap: var(--sc-space-3);
2559
+ min-width: 0;
2560
+ }
2561
+
2562
+ .sc-person-card-head .sc-avatar {
2563
+ width: 3rem;
2564
+ height: 3rem;
2565
+ font-size: var(--sc-text-lg);
2566
+ }
2567
+
2568
+ .sc-person-card-who {
2569
+ display: grid;
2570
+ gap: 0.125rem;
2571
+ min-width: 0;
2572
+ }
2573
+
2574
+ .sc-person-card-name {
2575
+ display: flex;
2576
+ flex-wrap: wrap;
2577
+ align-items: baseline;
2578
+ gap: var(--sc-space-1) var(--sc-space-2);
2579
+ color: var(--sc-color-text);
2580
+ font-size: var(--sc-text-md);
2581
+ font-weight: var(--sc-weight-bold);
2582
+ line-height: var(--sc-leading-snug);
2583
+ overflow-wrap: anywhere;
2584
+ }
2585
+
2586
+ .sc-person-card-name .sc-person-you {
2587
+ margin: 0;
2588
+ font-weight: var(--sc-weight-normal);
2589
+ }
2590
+
2591
+ .sc-person-card-note {
2592
+ color: var(--sc-color-text-muted);
2593
+ font-size: var(--sc-text-xs);
2594
+ overflow-wrap: anywhere;
2595
+ }
2596
+
2597
+ .sc-person-facts {
2598
+ display: grid;
2599
+ gap: var(--sc-space-1);
2600
+ margin: 0;
2601
+ padding-top: var(--sc-space-3);
2602
+ border-top: var(--sc-hairline);
2603
+ }
2604
+
2605
+ .sc-person-fact {
2606
+ display: flex;
2607
+ align-items: center;
2608
+ justify-content: space-between;
2538
2609
  gap: var(--sc-space-3);
2610
+ min-height: 2rem;
2611
+ }
2612
+
2613
+ .sc-person-fact dt {
2614
+ flex: none;
2615
+ color: var(--sc-color-text-muted);
2616
+ font-size: var(--sc-text-sm);
2617
+ }
2618
+
2619
+ .sc-person-fact dd {
2620
+ display: flex;
2621
+ justify-content: flex-end;
2622
+ min-width: 0;
2623
+ margin: 0;
2624
+ font-size: var(--sc-text-sm);
2625
+ }
2626
+
2627
+ /* The ways to a person's work at the foot of the card, the way out across from them. */
2628
+ .sc-person-card-ways {
2629
+ display: flex;
2630
+ flex-wrap: wrap;
2631
+ align-items: center;
2632
+ gap: var(--sc-space-1);
2633
+ margin-top: auto;
2634
+ margin-inline: calc(var(--sc-space-2) * -1);
2635
+ }
2636
+
2637
+ .sc-person-card-ways button {
2638
+ margin-inline-start: auto;
2639
+ }
2640
+
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%;
2646
+ min-height: 2rem;
2647
+ padding-block: 0;
2648
+ padding-inline-start: var(--sc-space-2);
2649
+ border-color: transparent;
2650
+ background-color: transparent;
2651
+ text-overflow: ellipsis;
2652
+ }
2653
+
2654
+ select.sc-input-quiet:hover,
2655
+ select.sc-input-quiet:focus-visible {
2656
+ border-color: var(--sc-color-border);
2657
+ background-color: var(--sc-color-sheet);
2539
2658
  }
2540
2659
 
2541
2660
  .sc-person-row {
@@ -2596,118 +2715,11 @@ select.sc-input {
2596
2715
  font-size: var(--sc-text-sm);
2597
2716
  }
2598
2717
 
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);
2605
- }
2606
-
2607
- .sc-project {
2608
- display: flex;
2609
- flex-direction: column;
2610
- 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
- }
2618
-
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);
2624
- }
2625
-
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;
2631
- }
2632
-
2633
- .sc-project-head::after {
2634
- content: "";
2635
- display: block;
2636
- clear: both;
2637
- }
2638
-
2639
- .sc-project-head > :first-child {
2640
- float: left;
2641
- margin-inline-end: var(--sc-space-3);
2642
- }
2643
-
2644
- .sc-project-head > .sc-badge {
2645
- margin-top: var(--sc-space-3);
2646
- margin-inline-end: var(--sc-space-1);
2647
- }
2648
-
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;
2658
- }
2659
-
2660
- .sc-project-name::after {
2661
- content: "";
2662
- position: absolute;
2663
- inset: 0;
2664
- }
2665
-
2666
- .sc-project-name:hover {
2667
- color: var(--sc-color-text);
2668
- }
2669
-
2670
- .sc-project-name:focus-visible {
2671
- outline: none;
2672
- }
2673
-
2674
2718
  .sc-project-key {
2675
2719
  color: var(--sc-color-text-faint);
2676
2720
  font-size: var(--sc-text-xs);
2677
2721
  }
2678
2722
 
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);
2684
- }
2685
-
2686
- .sc-project-head > .sc-project-key::after {
2687
- content: "";
2688
- display: block;
2689
- clear: both;
2690
- }
2691
-
2692
- .sc-project-description {
2693
- margin-top: var(--sc-space-1);
2694
- color: var(--sc-color-text-muted);
2695
- font-size: var(--sc-text-sm);
2696
- }
2697
-
2698
- .sc-project-meta {
2699
- display: flex;
2700
- flex-wrap: wrap;
2701
- gap: var(--sc-space-2);
2702
- margin-top: auto;
2703
- padding-top: var(--sc-space-3);
2704
- border-top: var(--sc-hairline);
2705
- }
2706
-
2707
- .sc-project-meta:empty {
2708
- display: none;
2709
- }
2710
-
2711
2723
  .sc-members {
2712
2724
  display: grid;
2713
2725
  gap: var(--sc-space-4);
@@ -2980,7 +2992,8 @@ select.sc-input {
2980
2992
  }
2981
2993
  }
2982
2994
 
2983
- .sc-comment-files {
2995
+ .sc-comment-files,
2996
+ .sc-decision-files {
2984
2997
  display: grid;
2985
2998
  gap: var(--sc-space-2);
2986
2999
  margin: 0;
@@ -2990,6 +3003,7 @@ select.sc-input {
2990
3003
  }
2991
3004
 
2992
3005
  .sc-comment-picture,
3006
+ .sc-decision-picture,
2993
3007
  .sc-artifact-picture {
2994
3008
  display: grid;
2995
3009
  gap: var(--sc-space-1);
@@ -3828,11 +3842,12 @@ select.sc-input {
3828
3842
 
3829
3843
  /* The title of a bar with more days in the week runs along the bar as far as its days reach,
3830
3844
  less the room of its end, instead of stopping at the first day's edge: above every piece,
3831
- the one under the pointer included, and under the cards; the pointer goes through it to the
3832
- piece of the day beneath. The days are the first piece's own custom property. */
3845
+ the one under the pointer included, and under the cards and the header, which the page scrolls
3846
+ beneath; the pointer goes through it to the piece of the day beneath. The days are the first
3847
+ piece's own custom property. */
3833
3848
  .sc-calendar-task-title-spanning {
3834
3849
  position: relative;
3835
- z-index: 25;
3850
+ z-index: 2;
3836
3851
  flex: none;
3837
3852
  max-width: calc(var(--sc-span, 1) * 100% - 2.25rem);
3838
3853
  pointer-events: none;
@@ -3916,14 +3931,6 @@ select.sc-input {
3916
3931
 
3917
3932
  /* The mark hangs in the margin, so that what wraps onto a second line, a badge most often,
3918
3933
  starts under the name rather than under the mark. */
3919
- .sc-project-head:has(> .sc-mark-md) {
3920
- padding-inline-start: calc(2rem + var(--sc-space-3));
3921
- }
3922
-
3923
- .sc-project-head > .sc-mark-md {
3924
- margin-inline-start: calc(-2rem - var(--sc-space-3));
3925
- }
3926
-
3927
3934
  .sc-mark-lg {
3928
3935
  width: 3rem;
3929
3936
  height: 3rem;
@@ -4559,7 +4566,13 @@ select.sc-input {
4559
4566
  }
4560
4567
 
4561
4568
  .sc-main {
4562
- padding: var(--sc-space-5) var(--sc-space-4) var(--sc-space-7);
4569
+ --sc-main-top: var(--sc-space-5);
4570
+ --sc-main-side: var(--sc-space-4);
4571
+ padding-bottom: var(--sc-space-7);
4572
+ }
4573
+
4574
+ .sc-page-tabs {
4575
+ gap: var(--sc-space-4);
4563
4576
  }
4564
4577
 
4565
4578
  .sc-page-title,
@@ -5153,13 +5166,14 @@ select.sc-input {
5153
5166
  }
5154
5167
 
5155
5168
  /* A goal's page reads as the board does: the facts in a row at its head, then a switch between
5156
- the views of its tasks, then the view, which takes the rest of the height as the board does. */
5169
+ the views of its tasks, then the view, which takes the rest of the height as the board does. A
5170
+ view that needs more makes the page longer, as on any page: held to the window, it would run out
5171
+ of the shell, and the header, which stays within the shell, would go with the scrolling. */
5157
5172
  .sc-goal-page {
5158
5173
  display: flex;
5159
5174
  flex: 1 1 0;
5160
5175
  flex-direction: column;
5161
5176
  gap: var(--sc-space-4);
5162
- min-height: 0;
5163
5177
  }
5164
5178
 
5165
5179
  .sc-goal-header {
@@ -5249,7 +5263,6 @@ select.sc-input {
5249
5263
  display: flex;
5250
5264
  flex: 1 1 0;
5251
5265
  flex-direction: column;
5252
- min-height: 0;
5253
5266
  }
5254
5267
 
5255
5268
  .sc-goal-view-list {
@@ -5893,27 +5906,140 @@ select.sc-input {
5893
5906
  margin-top: 0.25em;
5894
5907
  }
5895
5908
 
5896
- .sc-plugin-tick-words {
5897
- display: grid;
5898
- gap: 2px;
5909
+ /* One the plugin requires: on, and not the person's to change, so it does not read as a control. */
5910
+ .sc-plugin-tick-locked {
5911
+ background: transparent;
5912
+ cursor: default;
5899
5913
  }
5900
5914
 
5901
- .sc-plugin-tick-name {
5902
- font-weight: var(--sc-weight-medium);
5915
+ /* What a plugin asks, in two lists: what it requires, and what it can go without. */
5916
+ .sc-plugin-capabilities {
5917
+ display: grid;
5918
+ gap: var(--sc-space-2);
5903
5919
  }
5904
5920
 
5905
- .sc-plugin-tick-under {
5906
- color: var(--sc-color-text-muted);
5907
- font-size: var(--sc-text-sm);
5921
+ .sc-plugin-capabilities + .sc-plugin-capabilities {
5922
+ margin-top: var(--sc-space-3);
5908
5923
  }
5909
5924
 
5910
- /* The capabilities an enabled plugin holds, one a line; its commands as words side by side. */
5911
- .sc-plugin-held {
5912
- display: grid;
5913
- gap: var(--sc-space-1);
5925
+ .sc-plugin-capabilities-head {
5926
+ display: flex;
5927
+ flex-wrap: wrap;
5928
+ align-items: baseline;
5929
+ gap: var(--sc-space-1) var(--sc-space-2);
5914
5930
  margin: 0;
5915
- padding: 0;
5916
- list-style: none;
5931
+ }
5932
+
5933
+ .sc-plugin-capabilities-name {
5934
+ font-size: var(--sc-text-sm);
5935
+ font-weight: var(--sc-weight-bold);
5936
+ }
5937
+
5938
+ .sc-plugin-capabilities-head .sc-settings-hint {
5939
+ margin: 0;
5940
+ }
5941
+
5942
+ /* What it can go without, on the page of a plugin that is on: under what it requires, each a box. */
5943
+ .sc-plugin-optional {
5944
+ display: grid;
5945
+ gap: var(--sc-space-1);
5946
+ margin-top: var(--sc-space-3);
5947
+ }
5948
+
5949
+ .sc-plugin-tick-words {
5950
+ display: grid;
5951
+ gap: 2px;
5952
+ }
5953
+
5954
+ .sc-plugin-tick-name {
5955
+ display: inline-flex;
5956
+ flex-wrap: wrap;
5957
+ align-items: center;
5958
+ gap: var(--sc-space-2);
5959
+ font-weight: var(--sc-weight-medium);
5960
+ }
5961
+
5962
+ .sc-plugin-tick-under {
5963
+ color: var(--sc-color-text-muted);
5964
+ font-size: var(--sc-text-sm);
5965
+ }
5966
+
5967
+ /* A setting of several choices (a list of an enum): a pill per choice, lit while chosen. */
5968
+ .sc-toggle-chips {
5969
+ display: flex;
5970
+ flex-wrap: wrap;
5971
+ gap: var(--sc-space-2);
5972
+ margin: 0;
5973
+ padding: 0;
5974
+ border: 0;
5975
+ }
5976
+
5977
+ .sc-toggle-chip {
5978
+ display: inline-flex;
5979
+ align-items: center;
5980
+ gap: var(--sc-space-1);
5981
+ min-height: var(--sc-control-size);
5982
+ padding: 0 var(--sc-space-3);
5983
+ border: var(--sc-border);
5984
+ border-radius: var(--sc-radius-full);
5985
+ background: var(--sc-color-bg-inset);
5986
+ font-size: var(--sc-text-sm);
5987
+ cursor: pointer;
5988
+ }
5989
+
5990
+ .sc-toggle-chip input {
5991
+ margin: 0;
5992
+ }
5993
+
5994
+ .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);
5998
+ }
5999
+
6000
+ /* A list of several choices too long for pills: a column of boxes. */
6001
+ .sc-check-list {
6002
+ display: grid;
6003
+ gap: var(--sc-space-1);
6004
+ margin: 0;
6005
+ padding: 0;
6006
+ list-style: none;
6007
+ }
6008
+
6009
+ /* A list of items typed one by one: the field and its button on one line, the items as chips above. */
6010
+ .sc-chip-input {
6011
+ display: flex;
6012
+ gap: var(--sc-space-2);
6013
+ width: 100%;
6014
+ }
6015
+
6016
+ .sc-chip-input .sc-input {
6017
+ flex: 1;
6018
+ min-width: 0;
6019
+ }
6020
+
6021
+ /* The settings form divided into groups: each a titled block after the ungrouped settings. */
6022
+ .sc-settings-group {
6023
+ padding-top: var(--sc-space-5);
6024
+ }
6025
+
6026
+ .sc-settings-group-title {
6027
+ margin: 0;
6028
+ font-size: var(--sc-text-md);
6029
+ font-weight: var(--sc-weight-medium);
6030
+ }
6031
+
6032
+ .sc-settings-group > .sc-settings-row:first-of-type {
6033
+ border-top: 0;
6034
+ }
6035
+
6036
+ /* The capabilities an enabled plugin holds, one a line; its commands as words side by side. */
6037
+ .sc-plugin-held {
6038
+ display: grid;
6039
+ gap: var(--sc-space-1);
6040
+ margin: 0;
6041
+ padding: 0;
6042
+ list-style: none;
5917
6043
  }
5918
6044
 
5919
6045
  .sc-plugin-codes {
@@ -6026,3 +6152,449 @@ select.sc-input {
6026
6152
  grid-template-columns: minmax(0, 1fr);
6027
6153
  }
6028
6154
  }
6155
+
6156
+ /* The front page (ADR-0061): one grid of square cells, each as wide as the page gives it, a
6157
+ tile's place and shape numbers on its style. A tile stands where a transform puts it, so that
6158
+ it glides to a new place and the frame in it stays loaded. */
6159
+
6160
+ .sc-home {
6161
+ container-type: inline-size;
6162
+ }
6163
+
6164
+ .sc-home-grid {
6165
+ --sc-home-columns: 8;
6166
+ --sc-home-rows: 1;
6167
+ --sc-home-gap: var(--sc-space-4);
6168
+ --sc-home-cell: calc(
6169
+ (100cqi - (var(--sc-home-columns) - 1) * var(--sc-home-gap)) /
6170
+ var(--sc-home-columns)
6171
+ );
6172
+ --sc-home-step: calc(var(--sc-home-cell) + var(--sc-home-gap));
6173
+ position: relative;
6174
+ height: calc(var(--sc-home-rows) * var(--sc-home-step) - var(--sc-home-gap));
6175
+ row-gap: var(--sc-home-gap);
6176
+ margin: 0;
6177
+ padding: 0;
6178
+ list-style: none;
6179
+ }
6180
+
6181
+ .sc-home-grid[data-columns="4"] {
6182
+ --sc-home-gap: var(--sc-space-3);
6183
+ }
6184
+
6185
+ .sc-tile {
6186
+ container: sc-tile / size;
6187
+ --sc-tile-x: 0;
6188
+ --sc-tile-y: 0;
6189
+ --sc-tile-w: 1;
6190
+ --sc-tile-h: 1;
6191
+ --sc-tile-left: 0px;
6192
+ --sc-tile-top: 0px;
6193
+ --sc-tile-wait: 0ms;
6194
+ position: absolute;
6195
+ top: 0;
6196
+ left: 0;
6197
+ width: calc(var(--sc-tile-w) * var(--sc-home-step) - var(--sc-home-gap));
6198
+ height: calc(var(--sc-tile-h) * var(--sc-home-step) - var(--sc-home-gap));
6199
+ /* The property of its own and not `transform`, which the `scale` of a tile in hand would multiply. */
6200
+ translate: calc(var(--sc-tile-x) * var(--sc-home-step))
6201
+ calc(var(--sc-tile-y) * var(--sc-home-step));
6202
+ }
6203
+
6204
+ .sc-tile-pane {
6205
+ width: 100%;
6206
+ height: 100%;
6207
+ border-radius: var(--sc-radius-xl);
6208
+ transition:
6209
+ border-color var(--sc-transition),
6210
+ background var(--sc-transition),
6211
+ box-shadow var(--sc-transition);
6212
+ }
6213
+
6214
+ /* A project as an icon: its mark and its name in the middle of the cell, what waits in the corner.
6215
+ The mark and the room around it follow the cell. What still does not fit stands whole or not at
6216
+ all: its row goes to a second column, past the room the tile cuts off, so that no line of words
6217
+ is ever cut across. */
6218
+ .sc-tile-project {
6219
+ --sc-tile-mark: clamp(1.75rem, 47cqh, 3.25rem);
6220
+ display: flex;
6221
+ flex-flow: column wrap;
6222
+ gap: clamp(0.125rem, 4cqh, 0.5rem) var(--sc-space-7);
6223
+ align-content: flex-start;
6224
+ justify-content: center;
6225
+ padding: clamp(0.25rem, 8cqh, 0.75rem);
6226
+ overflow: hidden;
6227
+ color: var(--sc-color-text);
6228
+ text-align: center;
6229
+ text-decoration: none;
6230
+ }
6231
+
6232
+ .sc-tile-project > :not(.sc-tile-count) {
6233
+ flex: none;
6234
+ width: 100%;
6235
+ }
6236
+
6237
+ .sc-tile-mark {
6238
+ display: flex;
6239
+ justify-content: center;
6240
+ }
6241
+
6242
+ a.sc-tile-project:hover,
6243
+ a.sc-tile-project:focus-visible {
6244
+ border-color: var(--sc-color-accent);
6245
+ background: var(--sc-glass-surface-hover);
6246
+ color: var(--sc-color-text);
6247
+ box-shadow: var(--sc-glass-sheen), var(--sc-glass-lift), var(--sc-glow);
6248
+ }
6249
+
6250
+ .sc-tile-project .sc-mark {
6251
+ width: var(--sc-tile-mark);
6252
+ height: var(--sc-tile-mark);
6253
+ font-size: calc(var(--sc-tile-mark) * 0.42);
6254
+ }
6255
+
6256
+ .sc-tile-name {
6257
+ display: -webkit-box;
6258
+ max-width: 100%;
6259
+ overflow: hidden;
6260
+ font-size: var(--sc-text-sm);
6261
+ font-weight: var(--sc-weight-medium);
6262
+ line-height: var(--sc-leading-snug);
6263
+ overflow-wrap: anywhere;
6264
+ -webkit-box-orient: vertical;
6265
+ -webkit-line-clamp: 2;
6266
+ }
6267
+
6268
+ /* What waits, in the corner: the count a tab shows, where it stands on a tile. */
6269
+ .sc-tile-count {
6270
+ position: absolute;
6271
+ top: var(--sc-space-2);
6272
+ right: var(--sc-space-2);
6273
+ }
6274
+
6275
+ /* On a low cell the name keeps to one line, on the lowest in smaller words. */
6276
+ @container sc-tile (height < 7.75rem) {
6277
+ .sc-tile-project:not(.sc-tile-project-card) .sc-tile-name {
6278
+ -webkit-line-clamp: 1;
6279
+ }
6280
+ }
6281
+
6282
+ @container sc-tile (height < 5.5rem) {
6283
+ .sc-tile-project:not(.sc-tile-project-card) {
6284
+ border-radius: var(--sc-radius-lg);
6285
+ }
6286
+
6287
+ .sc-tile-project:not(.sc-tile-project-card) .sc-tile-name {
6288
+ font-size: var(--sc-text-xs);
6289
+ line-height: var(--sc-leading-tight);
6290
+ }
6291
+ }
6292
+
6293
+ /* A project as a card, read from the corner: its name, what it is at a glance, and as much of its
6294
+ description as the card has room for, the rows lost from the last up. */
6295
+ .sc-tile-project-card {
6296
+ --sc-tile-mark: clamp(2.25rem, 22cqh, 3.25rem);
6297
+ justify-content: flex-start;
6298
+ padding: clamp(0.75rem, 8cqh, 1.25rem);
6299
+ text-align: start;
6300
+ }
6301
+
6302
+ .sc-tile-project-card .sc-tile-mark {
6303
+ justify-content: flex-start;
6304
+ }
6305
+
6306
+ .sc-tile-project-card .sc-tile-name {
6307
+ font-size: var(--sc-text-lg);
6308
+ font-weight: var(--sc-weight-bold);
6309
+ }
6310
+
6311
+ .sc-tile-meta {
6312
+ display: flex;
6313
+ flex-wrap: wrap;
6314
+ gap: var(--sc-space-1) var(--sc-space-2);
6315
+ align-items: center;
6316
+ }
6317
+
6318
+ .sc-tile-about {
6319
+ display: -webkit-box;
6320
+ overflow: hidden;
6321
+ color: var(--sc-color-text-muted);
6322
+ font-size: var(--sc-text-sm);
6323
+ -webkit-box-orient: vertical;
6324
+ -webkit-line-clamp: 3;
6325
+ }
6326
+
6327
+ @container sc-tile (height < 15rem) {
6328
+ .sc-tile-project-card .sc-tile-name {
6329
+ -webkit-line-clamp: 1;
6330
+ }
6331
+
6332
+ .sc-tile-about {
6333
+ -webkit-line-clamp: 2;
6334
+ }
6335
+ }
6336
+
6337
+ @container sc-tile (height < 13rem) {
6338
+ .sc-tile-about {
6339
+ -webkit-line-clamp: 1;
6340
+ }
6341
+ }
6342
+
6343
+ /* A widget: its name, and its frame filling the cells its size gives it. */
6344
+ .sc-tile-widget {
6345
+ display: grid;
6346
+ grid-template-rows: auto minmax(0, 1fr);
6347
+ padding: var(--sc-space-3) var(--sc-space-4);
6348
+ overflow: hidden;
6349
+ }
6350
+
6351
+ .sc-tile-title {
6352
+ margin: 0 0 var(--sc-space-2);
6353
+ overflow: hidden;
6354
+ color: var(--sc-color-text-muted);
6355
+ font-size: var(--sc-text-sm);
6356
+ font-weight: var(--sc-weight-medium);
6357
+ text-overflow: ellipsis;
6358
+ white-space: nowrap;
6359
+ }
6360
+
6361
+ .sc-tile-widget .sc-plugin-frame-widget {
6362
+ height: 100%;
6363
+ min-height: 0;
6364
+ }
6365
+
6366
+ /* While the page is arranged: the cells show as dots, every tile is a thing to take hold of, and
6367
+ what is in a frame stays out of the pointer's way. The bar stays in reach, just under the header
6368
+ and above the tiles that pass beneath it. */
6369
+ .sc-home-bar {
6370
+ position: sticky;
6371
+ top: calc(var(--sc-header-height) + 2.75rem + var(--sc-space-3));
6372
+ z-index: 2;
6373
+ display: flex;
6374
+ flex-wrap: wrap;
6375
+ gap: var(--sc-space-2) var(--sc-space-4);
6376
+ align-items: center;
6377
+ justify-content: space-between;
6378
+ margin-bottom: var(--sc-space-4);
6379
+ padding: var(--sc-space-2) var(--sc-space-2) var(--sc-space-2) var(--sc-space-4);
6380
+ border-radius: var(--sc-radius-lg);
6381
+ }
6382
+
6383
+ .sc-home-hint {
6384
+ margin: 0;
6385
+ color: var(--sc-color-text-muted);
6386
+ font-size: var(--sc-text-sm);
6387
+ }
6388
+
6389
+ .sc-home-bar-actions {
6390
+ display: flex;
6391
+ gap: var(--sc-space-2);
6392
+ align-items: center;
6393
+ }
6394
+
6395
+ .sc-home-tray {
6396
+ display: flex;
6397
+ flex-wrap: wrap;
6398
+ gap: var(--sc-space-2);
6399
+ align-items: center;
6400
+ margin-bottom: var(--sc-space-4);
6401
+ }
6402
+
6403
+ .sc-home-add {
6404
+ padding: var(--sc-space-1) var(--sc-space-3);
6405
+ border: var(--sc-border);
6406
+ border-radius: var(--sc-radius-full);
6407
+ background: var(--sc-color-sheet);
6408
+ color: var(--sc-color-text);
6409
+ font: inherit;
6410
+ font-size: var(--sc-text-sm);
6411
+ cursor: pointer;
6412
+ }
6413
+
6414
+ .sc-home-add:hover {
6415
+ border-color: var(--sc-color-accent);
6416
+ }
6417
+
6418
+ .sc-home-editing .sc-home-grid {
6419
+ background-image: radial-gradient(circle, var(--sc-color-text-faint) 1px, transparent 1.5px);
6420
+ background-position: calc(var(--sc-home-cell) / 2) calc(var(--sc-home-cell) / 2);
6421
+ background-size: var(--sc-home-step) var(--sc-home-step);
6422
+ }
6423
+
6424
+ /* A tile moves with a little give, overshooting its cell and settling on it, and those in the way
6425
+ start one after another, each as the wait in its style says. One put down keeps its place above
6426
+ the others until it has landed. */
6427
+ .sc-home-editing .sc-tile {
6428
+ z-index: 1;
6429
+ cursor: grab;
6430
+ transition:
6431
+ translate 360ms cubic-bezier(0.25, 1.35, 0.4, 1) var(--sc-tile-wait),
6432
+ scale 160ms ease-out,
6433
+ z-index 0s linear 360ms;
6434
+ user-select: none;
6435
+ }
6436
+
6437
+ .sc-home-editing .sc-tile:focus-visible {
6438
+ outline: var(--sc-focus-ring);
6439
+ outline-offset: 2px;
6440
+ }
6441
+
6442
+ .sc-home-editing .sc-tile:hover .sc-tile-pane {
6443
+ border-color: var(--sc-color-accent);
6444
+ }
6445
+
6446
+ .sc-home-editing .sc-plugin-frame {
6447
+ pointer-events: none;
6448
+ }
6449
+
6450
+ /* A finger resting on a tile is neither selecting its words nor asking for the page's menu. */
6451
+ @media (pointer: coarse) {
6452
+ .sc-home-editing .sc-tile {
6453
+ -webkit-touch-callout: none;
6454
+ }
6455
+ }
6456
+
6457
+ /* The tile in hand: lifted off the page, and under the pointer with no delay. */
6458
+ .sc-home-editing .sc-tile-held {
6459
+ z-index: 10;
6460
+ translate: var(--sc-tile-left) var(--sc-tile-top);
6461
+ scale: 1.04;
6462
+ transition: scale 160ms ease-out;
6463
+ }
6464
+
6465
+ .sc-tile-held .sc-tile-pane {
6466
+ box-shadow: var(--sc-glass-sheen), var(--sc-glass-lift), var(--sc-glow);
6467
+ }
6468
+
6469
+ .sc-home-held,
6470
+ .sc-home-held .sc-tile,
6471
+ .sc-home-held .sc-tile * {
6472
+ cursor: grabbing;
6473
+ }
6474
+
6475
+ /* Where it would land: the tile itself, faint, on a pane of the accent's glass, beneath those on
6476
+ their way out of it. */
6477
+ .sc-home-editing .sc-tile-slot {
6478
+ z-index: 0;
6479
+ animation: sc-tile-slot-in 160ms ease-out;
6480
+ pointer-events: none;
6481
+ }
6482
+
6483
+ .sc-tile-slot .sc-tile-pane {
6484
+ border-color: color-mix(in srgb, var(--sc-color-accent-solid) 45%, transparent);
6485
+ background: color-mix(in srgb, var(--sc-color-accent-subtle) 50%, transparent);
6486
+ box-shadow: none;
6487
+ }
6488
+
6489
+ .sc-tile-slot .sc-tile-pane > * {
6490
+ opacity: 0.4;
6491
+ }
6492
+
6493
+ .sc-tile-slot .sc-tile-count {
6494
+ display: none;
6495
+ }
6496
+
6497
+ @keyframes sc-tile-slot-in {
6498
+ from {
6499
+ opacity: 0;
6500
+ }
6501
+ }
6502
+
6503
+ /* The ways on a tile while the page is arranged: off the page at its corner, the sizes across. */
6504
+ .sc-tile-remove {
6505
+ position: absolute;
6506
+ top: calc(var(--sc-space-2) * -1);
6507
+ left: calc(var(--sc-space-2) * -1);
6508
+ z-index: 1;
6509
+ display: inline-flex;
6510
+ align-items: center;
6511
+ justify-content: center;
6512
+ width: 1.5rem;
6513
+ height: 1.5rem;
6514
+ padding: 0;
6515
+ border: var(--sc-border);
6516
+ border-radius: var(--sc-radius-full);
6517
+ background: var(--sc-color-bg-raised);
6518
+ color: var(--sc-color-text);
6519
+ font-size: var(--sc-text-sm);
6520
+ line-height: 1;
6521
+ cursor: pointer;
6522
+ }
6523
+
6524
+ .sc-tile-remove:hover {
6525
+ border-color: var(--sc-color-accent);
6526
+ }
6527
+
6528
+ .sc-tile-sizes {
6529
+ position: absolute;
6530
+ top: var(--sc-space-1);
6531
+ right: var(--sc-space-1);
6532
+ z-index: 1;
6533
+ display: inline-flex;
6534
+ gap: 1px;
6535
+ margin: 0;
6536
+ padding: 1px;
6537
+ border: var(--sc-border);
6538
+ border-radius: var(--sc-radius-md);
6539
+ background: var(--sc-color-bg-raised);
6540
+ }
6541
+
6542
+ .sc-tile-size {
6543
+ display: inline-flex;
6544
+ align-items: center;
6545
+ justify-content: center;
6546
+ min-width: 1.5rem;
6547
+ height: 1.5rem;
6548
+ padding: 0 3px;
6549
+ border: 0;
6550
+ border-radius: var(--sc-radius-sm);
6551
+ background: transparent;
6552
+ color: var(--sc-color-text-muted);
6553
+ cursor: pointer;
6554
+ }
6555
+
6556
+ .sc-tile-size:hover {
6557
+ background: var(--sc-color-bg-inset);
6558
+ }
6559
+
6560
+ .sc-tile-size-on {
6561
+ background: var(--sc-color-accent-subtle);
6562
+ color: var(--sc-color-accent);
6563
+ }
6564
+
6565
+ /* Under the sizes, a widget's name ends short of them; on small cells a project stands lower. */
6566
+ .sc-home-editing .sc-tile-title {
6567
+ padding-inline-end: 4.5rem;
6568
+ }
6569
+
6570
+ .sc-home-editing .sc-home-grid[data-columns="4"] .sc-tile-size,
6571
+ .sc-home-editing .sc-home-grid[data-columns="6"] .sc-tile-size {
6572
+ min-width: 1.25rem;
6573
+ height: 1.25rem;
6574
+ padding: 0 2px;
6575
+ }
6576
+
6577
+ .sc-home-editing .sc-home-grid[data-columns="4"] .sc-tile-project:not(.sc-tile-project-card),
6578
+ .sc-home-editing .sc-home-grid[data-columns="6"] .sc-tile-project:not(.sc-tile-project-card) {
6579
+ justify-content: flex-end;
6580
+ }
6581
+
6582
+ /* The size's shape in small: the cells it takes, a few pixels each. */
6583
+ .sc-tile-size-glyph {
6584
+ display: block;
6585
+ width: calc(var(--sc-tile-w) * 2px + 4px);
6586
+ height: calc(var(--sc-tile-h) * 2px + 4px);
6587
+ border: 1.5px solid currentcolor;
6588
+ border-radius: 2px;
6589
+ }
6590
+
6591
+ @media (prefers-reduced-motion: reduce) {
6592
+ .sc-home-editing .sc-tile,
6593
+ .sc-home-editing .sc-tile-held {
6594
+ transition: none;
6595
+ }
6596
+
6597
+ .sc-home-editing .sc-tile-slot {
6598
+ animation: none;
6599
+ }
6600
+ }