@crewlethq/ui 0.48.3 → 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 (144) hide show
  1. package/README.md +56 -0
  2. package/dist/AgentHandoffPanel/index.js +3 -3
  3. package/dist/ArrangeList/index.js +2 -2
  4. package/dist/ArtifactBar/index.js +4 -4
  5. package/dist/{ArtifactBar-6PGWGKN2.css → ArtifactBar-UMZCTARR.css} +9 -0
  6. package/dist/ArtifactCard/ArtifactCard.d.ts +30 -1
  7. package/dist/ArtifactCard/index.js +10 -3
  8. package/dist/{ArtifactCard-OGTMO2KI.css → ArtifactCard-SOB63NV5.css} +72 -1
  9. package/dist/ArtifactCover/index.js +2 -2
  10. package/dist/ArtifactIcon/index.js +2 -2
  11. package/dist/ArtifactKindGlyph/ArtifactKindGlyph.d.ts +7 -3
  12. package/dist/ArtifactKindGlyph/index.js +1 -1
  13. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +4 -3
  14. package/dist/ArtifactKindIllustration/index.js +1 -1
  15. package/dist/{ArtifactKinds-CVD3FCYO.css → ArtifactKinds-O3CALPVX.css} +1 -0
  16. package/dist/ArtifactMakeRow/index.js +2 -2
  17. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +14 -1
  18. package/dist/ArtifactNameCell/index.d.ts +1 -1
  19. package/dist/ArtifactNameCell/index.js +2 -2
  20. package/dist/{ArtifactNameCell-RTVP4LO4.css → ArtifactNameCell-3AHLUSE5.css} +12 -0
  21. package/dist/BrandChip/BrandChip.d.ts +26 -0
  22. package/dist/BrandChip/index.d.ts +3 -0
  23. package/dist/BrandChip/index.js +2 -0
  24. package/dist/BrandChip-SQWBC2WU.css +81 -0
  25. package/dist/BrandSample/BrandSample.d.ts +75 -0
  26. package/dist/BrandSample/index.d.ts +3 -0
  27. package/dist/BrandSample/index.js +5 -0
  28. package/dist/BrandSample-G5V7GKR2.css +185 -0
  29. package/dist/BrandScope/BrandScope.d.ts +61 -0
  30. package/dist/BrandScope/index.d.ts +4 -0
  31. package/dist/BrandScope/index.js +4 -0
  32. package/dist/BrandScope-H2KZHGT7.css +29 -0
  33. package/dist/Checkbox/Checkbox.d.ts +8 -0
  34. package/dist/Checkbox/index.js +1 -1
  35. package/dist/{Checkbox-ALWG3WV2.css → Checkbox-MB22OW6P.css} +18 -0
  36. package/dist/ColorField/ColorField.d.ts +63 -0
  37. package/dist/ColorField/index.d.ts +3 -0
  38. package/dist/ColorField/index.js +11 -0
  39. package/dist/ColorField-2OIOWT3Z.css +68 -0
  40. package/dist/ColorSwatch/ColorSwatch.d.ts +43 -0
  41. package/dist/ColorSwatch/index.d.ts +3 -0
  42. package/dist/ColorSwatch/index.js +9 -0
  43. package/dist/ColorSwatch-DNMUFHNS.css +83 -0
  44. package/dist/Combobox/Combobox.d.ts +45 -4
  45. package/dist/Combobox/index.d.ts +1 -1
  46. package/dist/Combobox/index.js +1 -1
  47. package/dist/Combobox-GBCWXWEB.css +163 -0
  48. package/dist/CommandPalette/index.js +3 -3
  49. package/dist/CommentThread/index.js +3 -3
  50. package/dist/Composer/index.js +2 -2
  51. package/dist/ContrastBadge/ContrastBadge.d.ts +63 -0
  52. package/dist/ContrastBadge/index.d.ts +3 -0
  53. package/dist/ContrastBadge/index.js +6 -0
  54. package/dist/ContrastBadge-CBZPGG3G.css +47 -0
  55. package/dist/DataGrid/DataGrid.d.ts +28 -1
  56. package/dist/DataGrid/index.js +8 -1
  57. package/dist/{DataGrid-AQKPJD7W.css → DataGrid-VNGQESJA.css} +15 -0
  58. package/dist/DataTable/index.js +3 -3
  59. package/dist/DataView/index.js +8 -8
  60. package/dist/DateTimePicker/index.js +2 -2
  61. package/dist/FolderTile/FolderTile.d.ts +91 -0
  62. package/dist/FolderTile/index.d.ts +3 -0
  63. package/dist/FolderTile/index.js +7 -0
  64. package/dist/FolderTile-FDT5Y63Z.css +231 -0
  65. package/dist/LinkInterstitial/index.js +2 -2
  66. package/dist/ListInput/index.js +2 -2
  67. package/dist/LogoSlot/LogoSlot.d.ts +84 -0
  68. package/dist/LogoSlot/index.d.ts +3 -0
  69. package/dist/LogoSlot/index.js +9 -0
  70. package/dist/LogoSlot-T2UFOJXU.css +159 -0
  71. package/dist/Modal/Modal.d.ts +13 -0
  72. package/dist/Modal/index.js +1 -1
  73. package/dist/{Modal-TOEWHDCQ.css → Modal-3HMP7WAZ.css} +30 -0
  74. package/dist/PresenterView/index.js +2 -2
  75. package/dist/PrincipalPicker/index.js +2 -2
  76. package/dist/SelectionBar/SelectionBar.d.ts +50 -0
  77. package/dist/SelectionBar/index.d.ts +3 -0
  78. package/dist/SelectionBar/index.js +9 -0
  79. package/dist/SelectionBar-XPWKUOSC.css +61 -0
  80. package/dist/ShareDialog/index.js +3 -3
  81. package/dist/SheetColumnEditor/index.js +3 -3
  82. package/dist/SheetGrid/index.js +2 -2
  83. package/dist/Switcher/index.js +2 -2
  84. package/dist/ThemeGallery/ThemeGallery.d.ts +13 -2
  85. package/dist/ThemeGallery/index.js +3 -1
  86. package/dist/{ThemeGallery-X35Y25EX.css → ThemeGallery-UEFZRT6W.css} +21 -0
  87. package/dist/TimeWindowPicker/index.js +2 -2
  88. package/dist/TypeSpecimen/TypeSpecimen.d.ts +49 -0
  89. package/dist/TypeSpecimen/index.d.ts +3 -0
  90. package/dist/TypeSpecimen/index.js +3 -0
  91. package/dist/TypeSpecimen-WK6YNHL7.css +96 -0
  92. package/dist/chunk-5SGHW42B.js +23 -0
  93. package/dist/{chunk-ILDNJHRU.js → chunk-AVL52EME.js} +1 -1
  94. package/dist/chunk-B235ANDO.js +66 -0
  95. package/dist/{chunk-2MYSESZF.js → chunk-FB5CFQTG.js} +82 -12
  96. package/dist/{chunk-DY4DQ7EB.js → chunk-GP4YWZFO.js} +1 -1
  97. package/dist/{chunk-LIJQT74Y.js → chunk-H55D66IK.js} +1 -1
  98. package/dist/{chunk-6EBGPCAW.js → chunk-H7NMJ5AI.js} +1 -1
  99. package/dist/chunk-ITI2Z44C.js +139 -0
  100. package/dist/{chunk-P5VGSVWG.js → chunk-J24Q4HTD.js} +17 -8
  101. package/dist/{chunk-5EBDOE3C.js → chunk-JFDIMO3A.js} +1 -1
  102. package/dist/chunk-JKAFEFFC.js +44 -0
  103. package/dist/{chunk-32TGEMQQ.js → chunk-KHZYAEGZ.js} +1 -1
  104. package/dist/chunk-M4QM477B.js +80 -0
  105. package/dist/{chunk-TWZEWXNW.js → chunk-MIEBOO7Y.js} +2 -2
  106. package/dist/{chunk-SMOFYZJ5.js → chunk-NAWUXCBC.js} +3 -3
  107. package/dist/{chunk-F57N6ZJG.js → chunk-NCHKKYPQ.js} +5 -2
  108. package/dist/chunk-OCRVY42T.js +50 -0
  109. package/dist/chunk-OEEYL2CM.js +73 -0
  110. package/dist/chunk-P3OIM6OC.js +38 -0
  111. package/dist/{chunk-FWBKMPNR.js → chunk-P3QWT5VR.js} +1 -1
  112. package/dist/chunk-P5JBDHWC.js +206 -0
  113. package/dist/{chunk-OKE5YSLD.js → chunk-Q44X36QC.js} +79 -35
  114. package/dist/{chunk-R2IBCEU6.js → chunk-R3BA3C4Y.js} +2 -2
  115. package/dist/{chunk-CE2THTQR.js → chunk-RSKW25Y5.js} +4 -3
  116. package/dist/{chunk-UBZDYOCA.js → chunk-RV6XB5UV.js} +12 -1
  117. package/dist/{chunk-E4BOVKNJ.js → chunk-UTESMBPL.js} +5 -3
  118. package/dist/chunk-UZMNR366.js +9 -0
  119. package/dist/{chunk-CWKWMIIJ.js → chunk-V7GOOXPK.js} +1 -1
  120. package/dist/{chunk-7JED2NYP.js → chunk-VBIM6HFC.js} +1 -1
  121. package/dist/{chunk-U4HOKU6P.js → chunk-VN47PYUF.js} +5 -5
  122. package/dist/{chunk-MUQJCH2Y.js → chunk-VTSJMDGP.js} +2 -2
  123. package/dist/chunk-W6FOEBIL.js +119 -0
  124. package/dist/chunk-WLSEAIVC.js +48 -0
  125. package/dist/{chunk-AS2BMY3E.js → chunk-WQ7S7CKZ.js} +2 -2
  126. package/dist/{chunk-6AKG2VLR.js → chunk-YCC2S7DF.js} +4 -1
  127. package/dist/chunk-ZH77BXMA.js +14 -0
  128. package/dist/generated/index.d.ts +10 -0
  129. package/dist/generated/index.js +80 -68
  130. package/dist/index.js +80 -68
  131. package/dist/styles.css +1414 -85
  132. package/dist/utils/fontFamily.d.ts +29 -0
  133. package/dist/utils/hexColour.d.ts +12 -0
  134. package/package.json +3 -3
  135. package/scripts/check-css-variables.mjs +18 -2
  136. package/dist/Combobox-YDONYDTM.css +0 -81
  137. package/dist/chunk-OOJTPR7N.js +0 -137
  138. package/dist/{chunk-245IXG5P.js → chunk-3WMOEGEL.js} +0 -0
  139. package/dist/{chunk-ISDEXIXH.js → chunk-E6HXFFWO.js} +1 -1
  140. package/dist/{chunk-6R5BSA36.js → chunk-GHY63X4C.js} +1 -1
  141. package/dist/{chunk-ICVS3U4S.js → chunk-PGR2PKH6.js} +1 -1
  142. package/dist/{chunk-VKFG4FLE.js → chunk-R6R2UHVG.js} +1 -1
  143. package/dist/{chunk-OO7QJCJQ.js → chunk-WXOYHVWG.js} +1 -1
  144. package/dist/{chunk-UFXLNC2N.js → chunk-ZFM5L7M4.js} +1 -1
