@crewlethq/ui 0.48.2 → 0.49.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 (190) hide show
  1. package/README.md +60 -0
  2. package/dist/AgentHandoffPanel/index.js +4 -4
  3. package/dist/AppShell/index.js +4 -4
  4. package/dist/{AppShell-5P575KYA.css → AppShell-BIUFNT3J.css} +30 -11
  5. package/dist/ArrangeList/index.js +4 -4
  6. package/dist/ArtifactBar/index.js +9 -9
  7. package/dist/{ArtifactBar-6PGWGKN2.css → ArtifactBar-UMZCTARR.css} +9 -0
  8. package/dist/ArtifactCard/ArtifactCard.d.ts +30 -1
  9. package/dist/ArtifactCard/index.js +12 -5
  10. package/dist/{ArtifactCard-OGTMO2KI.css → ArtifactCard-SOB63NV5.css} +72 -1
  11. package/dist/ArtifactCover/index.js +2 -2
  12. package/dist/ArtifactIcon/index.js +2 -2
  13. package/dist/ArtifactKindGlyph/ArtifactKindGlyph.d.ts +7 -3
  14. package/dist/ArtifactKindGlyph/index.js +1 -1
  15. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +4 -3
  16. package/dist/ArtifactKindIllustration/index.js +1 -1
  17. package/dist/{ArtifactKinds-CVD3FCYO.css → ArtifactKinds-O3CALPVX.css} +1 -0
  18. package/dist/ArtifactMakeRow/index.js +2 -2
  19. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +14 -1
  20. package/dist/ArtifactNameCell/index.d.ts +1 -1
  21. package/dist/ArtifactNameCell/index.js +2 -2
  22. package/dist/{ArtifactNameCell-RTVP4LO4.css → ArtifactNameCell-3AHLUSE5.css} +12 -0
  23. package/dist/AvatarPicker/index.js +7 -7
  24. package/dist/BrandChip/BrandChip.d.ts +26 -0
  25. package/dist/BrandChip/index.d.ts +3 -0
  26. package/dist/BrandChip/index.js +2 -0
  27. package/dist/BrandChip-SQWBC2WU.css +81 -0
  28. package/dist/BrandSample/BrandSample.d.ts +75 -0
  29. package/dist/BrandSample/index.d.ts +3 -0
  30. package/dist/BrandSample/index.js +5 -0
  31. package/dist/BrandSample-G5V7GKR2.css +185 -0
  32. package/dist/BrandScope/BrandScope.d.ts +61 -0
  33. package/dist/BrandScope/index.d.ts +4 -0
  34. package/dist/BrandScope/index.js +4 -0
  35. package/dist/BrandScope-H2KZHGT7.css +29 -0
  36. package/dist/Canvas/index.js +2 -2
  37. package/dist/CanvasBoard/index.js +4 -4
  38. package/dist/CanvasToolbar/index.js +3 -3
  39. package/dist/Checkbox/Checkbox.d.ts +8 -0
  40. package/dist/Checkbox/index.js +3 -3
  41. package/dist/{Checkbox-ALWG3WV2.css → Checkbox-MB22OW6P.css} +18 -0
  42. package/dist/ColorField/ColorField.d.ts +63 -0
  43. package/dist/ColorField/index.d.ts +3 -0
  44. package/dist/ColorField/index.js +11 -0
  45. package/dist/ColorField-2OIOWT3Z.css +68 -0
  46. package/dist/ColorSwatch/ColorSwatch.d.ts +43 -0
  47. package/dist/ColorSwatch/index.d.ts +3 -0
  48. package/dist/ColorSwatch/index.js +9 -0
  49. package/dist/ColorSwatch-DNMUFHNS.css +83 -0
  50. package/dist/Combobox/Combobox.d.ts +45 -4
  51. package/dist/Combobox/index.d.ts +1 -1
  52. package/dist/Combobox/index.js +3 -3
  53. package/dist/Combobox-GBCWXWEB.css +163 -0
  54. package/dist/CommandPalette/index.js +5 -5
  55. package/dist/CommentThread/index.js +5 -5
  56. package/dist/Composer/index.js +3 -3
  57. package/dist/ConfirmField/index.js +3 -3
  58. package/dist/ContrastBadge/ContrastBadge.d.ts +63 -0
  59. package/dist/ContrastBadge/index.d.ts +3 -0
  60. package/dist/ContrastBadge/index.js +6 -0
  61. package/dist/ContrastBadge-CBZPGG3G.css +47 -0
  62. package/dist/DataGrid/DataGrid.d.ts +28 -1
  63. package/dist/DataGrid/index.js +8 -1
  64. package/dist/{DataGrid-AQKPJD7W.css → DataGrid-VNGQESJA.css} +15 -0
  65. package/dist/DataTable/index.js +6 -6
  66. package/dist/DataView/index.js +10 -10
  67. package/dist/DateTimePicker/index.js +3 -3
  68. package/dist/DocTabsEditor/index.js +4 -4
  69. package/dist/{Editor-6U4BJ25W.js → Editor-MLGK3KOG.js} +3 -3
  70. package/dist/FolderTile/FolderTile.d.ts +91 -0
  71. package/dist/FolderTile/index.d.ts +3 -0
  72. package/dist/FolderTile/index.js +7 -0
  73. package/dist/FolderTile-FDT5Y63Z.css +231 -0
  74. package/dist/HuePicker/index.js +6 -6
  75. package/dist/Input/index.js +2 -2
  76. package/dist/LinkInterstitial/index.js +3 -3
  77. package/dist/ListInput/index.js +3 -3
  78. package/dist/LogoSlot/LogoSlot.d.ts +84 -0
  79. package/dist/LogoSlot/index.d.ts +3 -0
  80. package/dist/LogoSlot/index.js +9 -0
  81. package/dist/LogoSlot-T2UFOJXU.css +159 -0
  82. package/dist/MarkdownEditor/index.js +6 -6
  83. package/dist/Menu/index.js +2 -2
  84. package/dist/MergeConflicts/index.js +6 -6
  85. package/dist/Modal/Modal.d.ts +13 -0
  86. package/dist/Modal/index.js +2 -2
  87. package/dist/{Modal-TOEWHDCQ.css → Modal-3HMP7WAZ.css} +30 -0
  88. package/dist/OrgTable/index.js +1 -1
  89. package/dist/PresenterView/index.js +3 -3
  90. package/dist/PrincipalPicker/index.js +4 -4
  91. package/dist/RichEditor/index.js +1 -1
  92. package/dist/SegmentedControl/index.js +5 -5
  93. package/dist/Select/index.js +2 -2
  94. package/dist/SelectionBar/SelectionBar.d.ts +50 -0
  95. package/dist/SelectionBar/index.d.ts +3 -0
  96. package/dist/SelectionBar/index.js +9 -0
  97. package/dist/SelectionBar-XPWKUOSC.css +61 -0
  98. package/dist/ShareDialog/index.js +6 -6
  99. package/dist/SheetColumnEditor/index.js +10 -10
  100. package/dist/SheetGrid/index.js +4 -4
  101. package/dist/SlideFilmstrip/index.js +3 -3
  102. package/dist/Switcher/index.js +4 -4
  103. package/dist/Tabs/index.js +4 -4
  104. package/dist/TagsInput/index.js +2 -2
  105. package/dist/ThemeGallery/ThemeGallery.d.ts +13 -2
  106. package/dist/ThemeGallery/index.js +3 -1
  107. package/dist/{ThemeGallery-X35Y25EX.css → ThemeGallery-UEFZRT6W.css} +21 -0
  108. package/dist/ThemeSwitcher/index.js +6 -6
  109. package/dist/TimeWindowPicker/index.js +6 -6
  110. package/dist/TreeCanvas/index.js +3 -3
  111. package/dist/TreeGrid/index.js +1 -1
  112. package/dist/TypeSpecimen/TypeSpecimen.d.ts +49 -0
  113. package/dist/TypeSpecimen/index.d.ts +3 -0
  114. package/dist/TypeSpecimen/index.js +3 -0
  115. package/dist/TypeSpecimen-WK6YNHL7.css +96 -0
  116. package/dist/VersionCompare/index.js +6 -6
  117. package/dist/{chunk-RBUA7ZNK.js → chunk-34RMTXDZ.js} +1 -1
  118. package/dist/{chunk-YFUG6ARA.js → chunk-3QSKDZR5.js} +1 -1
  119. package/dist/chunk-5SGHW42B.js +23 -0
  120. package/dist/{chunk-R2EOET5Q.js → chunk-627KFRON.js} +2 -2
  121. package/dist/{chunk-SMVWDO72.js → chunk-6FVGSWLS.js} +1 -1
  122. package/dist/{chunk-ILDNJHRU.js → chunk-AVL52EME.js} +1 -1
  123. package/dist/chunk-B235ANDO.js +66 -0
  124. package/dist/{chunk-MZ3QFQDL.js → chunk-CAVWDJF4.js} +1 -1
  125. package/dist/{chunk-BLQRC7QR.js → chunk-D6MTBXAJ.js} +2 -2
  126. package/dist/{chunk-2MYSESZF.js → chunk-FB5CFQTG.js} +82 -12
  127. package/dist/{chunk-KNMQS3JY.js → chunk-GHY63X4C.js} +1 -1
  128. package/dist/{chunk-DY4DQ7EB.js → chunk-GP4YWZFO.js} +1 -1
  129. package/dist/{chunk-NRWJUGNA.js → chunk-H55D66IK.js} +1 -1
  130. package/dist/{chunk-JNFTFAPN.js → chunk-H7NMJ5AI.js} +2 -2
  131. package/dist/{chunk-GKRPPSWY.js → chunk-ILFEWRLG.js} +1 -1
  132. package/dist/chunk-ITI2Z44C.js +139 -0
  133. package/dist/{chunk-P5VGSVWG.js → chunk-J24Q4HTD.js} +17 -8
  134. package/dist/{chunk-2FDTSARB.js → chunk-JFDIMO3A.js} +2 -2
  135. package/dist/chunk-JKAFEFFC.js +44 -0
  136. package/dist/{chunk-6HYPQ5PY.js → chunk-JWNYI7UD.js} +1 -1
  137. package/dist/{chunk-WT5UPL6P.js → chunk-KHZYAEGZ.js} +1 -1
  138. package/dist/chunk-M4QM477B.js +80 -0
  139. package/dist/{chunk-YUDUYMZB.js → chunk-MIEBOO7Y.js} +2 -2
  140. package/dist/{chunk-IVA7ZWDS.js → chunk-NAWUXCBC.js} +5 -5
  141. package/dist/{chunk-YUAQSWNW.js → chunk-NCHKKYPQ.js} +6 -3
  142. package/dist/chunk-OCRVY42T.js +50 -0
  143. package/dist/chunk-OEEYL2CM.js +73 -0
  144. package/dist/chunk-P3OIM6OC.js +38 -0
  145. package/dist/{chunk-FWBKMPNR.js → chunk-P3QWT5VR.js} +1 -1
  146. package/dist/chunk-P5JBDHWC.js +206 -0
  147. package/dist/{chunk-WQJSOTEO.js → chunk-PGR2PKH6.js} +1 -1
  148. package/dist/{chunk-U2XAJONO.js → chunk-Q44X36QC.js} +80 -36
  149. package/dist/{chunk-R2IBCEU6.js → chunk-R3BA3C4Y.js} +2 -2
  150. package/dist/{chunk-HDMLHJFI.js → chunk-R6R2UHVG.js} +4 -4
  151. package/dist/{chunk-VBEMIZIJ.js → chunk-RFPCHMSX.js} +1 -1
  152. package/dist/{chunk-CE2THTQR.js → chunk-RSKW25Y5.js} +4 -3
  153. package/dist/{chunk-UBZDYOCA.js → chunk-RV6XB5UV.js} +12 -1
  154. package/dist/{chunk-LXCRHVMZ.js → chunk-SEPSXOGJ.js} +1 -1
  155. package/dist/{chunk-K2FNW3MK.js → chunk-SQ4JFHO7.js} +1 -1
  156. package/dist/{chunk-F45VSK2M.js → chunk-SS4XCUUJ.js} +2 -2
  157. package/dist/{chunk-E4BOVKNJ.js → chunk-UTESMBPL.js} +5 -3
  158. package/dist/chunk-UZMNR366.js +9 -0
  159. package/dist/{chunk-GQXVLFQB.js → chunk-V7GOOXPK.js} +1 -1
  160. package/dist/{chunk-KMNY3KEB.js → chunk-VBIM6HFC.js} +2 -2
  161. package/dist/{chunk-Z5RZXVQ7.js → chunk-VN47PYUF.js} +7 -7
  162. package/dist/{chunk-CNTBUK24.js → chunk-VP2ODUCC.js} +2 -2
  163. package/dist/{chunk-VIAQW6RK.js → chunk-VTSJMDGP.js} +5 -5
  164. package/dist/chunk-W6FOEBIL.js +119 -0
  165. package/dist/chunk-WLSEAIVC.js +48 -0
  166. package/dist/{chunk-DETVVKAH.js → chunk-WQ7S7CKZ.js} +3 -3
  167. package/dist/{chunk-OKUULQ22.js → chunk-WXOYHVWG.js} +2 -2
  168. package/dist/{chunk-NILOJV62.js → chunk-X4NIE7CI.js} +1 -1
  169. package/dist/{chunk-PZZHO6OS.js → chunk-XS2FJVMT.js} +1 -1
  170. package/dist/{chunk-6AKG2VLR.js → chunk-YCC2S7DF.js} +4 -1
  171. package/dist/{chunk-5CLWBPB5.js → chunk-ZCIL5IHU.js} +1 -1
  172. package/dist/chunk-ZH77BXMA.js +14 -0
  173. package/dist/generated/index.d.ts +10 -0
  174. package/dist/generated/index.js +101 -89
  175. package/dist/index.js +101 -89
  176. package/dist/styles.css +1370 -22
  177. package/dist/utils/fontFamily.d.ts +29 -0
  178. package/dist/utils/hexColour.d.ts +12 -0
  179. package/package.json +3 -3
  180. package/scripts/check-css-variables.mjs +18 -2
  181. package/dist/Combobox-YDONYDTM.css +0 -81
  182. package/dist/chunk-LOBV4QON.js +0 -137
  183. package/dist/{chunk-245IXG5P.js → chunk-3WMOEGEL.js} +0 -0
  184. package/dist/{chunk-ICPQIAD6.js → chunk-D7Q5MQRF.js} +1 -1
  185. package/dist/{chunk-ISDEXIXH.js → chunk-E6HXFFWO.js} +1 -1
  186. package/dist/{chunk-D4EOPIFL.js → chunk-EXRRTKWT.js} +1 -1
  187. package/dist/{chunk-S6J3EWDP.js → chunk-SXBJMBSV.js} +1 -1
  188. package/dist/{chunk-3JIZ2A6K.js → chunk-TMM32U7D.js} +1 -1
  189. package/dist/{chunk-LD3GEVQU.js → chunk-XQZ6EWOE.js} +1 -1
  190. package/dist/{chunk-K77LKW3X.js → chunk-ZFM5L7M4.js} +2 -2
