@crewlethq/ui 0.52.2 → 0.54.0

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 (112) hide show
  1. package/README.md +26 -0
  2. package/dist/AgentHandoffPanel/index.js +5 -5
  3. package/dist/AppShell/index.js +3 -3
  4. package/dist/{AppShell-BIUFNT3J.css → AppShell-5LPXYUV3.css} +19 -3
  5. package/dist/ArrangeList/index.js +5 -5
  6. package/dist/ArtifactBar/index.js +5 -5
  7. package/dist/ArtifactCard/index.js +5 -5
  8. package/dist/AvatarPicker/index.js +7 -7
  9. package/dist/Canvas/index.js +2 -2
  10. package/dist/CanvasBoard/index.js +4 -4
  11. package/dist/CanvasToolbar/index.js +3 -3
  12. package/dist/Checkbox/index.js +4 -4
  13. package/dist/ColorField/index.js +4 -4
  14. package/dist/Combobox/index.js +4 -4
  15. package/dist/CommandPalette/index.js +4 -4
  16. package/dist/CommentThread/index.js +5 -5
  17. package/dist/Composer/index.js +4 -4
  18. package/dist/ConfirmField/index.js +4 -4
  19. package/dist/ContrastHelp/index.js +1 -1
  20. package/dist/DataGrid/index.js +5 -5
  21. package/dist/DataTable/index.js +6 -6
  22. package/dist/DataView/index.js +8 -8
  23. package/dist/DateTimePicker/index.js +2 -2
  24. package/dist/DocTabsEditor/index.js +5 -5
  25. package/dist/{Editor-FEKMRFBK.js → Editor-RMM3NQJ2.js} +4 -4
  26. package/dist/FolderTile/FolderTile.d.ts +20 -13
  27. package/dist/FolderTile/index.d.ts +1 -1
  28. package/dist/FolderTile/index.js +1 -1
  29. package/dist/{FolderTile-MIUEB7SO.css → FolderTile-NM7CRTVH.css} +168 -29
  30. package/dist/HuePicker/index.js +5 -5
  31. package/dist/Input/index.js +3 -3
  32. package/dist/LinkInterstitial/index.js +1 -1
  33. package/dist/ListInput/index.js +4 -4
  34. package/dist/MarkdownEditor/index.js +5 -5
  35. package/dist/Menu/index.js +2 -2
  36. package/dist/MergeConflicts/index.js +5 -5
  37. package/dist/Modal/index.js +1 -1
  38. package/dist/OrgTable/index.js +1 -1
  39. package/dist/PresenterView/index.js +1 -1
  40. package/dist/PrincipalPicker/index.js +5 -5
  41. package/dist/ReviewList/ReviewList.d.ts +58 -0
  42. package/dist/ReviewList/index.d.ts +3 -0
  43. package/dist/ReviewList/index.js +6 -0
  44. package/dist/ReviewList-TIN6C2JN.css +116 -0
  45. package/dist/RichEditor/index.js +1 -1
  46. package/dist/SegmentedControl/index.js +4 -4
  47. package/dist/SelectionBar/index.js +2 -2
  48. package/dist/SetupWizard/SetupWizard.d.ts +17 -11
  49. package/dist/SetupWizard/index.js +1 -1
  50. package/dist/{SetupWizard-GZK5UDKC.css → SetupWizard-Z54H6RYW.css} +86 -15
  51. package/dist/ShareDialog/index.js +1 -1
  52. package/dist/SheetColumnEditor/index.js +9 -9
  53. package/dist/SheetGrid/index.js +4 -4
  54. package/dist/SlideFilmstrip/index.js +4 -4
  55. package/dist/Switcher/index.js +4 -4
  56. package/dist/Tabs/index.js +3 -3
  57. package/dist/TagsInput/index.js +3 -3
  58. package/dist/ThemeSwitcher/index.js +5 -5
  59. package/dist/TimeWindowPicker/index.js +4 -4
  60. package/dist/TreeCanvas/index.js +3 -3
  61. package/dist/TreeGrid/index.js +1 -1
  62. package/dist/VersionCompare/index.js +5 -5
  63. package/dist/{chunk-D6MTBXAJ.js → chunk-4QIGQC6Y.js} +2 -2
  64. package/dist/{chunk-CQEYF3UW.js → chunk-6PEALINJ.js} +2 -2
  65. package/dist/{chunk-2GIWL7IS.js → chunk-BR4FA2NG.js} +1 -1
  66. package/dist/{chunk-VP2ODUCC.js → chunk-CNTBUK24.js} +2 -2
  67. package/dist/{chunk-J53T2QAH.js → chunk-CONCQJ2X.js} +4 -4
  68. package/dist/{chunk-GRKGLZFM.js → chunk-DTCX5KCL.js} +4 -4
  69. package/dist/{chunk-EZ43L6T7.js → chunk-DU5AHR5B.js} +1 -1
  70. package/dist/{chunk-3NXWH5NC.js → chunk-E2X2MXVK.js} +1 -1
  71. package/dist/{chunk-G5SUSCWL.js → chunk-EMC2QD76.js} +1 -1
  72. package/dist/{chunk-SS4XCUUJ.js → chunk-F45VSK2M.js} +2 -2
  73. package/dist/{chunk-ILFEWRLG.js → chunk-GKRPPSWY.js} +1 -1
  74. package/dist/{chunk-7PE56HHD.js → chunk-GM2LN24I.js} +1 -1
  75. package/dist/{chunk-5O72FSOK.js → chunk-HEBW53YG.js} +2 -2
  76. package/dist/{chunk-VN47PYUF.js → chunk-IRAS2CZ5.js} +3 -3
  77. package/dist/{chunk-CUL5XV6O.js → chunk-JM5AN3CF.js} +1 -1
  78. package/dist/{chunk-SQ4JFHO7.js → chunk-K2FNW3MK.js} +1 -1
  79. package/dist/{chunk-3QSKDZR5.js → chunk-LHKIP4ZP.js} +2 -2
  80. package/dist/{chunk-VVOPDWLX.js → chunk-LVFG2RER.js} +1 -1
  81. package/dist/{chunk-SEPSXOGJ.js → chunk-LXCRHVMZ.js} +1 -1
  82. package/dist/{chunk-GPZXBJFU.js → chunk-M5LON3CU.js} +2 -2
  83. package/dist/{chunk-CAVWDJF4.js → chunk-MZ3QFQDL.js} +1 -1
  84. package/dist/{chunk-WXOYHVWG.js → chunk-N224FUS3.js} +1 -1
  85. package/dist/{chunk-X4NIE7CI.js → chunk-NILOJV62.js} +1 -1
  86. package/dist/chunk-OBUQVGEG.js +38 -0
  87. package/dist/{chunk-C6Z3MLSA.js → chunk-PZQK7DWI.js} +1 -1
  88. package/dist/{chunk-XS2FJVMT.js → chunk-PZZHO6OS.js} +1 -1
  89. package/dist/{chunk-SSHDQBHR.js → chunk-QEVW4DIN.js} +1 -1
  90. package/dist/{chunk-RQI43UJ7.js → chunk-QRA2GOK2.js} +1 -1
  91. package/dist/{chunk-34RMTXDZ.js → chunk-RBUA7ZNK.js} +1 -1
  92. package/dist/{chunk-6FVGSWLS.js → chunk-SMVWDO72.js} +1 -1
  93. package/dist/{chunk-FXHWOXGD.js → chunk-TFIINTEU.js} +17 -9
  94. package/dist/{chunk-5WYPSVRX.js → chunk-UD76FCAO.js} +1 -1
  95. package/dist/{chunk-RFPCHMSX.js → chunk-VBEMIZIJ.js} +1 -1
  96. package/dist/{chunk-NMR7AJSB.js → chunk-VEXOODVM.js} +1 -1
  97. package/dist/{chunk-DTSZUH6H.js → chunk-WXWMHYKW.js} +1 -1
  98. package/dist/{chunk-FNPZ3LLQ.js → chunk-XNKARRTG.js} +2 -2
  99. package/dist/{chunk-UJ4VVK7R.js → chunk-XS7HRQVY.js} +1 -1
  100. package/dist/{chunk-6VQA2LZC.js → chunk-ZBZUTUE7.js} +2 -2
  101. package/dist/generated/index.d.ts +1 -0
  102. package/dist/generated/index.js +68 -67
  103. package/dist/index.js +68 -67
  104. package/dist/styles.css +395 -50
  105. package/package.json +3 -3
  106. package/dist/{chunk-SXBJMBSV.js → chunk-25S5YROP.js} +2 -2
  107. package/dist/{chunk-TMM32U7D.js → chunk-3JIZ2A6K.js} +1 -1
  108. package/dist/{chunk-P432I5DQ.js → chunk-55MPFB2U.js} +0 -0
  109. package/dist/{chunk-OCRVY42T.js → chunk-F6CKQX5D.js} +1 -1
  110. package/dist/{chunk-ZFM5L7M4.js → chunk-I6NNUIIT.js} +1 -1
  111. package/dist/{chunk-D7Q5MQRF.js → chunk-ICPQIAD6.js} +1 -1
  112. package/dist/{chunk-LJHH4WWB.js → chunk-QLEJPU5R.js} +2 -2