package/dist/styles.css CHANGED
@@ -2474,7 +2474,7 @@ button.crewlet-account-row__who:focus-visible {
2474
2474
  }
2475
2475
 
2476
2476
 
2477
- /* ArtifactBar-6PGWGKN2.css */
2477
+ /* ArtifactBar-UMZCTARR.css */
2478
2478
  /*
2479
2479
  * One row, one hairline under it, the height of a large row. The lead (the
2480
2480
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2581,6 +2581,15 @@ button.crewlet-account-row__who:focus-visible {
2581
2581
  overflow: visible;
2582
2582
  }
2583
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
+
2584
2593
  .crewlet-artifact-bar__rename {
2585
2594
  min-width: 0;
2586
2595
  max-width: 100%;
@@ -2904,7 +2913,7 @@ button.crewlet-account-row__who:focus-visible {
2904
2913
  }
2905
2914
 
2906
2915
 
2907
- /* ArtifactCard-OGTMO2KI.css */
2916
+ /* ArtifactCard-SOB63NV5.css */
2908
2917
  /*
2909
2918
  * A card in a gallery: the preview on top at a fixed ratio, so a grid of them
2910
2919
  * lines up whatever each preview is, the kind's badge over its foot, then the
@@ -3179,9 +3188,80 @@ button.crewlet-account-row__who:focus-visible {
3179
3188
  }
3180
3189
  }
3181
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
+
3182
3261
  @media (prefers-reduced-motion: reduce) {
3183
3262
  .crewlet-artifact-card--card,
3184
- .crewlet-artifact-card__actions {
3263
+ .crewlet-artifact-card__actions,
3264
+ .crewlet-artifact-card__select {
3185
3265
  transition: none;
3186
3266
  }
3187
3267
  }
@@ -3521,7 +3601,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3521
3601
  }
3522
3602
 
3523
3603
 
3524
- /* ArtifactKinds-CVD3FCYO.css */
3604
+ /* ArtifactKinds-O3CALPVX.css */
3525
3605
  /*
3526
3606
  * A kind's colours, set once per kind on `--crewlet-kind-*` by its class
3527
3607
  * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps and the ink a
@@ -3536,6 +3616,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3536
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); }
3537
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); }
3538
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); }
3539
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); }
3540
3621
 
3541
3622
 
@@ -3752,7 +3833,7 @@ a.crewlet-make-row__item:active {
3752
3833
  }
3753
3834
 
3754
3835
 
3755
- /* ArtifactNameCell-RTVP4LO4.css */
3836
+ /* ArtifactNameCell-3AHLUSE5.css */
3756
3837
  /*
3757
3838
  * An artifact's name in a list: the kind's mark on its tint, the title over
3758
3839
  * one quiet line. Every colour is a token: the mark reads the kind's own Fill,
@@ -3792,6 +3873,18 @@ a.crewlet-make-row__item:active {
3792
3873
  box-shadow: inset 0 0 0 1px var(--crewlet-kind-hue);
3793
3874
  }
3794
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
+
3795
3888
  .crewlet-artifact-name--trashed .crewlet-artifact-name__mark {
3796
3889
  background: var(--color-surface-inset);
3797
3890
  box-shadow: inset 0 0 0 1px var(--color-border-default);
@@ -4617,6 +4710,90 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
4617
4710
  }
4618
4711
 
4619
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
+
4620
4797
  /* BrandLockup-JKGXFCZF.css */