package/dist/styles.css CHANGED
@@ -702,7 +702,7 @@
702
702
  }
703
703
 
704
704
 
705
- /* AppShell-5P575KYA.css */
705
+ /* AppShell-BIUFNT3J.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.
@@ -1511,14 +1511,21 @@
1511
1511
  * half the foot's gap, to meet the row above (HitArea.css).
1512
1512
  *
1513
1513
  * IT IS THE ONE TALL ROW IN THE FOOT. Who is signed in is the row a reader
1514
- * looks for, so it stands on the large control step (`--size-control-lg`,
1515
- * 44px) around a medium badge (`size="md"`, 32px), where the rows above it
1516
- * keep the compact step. The badge stands in a column of its own width
1517
- * (`--crewlet-account-row-badge`), centred in it, so a smaller badge a caller
1518
- * hands the row lands where a medium one would, and the column is inset from
1519
- * the row's edge by the 6px the badge has above and below it in the 44px row.
1520
- * A 32px badge cannot stand on the nav's 14px glyph column: centred there, its
1521
- * ring (1.5px, 2px out) would cross the row's own edge.
1514
+ * looks for, so it stands half a spacing step under the large control step
1515
+ * (`--crewlet-account-row-height`, 42px) around a medium badge (`size="md"`,
1516
+ * 32px), where the rows above it keep the compact step. At 44px it read as
1517
+ * cramped against the foot's edges, so it gives up the half step and the
1518
+ * space around it grows instead (`--crewlet-account-row-pad`, one step above
1519
+ * and below, where it was none): the row is slimmer and the foot breathes
1520
+ * more. It goes no lower than 42px because the badge's ring (1.5px, 2px out)
1521
+ * takes 39px of it, and 42 keeps the ring 1.5px clear of the row's hover fill
1522
+ * where 40 would leave half a pixel, which reads as the ring touching it. The
1523
+ * badge stands in a column of its own width (`--crewlet-account-row-badge`),
1524
+ * centred in it, so a smaller badge a caller hands the row lands where a
1525
+ * medium one would, and the column is inset 6px from the row's start, so the
1526
+ * badge's ring clears the row's edge on that side too. A 32px badge cannot
1527
+ * stand on the nav's 14px glyph column: centred there, its ring (1.5px, 2px
1528
+ * out) would cross the row's own edge.
1522
1529
  *
1523
1530
  * The name takes the body's size (`--font-size-compact`, the nav's words) and
1524
1531
  * both lines take the body's leading, a step a 36px row had no room for.
@@ -1533,9 +1540,17 @@
1533
1540
  * after the name is the half step, and the controls beside the link
1534
1541
  * (Settings, Preferences) are half a step apart and half a step off it.
1535
1542
  * Outside a rail's foot the row keeps its chevron.
1543
+ *
1544
+ * THE CONTROLS STAND AS TALL AS THE ROW. Beside a 42px row, the small step's
1545
+ * 26px squares floated in the middle of it as two smaller boxes, and their
1546
+ * hover fill ended short of the row's on both sides. They take the row's
1547
+ * height (`--crewlet-account-row-height`) and keep the small step's width and
1548
+ * glyph, so the fill lines up with the row's top and bottom and the words
1549
+ * keep every pixel of their column.
1536
1550
  */
1537
1551
  .crewlet-app-shell__rail-foot .crewlet-account-row {
1538
- --crewlet-account-row-pad: var(--spacing-0);
1552
+ --crewlet-account-row-pad: var(--spacing-1);
1553
+ --crewlet-account-row-height: calc(var(--size-control-lg) - var(--spacing-1) / 2);
1539
1554
  --crewlet-account-row-badge: 32px;
1540
1555
  gap: calc(var(--spacing-1) / 2);
1541
1556
  }
@@ -1543,8 +1558,8 @@
1543
1558
  .crewlet-app-shell__rail-foot .crewlet-account-row__who {
1544
1559
  --crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
1545
1560
  gap: 0;
1546
- min-height: var(--size-control-lg);
1547
- padding-block: var(--spacing-1);
1561
+ min-height: var(--crewlet-account-row-height);
1562
+ padding-block: calc(var(--spacing-1) / 2);
1548
1563
  padding-inline: calc(var(--spacing-1) + var(--spacing-1) / 2) calc(var(--spacing-1) / 2);
1549
1564
  }
1550
1565
 
@@ -1570,6 +1585,10 @@
1570
1585
  gap: calc(var(--spacing-1) / 2);
1571
1586
  }
1572
1587
 
1588
+ .crewlet-app-shell__rail-foot .crewlet-account-row__actions .crewlet-icon-btn {
1589
+ height: var(--crewlet-account-row-height);
1590
+ }
1591
+
1573
1592
  /* The row as the reader's menu button: a button drawn as the link is. */