package/dist/styles.css CHANGED
@@ -702,7 +702,7 @@
702
702
  }
703
703
 
704
704
 
705
- /* AppShell-BIUFNT3J.css */
705
+ /* AppShell-5LPXYUV3.css */
706
706
  /*
707
707
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
708
708
  * floats beside it.
@@ -1316,13 +1316,25 @@
1316
1316
  programmatic focus does not match :focus-visible, so neither the browser nor
1317
1317
  the document baseline draws a ring around the whole screen. */
1318
1318
 
1319
+ /*
1320
+ * THE CONTENT'S END is room under the last line, so it never reads flush
1321
+ * against the window's edge. It is a custom property,
1322
+ * `--crewlet-app-shell-content-end`, because a screen that ends in a bar
1323
+ * docked to the bottom of the scroller (a setup's footer) IS that edge: the
1324
+ * bar takes the room back with a negative margin of the same length, and
1325
+ * sits on the scroller's bottom at the end of a scroll exactly where it stood
1326
+ * while scrolling, rather than riding the room's height above it.
1327
+ */
1319
1328
  .crewlet-app-shell__content {
1329
+ --crewlet-app-shell-content-end: var(--spacing-10);
1330
+
1320
1331
  display: flex;
1321
1332
  flex-direction: column;
1322
1333
  gap: var(--spacing-5);
1323
1334
  max-width: var(--size-content-max);
1324
1335
  margin: 0 auto;
1325
- padding: var(--spacing-5) var(--spacing-5) var(--spacing-10);
1336
+ padding: var(--spacing-5) var(--spacing-5);
1337
+ padding-bottom: var(--crewlet-app-shell-content-end);
1326
1338
  min-width: 0;
1327
1339
  }
1328
1340
 
@@ -1341,8 +1353,9 @@
1341
1353
  }
1342
1354
 
1343
1355
  .crewlet-app-shell--fill .crewlet-app-shell__content {
1356
+ --crewlet-app-shell-content-end: var(--spacing-5);
1357
+
1344
1358
  height: 100%;
1345
- padding-bottom: var(--spacing-5);
1346
1359
  }
1347
1360
 