4621
4798
  /*
4622
4799
  * The brand lockup at the head of the rail.
@@ -4734,6 +4911,226 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
4734
4911
  }
4735
4912
 
4736
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
+
4737
5134
  /* Breadcrumb-YMWVM3SV.css */
4738
5135
  /*
4739
5136
  * The trail in a top bar.
@@ -8445,7 +8842,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
8445
8842
  }
8446
8843
 
8447
8844
 
8448
- /* Checkbox-ALWG3WV2.css */
8845
+ /* Checkbox-MB22OW6P.css */
8449
8846
  /*
8450
8847
  * Checkbox: a box, its label and its consequence as one target.
8451
8848
  *
@@ -8574,6 +8971,24 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
8574
8971
  font-size: var(--font-size-compact);
8575
8972
  }
8576
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
+
8577
8992
  .crewlet-checkbox.is-disabled,
8578
8993
  .crewlet-checkbox.is-disabled .crewlet-checkbox__control {
8579
8994
  cursor: not-allowed;
@@ -9158,7 +9573,164 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9158
9573
  }
9159
9574
 
9160
9575
 
9161
- /* 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 */
9162
9734
  /*
9163
9735
  * Combobox: a field that offers completions.
9164
9736
  *
@@ -9241,6 +9813,88 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9241
9813
  cursor: not-allowed;
9242
9814
  }
9243
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
+
9244
9898
 
9245
9899
  /* CommandPalette-TOZYLWLE.css */