1574
1593
  button.crewlet-account-row__who {
1575
1594
  width: 100%;
@@ -2455,7 +2474,7 @@ button.crewlet-account-row__who:focus-visible {
2455
2474
  }
2456
2475
 
2457
2476
 
2458
- /* ArtifactBar-6PGWGKN2.css */
2477
+ /* ArtifactBar-UMZCTARR.css */
2459
2478
  /*
2460
2479
  * One row, one hairline under it, the height of a large row. The lead (the
2461
2480
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2562,6 +2581,15 @@ button.crewlet-account-row__who:focus-visible {
2562
2581
  overflow: visible;
2563
2582
  }
2564
2583
 
2584
+ /* A read-only title's words: the block that takes the ellipsis, which the
2585
+ flex heading around it cannot. */
2586
+ .crewlet-artifact-bar__text {
2587
+ min-width: 0;
2588
+ overflow: hidden;
2589
+ text-overflow: ellipsis;
2590
+ white-space: nowrap;
2591
+ }
2592
+
2565
2593
  .crewlet-artifact-bar__rename {
2566
2594
  min-width: 0;
2567
2595
  max-width: 100%;
@@ -2885,7 +2913,7 @@ button.crewlet-account-row__who:focus-visible {
2885
2913
  }
2886
2914
 
2887
2915
 
2888
- /* ArtifactCard-OGTMO2KI.css */
2916
+ /* ArtifactCard-SOB63NV5.css */
2889
2917
  /*
2890
2918
  * A card in a gallery: the preview on top at a fixed ratio, so a grid of them
2891
2919
  * lines up whatever each preview is, the kind's badge over its foot, then the
@@ -3160,9 +3188,80 @@ button.crewlet-account-row__who:focus-visible {
3160
3188
  }
3161
3189
  }
3162
3190
 
3191
+ /*
3192
+ * PICKED, as every chosen option in the package is drawn: the selected edge
3193
+ * over the selected fill, laid as an image over the card's own ground so the
3194
+ * card keeps it. Never the accent, which is the focus ring's hue.
3195
+ */
3196
+ .crewlet-artifact-card--card.is-selected {
3197
+ border-color: var(--color-border-selected);
3198
+ background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
3199
+ }
3200
+
3201
+ /*
3202
+ * THE SELECTION BOX STANDS ON THE PREVIEW'S FOOT, opposite the kind's badge
3203
+ * and drawn as its twin: half over the picture and half over the card, on a
3204
+ * raised square in the badge's own size, hairline and shadow. A cover's own
3205
+ * title starts at its top corner, and a box over that corner hid its first
3206
+ * words; the foot's far corner is where a cover has the least to say.
3207
+ *
3208
+ * Its anchor has the preview's shape (the card's width at 16:9) and takes no
3209
+ * pointer, so the box is placed against the preview's foot at any width
3210
+ * without being nested in the link the preview belongs to. Hidden until the
3211
+ * card is hovered or holds focus, and always there once the card is picked,
3212
+ * while the gallery is choosing, and on a screen with no hover.
3213
+ */
3214
+ .crewlet-artifact-card__select-anchor {
3215
+ position: absolute;
3216
+ inset: 0 0 auto 0;
3217
+ aspect-ratio: 16 / 9;
3218
+ pointer-events: none;
3219
+ }
3220
+
3221
+ .crewlet-artifact-card__select {
3222
+ position: absolute;
3223
+ right: var(--spacing-4);
3224
+ bottom: 0;
3225
+ display: inline-flex;
3226
+ align-items: center;
3227
+ justify-content: center;
3228
+ width: 32px;
3229
+ height: 32px;
3230
+ box-sizing: border-box;
3231
+ border: 1px solid var(--color-border-default);
3232
+ border-radius: var(--radius-md);
3233
+ background: var(--color-surface-background);
3234
+ box-shadow: var(--shadow-sm);
3235
+ transform: translateY(50%);
3236
+ pointer-events: auto;
3237
+ opacity: 0;
3238
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-out);
3239
+ }
3240
+
3241
+ .crewlet-artifact-card--card:hover .crewlet-artifact-card__select,
3242
+ .crewlet-artifact-card--card:focus-within .crewlet-artifact-card__select,
3243
+ .crewlet-artifact-card--card.is-selected .crewlet-artifact-card__select,
3244
+ .crewlet-artifact-card--selecting .crewlet-artifact-card__select {
3245
+ opacity: 1;
3246
+ }
3247
+
3248
+ @media (hover: none) {
3249
+ .crewlet-artifact-card__select {
3250
+ opacity: 1;
3251
+ }
3252
+ }
3253
+
3254
+ /* WHILE CHOOSING, THE BODY PICKS: the pointer says so, and a Shift-press
3255
+ for a range selects no text on the way. */
3256
+ .crewlet-artifact-card--selecting .crewlet-artifact-card__link {
3257
+ cursor: pointer;
3258
+ user-select: none;
3259
+ }
3260
+
3163
3261
  @media (prefers-reduced-motion: reduce) {
3164
3262
  .crewlet-artifact-card--card,
3165
- .crewlet-artifact-card__actions {
3263
+ .crewlet-artifact-card__actions,
3264
+ .crewlet-artifact-card__select {
3166
3265
  transition: none;
3167
3266
  }
3168
3267
  }
@@ -3502,7 +3601,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3502
3601
  }
3503
3602
 
3504
3603
 
3505
- /* ArtifactKinds-CVD3FCYO.css */
3604
+ /* ArtifactKinds-O3CALPVX.css */
3506
3605
  /*
3507
3606
  * A kind's colours, set once per kind on `--crewlet-kind-*` by its class
3508
3607
  * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps and the ink a
@@ -3517,6 +3616,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3517
3616
  .crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); }
3518
3617
  .crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); }
3519
3618
  .crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); }
3619
+ .crewlet-kind--brand { --crewlet-kind-hue: var(--color-artifact-kind-brand); --crewlet-kind-fill: var(--color-artifact-kind-brand-fill); --crewlet-kind-line: var(--color-artifact-kind-brand-line); --crewlet-kind-ink: var(--color-artifact-kind-brand-ink); }
3520
3620
  .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
3521
3621
 
3522
3622
 
@@ -3733,7 +3833,7 @@ a.crewlet-make-row__item:active {
3733
3833
  }
3734
3834
 
3735
3835
 
3736
- /* ArtifactNameCell-RTVP4LO4.css */
3836
+ /* ArtifactNameCell-3AHLUSE5.css */
3737
3837
  /*
3738
3838
  * An artifact's name in a list: the kind's mark on its tint, the title over
3739
3839
  * one quiet line. Every colour is a token: the mark reads the kind's own Fill,
@@ -3773,6 +3873,18 @@ a.crewlet-make-row__item:active {
3773
3873
  box-shadow: inset 0 0 0 1px var(--crewlet-kind-hue);
3774
3874
  }
3775
3875
 
3876
+ /* A FOLDER'S MARK IS NEUTRAL: a folder is not a kind, so it takes the inset
3877
+ ground and the plain hairline, and its hover takes the hover hairline. */
3878
+ .crewlet-artifact-name__mark--folder {
3879
+ background: var(--color-surface-inset);
3880
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
3881
+ color: var(--color-text-secondary);
3882
+ }
3883
+
3884
+ :is(tr, [role='row']):hover .crewlet-artifact-name__mark--folder {
3885
+ box-shadow: inset 0 0 0 1px var(--color-border-hover);
3886
+ }
3887
+
3776
3888
  .crewlet-artifact-name--trashed .crewlet-artifact-name__mark {
3777
3889
  background: var(--color-surface-inset);
3778
3890
  box-shadow: inset 0 0 0 1px var(--color-border-default);
@@ -4598,6 +4710,90 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
4598
4710
  }
4599
4711
 
4600
4712
 
4713
+ /* BrandChip-SQWBC2WU.css */
4714
+ /*
4715
+ * The company's brand as a small link: the mark, the name, a chevron. A quiet
4716
+ * chip at a small control's height, inside the default hairline, that steps
4717
+ * its hairline up under the pointer and moves nothing.
4718
+ */
4719
+ .crewlet-brand-chip {
4720
+ display: inline-flex;
4721
+ align-items: center;
4722
+ gap: var(--spacing-2);
4723
+ min-width: 0;
4724
+ max-width: 100%;
4725
+ min-height: var(--size-control-sm);
4726
+ box-sizing: border-box;
4727
+ padding: 2px var(--spacing-2) 2px 2px;
4728
+ border: 1px solid var(--color-border-default);
4729
+ border-radius: var(--radius-pill);
4730
+ background: var(--color-surface-subtle);
4731
+ color: var(--color-text-secondary);
4732
+ font-size: var(--font-size-compact);
4733
+ font-weight: var(--font-weight-medium);
4734
+ text-decoration: none;
4735
+ transition:
4736
+ border-color var(--motion-duration-fast) var(--motion-easing-out),
4737
+ color var(--motion-duration-fast) var(--motion-easing-out);
4738
+ }
4739
+
4740
+ .crewlet-brand-chip:hover {
4741
+ border-color: var(--color-border-hover);
4742
+ color: var(--color-text-primary);
4743
+ text-decoration: none;
4744
+ }
4745
+
4746
+ .crewlet-brand-chip:focus-visible {
4747
+ outline: 2px solid var(--color-focus);
4748
+ outline-offset: var(--size-focus-ring-inset-offset);
4749
+ }
4750
+
4751
+ /* THE MARK ON ITS OWN PLATE, so a mark drawn for a light ground still reads
4752
+ on a dark theme: the brand's square logo at the chip's inner height. */
4753
+ .crewlet-brand-chip__mark {
4754
+ display: inline-flex;
4755
+ flex: none;
4756
+ align-items: center;
4757
+ justify-content: center;
4758
+ width: calc(var(--size-control-sm) - 6px);
4759
+ height: calc(var(--size-control-sm) - 6px);
4760
+ overflow: hidden;
4761
+ border-radius: var(--radius-circle);
4762
+ background: var(--color-surface-inset);
4763
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
4764
+ }
4765
+
4766
+ .crewlet-brand-chip__mark--glyph {
4767
+ color: var(--color-text-tertiary);
4768
+ }
4769
+
4770
+ .crewlet-brand-chip__image {
4771
+ display: block;
4772
+ width: 100%;
4773
+ height: 100%;
4774
+ object-fit: contain;
4775
+ }
4776
+
4777
+ .crewlet-brand-chip__label {
4778
+ min-width: 0;
4779
+ overflow: hidden;
4780
+ text-overflow: ellipsis;
4781
+ white-space: nowrap;
4782
+ }
4783
+
4784
+ .crewlet-brand-chip__chevron {
4785
+ display: inline-flex;
4786
+ flex: none;
4787
+ color: var(--color-text-tertiary);
4788
+ }
4789
+
4790
+ @media (prefers-reduced-motion: reduce) {
4791
+ .crewlet-brand-chip {
4792
+ transition: none;
4793
+ }
4794
+ }
4795
+
4796
+
4601
4797
  /* BrandLockup-JKGXFCZF.css */
4602
4798
  /*
4603
4799
  * The brand lockup at the head of the rail.
@@ -4715,6 +4911,226 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
4715
4911
  }
4716
4912
 
4717
4913
 
4914
+ /* BrandSample-G5V7GKR2.css */
4915
+ /*
4916
+ * A company's brand, drawn: a doc's opening or a title slide, in a 16:9 frame
4917
+ * that sets every length against its own width, so one drawing reads at a
4918
+ * gallery cover's size and at a preview's.
4919
+ *
4920
+ * It paints with the public tokens, which the sample's BrandScope (pinned to
4921
+ * the sample's mode) sets from the brand through the artifact kit's own
4922
+ * mapping: the ground, the text, the accent, the highlight and the two faces,
4923
+ * and the quiet line in the tertiary text of the sample's pinned mode.
4924
+ */
4925
+ .crewlet-brand-sample {
4926
+ /* The frame's corner. A host drawing the sample edge to edge in a cover
4927
+ that clips its own corners sets it to its own. */
4928
+ --crewlet-brand-sample-radius: var(--radius-lg);
4929
+
4930
+ /* THE SAMPLE IS ITS OWN CONTAINER, so `cqi` inside it is its own width. */
4931
+ container-type: inline-size;
4932
+ position: relative;
4933
+ display: block;
4934
+ width: 100%;
4935
+ aspect-ratio: 16 / 9;
4936
+ overflow: hidden;
4937
+ border-radius: var(--crewlet-brand-sample-radius);
4938
+ background: var(--color-surface-background);
4939
+ /* AN EDGE OF ITS OWN, inside the frame, so a ground that matches the page
4940
+ is still a frame. */
4941
+ box-shadow: inset 0 0 0 1px var(--color-border-hover);
4942
+ color: var(--color-text-primary);
4943
+ font-family: var(--font-family-sans);
4944
+ line-height: var(--font-line-height-snug);
4945
+ user-select: none;
4946
+ }
4947
+
4948
+ .crewlet-brand-sample__page,
4949
+ .crewlet-brand-sample__slide {
4950
+ position: absolute;
4951
+ inset: 0;
4952
+ display: flex;
4953
+ flex-direction: column;
4954
+ box-sizing: border-box;
4955
+ min-width: 0;
4956
+ }
4957
+
4958
+ /* ---- the doc's opening ---- */
4959
+
4960
+ .crewlet-brand-sample__page {
4961
+ align-items: flex-start;
4962
+ gap: 2.4cqi;
4963
+ padding: 6cqi 7cqi;
4964
+ }
4965
+
4966
+ .crewlet-brand-sample__brand {
4967
+ display: flex;
4968
+ align-items: center;
4969
+ height: 6cqi;
4970
+ max-width: 40%;
4971
+ margin-bottom: 1.6cqi;
4972
+ }
4973
+
4974
+ .crewlet-brand-sample__logo {
4975
+ display: block;
4976
+ max-width: 100%;
4977
+ max-height: 100%;
4978
+ object-fit: contain;
4979
+ }
4980
+
4981
+ /* WHERE THERE IS NO LOGO, the company's name in the heading face. */
4982
+ .crewlet-brand-sample__wordmark {
4983
+ overflow: hidden;
4984
+ font-family: var(--font-family-display);
4985
+ font-size: 3.4cqi;
4986
+ font-weight: var(--font-weight-semibold);
4987
+ text-overflow: ellipsis;
4988
+ white-space: nowrap;
4989
+ }
4990
+
4991
+ .crewlet-brand-sample__heading {
4992
+ max-width: 100%;
4993
+ overflow: hidden;
4994
+ font-family: var(--font-family-display);
4995
+ font-size: 6cqi;
4996
+ font-weight: var(--font-weight-semibold);
4997
+ letter-spacing: var(--font-letter-spacing-tight);
4998
+ line-height: 1.1;
4999
+ text-overflow: ellipsis;
5000
+ white-space: nowrap;
5001
+ }
5002
+
5003
+ /* THE ACCENT RULE under the heading, in the brand's main colour for the mode. */
5004
+ .crewlet-brand-sample__rule {
5005
+ display: block;
5006
+ width: 12cqi;
5007
+ height: 0.8cqi;
5008
+ border-radius: var(--radius-pill);
5009
+ background: var(--color-brand-accent);
5010
+ }
5011
+
5012
+ .crewlet-brand-sample__body {
5013
+ max-width: 82%;
5014
+ font-size: 2.8cqi;
5015
+ line-height: var(--font-line-height-normal);
5016
+ }
5017
+
5018
+ /* A LINK, DRAWN: the accent ink and its underline, and nothing to follow. */
5019
+ .crewlet-brand-sample__link {
5020
+ color: var(--color-brand-accent);
5021
+ text-decoration: underline;
5022
+ text-decoration-thickness: 0.2cqi;
5023
+ text-underline-offset: 0.5cqi;
5024
+ }
5025
+
5026
+ .crewlet-brand-sample__byline {
5027
+ margin-top: auto;
5028
+ color: var(--color-text-tertiary);
5029
+ font-size: 2.2cqi;
5030
+ }
5031
+
5032
+ /* ---- the title slide ---- */
5033
+
5034
+ .crewlet-brand-sample__slide {
5035
+ justify-content: flex-end;
5036
+ gap: 2.4cqi;
5037
+ padding: 6.5cqi 7cqi;
5038
+ }
5039
+
5040
+ /* The mark in the slide's top corner, square, at the slide's own scale. */
5041
+ .crewlet-brand-sample__slide .crewlet-brand-sample__brand {
5042
+ position: absolute;
5043
+ top: 6.5cqi;
5044
+ left: 7cqi;
5045
+ height: 7cqi;
5046
+ max-width: 30%;
5047
+ margin: 0;
5048
+ }
5049
+
5050
+ .crewlet-brand-sample__logo--mark {
5051
+ width: 7cqi;
5052
+ height: 7cqi;
5053
+ }
5054
+
5055
+ /* THE ACCENT BAR: the brand's main colour, then its second where it has one. */
5056
+ .crewlet-brand-sample__bar {
5057
+ display: flex;
5058
+ gap: 0.8cqi;
5059
+ height: 1cqi;
5060
+ }
5061
+
5062
+ .crewlet-brand-sample__bar-primary,
5063
+ .crewlet-brand-sample__bar-secondary {
5064
+ display: block;
5065
+ height: 100%;
5066
+ border-radius: var(--radius-pill);
5067
+ }
5068
+
5069
+ .crewlet-brand-sample__bar-primary {
5070
+ width: 12cqi;
5071
+ background: var(--color-brand-accent);
5072
+ }
5073
+
5074
+ .crewlet-brand-sample__bar-secondary {
5075
+ width: 4cqi;
5076
+ background: var(--color-brand-highlight);
5077
+ }
5078
+
5079
+ /* TWO LINES AT MOST, set large: a title slide's heading. */
5080
+ .crewlet-brand-sample__heading--slide {
5081
+ display: -webkit-box;
5082
+ max-width: 48%;
5083
+ font-size: 7.5cqi;
5084
+ line-height: 1.05;
5085
+ white-space: normal;
5086
+ -webkit-box-orient: vertical;
5087
+ -webkit-line-clamp: 2;
5088
+ }
5089
+
5090
+ .crewlet-brand-sample__footer {
5091
+ margin-top: 3cqi;
5092
+ overflow: hidden;
5093
+ color: var(--color-text-tertiary);
5094
+ font-size: 2cqi;
5095
+ letter-spacing: var(--font-letter-spacing-wide);
5096
+ text-overflow: ellipsis;
5097
+ text-transform: uppercase;
5098
+ white-space: nowrap;
5099
+ }
5100
+
5101
+
5102
+ /* BrandScope-H2KZHGT7.css */
5103
+ /*
5104
+ * A region in a company's brand. The mapping itself (the captured page values
5105
+ * on `.crewlet-brand-scope`, the brand's steps and public tokens on
5106
+ * `.crewlet-brand-scope__layer`) is @crewlethq/tokens' css/brand-scope,
5107
+ * imported beside this file and built from the one source the artifact kit's
5108
+ * brand layer is built from. This file is only the two elements' own shape.
5109
+ */
5110
+
5111
+ /* The outer element carries the inputs and the capture, and draws no box. */
5112
+ .crewlet-brand-scope {
5113
+ display: contents;
5114
+ }
5115
+
5116
+ /* THE BOX, with the body text and face of the brand, so plain text inside it
5117
+ follows the brand without a rule of its own. It paints no ground. */
5118
+ .crewlet-brand-scope__layer {
5119
+ color: var(--color-text-primary);
5120
+ font-family: var(--font-family-sans);
5121
+ }
5122
+
5123
+ /* A PINNED MODE is that mode for the platform's own drawing too: a native
5124
+ control or a scrollbar inside a light preview on a dark page is light. */
5125
+ .crewlet-brand-scope[data-mode='light'] > .crewlet-brand-scope__layer {
5126
+ color-scheme: light;
5127
+ }
5128
+
5129
+ .crewlet-brand-scope[data-mode='dark'] > .crewlet-brand-scope__layer {
5130
+ color-scheme: dark;
5131
+ }
5132
+
5133
+
4718
5134
  /* Breadcrumb-YMWVM3SV.css */
4719
5135
  /*
4720
5136
  * The trail in a top bar.
@@ -8426,7 +8842,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
8426
8842
  }
8427
8843
 
8428
8844
 
8429
- /* Checkbox-ALWG3WV2.css */
8845
+ /* Checkbox-MB22OW6P.css */
8430
8846
  /*
8431
8847
  * Checkbox: a box, its label and its consequence as one target.
8432
8848
  *
@@ -8555,6 +8971,24 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
8555
8971
  font-size: var(--font-size-compact);
8556
8972
  }
8557
8973
 
8974
+ /*
8975
+ * THE BARE BOX (`hideLabel`): no words beside it, so the row's floor and its
8976
+ * gap go, and the box is centred on a square the pointer floor allows. The
8977
+ * label is still its name, said rather than printed.
8978
+ */
8979
+ .crewlet-checkbox--bare {
8980
+ display: inline-flex;
8981
+ align-items: center;
8982
+ justify-content: center;
8983
+ gap: 0;
8984
+ min-width: var(--size-target-min);
8985
+ min-height: var(--size-target-min);
8986
+ }
8987
+
8988
+ .crewlet-checkbox--bare .crewlet-checkbox__control {
8989
+ margin: 0;
8990
+ }
8991
+
8558
8992
  .crewlet-checkbox.is-disabled,
8559
8993
  .crewlet-checkbox.is-disabled .crewlet-checkbox__control {
8560
8994
  cursor: not-allowed;
@@ -9139,7 +9573,164 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9139
9573
  }
9140
9574
 
9141
9575
 
9142
- /* Combobox-YDONYDTM.css */
9576
+ /* ColorField-2OIOWT3Z.css */
9577
+ /*
9578
+ * A colour a person chooses: the swatch that opens the platform's picker,
9579
+ * beside the hex field. The swatch's fill is the one value that is not a
9580
+ * token, and it arrives through `--crewlet-color-field-value` only after it
9581
+ * has passed `#rrggbb`.
9582
+ */
9583
+ .crewlet-color-field__row {
9584
+ display: flex;
9585
+ align-items: center;
9586
+ gap: var(--spacing-2);
9587
+ min-width: 0;
9588
+ }
9589
+
9590
+ /*
9591
+ * THE SWATCH IS THE PICKER: the platform's colour input lies over the chip,
9592
+ * transparent, so a press anywhere on the chip opens it and the chip is what
9593
+ * the reader sees, the same in every browser. Its edge is its own, so a
9594
+ * colour that matches the page is still a chip.
9595
+ */
9596
+ .crewlet-color-field__swatch {
9597
+ /* The hatch of no colour, as a colour swatch draws it. */
9598
+ --crewlet-color-field-hatch: repeating-linear-gradient(
9599
+ -45deg,
9600
+ var(--color-border-hatch) 0 1px,
9601
+ transparent 1px var(--spacing-2)
9602
+ );
9603
+
9604
+ position: relative;
9605
+ display: inline-flex;
9606
+ flex: none;
9607
+ width: var(--size-control-md);
9608
+ height: var(--size-control-md);
9609
+ box-sizing: border-box;
9610
+ border-radius: var(--radius-md);
9611
+ background: var(--crewlet-color-field-value, var(--color-surface-inset));
9612
+ box-shadow: inset 0 0 0 1px var(--color-border-field);
9613
+ }
9614
+
9615
+ .crewlet-color-field__swatch.is-empty {
9616
+ background: var(--crewlet-color-field-hatch);
9617
+ }
9618
+
9619
+ .crewlet-color-field__swatch.is-disabled {
9620
+ opacity: 0.6;
9621
+ }
9622
+
9623
+ .crewlet-color-field__picker {
9624
+ position: absolute;
9625
+ inset: 0;
9626
+ width: 100%;
9627
+ height: 100%;
9628
+ margin: 0;
9629
+ padding: 0;
9630
+ border: 0;
9631
+ opacity: 0;
9632
+ cursor: pointer;
9633
+ }
9634
+
9635
+ .crewlet-color-field__picker:disabled {
9636
+ cursor: not-allowed;
9637
+ }
9638
+
9639
+ /* THE RING IS THE CHIP'S: the input under it is transparent, so the ring a
9640
+ keyboard needs is drawn on what the reader sees. */
9641
+ .crewlet-color-field__swatch:has(.crewlet-color-field__picker:focus-visible) {
9642
+ outline: 2px solid var(--color-focus);
9643
+ outline-offset: 0;
9644
+ }
9645
+
9646
+
9647
+ /* ColorSwatch-DNMUFHNS.css */
9648
+ /*
9649
+ * One colour of a brand: a chip of it over its role and its value. The chip's
9650
+ * fill is the one value that is not a token, and it arrives through
9651
+ * `--crewlet-color-swatch-value` only after it has passed `#rrggbb`. Every
9652
+ * other colour here is a token.
9653
+ */
9654
+ .crewlet-color-swatch {
9655
+ /* The hatch of no colour, as one value: the same lines an arranged page's
9656
+ ground draws, so "nothing here" reads one way across the package. */
9657
+ --crewlet-color-swatch-hatch: repeating-linear-gradient(
9658
+ -45deg,
9659
+ var(--color-border-hatch) 0 1px,
9660
+ transparent 1px var(--spacing-2)
9661
+ );
9662
+
9663
+ display: flex;
9664
+ flex-direction: column;
9665
+ gap: var(--spacing-2);
9666
+ min-width: 0;
9667
+ }
9668
+
9669
+ /* THE CHIP HAS AN EDGE OF ITS OWN, so a colour that matches the page is
9670
+ still a chip rather than a gap. */
9671
+ .crewlet-color-swatch__chip {
9672
+ display: block;
9673
+ width: 100%;
9674
+ height: var(--size-row-lg);
9675
+ box-sizing: border-box;
9676
+ border-radius: var(--radius-md);
9677
+ background: var(--crewlet-color-swatch-value, var(--color-surface-inset));
9678
+ box-shadow: inset 0 0 0 1px var(--color-border-hover);
9679
+ }
9680
+
9681
+ .crewlet-color-swatch__chip.is-empty {
9682
+ background: var(--crewlet-color-swatch-hatch);
9683
+ }
9684
+
9685
+ .crewlet-color-swatch__words {
9686
+ display: flex;
9687
+ flex-direction: column;
9688
+ gap: 2px;
9689
+ min-width: 0;
9690
+ }
9691
+
9692
+ .crewlet-color-swatch__name {
9693
+ overflow: hidden;
9694
+ color: var(--color-text-primary);
9695
+ font-size: var(--font-size-sm);
9696
+ font-weight: var(--font-weight-medium);
9697
+ text-overflow: ellipsis;
9698
+ white-space: nowrap;
9699
+ }
9700
+
9701
+ .crewlet-color-swatch__description {
9702
+ color: var(--color-text-tertiary);
9703
+ font-size: var(--font-size-xs);
9704
+ }
9705
+
9706
+ .crewlet-color-swatch__value--plain {
9707
+ color: var(--color-text-secondary);
9708
+ font-family: var(--font-family-mono);
9709
+ font-size: var(--font-size-xs);
9710
+ }
9711
+
9712
+ .crewlet-color-swatch__empty {
9713
+ color: var(--color-text-tertiary);
9714
+ font-size: var(--font-size-xs);
9715
+ }
9716
+
9717
+ /* ---- sm: a chip beside the words, for a dense list ---- */
9718
+
9719
+ .crewlet-color-swatch--sm {
9720
+ flex-direction: row;
9721
+ align-items: center;
9722
+ gap: var(--spacing-2);
9723
+ }
9724
+
9725
+ .crewlet-color-swatch--sm .crewlet-color-swatch__chip {
9726
+ flex: none;
9727
+ width: var(--size-control-sm);
9728
+ height: var(--size-control-sm);
9729
+ border-radius: var(--radius-sm);
9730
+ }
9731
+
9732
+
9733
+ /* Combobox-GBCWXWEB.css */
9143
9734
  /*
9144
9735
  * Combobox: a field that offers completions.
9145
9736
  *
@@ -9222,6 +9813,88 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9222
9813
  cursor: not-allowed;
9223
9814
  }
9224
9815
 
9816
+ /* ---- inline (`inline`): the list is the surface's body ------------------
9817
+ Always on screen, in the flow under the field, at ONE HEIGHT: the box is
9818
+ `rows` one-line rows tall (`--crewlet-combobox-rows`, set by the component)
9819
+ whatever the filter leaves in it, so nothing under it moves as somebody
9820
+ types, and it scrolls past that. It sits on the surface's own ground inside
9821
+ a hairline, because it is part of the surface rather than a panel over it. */
9822
+ .crewlet-combobox--inline {
9823
+ display: flex;
9824
+ flex-direction: column;
9825
+ gap: var(--spacing-2);
9826
+ }
9827
+
9828
+ .crewlet-combobox__list {
9829
+ /* ONE ROW IS ONE ROW STEP, exactly: a row's own height is held to it
9830
+ below, so a label that draws a glyph beside its words is no taller than
9831
+ one that does not, and `rows` rows fill the box to the pixel. */
9832
+ --crewlet-combobox-row: var(--size-row-md);
9833
+ --crewlet-listbox-gap: 1px;
9834
+
9835
+ height: calc(
9836
+ var(--crewlet-combobox-rows) * var(--crewlet-combobox-row) + (var(--crewlet-combobox-rows) - 1) * var(--crewlet-listbox-gap) +
9837
+ var(--spacing-1) * 2 + 2px
9838
+ );
9839
+ box-sizing: border-box;
9840
+ overflow: hidden;
9841
+ border: 1px solid var(--color-border-default);
9842
+ border-radius: var(--radius-md);
9843
+ }
9844
+
9845
+ .crewlet-combobox__options {
9846
+ display: flex;
9847
+ flex-direction: column;
9848
+ gap: var(--crewlet-listbox-gap);
9849
+ height: 100%;
9850
+ box-sizing: border-box;
9851
+ padding: var(--spacing-1);
9852
+ overflow-y: auto;
9853
+ overscroll-behavior: contain;
9854
+ }
9855
+
9856
+ .crewlet-combobox__list.is-mono .crewlet-combobox__label {
9857
+ font-family: var(--font-family-mono);
9858
+ font-size: var(--font-size-compact);
9859
+ }
9860
+
9861
+ .crewlet-combobox__options .crewlet-listbox__option {
9862
+ height: var(--crewlet-combobox-row);
9863
+ min-height: 0;
9864
+ padding-block: 0;
9865
+ border-radius: var(--radius-xs);
9866
+ }
9867
+
9868
+ /* The row the arrows or the pointer are on, in the hover tint, as the popup
9869
+ draws it. Scoped to the list for the same reason as the panel's. */
9870
+ .crewlet-combobox__options .crewlet-listbox__option.is-highlight,
9871
+ .crewlet-combobox__options .crewlet-listbox__option:hover {
9872
+ background: var(--color-surface-hover);
9873
+ color: var(--color-text-primary);
9874
+ }
9875
+
9876
+ /*
9877
+ * THE CHOSEN ROW (`chosen`), as every chosen option in the package is drawn:
9878
+ * the selected fill, never the accent, with a tick in the accent's ink so the
9879
+ * choice never rests on the tint. It keeps its fill under the arrows too.
9880
+ */
9881
+ .crewlet-combobox__options .crewlet-listbox__option[aria-selected='true'] {
9882
+ background: var(--color-surface-selected);
9883
+ color: var(--color-text-primary);
9884
+ }
9885
+
9886
+ .crewlet-combobox__check {
9887
+ display: inline-flex;
9888
+ flex: none;
9889
+ color: var(--color-brand-accent-ink);
9890
+ }
9891
+
9892
+ .crewlet-combobox__options .crewlet-listbox__option.is-disabled {
9893
+ background: transparent;
9894
+ color: var(--color-text-tertiary);
9895
+ cursor: not-allowed;
9896
+ }
9897
+
9225
9898
 
9226
9899
  /* CommandPalette-TOZYLWLE.css */
9227
9900
  /*
@@ -9828,6 +10501,56 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9828
10501
  }
9829
10502
 
9830
10503
 
10504
+ /* ContrastBadge-CBZPGG3G.css */
10505
+ /*
10506
+ * Whether one colour reads on another: a sample of the pair, the ratio and
10507
+ * the level. The sample's two colours are the only values here that are not
10508
+ * tokens, and they arrive through `--crewlet-contrast-badge-ink` and
10509
+ * `--crewlet-contrast-badge-ground` only once both have passed `#rrggbb`.
10510
+ */
10511
+ .crewlet-contrast-badge {
10512
+ display: inline-flex;
10513
+ flex-wrap: wrap;
10514
+ align-items: center;
10515
+ gap: var(--spacing-2);
10516
+ min-width: 0;
10517
+ font-size: var(--font-size-xs);
10518
+ }
10519
+
10520
+ /* THE SAMPLE HAS AN EDGE OF ITS OWN, so a ground that matches the page is
10521
+ still a sample. */
10522
+ .crewlet-contrast-badge__sample {
10523
+ display: inline-flex;
10524
+ flex: none;
10525
+ align-items: center;
10526
+ justify-content: center;
10527
+ width: var(--size-control-sm);
10528
+ height: var(--size-control-sm);
10529
+ box-sizing: border-box;
10530
+ border-radius: var(--radius-sm);
10531
+ background: var(--crewlet-contrast-badge-ground, var(--color-surface-inset));
10532
+ box-shadow: inset 0 0 0 1px var(--color-border-hover);
10533
+ color: var(--crewlet-contrast-badge-ink, var(--color-text-tertiary));
10534
+ font-size: var(--font-size-xs);
10535
+ font-weight: var(--font-weight-semibold);
10536
+ line-height: 1;
10537
+ }
10538
+
10539
+ .crewlet-contrast-badge__label {
10540
+ color: var(--color-text-secondary);
10541
+ }
10542
+
10543
+ .crewlet-contrast-badge__ratio {
10544
+ color: var(--color-text-primary);
10545
+ font-family: var(--font-family-mono);
10546
+ font-variant-numeric: tabular-nums;
10547
+ }
10548
+
10549
+ .crewlet-contrast-badge__unmeasured {
10550
+ color: var(--color-text-tertiary);
10551
+ }
10552
+
10553
+
9831
10554
  /* Copyable-5PNRFOLS.css */
9832
10555
  /*
9833
10556
  * Copyable: a value and the one control that copies it.
@@ -10222,7 +10945,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10222
10945
  }
10223
10946
 
10224
10947
 
10225
- /* DataGrid-AQKPJD7W.css */
10948
+ /* DataGrid-VNGQESJA.css */
10226
10949
  /*
10227
10950
  * DataGrid: a list as columns, one track list on the grid.
10228
10951
  *
@@ -10420,6 +11143,21 @@ button.crewlet-data-grid__row-link {
10420
11143
  background: var(--color-brand-accent-soft);
10421
11144
  }
10422
11145
 
11146
+ /*
11147
+ * PICKED FOR A BULK ACTION (`selection`), as every chosen option is drawn:
11148
+ * the selected fill, never the accent. One fill, so the hover overlay does not
11149
+ * stack on it, and its box says it as well.
11150
+ */
11151
+ .crewlet-data-grid__row--picked,
11152
+ .crewlet-data-grid__row--picked:hover {
11153
+ background: var(--color-surface-selected);
11154
+ }
11155
+
11156
+ /* The selection box, centred in its track and standing above the row's link. */
11157
+ .crewlet-data-grid__select {
11158
+ display: inline-flex;
11159
+ }
11160
+
10423
11161
  .crewlet-data-grid__row--cursor {
10424
11162
  box-shadow: inset 2px 0 0 var(--color-brand-accent);
10425
11163
  }
@@ -15667,6 +16405,240 @@ button.crewlet-finding-list__row:focus-visible {
15667
16405
  }
15668
16406
 
15669
16407
 
16408
+ /* FolderTile-FDT5Y63Z.css */
16409
+ /*
16410
+ * A folder in a gallery: a short tile on Card (no preview), the folder glyph
16411
+ * on a neutral tint over the name and one quiet line, and a More menu in the
16412
+ * top corner outside the link. `row` is the full width, 44px row a phone
16413
+ * takes, and a tile becomes one under the phone breakpoint.
16414
+ *
16415
+ * ON TOP OF CARD, so every rule that changes Card's own layout carries Card's
16416
+ * class too: the two sheets meet at equal weight and the bundle orders them by
16417
+ * file name, which puts Card's after this one.
16418
+ */
16419
+
16420
+ /*
16421
+ * THE ARTIFACT CARD'S CORNER, so a folder tile and the cards below it read as
16422
+ * one gallery, and Card's own hover step (the hairline darkens, nothing
16423
+ * lifts). The chosen state is Card's (`selected`): the selected edge over the
16424
+ * selected fill.
16425
+ */
16426
+ .crewlet-card.crewlet-folder-tile {
16427
+ /*
16428
+ * THE TWO SHAPES ARE ONE LAYOUT AT TWO SIZES, so the row (and a tile under
16429
+ * the phone breakpoint) restates these and nothing else.
16430
+ */
16431
+ --crewlet-folder-tile-radius: var(--radius-xl);
16432
+ --crewlet-folder-tile-gap: var(--spacing-3);
16433
+ --crewlet-folder-tile-pad-block: var(--spacing-4);
16434
+ --crewlet-folder-tile-pad-inline: var(--spacing-4);
16435
+ --crewlet-folder-tile-floor: auto;
16436
+ --crewlet-folder-tile-glyph: 40px;
16437
+ --crewlet-folder-tile-glyph-radius: var(--radius-md);
16438
+ --crewlet-folder-tile-name: var(--font-size-md);
16439
+ --crewlet-folder-tile-facts: var(--font-size-sm);
16440
+ --crewlet-folder-tile-actions-inset: var(--spacing-3);
16441
+ /*
16442
+ * A TILE STACKS: the glyph on top with the More menu level with it in the
16443
+ * other corner, then the name and the facts the full width of the tile,
16444
+ * where a gallery four across has room for "Everyone · 12 artifacts · 2
16445
+ * folders". A row is one line of glyph and words with the menu centred on
16446
+ * it, and only the row gives the menu room.
16447
+ */
16448
+ --crewlet-folder-tile-direction: column;
16449
+ --crewlet-folder-tile-align: flex-start;
16450
+ --crewlet-folder-tile-actions-top: calc(
16451
+ var(--crewlet-folder-tile-pad-block) + (var(--crewlet-folder-tile-glyph) - var(--size-control-sm)) / 2
16452
+ );
16453
+ --crewlet-folder-tile-actions-shift: 0;
16454
+ --crewlet-folder-tile-reserve-link: 0px;
16455
+
16456
+ flex-direction: row;
16457
+ align-items: stretch;
16458
+ min-width: 0;
16459
+ border-radius: var(--crewlet-folder-tile-radius);
16460
+ }
16461
+
16462
+ /* ---- the row: a phone's, full width at 44px ---- */
16463
+
16464
+ .crewlet-card.crewlet-folder-tile--row {
16465
+ --crewlet-folder-tile-radius: var(--radius-lg);
16466
+ --crewlet-folder-tile-gap: var(--spacing-2);
16467
+ --crewlet-folder-tile-pad-block: var(--spacing-1);
16468
+ --crewlet-folder-tile-pad-inline: var(--spacing-3);
16469
+ --crewlet-folder-tile-floor: var(--size-control-lg);
16470
+ --crewlet-folder-tile-glyph: 28px;
16471
+ --crewlet-folder-tile-glyph-radius: var(--radius-sm);
16472
+ --crewlet-folder-tile-name: var(--font-size-sm);
16473
+ --crewlet-folder-tile-facts: var(--font-size-xs);
16474
+ --crewlet-folder-tile-actions-inset: var(--spacing-2);
16475
+ --crewlet-folder-tile-direction: row;
16476
+ --crewlet-folder-tile-align: center;
16477
+ --crewlet-folder-tile-actions-top: 50%;
16478
+ --crewlet-folder-tile-actions-shift: -50%;
16479
+ --crewlet-folder-tile-reserve-link: calc(var(--size-control-sm) + var(--spacing-1));
16480
+ }
16481
+
16482
+ /* UNDER THE PHONE BREAKPOINT A TILE IS THE ROW, strictly under, as the
16483
+ package switches there everywhere else. */
16484
+ @media (width < 640px) {
16485
+ .crewlet-card.crewlet-folder-tile--tile {
16486
+ --crewlet-folder-tile-radius: var(--radius-lg);
16487
+ --crewlet-folder-tile-gap: var(--spacing-2);
16488
+ --crewlet-folder-tile-pad-block: var(--spacing-1);
16489
+ --crewlet-folder-tile-pad-inline: var(--spacing-3);
16490
+ --crewlet-folder-tile-floor: var(--size-control-lg);
16491
+ --crewlet-folder-tile-glyph: 28px;
16492
+ --crewlet-folder-tile-glyph-radius: var(--radius-sm);
16493
+ --crewlet-folder-tile-name: var(--font-size-sm);
16494
+ --crewlet-folder-tile-facts: var(--font-size-xs);
16495
+ --crewlet-folder-tile-actions-inset: var(--spacing-2);
16496
+ --crewlet-folder-tile-direction: row;
16497
+ --crewlet-folder-tile-align: center;
16498
+ --crewlet-folder-tile-actions-top: 50%;
16499
+ --crewlet-folder-tile-actions-shift: -50%;
16500
+ --crewlet-folder-tile-reserve-link: calc(var(--size-control-sm) + var(--spacing-1));
16501
+ }
16502
+ }
16503
+
16504
+ /*
16505
+ * SOMETHING HELD OVER IT WOULD LAND IN IT: the accent edge over the accent's
16506
+ * soft fill, the same pair a file drop target takes while files are over it,
16507
+ * so "let go here" reads one way across the package.
16508
+ */
16509
+ .crewlet-card.crewlet-folder-tile.is-drop-target {
16510
+ border-color: var(--color-brand-accent);
16511
+ background-color: var(--color-brand-accent-soft);
16512
+ }
16513
+
16514
+ .crewlet-card.crewlet-folder-tile:has(.crewlet-folder-tile__link:focus-visible) {
16515
+ outline: 2px solid var(--color-focus);
16516
+ outline-offset: var(--size-focus-ring-inset-offset);
16517
+ }
16518
+
16519
+ /* THE LINK IS THE TILE: it fills it, and the ring is drawn on the tile. */
16520
+ .crewlet-folder-tile__link,
16521
+ .crewlet-folder-tile__link:hover {
16522
+ text-decoration: none;
16523
+ }
16524
+
16525
+ .crewlet-folder-tile__link {
16526
+ display: flex;
16527
+ flex: 1 1 auto;
16528
+ flex-direction: var(--crewlet-folder-tile-direction);
16529
+ align-items: var(--crewlet-folder-tile-align);
16530
+ gap: var(--crewlet-folder-tile-gap);
16531
+ min-width: 0;
16532
+ min-height: var(--crewlet-folder-tile-floor);
16533
+ padding: var(--crewlet-folder-tile-pad-block) var(--crewlet-folder-tile-pad-inline);
16534
+ border-radius: inherit;
16535
+ color: inherit;
16536
+ outline: none;
16537
+ }
16538
+
16539
+ /* Room for the More menu on a row, where it sits beside the words. */
16540
+ .crewlet-folder-tile--with-actions .crewlet-folder-tile__link {
16541
+ padding-inline-end: calc(var(--crewlet-folder-tile-pad-inline) + var(--crewlet-folder-tile-reserve-link));
16542
+ }
16543
+
16544
+ /* A NEUTRAL TINT, never a kind's: a folder is not a kind. */
16545
+ .crewlet-folder-tile__glyph {
16546
+ display: inline-flex;
16547
+ flex: none;
16548
+ align-items: center;
16549
+ justify-content: center;
16550
+ width: var(--crewlet-folder-tile-glyph);
16551
+ height: var(--crewlet-folder-tile-glyph);
16552
+ box-sizing: border-box;
16553
+ border-radius: var(--crewlet-folder-tile-glyph-radius);
16554
+ background: var(--color-surface-inset);
16555
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
16556
+ color: var(--color-text-secondary);
16557
+ }
16558
+
16559
+ .crewlet-folder-tile__body {
16560
+ display: flex;
16561
+ flex-direction: column;
16562
+ gap: 2px;
16563
+ min-width: 0;
16564
+ max-width: 100%;
16565
+ }
16566
+
16567
+ .crewlet-folder-tile__name {
16568
+ overflow: hidden;
16569
+ color: var(--color-text-primary);
16570
+ font-size: var(--crewlet-folder-tile-name);
16571
+ font-weight: var(--font-weight-medium);
16572
+ line-height: 1.35;
16573
+ text-overflow: ellipsis;
16574
+ white-space: nowrap;
16575
+ }
16576
+
16577
+ /*
16578
+ * THE FACTS WRAP, NEVER CUT. "Everyone" and "Nothing you can open yet" are
16579
+ * both things a reader has to read, and four tiles across a laptop's page do
16580
+ * not have room for them on one line: the count moves under who can see the
16581
+ * folder rather than losing its end to an ellipsis. The two are told apart by
16582
+ * the visibility glyph and the gap between them, not by a separator, so a
16583
+ * line that breaks never opens on a stray dot.
16584
+ */
16585
+ .crewlet-folder-tile__facts {
16586
+ display: flex;
16587
+ flex-wrap: wrap;
16588
+ align-items: center;
16589
+ gap: 2px var(--spacing-3);
16590
+ min-width: 0;
16591
+ color: var(--color-text-tertiary);
16592
+ font-size: var(--crewlet-folder-tile-facts);
16593
+ line-height: 1.35;
16594
+ }
16595
+
16596
+ .crewlet-folder-tile__visibility {
16597
+ display: inline-flex;
16598
+ flex: none;
16599
+ align-items: center;
16600
+ }
16601
+
16602
+ .crewlet-folder-tile__contents {
16603
+ min-width: 0;
16604
+ overflow-wrap: anywhere;
16605
+ }
16606
+
16607
+ /*
16608
+ * THE TILE'S OWN CONTROLS, at its trailing edge and outside the link: hidden
16609
+ * until the tile is hovered or holds focus, so a gallery rests as names, and
16610
+ * always there on a screen with no hover or while their menu is open.
16611
+ */
16612
+ .crewlet-folder-tile__actions {
16613
+ position: absolute;
16614
+ top: var(--crewlet-folder-tile-actions-top);
16615
+ right: var(--crewlet-folder-tile-actions-inset);
16616
+ display: inline-flex;
16617
+ gap: var(--spacing-1);
16618
+ transform: translateY(var(--crewlet-folder-tile-actions-shift));
16619
+ opacity: 0;
16620
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-out);
16621
+ }
16622
+
16623
+ .crewlet-folder-tile:hover .crewlet-folder-tile__actions,
16624
+ .crewlet-folder-tile:focus-within .crewlet-folder-tile__actions,
16625
+ .crewlet-folder-tile__actions:has([aria-expanded='true']) {
16626
+ opacity: 1;
16627
+ }
16628
+
16629
+ @media (hover: none) {
16630
+ .crewlet-folder-tile__actions {
16631
+ opacity: 1;
16632
+ }
16633
+ }
16634
+
16635
+ @media (prefers-reduced-motion: reduce) {
16636
+ .crewlet-folder-tile__actions {
16637
+ transition: none;
16638
+ }
16639
+ }
16640
+
16641
+
15670
16642
  /* Highlight-DXLV2R6L.css */