1348
1361
  /* Hidden by default, revealed by the breakpoint below: the wide layout has the
@@ -1461,7 +1474,10 @@
1461
1474
  }
1462
1475
 
1463
1476
  .crewlet-app-shell__content {
1464
- padding: var(--spacing-4) var(--spacing-4) var(--spacing-9);
1477
+ --crewlet-app-shell-content-end: var(--spacing-9);
1478
+
1479
+ padding: var(--spacing-4) var(--spacing-4);
1480
+ padding-bottom: var(--crewlet-app-shell-content-end);
1465
1481
  }
1466
1482
  }
1467
1483
 
@@ -16587,12 +16603,12 @@ button.crewlet-finding-list__row:focus-visible {
16587
16603
  }
16588
16604
 
16589
16605
 
16590
- /* FolderTile-MIUEB7SO.css */
16606
+ /* FolderTile-NM7CRTVH.css */
16591
16607
  /*
16592
16608
  * A folder in a gallery: a short tile on Card (no preview), the folder glyph
16593
- * on a neutral tint over the name and one quiet line, and a More menu in the
16594
- * top corner outside the link. `row` is the full width, 44px row a phone
16595
- * takes, and a tile becomes one under the phone breakpoint.
16609
+ * on a neutral tint over the name and one quiet run of facts, and a More menu
16610
+ * level with the glyph, outside the link. `row` is the full width row a phone
16611
+ * takes (44px at least), and a tile becomes one under the phone breakpoint.
16596
16612
  *
16597
16613
  * ON TOP OF CARD, so every rule that changes Card's own layout carries Card's
16598
16614
  * class too: the two sheets meet at equal weight and the bundle orders them by
@@ -16600,10 +16616,11 @@ button.crewlet-finding-list__row:focus-visible {
16600
16616
  */
16601
16617
 
16602
16618
  /*
16603
- * THE ARTIFACT CARD'S CORNER, so a folder tile and the cards below it read as
16604
- * one gallery, and Card's own hover step (the hairline darkens, nothing
16605
- * lifts). The chosen state is Card's (`selected`): the selected edge over the
16606
- * selected fill.
16619
+ * THE ARTIFACT CARD'S CORNER AND HOVER, so a folder tile and the cards below
16620
+ * it read as one gallery: under the pointer the hairline darkens and a
16621
+ * hairline shadow settles under the tile, quickly and with the standard ease,
16622
+ * exactly as a card's does. Nothing lifts or moves. The chosen state is
16623
+ * Card's (`selected`): the selected edge over the selected fill.
16607
16624
  */
16608
16625
  .crewlet-card.crewlet-folder-tile {
16609
16626
  /*
@@ -16616,6 +16633,7 @@ button.crewlet-finding-list__row:focus-visible {
16616
16633
  --crewlet-folder-tile-pad-inline: var(--spacing-4);
16617
16634
  --crewlet-folder-tile-floor: auto;
16618
16635
  --crewlet-folder-tile-glyph: 40px;
16636
+ --crewlet-folder-tile-glyph-icon: 20px;
16619
16637
  --crewlet-folder-tile-glyph-radius: var(--radius-md);
16620
16638
  /*
16621
16639
  * THE WORDS ARE SET AS THE CARDS BESIDE THEM: a tile's name at a gallery
@@ -16644,13 +16662,36 @@ button.crewlet-finding-list__row:focus-visible {
16644
16662
  --crewlet-folder-tile-actions-shift: 0;
16645
16663
  --crewlet-folder-tile-reserve-link: 0px;
16646
16664
 
16665
+ /*
16666
+ * THE CARD'S SEPARATOR between two facts, a quiet dot with a step of air on
16667
+ * each side: the width each fact after the first opens with.
16668
+ */
16669
+ --crewlet-folder-tile-separator: var(--spacing-5);
16670
+ /* Who can see it is a glyph and its word; the row keeps the glyph alone. */
16671
+ --crewlet-folder-tile-word-position: static;
16672
+ --crewlet-folder-tile-word-size: auto;
16673
+ --crewlet-folder-tile-word-clip: none;
16674
+
16647
16675
  flex-direction: row;
16648
16676
  align-items: stretch;
16649
16677
  min-width: 0;
16650
16678
  border-radius: var(--crewlet-folder-tile-radius);
16651
16679
  }
16652
16680
 
16653
- /* ---- the row: a phone's, full width at 44px ---- */
16681
+ /* The card's quick step, over Card's slower interactive one. */
16682
+ .crewlet-card.crewlet-folder-tile.is-interactive {
16683
+ transition:
16684
+ border-color var(--motion-duration-fast) var(--motion-easing-out),
16685
+ box-shadow var(--motion-duration-fast) var(--motion-easing-out);
16686
+ }
16687
+
16688
+ .crewlet-card.crewlet-folder-tile:hover {
16689
+ box-shadow: var(--shadow-xs);
16690
+ }
16691
+
16692
+ /* ---- the row: a phone's, full width and 44px at least ----
16693
+ The glyph and its tint keep the tile's proportion (the glyph half the
16694
+ tint), at the list name cell's 32px tint. */
16654
16695
 