9246
9900
  /*
@@ -9820,30 +10474,80 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
9820
10474
  max-width: 1440px;
9821
10475
  }
9822
10476
 
9823
- /*
9824
- * The console width. It reads the content-max token rather than restating the
9825
- * number, because the shell and this container have to agree about where a
9826
- * pane stops or a screen's own header sits at a different width from the
9827
- * screen under it.
9828
- */
9829
- .crewlet-container--2xl {
9830
- max-width: var(--size-content-max);
10477
+ /*
10478
+ * The console width. It reads the content-max token rather than restating the
10479
+ * number, because the shell and this container have to agree about where a
10480
+ * pane stops or a screen's own header sits at a different width from the
10481
+ * screen under it.
10482
+ */
10483
+ .crewlet-container--2xl {
10484
+ max-width: var(--size-content-max);
10485
+ }
10486
+
10487
+ /*
10488
+ * No measure, and the gutter kept. A canvas, a wide grid or a table that
10489
+ * genuinely wants the viewport still needs its content off the window edge.
10490
+ */
10491
+ .crewlet-container--full {
10492
+ max-width: none;
10493
+ }
10494
+
10495
+ /* A PHONE'S GUTTER IS THE SHELL'S, 16px, the top bar's own inset: a narrower
10496
+ one stood a page's content left of the title over it. */
10497
+ @media (max-width: 480px) {
10498
+ .crewlet-container {
10499
+ padding-inline: var(--spacing-4);
10500
+ }
10501
+ }
10502
+
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);
9831
10541
  }