15671
16643
  /*
15672
16644
  * Words a search matched (Highlight.tsx).
@@ -18920,6 +19892,168 @@ a.crewlet-icon-btn {
18920
19892
  }
18921
19893
 
18922
19894
 
19895
+ /* LogoSlot-T2UFOJXU.css */
19896
+ /*
19897
+ * One of a brand's logos on the ground it is made for. The ground and the ink
19898
+ * of its guide are the only values here that are not tokens: they arrive
19899
+ * through `--crewlet-logo-slot-ground` (the brand's own `#rrggbb`, or a
19900
+ * palette's sheet read from the tokens package) and `--crewlet-logo-slot-ink`
19901
+ * (whichever palette's text reads better on that ground).
19902
+ */
19903
+ .crewlet-logo-slot {
19904
+ /* Every stage is one height, so three slots side by side line up whatever
19905
+ their logos' shapes. */
19906
+ --crewlet-logo-slot-height: calc(var(--size-row-lg) * 3);
19907
+ --crewlet-logo-slot-padding: var(--spacing-5);
19908
+ --crewlet-logo-slot-clear: var(--spacing-3);
19909
+
19910
+ display: flex;
19911
+ flex-direction: column;
19912
+ gap: var(--spacing-2);
19913
+ min-width: 0;
19914
+ }
19915
+
19916
+ .crewlet-logo-slot__head {
19917
+ display: flex;
19918
+ align-items: flex-start;
19919
+ justify-content: space-between;
19920
+ gap: var(--spacing-2);
19921
+ min-width: 0;
19922
+ }
19923
+
19924
+ .crewlet-logo-slot__words {
19925
+ display: flex;
19926
+ flex-direction: column;
19927
+ gap: 2px;
19928
+ min-width: 0;
19929
+ }
19930
+
19931
+ .crewlet-logo-slot__label {
19932
+ color: var(--color-text-primary);
19933
+ font-size: var(--font-size-sm);
19934
+ font-weight: var(--font-weight-medium);
19935
+ }
19936
+
19937
+ .crewlet-logo-slot__description {
19938
+ color: var(--color-text-tertiary);
19939
+ font-size: var(--font-size-xs);
19940
+ }
19941
+
19942
+ .crewlet-logo-slot__download {
19943
+ display: inline-flex;
19944
+ flex: none;
19945
+ }
19946
+
19947
+ /*
19948
+ * THE STAGE: the logo's own ground, at one height, inside the page's hairline
19949
+ * so a ground that matches the page is still a stage. An empty one draws its
19950
+ * edge dashed, a place waiting to be filled.
19951
+ */
19952
+ .crewlet-logo-slot__stage {
19953
+ display: flex;
19954
+ align-items: center;
19955
+ justify-content: center;
19956
+ height: var(--crewlet-logo-slot-height);
19957
+ box-sizing: border-box;
19958
+ padding: var(--crewlet-logo-slot-padding);
19959
+ overflow: hidden;
19960
+ border: 1px solid var(--color-border-hover);
19961
+ border-radius: var(--radius-lg);
19962
+ background: var(--crewlet-logo-slot-ground);
19963
+ color: var(--crewlet-logo-slot-ink);
19964
+ }
19965
+
19966
+ .crewlet-logo-slot__stage.is-empty {
19967
+ border-style: dashed;
19968
+ border-color: var(--color-border-strong);
19969
+ }
19970
+
19971
+ /*
19972
+ * THE SPACE THE LOGO KEEPS: padding round it at the clear space, and with the
19973
+ * guide on, a dashed line at that edge in the ground's ink, half strength so
19974
+ * it reads as a guide and never as part of the logo.
19975
+ */
19976
+ .crewlet-logo-slot__space {
19977
+ position: relative;
19978
+ display: inline-flex;
19979
+ align-items: center;
19980
+ justify-content: center;
19981
+ max-width: 100%;
19982
+ box-sizing: border-box;
19983
+ padding: var(--crewlet-logo-slot-clear);
19984
+ }
19985
+
19986
+ .crewlet-logo-slot__space.has-guide::after {
19987
+ content: '';
19988
+ position: absolute;
19989
+ inset: 0;
19990
+ border: 1px dashed var(--crewlet-logo-slot-ink);
19991
+ border-radius: var(--radius-xs);
19992
+ opacity: 0.5;
19993
+ pointer-events: none;
19994
+ }
19995
+
19996
+ .crewlet-logo-slot__image {
19997
+ display: block;
19998
+ max-width: 100%;
19999
+ max-height: calc(var(--crewlet-logo-slot-height) - 2 * var(--crewlet-logo-slot-padding) - 2 * var(--crewlet-logo-slot-clear));
20000
+ object-fit: contain;
20001
+ }
20002
+
20003
+ /* WHERE A LOGO WOULD GO, at the shape it would take: a wordmark's band or a
20004
+ mark's square, with the image glyph in the ground's ink. */
20005
+ .crewlet-logo-slot__placeholder {
20006
+ display: inline-flex;
20007
+ align-items: center;
20008
+ justify-content: center;
20009
+ width: calc(var(--size-row-lg) * 3);
20010
+ height: var(--size-row-lg);
20011
+ opacity: 0.7;
20012
+ }
20013
+
20014
+ .crewlet-logo-slot__stage--square .crewlet-logo-slot__placeholder {
20015
+ width: var(--size-row-lg);
20016
+ }
20017
+
20018
+ .crewlet-logo-slot__stage.is-uploading .crewlet-logo-slot__space {
20019
+ opacity: 0.5;
20020
+ }
20021
+
20022
+ .crewlet-logo-slot__empty {
20023
+ margin: 0;
20024
+ color: var(--color-text-tertiary);
20025
+ font-size: var(--font-size-xs);
20026
+ }
20027
+
20028
+ /* A REFUSAL, in the danger ink with its glyph, so it never rests on the hue. */
20029
+ .crewlet-logo-slot__error {
20030
+ display: flex;
20031
+ align-items: flex-start;
20032
+ gap: var(--spacing-1);
20033
+ margin: 0;
20034
+ color: var(--color-feedback-danger-ink);
20035
+ font-size: var(--font-size-xs);
20036
+ line-height: var(--font-line-height-normal);
20037
+ }
20038
+
20039
+ .crewlet-logo-slot__error > svg {
20040
+ flex: none;
20041
+ margin-top: 1px;
20042
+ }
20043
+
20044
+ .crewlet-logo-slot__foot {
20045
+ display: flex;
20046
+ flex-wrap: wrap;
20047
+ align-items: center;
20048
+ gap: var(--spacing-2);
20049
+ }
20050
+
20051
+ .crewlet-logo-slot__hint {
20052
+ color: var(--color-text-tertiary);
20053
+ font-size: var(--font-size-xs);
20054
+ }
20055
+
20056
+
18923
20057
  /* MarkdownEditor-WOKV7CLK.css */
