@skillcdn/console 0.4.3 → 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 (231) 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 +95 -20
  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 +32 -9
  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 +17 -14
  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 +4 -0
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +2 -0
  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 +3 -3
  35. package/dist/components/board.js.map +1 -1
  36. package/dist/components/decision-form.d.ts +6 -0
  37. package/dist/components/decision-form.d.ts.map +1 -1
  38. package/dist/components/decision-form.js +23 -5
  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 +7 -1
  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/pack-connect.d.ts.map +1 -1
  55. package/dist/components/pack-connect.js +5 -4
  56. package/dist/components/pack-connect.js.map +1 -1
  57. package/dist/components/people.d.ts +2 -0
  58. package/dist/components/people.d.ts.map +1 -1
  59. package/dist/components/people.js +15 -2
  60. package/dist/components/people.js.map +1 -1
  61. package/dist/components/plugin-frame.d.ts +3 -12
  62. package/dist/components/plugin-frame.d.ts.map +1 -1
  63. package/dist/components/plugin-frame.js +53 -20
  64. package/dist/components/plugin-frame.js.map +1 -1
  65. package/dist/components/plugin-settings.d.ts.map +1 -1
  66. package/dist/components/plugin-settings.js +151 -26
  67. package/dist/components/plugin-settings.js.map +1 -1
  68. package/dist/components/projects.d.ts +0 -8
  69. package/dist/components/projects.d.ts.map +1 -1
  70. package/dist/components/projects.js +1 -13
  71. package/dist/components/projects.js.map +1 -1
  72. package/dist/components/task-view.d.ts.map +1 -1
  73. package/dist/components/task-view.js +2 -1
  74. package/dist/components/task-view.js.map +1 -1
  75. package/dist/components/ui.d.ts.map +1 -1
  76. package/dist/components/ui.js +5 -2
  77. package/dist/components/ui.js.map +1 -1
  78. package/dist/connect-page.d.ts.map +1 -1
  79. package/dist/connect-page.js +5 -6
  80. package/dist/connect-page.js.map +1 -1
  81. package/dist/console.css +761 -191
  82. package/dist/console.d.ts +10 -3
  83. package/dist/console.d.ts.map +1 -1
  84. package/dist/console.js +33 -13
  85. package/dist/console.js.map +1 -1
  86. package/dist/data.d.ts +4 -2
  87. package/dist/data.d.ts.map +1 -1
  88. package/dist/data.js +5 -0
  89. package/dist/data.js.map +1 -1
  90. package/dist/docs-page.d.ts.map +1 -1
  91. package/dist/docs-page.js +6 -5
  92. package/dist/docs-page.js.map +1 -1
  93. package/dist/home-tiles.d.ts +92 -0
  94. package/dist/home-tiles.d.ts.map +1 -0
  95. package/dist/home-tiles.js +294 -0
  96. package/dist/home-tiles.js.map +1 -0
  97. package/dist/i18n/en.d.ts +174 -0
  98. package/dist/i18n/en.d.ts.map +1 -1
  99. package/dist/i18n/en.js +175 -1
  100. package/dist/i18n/en.js.map +1 -1
  101. package/dist/i18n/index.d.ts +4 -2
  102. package/dist/i18n/index.d.ts.map +1 -1
  103. package/dist/i18n/index.js +10 -11
  104. package/dist/i18n/index.js.map +1 -1
  105. package/dist/i18n/ko.d.ts.map +1 -1
  106. package/dist/i18n/ko.js +170 -3
  107. package/dist/i18n/ko.js.map +1 -1
  108. package/dist/index.d.ts +4 -3
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +4 -3
  111. package/dist/index.js.map +1 -1
  112. package/dist/limits.d.ts +6 -0
  113. package/dist/limits.d.ts.map +1 -1
  114. package/dist/limits.js +6 -0
  115. package/dist/limits.js.map +1 -1
  116. package/dist/plugin/bridge.d.ts +44 -3
  117. package/dist/plugin/bridge.d.ts.map +1 -1
  118. package/dist/plugin/bridge.js +26 -0
  119. package/dist/plugin/bridge.js.map +1 -1
  120. package/dist/plugin/capabilities.d.ts +7 -1
  121. package/dist/plugin/capabilities.d.ts.map +1 -1
  122. package/dist/plugin/capabilities.js +14 -1
  123. package/dist/plugin/capabilities.js.map +1 -1
  124. package/dist/plugin/context.d.ts +18 -1
  125. package/dist/plugin/context.d.ts.map +1 -1
  126. package/dist/plugin/define.d.ts +1 -0
  127. package/dist/plugin/define.d.ts.map +1 -1
  128. package/dist/plugin/define.js +1 -1
  129. package/dist/plugin/define.js.map +1 -1
  130. package/dist/plugin/limits.d.ts +5 -2
  131. package/dist/plugin/limits.d.ts.map +1 -1
  132. package/dist/plugin/limits.js +5 -2
  133. package/dist/plugin/limits.js.map +1 -1
  134. package/dist/plugin/manifest.d.ts +83 -6
  135. package/dist/plugin/manifest.d.ts.map +1 -1
  136. package/dist/plugin/manifest.js +111 -7
  137. package/dist/plugin/manifest.js.map +1 -1
  138. package/dist/plugin/rest-schemas.d.ts +76 -0
  139. package/dist/plugin/rest-schemas.d.ts.map +1 -1
  140. package/dist/plugin/rest-schemas.js +23 -2
  141. package/dist/plugin/rest-schemas.js.map +1 -1
  142. package/dist/plugin/sandbox.d.ts +4 -3
  143. package/dist/plugin/sandbox.d.ts.map +1 -1
  144. package/dist/plugin/sandbox.js +33 -6
  145. package/dist/plugin/sandbox.js.map +1 -1
  146. package/dist/plugin/semver.d.ts +26 -0
  147. package/dist/plugin/semver.d.ts.map +1 -0
  148. package/dist/plugin/semver.js +76 -0
  149. package/dist/plugin/semver.js.map +1 -0
  150. package/dist/plugin/testing.d.ts.map +1 -1
  151. package/dist/plugin/testing.js +2 -1
  152. package/dist/plugin/testing.js.map +1 -1
  153. package/dist/plugin/web.d.ts +10 -1
  154. package/dist/plugin/web.d.ts.map +1 -1
  155. package/dist/plugin/web.js +34 -0
  156. package/dist/plugin/web.js.map +1 -1
  157. package/dist/plugin.d.ts +3 -2
  158. package/dist/plugin.d.ts.map +1 -1
  159. package/dist/plugin.js +3 -2
  160. package/dist/plugin.js.map +1 -1
  161. package/dist/rules.d.ts +2 -2
  162. package/dist/rules.js +3 -3
  163. package/dist/schemas.d.ts +497 -2
  164. package/dist/schemas.d.ts.map +1 -1
  165. package/dist/schemas.js +96 -9
  166. package/dist/schemas.js.map +1 -1
  167. package/dist/use-action.d.ts +8 -2
  168. package/dist/use-action.d.ts.map +1 -1
  169. package/dist/use-action.js +13 -6
  170. package/dist/use-action.js.map +1 -1
  171. package/dist/vocabulary.d.ts +3 -1
  172. package/dist/vocabulary.d.ts.map +1 -1
  173. package/dist/vocabulary.js +3 -0
  174. package/dist/vocabulary.js.map +1 -1
  175. package/docs/specs/cli.md +4 -3
  176. package/docs/specs/plugins.md +46 -33
  177. package/docs/specs/rest.md +16 -15
  178. package/package.json +1 -1
  179. package/skills/building-a-plugin/SKILL.md +8 -7
  180. package/skills/planning-the-board/references/setting-up.md +2 -1
  181. package/skills/working-the-board/SKILL.md +3 -3
  182. package/src/api.ts +6 -0
  183. package/src/cli/cli.ts +124 -19
  184. package/src/cli/format.ts +42 -9
  185. package/src/cli/help.ts +17 -13
  186. package/src/cli/plugin-check.ts +41 -2
  187. package/src/cli/plugin-cli.ts +10 -1
  188. package/src/cli/plugin-init.ts +8 -0
  189. package/src/client.ts +8 -0
  190. package/src/compat.ts +1 -1
  191. package/src/components/board.tsx +3 -3
  192. package/src/components/decision-form.tsx +75 -19
  193. package/src/components/decision-list.tsx +45 -13
  194. package/src/components/event-feed.tsx +7 -1
  195. package/src/components/goals.tsx +4 -1
  196. package/src/components/home.tsx +615 -0
  197. package/src/components/pack-connect.tsx +5 -4
  198. package/src/components/people.tsx +136 -54
  199. package/src/components/plugin-frame.tsx +62 -63
  200. package/src/components/plugin-settings.tsx +428 -87
  201. package/src/components/projects.tsx +0 -55
  202. package/src/components/task-view.tsx +7 -0
  203. package/src/components/ui.tsx +6 -2
  204. package/src/connect-page.tsx +5 -6
  205. package/src/console.tsx +80 -30
  206. package/src/data.ts +9 -2
  207. package/src/docs-page.tsx +6 -5
  208. package/src/home-tiles.ts +438 -0
  209. package/src/i18n/en.ts +178 -0
  210. package/src/i18n/index.ts +17 -14
  211. package/src/i18n/ko.ts +174 -3
  212. package/src/index.ts +7 -5
  213. package/src/limits.ts +6 -0
  214. package/src/plugin/bridge.ts +77 -1
  215. package/src/plugin/capabilities.ts +17 -1
  216. package/src/plugin/context.ts +18 -1
  217. package/src/plugin/define.ts +4 -1
  218. package/src/plugin/limits.ts +5 -2
  219. package/src/plugin/manifest.ts +154 -10
  220. package/src/plugin/rest-schemas.ts +27 -1
  221. package/src/plugin/sandbox.ts +36 -8
  222. package/src/plugin/semver.ts +89 -0
  223. package/src/plugin/testing.ts +2 -1
  224. package/src/plugin/web.ts +49 -0
  225. package/src/plugin.ts +18 -0
  226. package/src/rules.ts +3 -3
  227. package/src/schemas.ts +118 -10
  228. package/src/styles/console.css +761 -191
  229. package/src/use-action.ts +16 -7
  230. package/src/vocabulary.ts +4 -0
  231. 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,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);