9832
10542
 
9833
- /*
9834
- * No measure, and the gutter kept. A canvas, a wide grid or a table that
9835
- * genuinely wants the viewport still needs its content off the window edge.
9836
- */
9837
- .crewlet-container--full {
9838
- max-width: none;
10543
+ .crewlet-contrast-badge__ratio {
10544
+ color: var(--color-text-primary);
10545
+ font-family: var(--font-family-mono);
10546
+ font-variant-numeric: tabular-nums;
9839
10547
  }
9840
10548
 
9841
- /* A PHONE'S GUTTER IS THE SHELL'S, 16px, the top bar's own inset: a narrower
9842
- one stood a page's content left of the title over it. */
9843
- @media (max-width: 480px) {
9844
- .crewlet-container {
9845
- padding-inline: var(--spacing-4);
9846
- }
10549
+ .crewlet-contrast-badge__unmeasured {
10550
+ color: var(--color-text-tertiary);
9847
10551
  }
9848
10552
 
9849
10553
 
@@ -10241,7 +10945,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10241
10945
  }
10242
10946
 
10243
10947
 
10244
- /* DataGrid-AQKPJD7W.css */
10948
+ /* DataGrid-VNGQESJA.css */
10245
10949
  /*
10246
10950
  * DataGrid: a list as columns, one track list on the grid.
10247
10951
  *
@@ -10439,6 +11143,21 @@ button.crewlet-data-grid__row-link {
10439
11143
  background: var(--color-brand-accent-soft);
10440
11144
  }
10441
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
+
10442
11161
  .crewlet-data-grid__row--cursor {
10443
11162
  box-shadow: inset 2px 0 0 var(--color-brand-accent);
10444
11163
  }
@@ -15686,6 +16405,240 @@ button.crewlet-finding-list__row:focus-visible {
15686
16405
  }
15687
16406
 
15688
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
+
15689
16642
  /* Highlight-DXLV2R6L.css */
15690
16643
  /*
15691
16644
  * Words a search matched (Highlight.tsx).
@@ -18855,87 +19808,249 @@ a.crewlet-icon-btn {
18855
19808
  scrollbar-width: none !important;
18856
19809
  }
18857
19810
 
18858
- :is(.crewlet-live-preview__live, .crewlet-live-preview__still) *::-webkit-scrollbar {
18859
- display: none;
19811
+ :is(.crewlet-live-preview__live, .crewlet-live-preview__still) *::-webkit-scrollbar {
19812
+ display: none;
19813
+ }
19814
+
19815
+ /* THE LIVE LAYER renders out of sight: content that is copied is never seen
19816
+ live, only its copy is. A frame's page is kept rather than copied, so a
19817
+ framed preview's live layer is what fades in once it has drawn. */
19818
+ .crewlet-live-preview__live {
19819
+ position: absolute;
19820
+ inset: 0;
19821
+ display: block;
19822
+ overflow: hidden;
19823
+ opacity: 0;
19824
+ pointer-events: none;
19825
+ user-select: none;
19826
+ }
19827
+
19828
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live {
19829
+ transition: opacity var(--motion-duration-base) var(--motion-easing-out);
19830
+ }
19831
+
19832
+ .crewlet-live-preview[data-frame][data-state='ready'] > .crewlet-live-preview__live {
19833
+ opacity: 1;
19834
+ }
19835
+
19836
+ /* LAID OUT AT ITS OWN SIZE from the top left corner, and scaled from there:
19837
+ to the box's width, its top left the box's, or whole and centred. */
19838
+ .crewlet-preview-scale {
19839
+ position: absolute;
19840
+ inset: 0;
19841
+ display: block;
19842
+ overflow: hidden;
19843
+ }
19844
+
19845
+ .crewlet-preview-scale__layer {
19846
+ position: absolute;
19847
+ top: 0;
19848
+ left: 0;
19849
+ display: block;
19850
+ overflow: hidden;
19851
+ transform-origin: 0 0;
19852
+ }
19853
+
19854
+ /* WHAT IS UNDER A DRAWING is hidden only once it has faded in. Fading the
19855
+ stand-in out at the same time showed both at half strength halfway
19856
+ through: a double exposure. */
19857
+ .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
19858
+ visibility: hidden;
19859
+ /* Visibility is discrete and stays visible for the whole of a transition
19860
+ to hidden, so this holds it exactly as long as the fade above. A copy
19861
+ given back from the store is ready from its first style, which runs no
19862
+ transition, so its stand-in is never shown at all. */
19863
+ transition: visibility var(--motion-duration-base) linear;
19864
+ }
19865
+
19866
+ @media (prefers-reduced-motion: reduce) {
19867
+ .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still,
19868
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live,
19869
+ .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
19870
+ animation: none;
19871
+ transition: none;
19872
+ }
19873
+ }
19874
+
19875
+
19876
+ /* LockedLabel-VQEGEB7G.css */
19877
+ /*
19878
+ * LockedLabel: a place's words with the key after them. The words keep their
19879
+ * own ink and size; the key takes the quiet step, a step closer to the words
19880
+ * than the words are to anything else.
19881
+ */
19882
+ .crewlet-locked-label {
19883
+ display: inline-flex;
19884
+ align-items: center;
19885
+ gap: var(--spacing-1);
19886
+ min-width: 0;
19887
+ }
19888
+
19889
+ .crewlet-locked-label__key {
19890
+ flex: none;
19891
+ color: var(--color-text-tertiary);
19892
+ }
19893
+
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;
18860
19945
  }