18924
20058
  /*
18925
20059
  * Writing markdown (MarkdownEditor.tsx): the bar, the source or its preview,
@@ -19567,7 +20701,7 @@ a.crewlet-icon-btn {
19567
20701
  }
19568
20702
 
19569
20703
 
19570
- /* Modal-TOEWHDCQ.css */
20704
+ /* Modal-3HMP7WAZ.css */
19571
20705
  /*
19572
20706
  * The modal surface: the veil, the frame, and the three bands inside it.
19573
20707
  *
@@ -19682,6 +20816,32 @@ a.crewlet-icon-btn {
19682
20816
  animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
19683
20817
  }
19684
20818
 
20819
+ /*
20820
+ * THE PHONE SHEET (`phoneSheet`), strictly under the phone breakpoint as the
20821
+ * package switches there everywhere else: the dialog takes the whole window,
20822
+ * with no inset and no corners, so a long list in its body has the screen's
20823
+ * height to scroll in between a head and a foot that stay put. It rises from
20824
+ * the bottom edge as the bottom sheet does, and its foot stays clear of the
20825
+ * home indicator. Above the breakpoint nothing here applies, and the dialog
20826
+ * keeps its placement.
20827
+ */
20828
+ @media (width < 640px) {
20829
+ .crewlet-modal-overlay--dialog.crewlet-modal-overlay--phone-sheet {
20830
+ align-items: stretch;
20831
+ padding: 0;
20832
+ }
20833
+
20834
+ .crewlet-modal-overlay--phone-sheet > .crewlet-modal--dialog {
20835
+ width: 100%;
20836
+ height: 100%;
20837
+ max-height: none;
20838
+ border: none;
20839
+ border-radius: 0;
20840
+ padding-bottom: env(safe-area-inset-bottom, 0px);
20841
+ animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
20842
+ }
20843
+ }
20844
+
19685
20845
  /*
19686
20846
  * The sheet's veil fades over the same span the sheet itself travels, so the
19687
20847
  * two are one movement rather than a ground that lands and a panel that
@@ -20154,6 +21314,10 @@ a.crewlet-icon-btn {
20154
21314
  .crewlet-modal-overlay--bottom > .crewlet-modal--dialog {
20155
21315
  animation: none;
20156
21316
  }
21317
+
21318
+ .crewlet-modal-overlay--phone-sheet > .crewlet-modal--dialog {
21319
+ animation: none;
21320
+ }
20157
21321
  }
20158
21322
 
20159
21323
 
@@ -24958,6 +26122,70 @@ svg.crewlet-select__chevron {
24958
26122
  }
24959
26123
 
24960
26124
 
26125
+ /* SelectionBar-XPWKUOSC.css */
26126
+ /*
26127
+ * What is picked and what can be done to it: the count, the bulk actions and
26128
+ * Clear, on the raised rung inside the strong hairline so it reads as a bar
26129
+ * laid over the list rather than a row of it.
26130
+ *
26131
+ * ON TOP OF TOOLBAR, so the rules that change Toolbar's own layout carry
26132
+ * Toolbar's class too: the bundle orders the two sheets by file name.
26133
+ */
26134
+ .crewlet-toolbar.crewlet-selection-bar {
26135
+ position: sticky;
26136
+ top: var(--crewlet-selection-bar-top, var(--spacing-0));
26137
+ z-index: var(--z-index-sticky);
26138
+ flex-wrap: nowrap;
26139
+ gap: var(--spacing-3);
26140
+ min-height: var(--size-row-lg);
26141
+ padding: var(--spacing-1) var(--spacing-2) var(--spacing-1) var(--spacing-4);
26142
+ border: 1px solid var(--color-border-strong);
26143
+ border-radius: var(--radius-lg);
26144
+ background: var(--color-surface-elevated);
26145
+ box-shadow: var(--shadow-sm);
26146
+ }
26147
+
26148
+ .crewlet-selection-bar__count {
26149
+ flex: none;
26150
+ color: var(--color-text-primary);
26151
+ font-size: var(--font-size-sm);
26152
+ font-weight: var(--font-weight-medium);
26153
+ font-variant-numeric: tabular-nums;
26154
+ white-space: nowrap;
26155
+ }
26156
+
26157
+ .crewlet-selection-bar__actions {
26158
+ display: flex;
26159
+ align-items: center;
26160
+ flex-wrap: wrap;
26161
+ gap: var(--spacing-2);
26162
+ min-width: 0;
26163
+ }
26164
+
26165
+ .crewlet-selection-bar__spacer {
26166
+ flex: 1 1 auto;
26167
+ }
26168
+
26169
+ /*
26170
+ * DOCKED TO THE FOOT ON A PHONE, strictly under the phone breakpoint: over the
26171
+ * list at the bottom edge, inside the safe area, where a thumb reaches it and
26172
+ * the picks it acts on stay in view above it.
26173
+ */
26174
+ @media (width < 640px) {
26175
+ .crewlet-toolbar.crewlet-selection-bar {
26176
+ position: fixed;
26177
+ top: auto;
26178
+ right: var(--spacing-3);
26179
+ bottom: calc(var(--spacing-3) + env(safe-area-inset-bottom, var(--spacing-0)));
26180
+ left: var(--spacing-3);
26181
+ z-index: var(--z-index-overlay);
26182
+ gap: var(--spacing-2);
26183
+ padding-inline-start: var(--spacing-3);
26184
+ box-shadow: var(--shadow-lg);
26185
+ }
26186
+ }
26187
+
26188
+
24961
26189
  /* SettingsTable-6DUFAFXG.css */