@@ -3830,11 +3842,12 @@ select.sc-input {
3830
3842
 
3831
3843
  /* The title of a bar with more days in the week runs along the bar as far as its days reach,
3832
3844
  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. */
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. */
3835
3848
  .sc-calendar-task-title-spanning {
3836
3849
  position: relative;
3837
- z-index: 25;
3850
+ z-index: 2;
3838
3851
  flex: none;
3839
3852
  max-width: calc(var(--sc-span, 1) * 100% - 2.25rem);
3840
3853
  pointer-events: none;
@@ -3918,14 +3931,6 @@ select.sc-input {
3918
3931
 
3919
3932
  /* The mark hangs in the margin, so that what wraps onto a second line, a badge most often,
3920
3933
  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
3934
  .sc-mark-lg {
3930
3935
  width: 3rem;
3931
3936
  height: 3rem;
@@ -4561,7 +4566,13 @@ select.sc-input {
4561
4566
  }
4562
4567
 
4563
4568
  .sc-main {
4564
- 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);
4565
4576
  }
4566
4577
 
4567
4578
  .sc-page-title,
@@ -5155,13 +5166,14 @@ select.sc-input {
5155
5166
  }
5156
5167
 
5157
5168
  /* 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. */
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. */
5159
5172
  .sc-goal-page {
5160
5173
  display: flex;
5161
5174
  flex: 1 1 0;
5162
5175
  flex-direction: column;
5163
5176
  gap: var(--sc-space-4);
5164
- min-height: 0;
5165
5177
  }
5166
5178
 
5167
5179
  .sc-goal-header {
@@ -5251,7 +5263,6 @@ select.sc-input {
5251
5263
  display: flex;
5252
5264
  flex: 1 1 0;
5253
5265
  flex-direction: column;
5254
- min-height: 0;
5255
5266
  }
5256
5267
 
5257
5268
  .sc-goal-view-list {
@@ -5895,27 +5906,140 @@ select.sc-input {
5895
5906
  margin-top: 0.25em;
5896
5907
  }
5897
5908
 
5898
- .sc-plugin-tick-words {
5899
- display: grid;
5900
- 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;
5901
5913
  }
5902
5914
 
5903
- .sc-plugin-tick-name {
5904
- 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);
5905
5919
  }
5906
5920
 
5907
- .sc-plugin-tick-under {
5908
- color: var(--sc-color-text-muted);
5909
- font-size: var(--sc-text-sm);
5921
+ .sc-plugin-capabilities + .sc-plugin-capabilities {
5922
+ margin-top: var(--sc-space-3);
5910
5923
  }
5911
5924
 
5912
- /* The capabilities an enabled plugin holds, one a line; its commands as words side by side. */
5913
- .sc-plugin-held {
5914
- display: grid;
5915
- 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);
5916
5930
  margin: 0;
5917
- padding: 0;
5918
- 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;
5919
6043
  }
5920
6044
 
5921
6045
  .sc-plugin-codes {
@@ -6028,3 +6152,449 @@ select.sc-input {
6028
6152
  grid-template-columns: minmax(0, 1fr);
6029
6153
  }
6030
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
+ }