18861
19946
 
18862
- /* THE LIVE LAYER renders out of sight: content that is copied is never seen
18863
- live, only its copy is. A frame's page is kept rather than copied, so a
18864
- framed preview's live layer is what fades in once it has drawn. */
18865
- .crewlet-live-preview__live {
18866
- position: absolute;
18867
- inset: 0;
18868
- display: block;
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);
18869
19959
  overflow: hidden;
18870
- opacity: 0;
18871
- pointer-events: none;
18872
- user-select: none;
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);
18873
19964
  }
18874
19965
 
18875
- .crewlet-live-preview[data-frame] > .crewlet-live-preview__live {
18876
- transition: opacity var(--motion-duration-base) var(--motion-easing-out);
19966
+ .crewlet-logo-slot__stage.is-empty {
19967
+ border-style: dashed;
19968
+ border-color: var(--color-border-strong);
18877
19969
  }
18878
19970
 
18879
- .crewlet-live-preview[data-frame][data-state='ready'] > .crewlet-live-preview__live {
18880
- opacity: 1;
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);
18881
19984
  }
18882
19985
 
18883
- /* LAID OUT AT ITS OWN SIZE from the top left corner, and scaled from there:
18884
- to the box's width, its top left the box's, or whole and centred. */
18885
- .crewlet-preview-scale {
19986
+ .crewlet-logo-slot__space.has-guide::after {
19987
+ content: '';
18886
19988
  position: absolute;
18887
19989
  inset: 0;
18888
- display: block;
18889
- overflow: hidden;
19990
+ border: 1px dashed var(--crewlet-logo-slot-ink);
19991
+ border-radius: var(--radius-xs);
19992
+ opacity: 0.5;
19993
+ pointer-events: none;
18890
19994
  }
18891
19995
 
18892
- .crewlet-preview-scale__layer {
18893
- position: absolute;
18894
- top: 0;
18895
- left: 0;
19996
+ .crewlet-logo-slot__image {
18896
19997
  display: block;
18897
- overflow: hidden;
18898
- transform-origin: 0 0;
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;
18899
20001
  }
18900
20002
 
18901
- /* WHAT IS UNDER A DRAWING is hidden only once it has faded in. Fading the
18902
- stand-in out at the same time showed both at half strength halfway
18903
- through: a double exposure. */
18904
- .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
18905
- visibility: hidden;
18906
- /* Visibility is discrete and stays visible for the whole of a transition
18907
- to hidden, so this holds it exactly as long as the fade above. A copy
18908
- given back from the store is ready from its first style, which runs no
18909
- transition, so its stand-in is never shown at all. */
18910
- transition: visibility var(--motion-duration-base) linear;
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;
18911
20012
  }
18912
20013
 
18913
- @media (prefers-reduced-motion: reduce) {
18914
- .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still,
18915
- .crewlet-live-preview[data-frame] > .crewlet-live-preview__live,
18916
- .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
18917
- animation: none;
18918
- transition: none;
18919
- }
20014
+ .crewlet-logo-slot__stage--square .crewlet-logo-slot__placeholder {
20015
+ width: var(--size-row-lg);
18920
20016
  }
18921
20017
 
20018
+ .crewlet-logo-slot__stage.is-uploading .crewlet-logo-slot__space {
20019
+ opacity: 0.5;
20020
+ }
18922
20021
 
18923
- /* LockedLabel-VQEGEB7G.css */
18924
- /*
18925
- * LockedLabel: a place's words with the key after them. The words keep their
18926
- * own ink and size; the key takes the quiet step, a step closer to the words
18927
- * than the words are to anything else.
18928
- */
18929
- .crewlet-locked-label {
18930
- display: inline-flex;
18931
- align-items: center;
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;
18932
20032
  gap: var(--spacing-1);
18933
- min-width: 0;
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);
18934
20037
  }