24962
26190
  /*
24963
26191
  * SettingsTable: a read-only table of settings, one row each, on one grid.
@@ -30980,7 +32208,7 @@ b.crewlet-switcher__match {
30980
32208
  }
30981
32209
 
30982
32210
 
30983
- /* ThemeGallery-X35Y25EX.css */
32211
+ /* ThemeGallery-UEFZRT6W.css */
30984
32212
  /*
30985
32213
  * The gallery of themes: each group's heading over a grid of cards.
30986
32214
  *
@@ -31085,6 +32313,27 @@ b.crewlet-switcher__match {
31085
32313
  white-space: nowrap;
31086
32314
  }
31087
32315
 
32316
+ /*
32317
+ * THE TAG, DRAWN WHERE A THEME ASKS (`tagTone`), under the name: `quiet` on
32318
+ * the tertiary step and a step smaller, cut to one line with the whole of it
32319
+ * on hover, and `brand` as the accent's pill, so a reader picking a deck's
32320
+ * theme finds their brand among the product's at a glance. A theme that sets
32321
+ * no tone has its tag said with its name and nothing drawn.
32322
+ */
32323
+ .crewlet-theme-gallery__tag {
32324
+ overflow: hidden;
32325
+ color: var(--color-text-tertiary);
32326
+ font-size: var(--font-size-2xs);
32327
+ line-height: var(--font-line-height-tight);
32328
+ text-overflow: ellipsis;
32329
+ white-space: nowrap;
32330
+ }
32331
+
32332
+ .crewlet-theme-gallery__tag--brand {
32333
+ display: flex;
32334
+ min-width: 0;
32335
+ }
32336
+
31088
32337
  /*
31089
32338
  * FORCED COLORS keeps the border and drops the accent, so the chosen card
31090
32339
  * would look like every other; the system's own selected colour says it.
@@ -33886,6 +35135,105 @@ svg.crewlet-time-window__tick {
33886
35135
  }
33887
35136
 
33888
35137
 
35138
+ /* TypeSpecimen-WK6YNHL7.css */
35139
+ /*
35140
+ * A face, shown: its role and name in the interface's own type, then "Aa" and
35141
+ * a line set in the face itself (`--crewlet-type-specimen-family`, which
35142
+ * always ends in the package's sans).
35143
+ */
35144
+ .crewlet-type-specimen {
35145
+ display: grid;
35146
+ grid-template-columns: auto minmax(0, 1fr);
35147
+ grid-template-areas:
35148
+ 'glyphs caption'
35149
+ 'sample sample';
35150
+ align-items: center;
35151
+ gap: var(--spacing-2) var(--spacing-4);
35152
+ min-width: 0;
35153
+ margin: 0;
35154
+ }
35155
+
35156
+ .crewlet-type-specimen__caption {
35157
+ grid-area: caption;
35158
+ display: flex;
35159
+ flex-direction: column;
35160
+ gap: 2px;
35161
+ min-width: 0;
35162
+ }
35163
+
35164
+ .crewlet-type-specimen__label {
35165
+ color: var(--color-text-tertiary);
35166
+ font-size: var(--font-size-2xs);
35167
+ font-weight: var(--font-weight-medium);
35168
+ letter-spacing: var(--font-letter-spacing-wide);
35169
+ text-transform: uppercase;
35170
+ }
35171
+
35172
+ .crewlet-type-specimen__family {
35173
+ overflow: hidden;
35174
+ color: var(--color-text-primary);
35175
+ font-size: var(--font-size-sm);
35176
+ font-weight: var(--font-weight-medium);
35177
+ text-overflow: ellipsis;
35178
+ white-space: nowrap;
35179
+ }
35180
+
35181
+ .crewlet-type-specimen__detail {
35182
+ color: var(--color-text-tertiary);
35183
+ font-size: var(--font-size-xs);
35184
+ }
35185
+
35186
+ .crewlet-type-specimen__glyphs {
35187
+ grid-area: glyphs;
35188
+ color: var(--color-text-primary);
35189
+ font-family: var(--crewlet-type-specimen-family);
35190
+ font-size: var(--font-size-4xl);
35191
+ line-height: 1;
35192
+ }
35193
+
35194
+ .crewlet-type-specimen__sample {
35195
+ grid-area: sample;
35196
+ overflow: hidden;
35197
+ color: var(--color-text-secondary);
35198
+ font-family: var(--crewlet-type-specimen-family);
35199
+ font-size: var(--font-size-md);
35200
+ line-height: var(--font-line-height-snug);
35201
+ text-overflow: ellipsis;
35202
+ white-space: nowrap;
35203
+ }
35204
+
35205
+ .crewlet-type-specimen--regular :is(.crewlet-type-specimen__glyphs, .crewlet-type-specimen__sample) {
35206
+ font-weight: var(--font-weight-regular);
35207
+ }
35208
+
35209
+ .crewlet-type-specimen--medium :is(.crewlet-type-specimen__glyphs, .crewlet-type-specimen__sample) {
35210
+ font-weight: var(--font-weight-medium);
35211
+ }
35212
+
35213
+ .crewlet-type-specimen--semibold :is(.crewlet-type-specimen__glyphs, .crewlet-type-specimen__sample) {
35214
+ font-weight: var(--font-weight-semibold);
35215
+ }
35216
+
35217
+ .crewlet-type-specimen--bold :is(.crewlet-type-specimen__glyphs, .crewlet-type-specimen__sample) {
35218
+ font-weight: var(--font-weight-bold);
35219
+ }
35220
+
35221
+ /* ---- sm: a select option's lead, the letters smaller and the line gone ---- */
35222
+
35223
+ .crewlet-type-specimen--sm {
35224
+ grid-template-areas: 'glyphs caption';
35225
+ gap: var(--spacing-3);
35226
+ }
35227
+
35228
+ .crewlet-type-specimen--sm .crewlet-type-specimen__glyphs {
35229
+ font-size: var(--font-size-2xl);
35230
+ }
35231
+
35232
+ .crewlet-type-specimen--sm .crewlet-type-specimen__sample {
35233
+ display: none;
35234
+ }
35235
+
35236
+
33889
35237
  /* VersionCompare-UUZOPTQO.css */
33890
35238
  /* VersionCompare: a head naming the two versions with the lens switch at its
33891
35239
  end, then the changes or the two versions. */