16655
16696
  .crewlet-card.crewlet-folder-tile--row {
16656
16697
  --crewlet-folder-tile-radius: var(--radius-lg);
@@ -16658,8 +16699,9 @@ button.crewlet-finding-list__row:focus-visible {
16658
16699
  --crewlet-folder-tile-pad-block: var(--spacing-1);
16659
16700
  --crewlet-folder-tile-pad-inline: var(--spacing-3);
16660
16701
  --crewlet-folder-tile-floor: var(--size-control-lg);
16661
- --crewlet-folder-tile-glyph: 28px;
16662
- --crewlet-folder-tile-glyph-radius: var(--radius-sm);
16702
+ --crewlet-folder-tile-glyph: 32px;
16703
+ --crewlet-folder-tile-glyph-icon: 16px;
16704
+ --crewlet-folder-tile-glyph-radius: var(--radius-md);
16663
16705
  --crewlet-folder-tile-words-gap: 2px;
16664
16706
  --crewlet-folder-tile-actions-inset: var(--spacing-2);
16665
16707
  --crewlet-folder-tile-direction: row;
@@ -16667,6 +16709,9 @@ button.crewlet-finding-list__row:focus-visible {
16667
16709
  --crewlet-folder-tile-actions-top: 50%;
16668
16710
  --crewlet-folder-tile-actions-shift: -50%;
16669
16711
  --crewlet-folder-tile-reserve-link: calc(var(--size-control-sm) + var(--spacing-1));
16712
+ --crewlet-folder-tile-word-position: absolute;
16713
+ --crewlet-folder-tile-word-size: 1px;
16714
+ --crewlet-folder-tile-word-clip: inset(50%);
16670
16715
  }
16671
16716
 
16672
16717
  /* UNDER THE PHONE BREAKPOINT A TILE IS THE ROW, strictly under, as the
@@ -16678,8 +16723,9 @@ button.crewlet-finding-list__row:focus-visible {
16678
16723
  --crewlet-folder-tile-pad-block: var(--spacing-1);
16679
16724
  --crewlet-folder-tile-pad-inline: var(--spacing-3);
16680
16725
  --crewlet-folder-tile-floor: var(--size-control-lg);
16681
- --crewlet-folder-tile-glyph: 28px;
16682
- --crewlet-folder-tile-glyph-radius: var(--radius-sm);
16726
+ --crewlet-folder-tile-glyph: 32px;
16727
+ --crewlet-folder-tile-glyph-icon: 16px;
16728
+ --crewlet-folder-tile-glyph-radius: var(--radius-md);
16683
16729
  --crewlet-folder-tile-words-gap: 2px;
16684
16730
  --crewlet-folder-tile-actions-inset: var(--spacing-2);
16685
16731
  --crewlet-folder-tile-direction: row;
@@ -16687,19 +16733,41 @@ button.crewlet-finding-list__row:focus-visible {
16687
16733
  --crewlet-folder-tile-actions-top: 50%;
16688
16734
  --crewlet-folder-tile-actions-shift: -50%;
16689
16735
  --crewlet-folder-tile-reserve-link: calc(var(--size-control-sm) + var(--spacing-1));
16736
+ --crewlet-folder-tile-word-position: absolute;
16737
+ --crewlet-folder-tile-word-size: 1px;
16738
+ --crewlet-folder-tile-word-clip: inset(50%);
16690
16739
  }
16691
16740
  }
16692
16741
 
16742
+ /*
16743
+ * THE STATES OUTLAST THE POINTER. Card's hover step darkens the hairline at
16744
+ * the same weight as a state's edge, and Card's sheet comes after this one, so
16745
+ * each state restates its edge under the pointer too: a chosen tile keeps the
16746
+ * selected edge, and a drop target, which is under the pointer by definition,
16747
+ * keeps its accent.
16748
+ */
16749
+ .crewlet-card.crewlet-folder-tile.is-selected,
16750
+ .crewlet-card.crewlet-folder-tile.is-selected:hover {
16751
+ border-color: var(--color-border-selected);
16752
+ }
16753
+
16693
16754
  /*
16694
16755
  * SOMETHING HELD OVER IT WOULD LAND IN IT: the accent edge over the accent's
16695
16756
  * soft fill, the same pair a file drop target takes while files are over it,
16696
- * so "let go here" reads one way across the package.
16757
+ * so "let go here" reads one way across the package. The glyph's tint takes
16758
+ * the accent's hairline and ink, so the folder itself says it is open to it.
16697
16759
  */
16698
- .crewlet-card.crewlet-folder-tile.is-drop-target {
16760
+ .crewlet-card.crewlet-folder-tile.is-drop-target,
16761
+ .crewlet-card.crewlet-folder-tile.is-drop-target:hover {
16699
16762
  border-color: var(--color-brand-accent);
16700
16763
  background-color: var(--color-brand-accent-soft);
16701
16764
  }
16702
16765
 
16766
+ .crewlet-folder-tile.is-drop-target .crewlet-folder-tile__glyph {
16767
+ box-shadow: inset 0 0 0 1px var(--color-brand-accent);
16768
+ color: var(--color-brand-accent-ink);
16769
+ }
16770
+
16703
16771
  .crewlet-card.crewlet-folder-tile:has(.crewlet-folder-tile__link:focus-visible) {
16704
16772
  outline: 2px solid var(--color-focus);
16705
16773
  outline-offset: var(--size-focus-ring-inset-offset);
@@ -16730,7 +16798,11 @@ button.crewlet-finding-list__row:focus-visible {
16730
16798
  padding-inline-end: calc(var(--crewlet-folder-tile-pad-inline) + var(--crewlet-folder-tile-reserve-link));
16731
16799
  }
16732
16800
 
16733
- /* A NEUTRAL TINT, never a kind's: a folder is not a kind. */
16801
+ /*
16802
+ * A NEUTRAL TINT, never a kind's: a folder is not a kind. Its hairline steps
16803
+ * up with the tile's under the pointer, as a folder's mark does on a list
16804
+ * row, so the one drawn thing on the tile answers too.
16805
+ */
16734
16806
  .crewlet-folder-tile__glyph {
16735
16807
  display: inline-flex;
16736
16808
  flex: none;
@@ -16743,6 +16815,17 @@ button.crewlet-finding-list__row:focus-visible {
16743
16815
  background: var(--color-surface-inset);
16744
16816
  box-shadow: inset 0 0 0 1px var(--color-border-default);
16745
16817
  color: var(--color-text-secondary);
16818
+ transition: box-shadow var(--motion-duration-fast) var(--motion-easing-out);
16819
+ }
16820
+
16821
+ .crewlet-folder-tile:hover .crewlet-folder-tile__glyph {
16822
+ box-shadow: inset 0 0 0 1px var(--color-border-hover);
16823
+ }
16824
+
16825
+ /* The glyph is drawn at the shape's size, whatever size the markup asks. */
16826
+ .crewlet-folder-tile__glyph > svg {
16827
+ width: var(--crewlet-folder-tile-glyph-icon);
16828
+ height: var(--crewlet-folder-tile-glyph-icon);
16746
16829
  }
16747
16830
 
16748
16831
  .crewlet-folder-tile__body {
@@ -16764,35 +16847,105 @@ button.crewlet-finding-list__row:focus-visible {
16764
16847
  }
16765
16848
 
16766
16849
  /*
16767
- * THE FACTS WRAP, NEVER CUT. "Everyone" and "Nothing you can open yet" are
16768
- * both things a reader has to read, and four tiles across a laptop's page do
16769
- * not have room for them on one line: the count moves under who can see the
16770
- * folder rather than losing its end to an ellipsis. The two are told apart by
16771
- * the visibility glyph and the gap between them, not by a separator, so a
16772
- * line that breaks never opens on a stray dot.
16850
+ * THE FACTS ARE ONE RUN, WRAPPED AND NEVER CUT. "Everyone · 12 artifacts · 2
16851
+ * folders" is the card's run: each fact after the first opens with the card's
16852
+ * quiet dot. Four tiles across a laptop's page have no room for "Only you ·
16853
+ * Nothing you can open yet" on one line, so the run breaks between who can
16854
+ * see the folder and what is inside rather than losing its end to an
16855
+ * ellipsis, and the count moves as one.
16856
+ *
16857
+ * A LINE NEVER OPENS ON A DOT. Every fact carries its dot in the separator's
16858
+ * width before it, and the run is drawn that width to the left of the facts'
16859
+ * own edge, which clips the overhang: the first fact of every line, the very
16860
+ * first and any the run broke onto a new line, lays its dot in the clipped
16861
+ * strip. The clip is horizontal only, so nothing above or below is cut.
16862
+ *
16863
+ * ONE QUIET INK for the run: who can see the folder takes the facts' tertiary
16864
+ * step rather than the access label's stronger word, so the line reads as one
16865
+ * calm caption beside the name, as a card's facts do.
16773
16866
  */
16774
16867
  .crewlet-folder-tile__facts {
16775
- display: flex;
16776
- flex-wrap: wrap;
16777
- align-items: center;
16778
- gap: 2px var(--spacing-3);
16868
+ display: block;
16779
16869
  min-width: 0;
16870
+ overflow-x: clip;
16780
16871
  color: var(--color-text-tertiary);
16781
16872
  font-size: var(--crewlet-folder-tile-facts);
16782
16873
  line-height: 1.35;
16783
16874
  }
16784
16875
 
16785
- .crewlet-folder-tile__visibility {
16786
- display: inline-flex;
16787
- flex: none;
16876
+ .crewlet-folder-tile__run {
16877
+ display: flex;
16878
+ flex-wrap: wrap;
16788
16879
  align-items: center;
16880
+ row-gap: 2px;
16881
+ min-width: 0;
16882
+ margin-inline-start: calc(-1 * var(--crewlet-folder-tile-separator));
16789
16883
  }
16790
16884
 
16791
- .crewlet-folder-tile__contents {
16885
+ .crewlet-folder-tile__fact {
16886
+ position: relative;
16887
+ display: block;
16792
16888
  min-width: 0;
16889
+ max-width: 100%;
16890
+ padding-inline-start: var(--crewlet-folder-tile-separator);
16793
16891
  overflow-wrap: anywhere;
16794
16892
  }
16795
16893
 
16894
+ .crewlet-folder-tile__fact::before {
16895
+ position: absolute;
16896
+ inset-inline-start: 0;
16897
+ width: var(--crewlet-folder-tile-separator);
16898
+ text-align: center;
16899
+ }
16900
+
16901
+ .crewlet-folder-tile__fact::before,
16902
+ .crewlet-folder-tile__count-dot::before {
16903
+ content: '·';
16904
+ content: '·' / '';
16905
+ }
16906
+
16907
+ /*
16908
+ * INSIDE THE COUNT the same dot in the same width, carried at the end of the
16909
+ * part before it. Each part is one piece on the line, so "3 artifacts · 3
16910
+ * folders" moves to its own line as one fact, a count too long even for that
16911
+ * breaks only after a dot, and a part wraps within itself only when it alone
16912
+ * is wider than the tile.
16913
+ */
16914
+ .crewlet-folder-tile__count-part {
16915
+ display: inline-block;
16916
+ max-width: 100%;
16917
+ }
16918
+
16919
+ .crewlet-folder-tile__count-dot {
16920
+ display: inline;
16921
+ padding-inline: calc((var(--crewlet-folder-tile-separator) - 0.3em) / 2);
16922
+ }
16923
+
16924
+ .crewlet-folder-tile__visibility {
16925
+ display: flex;
16926
+ align-items: center;
16927
+ }
16928
+
16929
+ .crewlet-folder-tile__visibility > .crewlet-artifact-access {
16930
+ color: inherit;
16931
+ }
16932
+
16933
+ /*
16934
+ * ON A ROW, WHO CAN SEE IT IS ITS GLYPH, as a gallery card's facts draw an
16935
+ * artifact's access: a phone's row has room for one line of facts, and "Only
16936
+ * you · Nothing you can open yet" beside a glyph and a menu broke onto a
16937
+ * second, leaving rows of two heights. The word is still there, hidden from
16938
+ * the eye only (the package's visually hidden recipe, switched by the shape),
16939
+ * so the tile's description keeps saying "Everyone", and the label's title
16940
+ * names it under the pointer.
16941
+ */
16942
+ .crewlet-folder-tile__visibility .crewlet-artifact-access__word {
16943
+ position: var(--crewlet-folder-tile-word-position);
16944
+ width: var(--crewlet-folder-tile-word-size);
16945
+ height: var(--crewlet-folder-tile-word-size);
16946
+ clip-path: var(--crewlet-folder-tile-word-clip);
16947
+ }
16948
+
16796
16949
  /*
16797
16950
  * THE TILE'S OWN CONTROLS, at its trailing edge and outside the link: hidden
16798
16951
  * until the tile is hovered or holds focus, so a gallery rests as names, and
@@ -16822,6 +16975,8 @@ button.crewlet-finding-list__row:focus-visible {
16822
16975
  }
16823
16976
 
16824
16977
  @media (prefers-reduced-motion: reduce) {
16978
+ .crewlet-card.crewlet-folder-tile.is-interactive,
16979
+ .crewlet-folder-tile__glyph,
16825
16980
  .crewlet-folder-tile__actions {
16826
16981
  transition: none;
16827
16982
  }
@@ -24718,6 +24873,125 @@ button.crewlet-presence-stack__member:focus-visible {
24718
24873
  }
24719
24874
 
24720
24875
 
24876
+ /* ReviewList-TIN6C2JN.css */
24877
+ /*
24878
+ * ReviewList: a setup's parts in one bordered box, a row each, before the
24879
+ * setup is finished (ReviewList.tsx).
24880
+ *
24881
+ * A ROW IS A GRID OF THREE COLUMNS: the glyph's tile, the part (its title and
24882
+ * state over its values), and the action. The values sit under the title, at
24883
+ * its start, and reach the row's end under the action, so a row of logos or
24884
+ * swatches has the whole width and the titles still run down one line.
24885
+ */
24886
+ .crewlet-review-list {
24887
+ container-type: inline-size;
24888
+ display: flex;
24889
+ flex-direction: column;
24890
+ min-width: 0;
24891
+ margin: 0;
24892
+ padding: 0;
24893
+ border: 1px solid var(--color-border-default);
24894
+ border-radius: var(--radius-lg);
24895
+ background-color: var(--color-surface-subtle);
24896
+ list-style: none;
24897
+ }
24898
+
24899
+ .crewlet-review-list__item {
24900
+ display: grid;
24901
+ grid-template-columns: auto minmax(0, 1fr) auto;
24902
+ grid-template-areas:
24903
+ 'icon head action'
24904
+ '. body body'
24905
+ '. error error';
24906
+ align-items: center;
24907
+ column-gap: var(--spacing-3);
24908
+ min-width: 0;
24909
+ padding: var(--spacing-4) var(--spacing-5);
24910
+ }
24911
+
24912
+ .crewlet-review-list__item + .crewlet-review-list__item {
24913
+ border-top: 1px solid var(--color-border-default);
24914
+ }
24915
+
24916
+ .crewlet-review-list__icon {
24917
+ grid-area: icon;
24918
+ }
24919
+
24920
+ .crewlet-review-list__head {
24921
+ display: flex;
24922
+ flex-wrap: wrap;
24923
+ align-items: center;
24924
+ gap: var(--spacing-1) var(--spacing-2);
24925
+ grid-area: head;
24926
+ min-width: 0;
24927
+ }
24928
+
24929
+ .crewlet-review-list__title {
24930
+ margin: 0;
24931
+ color: var(--color-text-primary);
24932
+ font-family: var(--font-family-sans);
24933
+ font-size: var(--font-size-sm);
24934
+ font-weight: var(--font-weight-semibold);
24935
+ line-height: var(--font-line-height-tight);
24936
+ }
24937
+
24938
+ .crewlet-review-list__action {
24939
+ display: flex;
24940
+ align-items: center;
24941
+ gap: var(--spacing-1);
24942
+ grid-area: action;
24943
+ }
24944
+
24945
+ .crewlet-review-list__body {
24946
+ grid-area: body;
24947
+ min-width: 0;
24948
+ margin-top: var(--spacing-3);
24949
+ color: var(--color-text-primary);
24950
+ font-size: var(--font-size-sm);
24951
+ line-height: var(--font-line-height-body);
24952
+ }
24953
+
24954
+ /* WHAT HOLDS THE FINISH, in the danger ink with its glyph, so it never rests on the hue alone. */
24955
+ .crewlet-review-list__error {
24956
+ display: flex;
24957
+ align-items: flex-start;
24958
+ gap: var(--spacing-1);
24959
+ grid-area: error;
24960
+ margin: var(--spacing-2) 0 0;
24961
+ color: var(--color-feedback-danger-ink);
24962
+ font-size: var(--font-size-xs);
24963
+ line-height: var(--font-line-height-normal);
24964
+ }
24965
+
24966
+ .crewlet-review-list__error > svg {
24967
+ flex: none;
24968
+ margin-top: 1px;
24969
+ }
24970
+
24971
+ /* WITHOUT A GLYPH the part starts at the row's start, with no empty column before it. */
24972
+ .crewlet-review-list__item--plain {
24973
+ grid-template-columns: minmax(0, 1fr) auto;
24974
+ grid-template-areas:
24975
+ 'head action'
24976
+ 'body body'
24977
+ 'error error';
24978
+ }
24979
+
24980
+ /* A NARROW LIST gives the values the whole row: an indent of a tile and a gap is a fifth of a phone. */
24981
+ @container (width < 28rem) {
24982
+ .crewlet-review-list__item {
24983
+ padding: var(--spacing-3) var(--spacing-4);
24984
+ }
24985
+
24986
+ .crewlet-review-list__item:not(.crewlet-review-list__item--plain) {
24987
+ grid-template-areas:
24988
+ 'icon head action'
24989
+ 'body body body'
24990
+ 'error error error';
24991
+ }
24992
+ }
24993
+
24994
+
24721
24995
  /* RichEditor-NPD2KAPS.css */
24722
24996
  /*
24723
24997
  * The rich editor (RichEditor.tsx).
@@ -26695,7 +26969,7 @@ svg.crewlet-select__chevron {
26695
26969
  }
26696
26970
 
26697
26971
 
26698
- /* SetupWizard-GZK5UDKC.css */
26972
+ /* SetupWizard-Z54H6RYW.css */
26699
26973
  /*
26700
26974
  * SetupWizard: a setup walked step by step on a page of its own
26701
26975
  * (SetupWizard.tsx).
@@ -26705,27 +26979,58 @@ svg.crewlet-select__chevron {
26705
26979
  * from 70rem of the wizard's own width, the aside (320px). Under 70rem the
26706
26980
  * aside takes the row under the content and the rail runs down beside both.
26707
26981
  * Under the phone breakpoint every part is one column, in reading order.
26982
+ *
26983
+ * THE TRACKS ARE THE MEASURE, NOT THE WINDOW. The content's track is at most
26984
+ * its column, so on a window wider than the parts the aside stands right
26985
+ * beside the content and the header and the footer end where the parts do.
26986
+ * A track of 1fr with the content held to 640px inside it left the preview
26987
+ * stranded at the window's far edge with a void between, and Continue a
26988
+ * window's width from the fields it continues. A wide step (`wide`) takes
26989
+ * the content and the aside's columns together, so its footer ends where
26990
+ * every other step's does.
26708
26991
  */
26709
26992
 
26710
26993
  .crewlet-setup-wizard {
26994
+ --crewlet-setup-wizard-rail: 240px;
26995
+ --crewlet-setup-wizard-column: 640px;
26996
+ --crewlet-setup-wizard-aside: 320px;
26997
+ --crewlet-setup-wizard-gap: var(--spacing-8);
26998
+ --crewlet-setup-wizard-wide: calc(
26999
+ var(--crewlet-setup-wizard-column) + var(--crewlet-setup-wizard-gap) + var(--crewlet-setup-wizard-aside)
27000
+ );
27001
+
26711
27002
  container-type: inline-size;
26712
27003
  min-width: 0;
26713
27004
  }
26714
27005
 
26715
27006
  .crewlet-setup-wizard__frame {
26716
27007
  display: grid;
26717
- grid-template-columns: 240px minmax(0, 1fr);
27008
+ grid-template-columns: var(--crewlet-setup-wizard-rail) minmax(0, var(--crewlet-setup-wizard-column));
26718
27009
  grid-template-areas:
26719
27010
  'head head'
26720
27011
  'rail content'
26721
27012
  'rail aside'
26722
27013
  'foot foot';
26723
27014
  grid-template-rows: auto auto 1fr auto;
26724
- column-gap: var(--spacing-8);
27015
+ column-gap: var(--crewlet-setup-wizard-gap);
26725
27016
  row-gap: var(--spacing-6);
26726
27017
  min-width: 0;
26727
27018
  }
26728
27019
 
27020
+ /* With no aside there is no row for one, and no second gap above the footer. */
27021
+ .crewlet-setup-wizard--no-aside .crewlet-setup-wizard__frame {
27022
+ grid-template-areas:
27023
+ 'head head'
27024
+ 'rail content'
27025
+ 'foot foot';
27026
+ grid-template-rows: auto 1fr auto;
27027
+ }
27028
+
27029
+ /* A WIDE STEP lays out columns of its own across the content's and the aside's columns together. */
27030
+ .crewlet-setup-wizard--wide .crewlet-setup-wizard__frame {
27031
+ grid-template-columns: var(--crewlet-setup-wizard-rail) minmax(0, var(--crewlet-setup-wizard-wide));
27032
+ }
27033
+
26729
27034
  .crewlet-setup-wizard__head {
26730
27035
  display: flex;
26731
27036
  flex-direction: column;
@@ -26757,7 +27062,6 @@ svg.crewlet-select__chevron {
26757
27062
  grid-area: content;
26758
27063
  box-sizing: border-box;
26759
27064
  width: 100%;
26760
- max-width: 640px;
26761
27065
  min-width: 0;
26762
27066
  }
26763
27067
 
@@ -26800,7 +27104,6 @@ svg.crewlet-select__chevron {
26800
27104
  gap: var(--spacing-4);
26801
27105
  grid-area: aside;
26802
27106
  box-sizing: border-box;
26803
- max-width: 640px;
26804
27107
  min-width: 0;
26805
27108
  padding-top: var(--spacing-6);
26806
27109
  border-top: 1px solid var(--color-border-default);
@@ -26810,6 +27113,14 @@ svg.crewlet-select__chevron {
26810
27113
  * THE FOOTER holds the step's actions at the bottom of the view while the
26811
27114
  * content scrolls under it, on the sheet's own ground with a hairline above,
26812
27115
  * and clears the device's safe area where it has one.
27116
+ *
27117
+ * IT ENDS THE SCREEN. Inside an `AppShell` the content column keeps room
27118
+ * under its last line (`--crewlet-app-shell-content-end`, 64px wide), and a
27119
+ * docked bar is that last line: the footer takes the room back, so at the end
27120
+ * of a scroll it rests on the scroller's bottom edge, where it stood while
27121
+ * scrolling, rather than rising 64px with a strip of empty sheet under it.
27122
+ * Outside a shell there is no room to take back and the margin is zero. The
27123
+ * wizard is the screen's last element for the same reason.
26813
27124
  */
26814
27125
  .crewlet-setup-wizard__footer {
26815
27126
  position: sticky;
@@ -26820,6 +27131,7 @@ svg.crewlet-select__chevron {
26820
27131
  align-items: center;
26821
27132
  gap: var(--spacing-2);
26822
27133
  grid-area: foot;
27134
+ margin-bottom: calc(-1 * var(--crewlet-app-shell-content-end, 0px));
26823
27135
  padding: var(--spacing-3) 0 calc(var(--spacing-3) + env(safe-area-inset-bottom, var(--spacing-0)));
26824
27136
  border-top: 1px solid var(--color-border-default);
26825
27137
  background: var(--color-surface-background);
@@ -26838,15 +27150,16 @@ svg.crewlet-select__chevron {
26838
27150
  margin-inline-start: auto;
26839
27151
  }
26840
27152
 
26841
- /* A WIDE STEP lays out columns of its own across the whole width beside the rail. */
26842
- .crewlet-setup-wizard--wide .crewlet-setup-wizard__content {
26843
- max-width: none;
26844
- }
26845
-
26846
- /* BESIDE THE CONTENT, from 70rem of the wizard's own width: the aside holds in view. */
27153
+ /*
27154
+ * BESIDE THE CONTENT, from 70rem of the wizard's own width: the aside holds in
27155
+ * view. Written at the specificity of the wide and no-aside rules above, and
27156
+ * after them, so the three shapes are decided by source order alone.
27157
+ */
26847
27158
  @container (min-width: 70rem) {
26848
- .crewlet-setup-wizard__frame {
26849
- grid-template-columns: 240px minmax(0, 1fr) 320px;
27159
+ .crewlet-setup-wizard .crewlet-setup-wizard__frame {
27160
+ grid-template-columns:
27161
+ var(--crewlet-setup-wizard-rail) minmax(0, var(--crewlet-setup-wizard-column))
27162
+ var(--crewlet-setup-wizard-aside);
26850
27163
  grid-template-areas:
26851
27164
  'head head head'
26852
27165
  'rail content aside'
@@ -26854,15 +27167,19 @@ svg.crewlet-select__chevron {
26854
27167
  grid-template-rows: auto 1fr auto;
26855
27168
  }
26856
27169
 
26857
- /* With no aside, nothing is held for one: the content takes its column too. */
27170
+ /* With no aside, nothing is held for one. */
26858
27171
  .crewlet-setup-wizard--no-aside .crewlet-setup-wizard__frame {
26859
- grid-template-columns: 240px minmax(0, 1fr);
27172
+ grid-template-columns: var(--crewlet-setup-wizard-rail) minmax(0, var(--crewlet-setup-wizard-column));
26860
27173
  grid-template-areas:
26861
27174
  'head head'
26862
27175
  'rail content'
26863
27176
  'foot foot';
26864
27177
  }
26865
27178
 
27179
+ .crewlet-setup-wizard--wide.crewlet-setup-wizard--no-aside .crewlet-setup-wizard__frame {
27180
+ grid-template-columns: var(--crewlet-setup-wizard-rail) minmax(0, var(--crewlet-setup-wizard-wide));
27181
+ }
27182
+
26866
27183
  .crewlet-setup-wizard__aside {
26867
27184
  position: sticky;
26868
27185
  top: var(--spacing-5);
@@ -26878,7 +27195,7 @@ svg.crewlet-select__chevron {
26878
27195
  * position line, and scrolls away with the page rather than covering it.
26879
27196
  */
26880
27197
  @media (width < 640px) {
26881
- .crewlet-setup-wizard__frame {
27198
+ .crewlet-setup-wizard .crewlet-setup-wizard__frame {
26882
27199
  grid-template-columns: minmax(0, 1fr);
26883
27200
  grid-template-areas:
26884
27201
  'head'
@@ -26890,6 +27207,14 @@ svg.crewlet-select__chevron {
26890
27207
  row-gap: var(--spacing-5);
26891
27208
  }
26892
27209
 
27210
+ .crewlet-setup-wizard--no-aside .crewlet-setup-wizard__frame {
27211
+ grid-template-areas:
27212
+ 'head'
27213
+ 'rail'
27214
+ 'content'
27215
+ 'foot';
27216
+ }
27217
+
26893
27218
  .crewlet-setup-wizard__rail {
26894
27219
  position: static;
26895
27220
  display: flex;
@@ -26906,6 +27231,26 @@ svg.crewlet-select__chevron {
26906
27231
  padding-top: 0;
26907
27232
  border-top: 0;
26908
27233
  }
27234
+
27235
+ /*
27236
+ * THE ACTIONS SHARE TWO ROWS: the way out and the step's other actions on
27237
+ * the first, the step's last action, its primary, the whole width on the
27238
+ * second, under the thumb. The two groups give their buttons to the
27239
+ * footer's own row, so three short buttons no longer take three lines of a
27240
+ * footer held over the content.
27241
+ */
27242
+ .crewlet-setup-wizard__footer-start,
27243
+ .crewlet-setup-wizard__footer-end {
27244
+ display: contents;
27245
+ }
27246
+
27247
+ .crewlet-setup-wizard__footer-end > :first-child {
27248
+ margin-inline-start: auto;
27249
+ }
27250
+
27251
+ .crewlet-setup-wizard__footer-end > :last-child {
27252
+ flex: 1 1 100%;
27253
+ }
26909
27254
  }
26910
27255
 
26911
27256
  .crewlet-setup-wizard__position {