18935
20038
 
18936
- .crewlet-locked-label__key {
20039
+ .crewlet-logo-slot__error > svg {
18937
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 {
18938
20052
  color: var(--color-text-tertiary);
20053
+ font-size: var(--font-size-xs);
18939
20054
  }
18940
20055
 
18941
20056
 
@@ -19586,7 +20701,7 @@ a.crewlet-icon-btn {
19586
20701
  }
19587
20702
 
19588
20703
 
19589
- /* Modal-TOEWHDCQ.css */
20704
+ /* Modal-3HMP7WAZ.css */
19590
20705
  /*
19591
20706
  * The modal surface: the veil, the frame, and the three bands inside it.
19592
20707
  *
@@ -19701,6 +20816,32 @@ a.crewlet-icon-btn {
19701
20816
  animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
19702
20817
  }
19703
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
+
19704
20845
  /*
19705
20846
  * The sheet's veil fades over the same span the sheet itself travels, so the
19706
20847
  * two are one movement rather than a ground that lands and a panel that
@@ -20173,6 +21314,10 @@ a.crewlet-icon-btn {
20173
21314
  .crewlet-modal-overlay--bottom > .crewlet-modal--dialog {
20174
21315
  animation: none;
20175
21316
  }
21317
+
21318
+ .crewlet-modal-overlay--phone-sheet > .crewlet-modal--dialog {
21319
+ animation: none;
21320
+ }
20176
21321
  }
20177
21322
 
20178
21323
 
@@ -24977,6 +26122,70 @@ svg.crewlet-select__chevron {
24977
26122
  }
24978
26123
 
24979
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
+
24980
26189
  /* SettingsTable-6DUFAFXG.css */
24981
26190
  /*
24982
26191
  * SettingsTable: a read-only table of settings, one row each, on one grid.
@@ -30999,7 +32208,7 @@ b.crewlet-switcher__match {
30999
32208
  }
31000
32209
 
31001
32210
 
31002
- /* ThemeGallery-X35Y25EX.css */
32211
+ /* ThemeGallery-UEFZRT6W.css */
31003
32212
  /*
31004
32213
  * The gallery of themes: each group's heading over a grid of cards.
31005
32214
  *
@@ -31104,6 +32313,27 @@ b.crewlet-switcher__match {
31104
32313
  white-space: nowrap;
31105
32314
  }
31106
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
+
31107
32337
  /*
31108
32338
  * FORCED COLORS keeps the border and drops the accent, so the chosen card
31109
32339
  * would look like every other; the system's own selected colour says it.
@@ -33905,6 +35135,105 @@ svg.crewlet-time-window__tick {
33905
35135
  }
33906
35136
 
33907
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
+
33908
35237
  /* VersionCompare-UUZOPTQO.css */
33909
35238
  /* VersionCompare: a head naming the two versions with the lens switch at its
33910
35239
  end, then the changes or the two versions. */