@crewlethq/ui 0.82.0 → 0.84.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 (185) hide show
  1. package/README.md +63 -1
  2. package/dist/ActionCard/ActionCard.d.ts +7 -7
  3. package/dist/ActionCard/index.js +1 -1
  4. package/dist/ActionCard-YZKL3CKR.css +130 -0
  5. package/dist/AppShell/AccountRow.d.ts +6 -1
  6. package/dist/AppShell/AppShell.d.ts +25 -13
  7. package/dist/AppShell/index.d.ts +1 -1
  8. package/dist/AppShell/index.js +8 -5
  9. package/dist/AppShell/railMotion.d.ts +60 -0
  10. package/dist/AppShell/railShape.d.ts +5 -0
  11. package/dist/{AppShell-F7RID4P4.css → AppShell-NX5HCD4O.css} +251 -90
  12. package/dist/ArrangeList/index.js +3 -2
  13. package/dist/ArtifactBar/index.js +7 -5
  14. package/dist/ArtifactCard/index.js +3 -3
  15. package/dist/ArtifactKindIllustration/index.js +1 -1
  16. package/dist/{ArtifactKinds-3EH4KR3F.css → ArtifactKinds-27TE3KJL.css} +7 -7
  17. package/dist/ArtifactMakeRow/index.js +1 -1
  18. package/dist/ArtifactNameCell/index.js +1 -1
  19. package/dist/AuthLayout/index.js +3 -3
  20. package/dist/AvatarPicker/index.js +7 -6
  21. package/dist/BrandLockup/index.js +2 -2
  22. package/dist/BriefCard/index.js +2 -1
  23. package/dist/Canvas/index.js +4 -2
  24. package/dist/CanvasBoard/index.js +6 -4
  25. package/dist/CanvasToolbar/index.js +5 -3
  26. package/dist/CatalogTile/CatalogTile.d.ts +23 -5
  27. package/dist/CatalogTile/index.d.ts +1 -1
  28. package/dist/CatalogTile/index.js +2 -1
  29. package/dist/{CatalogTile-6VF36JWA.css → CatalogTile-TMOSGSV3.css} +4 -3
  30. package/dist/ChangeMark/index.js +4 -2
  31. package/dist/ChatThread/index.js +2 -2
  32. package/dist/CommandPalette/index.js +3 -2
  33. package/dist/CompactNav/CompactNav.d.ts +10 -6
  34. package/dist/CompactNav/index.js +2 -1
  35. package/dist/ContrastHelp/index.js +3 -2
  36. package/dist/DataGrid/index.js +2 -2
  37. package/dist/DataTable/index.js +4 -3
  38. package/dist/DataView/index.js +8 -7
  39. package/dist/DateTimePicker/index.js +3 -2
  40. package/dist/DeepWorkCard/index.js +2 -2
  41. package/dist/DirectoryList/index.js +1 -1
  42. package/dist/{DirectoryList-XZOWYOA3.css → DirectoryList-IXQIMNFS.css} +8 -1
  43. package/dist/DocTabsEditor/index.js +5 -3
  44. package/dist/DockColumn/DockColumn.d.ts +68 -0
  45. package/dist/DockColumn/index.d.ts +3 -0
  46. package/dist/DockColumn/index.js +6 -0
  47. package/dist/DockColumn-SMJCXHS4.css +61 -0
  48. package/dist/{Editor-7EQWP3RN.js → Editor-VGNB35NJ.js} +2 -1
  49. package/dist/EmojiPicker/index.js +5 -3
  50. package/dist/FactList/index.js +4 -2
  51. package/dist/HuePicker/index.js +5 -4
  52. package/dist/InboxList/InboxList.d.ts +28 -2
  53. package/dist/InboxList/index.d.ts +1 -1
  54. package/dist/InboxList/index.js +6 -1
  55. package/dist/{InboxList-OFGSX5IH.css → InboxList-X5Q5WWAI.css} +63 -2
  56. package/dist/LinkInterstitial/index.js +3 -2
  57. package/dist/ListDetail/ListDetail.d.ts +6 -0
  58. package/dist/ListDetail/index.js +1 -1
  59. package/dist/{ListDetail-N3L7PB46.css → ListDetail-JGESKTR7.css} +38 -0
  60. package/dist/ListInput/index.js +3 -2
  61. package/dist/MarkdownEditor/index.js +5 -4
  62. package/dist/MediaMatch/index.d.ts +1 -1
  63. package/dist/MediaMatch/index.js +1 -1
  64. package/dist/MediaMatch/useMediaMatch.d.ts +14 -0
  65. package/dist/Menu/index.js +2 -1
  66. package/dist/MergeConflicts/index.js +5 -4
  67. package/dist/MessageActions/index.js +6 -4
  68. package/dist/Modal/index.js +2 -1
  69. package/dist/OpenInAppCard/index.js +2 -2
  70. package/dist/Outline/index.js +2 -1
  71. package/dist/Popover/index.js +2 -1
  72. package/dist/Presence/index.d.ts +2 -0
  73. package/dist/Presence/index.js +4 -0
  74. package/dist/Presence/usePresence.d.ts +109 -0
  75. package/dist/ReactionBar/index.js +6 -4
  76. package/dist/ReadingPane/ReadingPane.d.ts +17 -1
  77. package/dist/ReadingPane/index.d.ts +1 -1
  78. package/dist/ReadingPane/index.js +2 -1
  79. package/dist/{ReadingPane-VLYOWMCM.css → ReadingPane-VFTRDPC5.css} +19 -0
  80. package/dist/RecordChip/index.js +3 -2
  81. package/dist/Reorder/index.js +2 -1
  82. package/dist/RichEditor/index.js +1 -1
  83. package/dist/SectionFrame/index.js +2 -2
  84. package/dist/SegmentedControl/index.js +4 -3
  85. package/dist/SetupWizard/index.js +2 -2
  86. package/dist/ShareDialog/index.js +5 -4
  87. package/dist/SheetColumnEditor/index.js +6 -5
  88. package/dist/SheetGrid/index.js +8 -6
  89. package/dist/SidebarNav/SidebarNav.d.ts +18 -2
  90. package/dist/SidebarNav/index.d.ts +1 -1
  91. package/dist/SidebarNav/index.js +1 -1
  92. package/dist/{SidebarNav-E7PZGGA6.css → SidebarNav-IKBKGXW4.css} +20 -0
  93. package/dist/SlideFilmstrip/index.js +5 -3
  94. package/dist/Switcher/index.js +5 -4
  95. package/dist/Tabs/index.js +3 -2
  96. package/dist/ThemeSwitcher/index.js +5 -4
  97. package/dist/TimeRangePicker/index.js +6 -5
  98. package/dist/TimeWindowPicker/index.js +3 -2
  99. package/dist/Tooltip/index.js +3 -1
  100. package/dist/TreeCanvas/index.js +6 -3
  101. package/dist/VersionCompare/index.js +5 -4
  102. package/dist/{chunk-KJR5X4II.js → chunk-22CU7V4J.js} +2 -2
  103. package/dist/{chunk-4RYELYWG.js → chunk-2SVQBQAD.js} +2 -2
  104. package/dist/{chunk-N2T7Y5KR.js → chunk-3AMWXJQX.js} +1 -1
  105. package/dist/{chunk-HQFOZJQ4.js → chunk-46FIBJCV.js} +4 -4
  106. package/dist/{chunk-LQRN2XZK.js → chunk-4DEKONVJ.js} +2 -2
  107. package/dist/chunk-5JPOFAVN.js +58 -0
  108. package/dist/{chunk-C7UHDM7Y.js → chunk-5V6GW6HK.js} +1 -1
  109. package/dist/{chunk-Q7N2ATMC.js → chunk-64JNKLLP.js} +57 -9
  110. package/dist/chunk-6C7GQOBV.js +10 -0
  111. package/dist/{chunk-YRNNUCQP.js → chunk-7BDBO2NP.js} +1 -1
  112. package/dist/{chunk-XGLMPPDW.js → chunk-7K6LVM5I.js} +1 -1
  113. package/dist/{chunk-FKAJBN6G.js → chunk-7M7WKYOV.js} +3 -3
  114. package/dist/{chunk-A5YKNRG6.js → chunk-7QCSISHM.js} +2 -1
  115. package/dist/{chunk-3QQIGMY3.js → chunk-7ZSEUO5Q.js} +6 -30
  116. package/dist/{chunk-57BFL323.js → chunk-ABRWL5FJ.js} +1 -1
  117. package/dist/{chunk-HFOTRZFU.js → chunk-AQNP3KQU.js} +2 -2
  118. package/dist/{chunk-GZVAZ3LL.js → chunk-AZYE7NR4.js} +1 -1
  119. package/dist/{chunk-6IOQWMYJ.js → chunk-BN5FEJL5.js} +1 -1
  120. package/dist/{chunk-25JQNHTC.js → chunk-BRK3HXGZ.js} +8 -2
  121. package/dist/{chunk-MPVMB2DV.js → chunk-BVML4UVB.js} +3 -2
  122. package/dist/{chunk-OAHRMR4U.js → chunk-C42XW5YP.js} +1 -1
  123. package/dist/{chunk-2H6YDUR5.js → chunk-C4JTX25K.js} +3 -3
  124. package/dist/{chunk-QE4OIE3Q.js → chunk-DJIWCW5Z.js} +6 -4
  125. package/dist/{chunk-HA2PL7PA.js → chunk-DRFOTWJE.js} +1 -1
  126. package/dist/{chunk-SM4P2SHB.js → chunk-EC6EUIAD.js} +7 -4
  127. package/dist/{chunk-QPHD4UUG.js → chunk-F6ZUM66S.js} +160 -25
  128. package/dist/{chunk-AMUXSJ2A.js → chunk-FPU7AA3X.js} +4 -15
  129. package/dist/{chunk-KLAVEJIO.js → chunk-GLKQHN7G.js} +1 -1
  130. package/dist/{chunk-MVMVMHYI.js → chunk-HDEKHP65.js} +1 -1
  131. package/dist/{chunk-XY4O2XMR.js → chunk-HKUZ2GYX.js} +4 -4
  132. package/dist/chunk-HTS5RJ7S.js +6 -0
  133. package/dist/{chunk-ZB3E2Z4Y.js → chunk-J5T5TDM2.js} +1 -1
  134. package/dist/{chunk-ISQANI6Q.js → chunk-JLOESTT2.js} +2 -1
  135. package/dist/{chunk-C75WZMXG.js → chunk-K6RWEQ6P.js} +1 -1
  136. package/dist/{chunk-GVPUCEWH.js → chunk-KXWJJWBD.js} +1 -1
  137. package/dist/chunk-L72URIHR.js +36 -0
  138. package/dist/{chunk-2TOGGCDM.js → chunk-LT44RL62.js} +2 -2
  139. package/dist/{chunk-C46DDVTK.js → chunk-LTD7KLOU.js} +1 -1
  140. package/dist/{chunk-HCUECVZ3.js → chunk-MVKUE4FI.js} +1 -1
  141. package/dist/{chunk-6YBBQAEM.js → chunk-MYAARF4Z.js} +1 -1
  142. package/dist/{chunk-SEKO6P3Y.js → chunk-NCUSI4ZU.js} +1 -1
  143. package/dist/{chunk-YBC2CYPD.js → chunk-O4VTQMEF.js} +1 -1
  144. package/dist/{chunk-HTBTAIH6.js → chunk-OM2LABPS.js} +2 -2
  145. package/dist/{chunk-T4IEESXN.js → chunk-ORONAXSF.js} +91 -25
  146. package/dist/chunk-PCAT2EFB.js +104 -0
  147. package/dist/{chunk-GP5TNTZH.js → chunk-QWRAWKB2.js} +53 -14
  148. package/dist/{chunk-TGCGLKD4.js → chunk-RBQRTGXX.js} +1 -1
  149. package/dist/{chunk-B3X4DHRB.js → chunk-RDIQB5ZE.js} +2 -2
  150. package/dist/{chunk-SRDNGGZE.js → chunk-RKIJAXQA.js} +1 -1
  151. package/dist/{chunk-T7WESRZF.js → chunk-RO5JU6SN.js} +2 -2
  152. package/dist/{chunk-IUWP2LSE.js → chunk-SGMWLUYQ.js} +2 -2
  153. package/dist/{chunk-LSOR77RZ.js → chunk-SHH7UD5U.js} +1 -1
  154. package/dist/{chunk-JV6JM6W6.js → chunk-SNQ7PH3D.js} +1 -1
  155. package/dist/{chunk-MPYRC3GO.js → chunk-SPNTUQBV.js} +2 -2
  156. package/dist/{chunk-YM77TZ7Q.js → chunk-T3S3D4FC.js} +1 -1
  157. package/dist/{chunk-YOJAGKTS.js → chunk-TGGYSQRD.js} +3 -4
  158. package/dist/{chunk-2KJCUCVE.js → chunk-TQKQRS2J.js} +2 -2
  159. package/dist/{chunk-ONNXUS5Y.js → chunk-VB3FVKNI.js} +1 -1
  160. package/dist/{chunk-JHQGNFN3.js → chunk-VONEKR3J.js} +2 -2
  161. package/dist/{chunk-P6F3PE4V.js → chunk-WANKINXG.js} +2 -2
  162. package/dist/{chunk-PXLS6JKL.js → chunk-WMO722J2.js} +1 -1
  163. package/dist/{chunk-SYVQXMLO.js → chunk-XRWHDW6F.js} +4 -4
  164. package/dist/{chunk-WT3B76MG.js → chunk-XTJHMP3W.js} +1 -1
  165. package/dist/{chunk-CF4M6N6A.js → chunk-XYSSFI5C.js} +1 -7
  166. package/dist/{chunk-RTPQDNW3.js → chunk-YJQXESOJ.js} +5 -1
  167. package/dist/{chunk-VGOWSOUA.js → chunk-YXKSUILG.js} +1 -1
  168. package/dist/{chunk-G6ZFSUIH.js → chunk-ZJVLGYE3.js} +2 -2
  169. package/dist/{chunk-BSAU7QRW.js → chunk-ZPTKAYJK.js} +1 -1
  170. package/dist/{chunk-XXDB6KPV.js → chunk-ZXXZESCD.js} +3 -4
  171. package/dist/generated/index.d.ts +2 -0
  172. package/dist/generated/index.js +108 -103
  173. package/dist/index.js +108 -103
  174. package/dist/styles.css +525 -134
  175. package/dist/utils/composedRef.d.ts +39 -0
  176. package/dist/utils/developing.d.ts +10 -0
  177. package/dist/utils/index.d.ts +2 -0
  178. package/dist/utils/index.js +3 -1
  179. package/dist/utils/tokenMs.d.ts +6 -0
  180. package/package.json +5 -5
  181. package/dist/ActionCard-47WSZ2O5.css +0 -110
  182. package/dist/{chunk-IYI6HWKN.js → chunk-CV2LU2T2.js} +1 -1
  183. package/dist/{chunk-FVZPSTL2.js → chunk-G4EHZHKM.js} +1 -1
  184. /package/dist/{chunk-FEJANUZK.js → chunk-KBSD476L.js} +0 -0
  185. /package/dist/{chunk-KLWWNV25.js → chunk-REEZQCML.js} +0 -0
package/dist/styles.css CHANGED
@@ -109,13 +109,15 @@
109
109
  }
110
110
 
111
111
 
112
- /* ActionCard-47WSZ2O5.css */
112
+ /* ActionCard-YZKL3CKR.css */
113
113
  /*
114
- * ActionCard: a first step offered as a picture, on an artifact kind's
115
- * colour ground. The ground is the kind's own Ground steps (ArtifactKinds.css)
116
- * laid over the card rung, which the palette suite holds to 4.5:1 for the
117
- * primary text in every palette and both modes, with the kind's glow behind
118
- * the drawing.
114
+ * ActionCard: a first step offered as a picture, on a CALM TINT of an
115
+ * artifact kind's hue. The ground is the kind's own Ground steps
116
+ * (ArtifactKinds.css): the card rung tinted by a share of the hue's chroma,
117
+ * never a slab of it, which the palette suite holds to 4.5:1 for the primary
118
+ * text in every palette and both modes and to a chroma ceiling. The edge is
119
+ * the kind's hue stepped toward the ink until it clears 3:1, a step further
120
+ * under the pointer, and a soft halo of the hue stands behind the drawing.
119
121
  */
120
122
 
121
123
  /*
@@ -143,6 +145,7 @@
143
145
 
144
146
  .crewlet-action-card {
145
147
  --crewlet-action-card-ground: var(--crewlet-kind-ground);
148
+ --crewlet-action-card-edge: var(--crewlet-kind-edge);
146
149
  position: relative;
147
150
  display: flex;
148
151
  flex: none;
@@ -153,30 +156,41 @@
153
156
  box-sizing: border-box;
154
157
  overflow: hidden;
155
158
  padding: var(--spacing-3) var(--spacing-3) 0;
156
- /* The kind's hue itself is the edge: 3:1 or more on the sheet in every
157
- palette and mode, where the kind's Line step measured 2.5:1. */
158
- border: 1px solid var(--crewlet-kind-hue);
159
- border-radius: var(--radius-lg);
159
+ /* THE KIND'S OWN EDGE: its hue stepped toward the ink until it clears 3:1
160
+ on the sheet and on the card's tint (`--color-artifact-kind-<kind>-edge`,
161
+ derived by the tokens build and held by its suite). The Line step, the
162
+ hue at 0.38, did not clear it, and a neutral grey outline read as a card
163
+ from another family. */
164
+ border: 1px solid var(--crewlet-action-card-edge);
165
+ /* The edge scale: the extra-large corner a tall card of its own takes, and
166
+ the smallest shadow, so the card sits on the page rather than in it. */
167
+ border-radius: var(--radius-xl);
160
168
  background-color: var(--color-surface-subtle);
161
169
  background-image:
162
- radial-gradient(110% 64% at 50% 100%, var(--crewlet-kind-glow) 0%, transparent 72%),
170
+ radial-gradient(90% 56% at 50% 100%, var(--crewlet-kind-glow) 0%, transparent 72%),
163
171
  linear-gradient(180deg, var(--crewlet-action-card-ground) 0%, var(--crewlet-kind-ground-end) 100%);
172
+ box-shadow: var(--shadow-xs);
164
173
  color: var(--color-text-primary);
165
174
  font: inherit;
166
175
  text-align: left;
167
176
  cursor: pointer;
168
177
  scroll-snap-align: start;
169
- transition: box-shadow var(--motion-duration-fast) var(--motion-easing-default);
178
+ transition:
179
+ box-shadow var(--motion-duration-fast) var(--motion-easing-default),
180
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
170
181
  }
171
182
 
172
- /* A QUIET HOVER: the ground deepens a step and a small shadow lifts the
173
- card off the page. Nothing moves. */
183
+ /* A QUIET HOVER: the tint deepens a step, the edge takes a stronger step of
184
+ the hue, and a small shadow lifts the card off the page. Nothing moves, so
185
+ a row of cards stays still under a pointer passing over it. */
174
186
  .crewlet-action-card:hover {
175
187
  --crewlet-action-card-ground: var(--crewlet-kind-ground-strong);
188
+ --crewlet-action-card-edge: var(--crewlet-kind-edge-strong);
176
189
  box-shadow: var(--shadow-sm);
177
190
  }
178
191
 
179
- /* The card draws its own edge, so the ring is drawn over it. */
192
+ /* The card draws its own edge, so the ring is drawn over it, on the same
193
+ corner. */
180
194
  .crewlet-action-card:focus-visible {
181
195
  outline: 2px solid var(--color-focus);
182
196
  outline-offset: var(--size-focus-ring-inset-offset);
@@ -192,23 +206,29 @@
192
206
  text-wrap: balance;
193
207
  }
194
208
 
195
- /* The drawing stands on the card's foot, still. */
209
+ /*
210
+ * THE DRAWING STANDS ON THE CARD'S FOOT, still, the card's own width less its
211
+ * inset. Every kind's drawing is one canvas (160 by 120), so each takes the
212
+ * same box whatever its shape, a tall page and a wide slide alike, where a
213
+ * fixed width and a height cap drew a page half the size of a slide. It is
214
+ * set a step into the foot, so it stands on the edge rather than floating
215
+ * above it, on a soft shadow of the kind's Fill.
216
+ */
196
217
  .crewlet-action-card__art {
197
218
  display: flex;
198
219
  align-items: flex-end;
199
220
  justify-content: center;
200
- height: 100px;
201
- margin: 0 calc(var(--spacing-3) * -1);
221
+ margin-bottom: calc(var(--spacing-2) * -1);
202
222
  }
203
223
 
204
224
  .crewlet-action-card__art .crewlet-kind-illustration {
205
- width: 112px;
206
- max-height: 96px;
207
- margin-bottom: calc(var(--spacing-2) * -1);
208
- filter: drop-shadow(0 6px 12px var(--crewlet-kind-line));
225
+ width: 100%;
226
+ height: auto;
227
+ filter: drop-shadow(0 4px 10px var(--crewlet-kind-fill));
209
228
  }
210
229
 
211
- /* FORCED COLORS drops the ground; the hue's border stays as the card's edge. */
230
+ /* FORCED COLORS drops the ground and the hue; the edge is drawn in the
231
+ system's text colour, so the card keeps its outline. */
212
232
  @media (forced-colors: active) {
213
233
  .crewlet-action-card {
214
234
  border-color: CanvasText;
@@ -944,7 +964,7 @@
944
964
  }
945
965
 
946
966
 
947
- /* AppShell-F7RID4P4.css */
967
+ /* AppShell-NX5HCD4O.css */
948
968
  /*
949
969
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
950
970
  * floats beside it.
@@ -973,31 +993,46 @@
973
993
  .crewlet-app-shell {
974
994
  --crewlet-app-shell-rail: var(--size-shell-rail);
975
995
  --crewlet-app-shell-topbar: var(--size-shell-topbar);
996
+ /* THE SHEET'S SIDE INSET, ONE LENGTH: the bar's, the content column's, and
997
+ the inset a box that reaches past the column to the sheet's edge keeps
998
+ inside itself (a `ListDetail` on a fill screen), one step narrower on a
999
+ narrow window. */
1000
+ --crewlet-app-shell-inset: var(--spacing-5);
976
1001
  /* What stands on the frame to the sheet's left: the rail's column, or
977
- nothing where there is no rail or the rail is a drawer. The aside's cap
978
- below subtracts it, so it is one name for both. */
1002
+ nothing where there is no rail or the rail is a drawer. */
979
1003
  --crewlet-app-shell-beside: var(--crewlet-app-shell-rail);
980
- /* THE ASIDE'S TRACK, while it is a column: the panel's width and the inset
981
- it is held off the window's edge by, capped so the sheet keeps the
982
- host's floor (`--crewlet-app-shell-aside-reserve`, the page's sheet with
983
- its own inset and hairlines). The host publishes both widths on this
984
- element; with no reserve the panel takes the width it was given. */
985
- --crewlet-app-shell-aside-track: calc(
986
- min(
987
- var(--crewlet-app-shell-aside),
988
- max(
989
- 0px,
990
- 100% - var(--crewlet-app-shell-beside) - var(--crewlet-app-shell-aside-reserve, 0px) - var(--size-shell-inset)
991
- )
992
- ) +
993
- var(--size-shell-inset)
1004
+ /*
1005
+ * THE ASIDE'S TRACK, while it is a column: the inset it is held off the
1006
+ * window's edge by at least, and the panel's width and that inset at most.
1007
+ * THE CAP IS THE GRID'S. The page's sheet takes the host's floor as its
1008
+ * own track's minimum (`--crewlet-app-shell-aside-reserve`, the page's sheet
1009
+ * with its own inset and hairlines), and the grid hands the aside what is
1010
+ * left once the rail and that floor have theirs, up to its width. The rail's
1011
+ * track is the rail's live width, so while the rail eases between its
1012
+ * shapes the cap eases with it: a cap computed from the rail's VARIABLE
1013
+ * named the shape drawn, and jumped at both ends of a fold. With no reserve
1014
+ * the panel takes the width it was given, as far as the window holds it.
1015
+ */
1016
+ --crewlet-app-shell-aside-track: minmax(
1017
+ var(--size-shell-inset),
1018
+ calc(var(--crewlet-app-shell-aside) + var(--size-shell-inset))
1019
+ );
1020
+ /* The page's floor beside an aside column, never more than the window
1021
+ leaves it: on a window too narrow for the floor, the page gives way rather
1022
+ than the shell growing past the window's edge. */
1023
+ --crewlet-app-shell-sheet-floor: min(
1024
+ var(--crewlet-app-shell-aside-reserve, 0px),
1025
+ max(0px, 100% - var(--crewlet-app-shell-beside) - var(--size-shell-inset))
994
1026
  );
995
1027
  /* Where the drawer's veil sits while it is open. The shell replaces it with
996
1028
  the surface's own place in the layer band; this default only has to clear
997
1029
  the page chrome for the moment before that lands. */
998
1030
  --crewlet-app-shell-drawer-z: var(--z-index-overlay);
999
1031
  display: grid;
1000
- grid-template-columns: var(--crewlet-app-shell-rail) minmax(0, 1fr);
1032
+ /* The rail's track is the rail's own width (`auto`), and the rail takes
1033
+ `--crewlet-app-shell-rail` itself, so the track follows it while it eases
1034
+ between its two shapes (see the rail's motion, below). */
1035
+ grid-template-columns: auto minmax(0, 1fr);
1001
1036
  /* One row, the viewport's height less nothing: the sheet's own margin is
1002
1037
  what holds it off the frame's edges, and a row sized by its content would
1003
1038
  let a tall screen push the sheet's bottom edge off the window. */
@@ -1036,11 +1071,11 @@
1036
1071
  keeps its column and is only narrower, so nothing under the bar moves but
1037
1072
  its end edge. */
1038
1073
  .crewlet-app-shell[data-aside='column'] {
1039
- grid-template-columns: var(--crewlet-app-shell-rail) minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
1074
+ grid-template-columns: auto minmax(var(--crewlet-app-shell-sheet-floor), 1fr) var(--crewlet-app-shell-aside-track);
1040
1075
  }
1041
1076
 
1042
1077
  .crewlet-app-shell--no-rail[data-aside='column'] {
1043
- grid-template-columns: minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
1078
+ grid-template-columns: minmax(var(--crewlet-app-shell-sheet-floor), 1fr) var(--crewlet-app-shell-aside-track);
1044
1079
  }
1045
1080
 
1046
1081
  /* The skip link, drawn only while it holds focus, over everything. */
@@ -1086,14 +1121,25 @@
1086
1121
  position: relative;
1087
1122
  display: flex;
1088
1123
  flex-direction: column;
1124
+ width: var(--crewlet-app-shell-rail);
1089
1125
  min-height: 0;
1090
1126
  min-width: 0;
1127
+ /* THE MOVING EDGE CUTS WHAT IT PASSES. While the rail eases between its
1128
+ shapes its content keeps the width of the shape drawn (below), and the
1129
+ edge clips it rather than squeezing it. Across only: a ring or a badge
1130
+ at a row's top or bottom is never cut. */
1131
+ overflow-x: clip;
1091
1132
  background: var(--color-surface-frame);
1133
+ transition: width var(--motion-duration-slow) var(--motion-easing-emphasized);
1092
1134
  }
1093
1135
 
1136
+ /* THE CONTENT IS LAID OUT AT ITS SHAPE'S WIDTH, never at a width between the
1137
+ two, so no word in the rail rewraps while it moves and nothing drifts with
1138
+ the edge: the column stands still and the edge travels over it. */
1094
1139
  .crewlet-app-shell__rail-inner {
1095
1140
  display: flex;
1096
1141
  flex-direction: column;
1142
+ width: var(--crewlet-app-shell-rail);
1097
1143
  min-height: 0;
1098
1144
  height: 100%;
1099
1145
  }
@@ -1554,7 +1600,8 @@
1554
1600
  gap: var(--spacing-3);
1555
1601
  flex: none;
1556
1602
  height: var(--crewlet-app-shell-topbar);
1557
- padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
1603
+ padding: 0 calc(var(--crewlet-app-shell-inset) + var(--crewlet-app-shell-gutter, 0px)) 0
1604
+ var(--crewlet-app-shell-inset);
1558
1605
  border-bottom: 1px solid var(--color-border-default);
1559
1606
  background: var(--color-surface-background);
1560
1607
  }
@@ -1644,46 +1691,76 @@
1644
1691
  gap: var(--spacing-5);
1645
1692
  max-width: var(--size-content-max);
1646
1693
  margin: 0 auto;
1647
- padding: var(--spacing-5) var(--spacing-5);
1694
+ padding: var(--crewlet-app-shell-inset);
1648
1695
  padding-bottom: var(--crewlet-app-shell-content-end);
1649
1696
  min-width: 0;
1650
1697
  }
1651
1698
 
1652
- /* A screen that draws to the bottom of the window: the scroller stops
1653
- scrolling and the content column takes the height that is left.
1654
-
1655
- IT KEEPS THE GUTTER RESERVED, like every other screen. The top bar's end
1656
- inset counts the scroller's gutter (`--crewlet-app-shell-gutter`, measured
1657
- by the shell), so a fill screen that reserved none put the bar's controls
1658
- one gutter further out than on the screen beside it: with classic
1659
- scrollbars, Add seat moved 11px between an org chart and its roster, two
1660
- tabs of one page. A strip at the end edge of a full-screen canvas is the
1661
- smaller cost than a bar that moves under the pointer. */
1699
+ /*
1700
+ * A screen that draws to the bottom of the window: the scroller stops
1701
+ * scrolling and the content column takes the height that is left, and the
1702
+ * whole width, since a screen that fills the window is a frame for panes
1703
+ * rather than a page of prose (prose inside it keeps its own measure).
1704
+ *
1705
+ * THE SCROLLER RESERVES NO GUTTER; THE COLUMN PADS BY IT INSTEAD. Nothing
1706
+ * scrolls here, so the strip a scrolling screen keeps for its scrollbar is
1707
+ * only there to hold the content where the bar's controls expect it (the
1708
+ * bar's end inset counts the gutter). A reserved strip did that, and also
1709
+ * stood between the sheet's edge and every pane that scrolls on its own: a
1710
+ * list's detail drew its scrollbar 31px inside the sheet, beside an empty
1711
+ * strip, and nothing in the screen could paint over a reserved gutter. The
1712
+ * same length as padding holds the content exactly where it stood, and a box
1713
+ * standing in the column can reach past padding: the column publishes it as
1714
+ * `--crewlet-app-shell-bleed-end`, and a `ListDetail` takes it back so its
1715
+ * scrollbar is the sheet's last pixel. The scrollbar's width is read off the
1716
+ * shell's gauge here (AppShell.tsx), so the bar keeps its place between a
1717
+ * fill screen and a scrolling one.
1718
+ */
1662
1719
  .crewlet-app-shell--fill .crewlet-app-shell__main {
1663
1720
  overflow: hidden;
1721
+ scrollbar-gutter: auto;
1664
1722
  }
1665
1723
 
1666
1724
  .crewlet-app-shell--fill .crewlet-app-shell__content {
1667
1725
  --crewlet-app-shell-content-end: var(--spacing-5);
1726
+ --crewlet-app-shell-bleed-end: calc(var(--crewlet-app-shell-inset) + var(--crewlet-app-shell-gutter, 0px));
1668
1727
 
1669
1728
  height: 100%;
1729
+ max-width: none;
1730
+ padding-right: var(--crewlet-app-shell-bleed-end);
1670
1731
  }
1671
1732
 
1672
1733
  /*
1673
- * A FLUSH SCREEN draws its own frame to the sheet's edges: the column gives up
1674
- * its pad, its measure and its gap, and the scroller reserves no gutter, since
1675
- * nothing in it scrolls and a strip at its end would cut the screen's own
1676
- * edge. The column is the containing block for a `LayerHost` the screen
1677
- * keeps, so its layers fill the screen rather than the window.
1734
+ * THE GAUGE: an empty scroller, never seen, that always draws its scrollbar,
1735
+ * so the shell can read the scrollbar's width on a fill screen, where the
1736
+ * screen's own scroller reserves none. It is a row of no height in the
1737
+ * sheet's column, clipped, so it takes no room and moves nothing; the ruler
1738
+ * inside it has a height of its own, because a scroller of no height draws
1739
+ * no scrollbar in Firefox and measured 0 there.
1678
1740
  */
1679
- .crewlet-app-shell--fill-flush .crewlet-app-shell__main {
1680
- scrollbar-gutter: auto;
1741
+ .crewlet-app-shell__gauge {
1742
+ flex: none;
1743
+ height: 0;
1744
+ overflow: hidden;
1745
+ visibility: hidden;
1746
+ }
1747
+
1748
+ .crewlet-app-shell__gauge-ruler {
1749
+ height: var(--size-target-min);
1750
+ overflow-y: scroll;
1681
1751
  }
1682
1752
 
1753
+ /*
1754
+ * A FLUSH SCREEN draws its own frame to the sheet's edges: the column gives up
1755
+ * its pad and its gap as well, so there is nothing for a box in it to reach
1756
+ * past. The column is the containing block for a `LayerHost` the screen
1757
+ * keeps, so its layers fill the screen rather than the window.
1758
+ */
1683
1759
  .crewlet-app-shell--fill-flush .crewlet-app-shell__content {
1760
+ --crewlet-app-shell-bleed-end: 0px;
1761
+
1684
1762
  position: relative;
1685
1763
  gap: 0;
1686
- max-width: none;
1687
1764
  padding: 0;
1688
1765
  }
1689
1766
 
@@ -1837,7 +1914,7 @@
1837
1914
  }
1838
1915
 
1839
1916
  /*
1840
- * THE COMPACT RAIL: the same track, narrowed to the compact column. One
1917
+ * THE COMPACT RAIL: the same rail, narrowed to the compact column. One
1841
1918
  * variable is the rail's width for the grid, the aside's cap and the drawer
1842
1919
  * alike, so folding the rail is this one declaration. The shell writes the
1843
1920
  * attribute only where the layout is wide: the drawer under the step is
@@ -1848,21 +1925,33 @@
1848
1925
  }
1849
1926
 
1850
1927
  /*
1851
- * THE FOLD CONTROL stands over the compact column's centre, in the row under
1852
- * the head, in both shapes, so it never moves under the pointer that pressed
1853
- * it. Quiet until the rail is pointed at: the tertiary ink, which holds 3:1
1854
- * on the frame, then the secondary, and the ghost's own primary under the
1855
- * pointer.
1928
+ * THE FOLD CONTROL stands on the head's row, before the brand's mark, in both
1929
+ * shapes, so it never moves under the pointer that pressed it: chevrons
1930
+ * pointing left to fold the rail and right to unfold it.
1931
+ *
1932
+ * THE CONTROL AND THE MARK ARE ONE PAIR: the control at the target floor
1933
+ * (`--size-target-min`, at every density), a step (`--spacing-1`), then the
1934
+ * mark, which is a target's size too, the pair centred in the compact column
1935
+ * so the 76px column holds both (12 + 24 + 4 + 24 + 12). The control is
1936
+ * centred on the bar's line as the mark is: the inset, then half of what the
1937
+ * bar leaves round it. The mark's inset below is the same arithmetic from the
1938
+ * other side.
1939
+ *
1940
+ * Quiet until the rail is pointed at: the tertiary ink, which holds 3:1 on
1941
+ * the frame, then the secondary, and the ghost's own primary under the
1942
+ * pointer. Its ring is drawn inside its own box, clear of the mark beside it.
1856
1943
  */
1857
1944
  .crewlet-app-shell__fold {
1858
1945
  position: absolute;
1859
- top: calc(var(--size-shell-inset) + var(--crewlet-app-shell-topbar));
1860
- left: calc((var(--size-shell-rail-compact) - var(--size-control-sm)) / 2);
1946
+ top: calc(var(--size-shell-inset) + (var(--crewlet-app-shell-topbar) - var(--size-target-min)) / 2);
1947
+ left: calc((var(--size-shell-rail-compact) - 2 * var(--size-target-min) - var(--spacing-1)) / 2);
1861
1948
  z-index: 1;
1862
1949
  display: inline-flex;
1863
1950
  }
1864
1951
 
1865
1952
  .crewlet-app-shell__fold > .crewlet-icon-btn {
1953
+ width: var(--size-target-min);
1954
+ height: var(--size-target-min);
1866
1955
  color: var(--color-text-tertiary);
1867
1956
  }
1868
1957
 
@@ -1870,14 +1959,25 @@
1870
1959
  color: var(--color-text-secondary);
1871
1960
  }
1872
1961
 
1962
+ .crewlet-app-shell__fold > .crewlet-icon-btn:focus-visible {
1963
+ outline-offset: var(--size-focus-ring-inset-offset);
1964
+ }
1965
+
1873
1966
  /*
1874
- * THE MARK STANDS WHERE THE COMPACT RAIL'S DOES, in both shapes: centred over
1875
- * the compact column, in the head. Full, the name follows it; compact, the
1876
- * name is not drawn (the link keeps it as its name and title).
1967
+ * THE MARK STANDS WHERE THE COMPACT RAIL'S DOES, in both shapes. With no fold
1968
+ * control it is centred over the compact column; beside the fold control it
1969
+ * is the second of the pair (above), a step after the control, which is half
1970
+ * the column and half the step in. Full, the name follows it; compact, the
1971
+ * name is not drawn (the link keeps it as its name and title), and the
1972
+ * lockup's end inset is given up, so the mark is all the column holds.
1877
1973
  */
1878
- .crewlet-app-shell--foldable .crewlet-app-shell__rail-head > .crewlet-brand,
1879
1974
  .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-head > .crewlet-brand {
1880
1975
  padding-left: calc((var(--size-shell-rail-compact) - var(--crewlet-brand-mark)) / 2);
1976
+ padding-right: 0;
1977
+ }
1978
+
1979
+ .crewlet-app-shell--foldable[data-rail] .crewlet-app-shell__rail-head > .crewlet-brand {
1980
+ padding-left: calc((var(--size-shell-rail-compact) + var(--spacing-1)) / 2);
1881
1981
  }
1882
1982
 
1883
1983
  .crewlet-app-shell[data-rail='compact'] .crewlet-brand__name,
@@ -1886,30 +1986,16 @@
1886
1986
  }
1887
1987
 
1888
1988
  /*
1889
- * FULL, THE FIELD STARTS AFTER THE FOLD CONTROL, a step off it, on the row
1890
- * the control stands in. The field holds its place at the top of the rail's
1891
- * middle while the rows scroll under it, on the frame's own ground, so the
1892
- * control beside it is always beside it.
1989
+ * COMPACT, THE STATUS HAS A ROW OF ITS OWN under the mark, a small control
1990
+ * step tall, its dot and its count centred in the column: the first thing
1991
+ * under the head, before the places, where the fold control stood before it
1992
+ * moved to the corner.
1893
1993
  */
1894
- /* The middle is a stacking context of its own, so the field pinned in it
1895
- stands over the rows scrolling under it and the whole middle stands under
1896
- the fold control, which is painted a step above the rail. */
1897
- .crewlet-app-shell--foldable .crewlet-app-shell__rail-body {
1898
- isolation: isolate;
1899
- }
1900
-
1901
- .crewlet-app-shell--foldable[data-rail='full'] .crewlet-app-shell__rail-search {
1902
- position: sticky;
1903
- top: 0;
1904
- z-index: 1;
1905
- padding-left: calc((var(--size-shell-rail-compact) + var(--size-control-sm)) / 2 + var(--spacing-2));
1906
- background: var(--color-surface-frame);
1907
- }
1908
-
1909
- /* COMPACT, THE FOLD CONTROL HAS A ROW OF ITS OWN under the mark, which the
1910
- head leaves room for, and the column of tiles starts under it. */
1911
- .crewlet-app-shell--foldable[data-rail='compact'] .crewlet-app-shell__rail-head {
1912
- margin-bottom: var(--size-control-sm);
1994
+ .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-inner > .crewlet-app-shell__rail-status {
1995
+ justify-content: center;
1996
+ min-width: 0;
1997
+ min-height: var(--size-control-sm);
1998
+ margin: 0;
1913
1999
  }
1914
2000
 
1915
2001
  .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-body {
@@ -1919,7 +2005,7 @@
1919
2005
 
1920
2006
  /*
1921
2007
  * The compact foot: what the full foot holds, centred in the column, a step
1922
- * apart: the status's dot, a Settings tile, the reader's face.
2008
+ * apart: a Settings tile, the reader's face.
1923
2009
  */
1924
2010
  .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-foot {
1925
2011
  align-items: center;
@@ -1931,15 +2017,93 @@
1931
2017
  align-self: stretch;
1932
2018
  }
1933
2019
 
1934
- .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-foot > .crewlet-app-shell__rail-status {
1935
- justify-content: center;
1936
- min-width: 0;
1937
- margin: 0;
2020
+ /*
2021
+ * THE COMPACT FACE IS CENTRED ON THE TILES' LINE. It gives up the full row's
2022
+ * badge column and the step after it (above): kept, the step stood the face
2023
+ * 4px left of the column's centre, in a box 8px wider than the face, so the
2024
+ * face sat off the line every tile above it is centred on.
2025
+ */
2026
+ .crewlet-app-shell__rail-foot .crewlet-account-row--compact .crewlet-account-row__avatar {
2027
+ width: auto;
2028
+ margin-inline-end: 0;
2029
+ }
2030
+
2031
+ /*
2032
+ * THE RAIL'S MOTION (railMotion.ts). The rail's width eases between the two
2033
+ * shapes on the slow step with the emphasized curve, the motion a
2034
+ * `DockColumn` opens and closes by, so a column of the frame and a column of
2035
+ * a screen move as one. What the rail holds keeps the width of the shape
2036
+ * drawn, so the moving edge clips the words rather than squeezing them.
2037
+ *
2038
+ * FOLDING, the full rail stays drawn, inert, while the edge narrows to the
2039
+ * compact column, and its words fade out on the base step; the compact column
2040
+ * is drawn when the rail's motion has ended, and fades in on the fast step.
2041
+ * UNFOLDING, the full rail is drawn at once and fades in while the edge
2042
+ * uncovers it. The brand's mark and the fold control are in the same place in
2043
+ * both shapes, so neither fades.
2044
+ *
2045
+ * THE WORDS LEAVE BY A TRANSITION and arrive by keyframes. A fold takes their
2046
+ * opacity to nothing; a fold pressed again mid way (`reverse`) declares
2047
+ * nothing of its own, so the same transition takes the opacity back from
2048
+ * wherever it had reached. Faded out by keyframes instead, a reversal could
2049
+ * only start an entrance from nothing, and the words blinked out and back.
2050
+ * The transition is declared only while the rail moves, so nothing else that
2051
+ * sets these parts' opacity is eased.
2052
+ */
2053
+ .crewlet-app-shell[data-rail-motion='fold'] > .crewlet-app-shell__rail {
2054
+ width: var(--size-shell-rail-compact);
2055
+ }
2056
+
2057
+ /* Two names for one entrance, so an unfold pressed while the compact column
2058
+ is still arriving starts the full rail's entrance afresh. */
2059
+ @keyframes crewlet-app-shell-rail-unfold {
2060
+ from {
2061
+ opacity: 0;
2062
+ }
2063
+ }
2064
+
2065
+ @keyframes crewlet-app-shell-rail-settle {
2066
+ from {
2067
+ opacity: 0;
2068
+ }
2069
+ }
2070
+
2071
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-body,
2072
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-foot,
2073
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-status,
2074
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__name,
2075
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__context {
2076
+ transition: opacity var(--motion-duration-base) var(--motion-easing-out);
2077
+ }
2078
+
2079
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-body,
2080
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-foot,
2081
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-status,
2082
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-head .crewlet-brand__name,
2083
+ .crewlet-app-shell[data-rail-motion='fold'] .crewlet-app-shell__rail-head .crewlet-brand__context {
2084
+ opacity: 0;
2085
+ }
2086
+
2087
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-body,
2088
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-foot,
2089
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-status,
2090
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__name,
2091
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__context {
2092
+ animation: crewlet-app-shell-rail-unfold var(--motion-duration-slow) var(--motion-easing-out);
2093
+ }
2094
+
2095
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-body,
2096
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-foot,
2097
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-status {
2098
+ animation: crewlet-app-shell-rail-settle var(--motion-duration-fast) var(--motion-easing-out);
1938
2099
  }
1939
2100
 
1940
2101
  @media (width < 1024px) {
1941
2102
  .crewlet-app-shell {
1942
2103
  --crewlet-app-shell-beside: 0px;
2104
+ /* 16px: the content's 12px stood every page's first line 4px left of
2105
+ the bar's title and the controls over it. */
2106
+ --crewlet-app-shell-inset: var(--spacing-4);
1943
2107
  grid-template-columns: minmax(0, 1fr);
1944
2108
  }
1945
2109
 
@@ -1947,7 +2111,7 @@
1947
2111
  step is still a column; the rail is a drawer here and takes no track. */
1948
2112
  .crewlet-app-shell[data-aside='column'],
1949
2113
  .crewlet-app-shell--no-rail[data-aside='column'] {
1950
- grid-template-columns: minmax(0, 1fr) var(--crewlet-app-shell-aside-track);
2114
+ grid-template-columns: minmax(var(--crewlet-app-shell-sheet-floor), 1fr) var(--crewlet-app-shell-aside-track);
1951
2115
  }
1952
2116
 
1953
2117
  .crewlet-app-shell--no-rail {
@@ -2012,22 +2176,18 @@
2012
2176
  transition: transform var(--motion-duration-slow) var(--motion-easing-emphasized);
2013
2177
  }
2014
2178
 
2015
- .crewlet-app-shell__toggle {
2016
- display: inline-flex;
2179
+ /* The drawer never changes shape, and on a window narrower than the rail
2180
+ it is the window's width: its content fills it rather than being cut. */
2181
+ .crewlet-app-shell__rail-inner {
2182
+ width: auto;
2017
2183
  }
2018
2184
 
2019
- /* THE TOP BAR'S GUTTER, 16px: the content's 12px stood every page's first
2020
- line 4px left of the title and the controls over it. The bar and the
2021
- content take it together. */
2022
- .crewlet-app-shell__topbar {
2023
- padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
2185
+ .crewlet-app-shell__toggle {
2186
+ display: inline-flex;
2024
2187
  }
2025
2188
 
2026
2189
  .crewlet-app-shell__content {
2027
2190
  --crewlet-app-shell-content-end: var(--spacing-9);
2028
-
2029
- padding: var(--spacing-4) var(--spacing-4);
2030
- padding-bottom: var(--crewlet-app-shell-content-end);
2031
2191
  }
2032
2192
  }
2033
2193
 
@@ -2046,6 +2206,27 @@
2046
2206
  .crewlet-app-shell__aside[data-shape='sheet'] {
2047
2207
  animation: none;
2048
2208
  }
2209
+
2210
+ /* Under reduced motion the shell draws the new shape at once
2211
+ (`usePresence`), so no phase starts; these hold even if one did. */
2212
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-body,
2213
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-foot,
2214
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-status,
2215
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__name,
2216
+ .crewlet-app-shell[data-rail-motion] .crewlet-app-shell__rail-head .crewlet-brand__context {
2217
+ transition: none;
2218
+ }
2219
+
2220
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-body,
2221
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-foot,
2222
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-status,
2223
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__name,
2224
+ .crewlet-app-shell[data-rail-motion='unfold'] .crewlet-app-shell__rail-head .crewlet-brand__context,
2225
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-body,
2226
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-foot,
2227
+ .crewlet-app-shell[data-rail-motion='folded'] .crewlet-app-shell__rail-status {
2228
+ animation: none;
2229
+ }
2049
2230
  }
2050
2231
 
2051
2232
  /* ── the account row ───────────────────────────────────────────────────── */
@@ -4344,7 +4525,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
4344
4525
  }
4345
4526
 
4346
4527
 
4347
- /* ArtifactKinds-3EH4KR3F.css */
4528
+ /* ArtifactKinds-27TE3KJL.css */
4348
4529
  /*
4349
4530
  * A kind's colours, set once per kind on `--crewlet-kind-*` by its class
4350
4531
  * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps, the ink a
@@ -4356,13 +4537,13 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
4356
4537
  * its own, imported by each surface that tints, because the glyph's module
4357
4538
  * carries no stylesheet (a frame that draws one glyph takes nothing else).
4358
4539
  */
4359
- .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); --crewlet-kind-ground: var(--color-artifact-kind-doc-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-doc-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-doc-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-doc-glow); }
4360
- .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); --crewlet-kind-ground: var(--color-artifact-kind-slides-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-slides-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-slides-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-slides-glow); }
4361
- .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); --crewlet-kind-ground: var(--color-artifact-kind-design-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-design-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-design-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-design-glow); }
4362
- .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); --crewlet-kind-ground: var(--color-artifact-kind-dashboard-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-dashboard-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-dashboard-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-dashboard-glow); }
4363
- .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); --crewlet-kind-ground: var(--color-artifact-kind-html-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-html-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-html-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-html-glow); }
4364
- .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); --crewlet-kind-ground: var(--color-artifact-kind-brand-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-brand-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-brand-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-brand-glow); }
4365
- .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); --crewlet-kind-ground: var(--color-artifact-kind-sheet-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-sheet-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-sheet-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-sheet-glow); }
4540
+ .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); --crewlet-kind-ground: var(--color-artifact-kind-doc-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-doc-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-doc-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-doc-glow); --crewlet-kind-edge: var(--color-artifact-kind-doc-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-doc-edge-strong); }
4541
+ .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); --crewlet-kind-ground: var(--color-artifact-kind-slides-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-slides-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-slides-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-slides-glow); --crewlet-kind-edge: var(--color-artifact-kind-slides-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-slides-edge-strong); }
4542
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-design-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-design-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-design-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-design-glow); --crewlet-kind-edge: var(--color-artifact-kind-design-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-design-edge-strong); }
4543
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-dashboard-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-dashboard-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-dashboard-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-dashboard-glow); --crewlet-kind-edge: var(--color-artifact-kind-dashboard-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-dashboard-edge-strong); }
4544
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-html-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-html-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-html-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-html-glow); --crewlet-kind-edge: var(--color-artifact-kind-html-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-html-edge-strong); }
4545
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-brand-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-brand-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-brand-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-brand-glow); --crewlet-kind-edge: var(--color-artifact-kind-brand-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-brand-edge-strong); }
4546
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-sheet-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-sheet-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-sheet-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-sheet-glow); --crewlet-kind-edge: var(--color-artifact-kind-sheet-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-sheet-edge-strong); }
4366
4547
 
4367
4548
 
4368
4549
  /* ArtifactMakeRow-6UX2LTF7.css */
@@ -8557,7 +8738,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8557
8738
  }
8558
8739
 
8559
8740
 
8560
- /* CatalogTile-6VF36JWA.css */
8741
+ /* CatalogTile-TMOSGSV3.css */
8561
8742
  /*
8562
8743
  * CatalogTile: mark, name and state, one sentence, and a foot with a quiet
8563
8744
  * fact and one action.
@@ -8639,9 +8820,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8639
8820
  overflow-wrap: anywhere;
8640
8821
  }
8641
8822
 
8642
- /* A state in words (a StatusDot's label) at a Tag's caption step, so a row
8643
- reads the same whichever one a tile carries. It inherited the page's size,
8644
- and on a 16px page "Connected" stood taller than the name before it. */
8823
+ /* THE STATE, the tone's dot and its word, at the caption step the fact
8824
+ beside it takes, so a compact tile's line reads name, state, fact at one
8825
+ height. It inherited the page's size, and on a 16px page "Connected" stood
8826
+ taller than the name before it. */
8645
8827
  .crewlet-catalog-tile__status {
8646
8828
  display: inline-flex;
8647
8829
  font-size: var(--font-size-xs);
@@ -18911,7 +19093,7 @@ svg.crewlet-datetime__chevron {
18911
19093
  }
18912
19094
 
18913
19095
 
18914
- /* DirectoryList-XZOWYOA3.css */
19096
+ /* DirectoryList-IXQIMNFS.css */
18915
19097
  /*
18916
19098
  * DirectoryList: named groups of links, each line a mark, a label and a state,
18917
19099
  * and one foot that holds the bottom (DirectoryList.tsx).
@@ -18931,7 +19113,12 @@ svg.crewlet-datetime__chevron {
18931
19113
  font-family: var(--font-family-sans);
18932
19114
  }
18933
19115
 
18934
- /* The groups take the room and scroll on their own, so the foot stays put. */
19116
+ /* The groups take the room and scroll on their own, so the foot stays put.
19117
+
19118
+ THEIR INSET IS INSIDE THE SCROLLER. The gutter is reserved whether or not
19119
+ they scroll, and the lines end a step before it: a line's state pill stood
19120
+ against the scrollbar, and moved by its width when the list grew long
19121
+ enough to scroll. */
18935
19122
  .crewlet-directory__groups {
18936
19123
  display: flex;
18937
19124
  flex: 1 1 auto;
@@ -18940,7 +19127,9 @@ svg.crewlet-datetime__chevron {
18940
19127
  under it rather than a band between two runs of them. */
18941
19128
  gap: var(--spacing-3);
18942
19129
  min-height: 0;
19130
+ padding-right: var(--spacing-2);
18943
19131
  overflow-y: auto;
19132
+ scrollbar-gutter: stable;
18944
19133
  }
18945
19134
 
18946
19135
  .crewlet-directory__group {
@@ -19563,6 +19752,70 @@ svg.crewlet-datetime__chevron {
19563
19752
  }
19564
19753
 
19565
19754
 
19755
+ /* DockColumn-SMJCXHS4.css */
19756
+ /*
19757
+ * A column docked beside the content (DockColumn.tsx).
19758
+ *
19759
+ * THE COLUMN EASES ITS WIDTH between none and its panel's, on the slow step
19760
+ * with the emphasized curve: the motion the application rail folds by,
19761
+ * so a column of the frame and a column of a screen open and close as one
19762
+ * movement. The host gives it an `auto` track, so its width is the track.
19763
+ * Clipped rather than hidden, so it is never a scroll container a focus or a
19764
+ * scrollIntoView could scroll.
19765
+ *
19766
+ * THE PANEL KEEPS ITS WIDTH and is held to the column's edge that faces the
19767
+ * content: before the content (`start`) it is held to the column's end, so
19768
+ * the moving edge uncovers it from the start edge, and after the content
19769
+ * (`end`) the other way round.
19770
+ *
19771
+ * Tokens only. The width is the component's own variable, set from the
19772
+ * `width` prop, so the column and the panel read one value.
19773
+ */
19774
+
19775
+ .crewlet-dock-column {
19776
+ display: flex;
19777
+ justify-content: flex-end;
19778
+ width: 0;
19779
+ min-width: 0;
19780
+ min-height: 0;
19781
+ overflow: clip;
19782
+ transition: width var(--motion-duration-slow) var(--motion-easing-emphasized);
19783
+ }
19784
+
19785
+ .crewlet-dock-column[data-side='end'] {
19786
+ justify-content: flex-start;
19787
+ }
19788
+
19789
+ .crewlet-dock-column[data-open] {
19790
+ width: var(--crewlet-dock-column-width);
19791
+ }
19792
+
19793
+ .crewlet-dock-column__panel {
19794
+ display: flex;
19795
+ flex: none;
19796
+ flex-direction: column;
19797
+ box-sizing: border-box;
19798
+ width: var(--crewlet-dock-column-width);
19799
+ min-height: 0;
19800
+ background: var(--crewlet-dock-column-ground, transparent);
19801
+ }
19802
+
19803
+ /* The hairline on the panel's edge that faces the content. */
19804
+ .crewlet-dock-column--divider[data-side='start'] > .crewlet-dock-column__panel {
19805
+ border-inline-end: 1px solid var(--color-border-default);
19806
+ }
19807
+
19808
+ .crewlet-dock-column--divider[data-side='end'] > .crewlet-dock-column__panel {
19809
+ border-inline-start: 1px solid var(--color-border-default);
19810
+ }
19811
+
19812
+ @media (prefers-reduced-motion: reduce) {
19813
+ .crewlet-dock-column {
19814
+ transition: none;
19815
+ }
19816
+ }
19817
+
19818
+
19566
19819
  /* Document-M6JYGLWV.css */
19567
19820
  /*
19568
19821
  * Rendered markdown, set as a document (Document.tsx).
@@ -22111,7 +22364,7 @@ a.crewlet-icon-btn {
22111
22364
  }
22112
22365
 
22113
22366
 
22114
- /* InboxList-OFGSX5IH.css */
22367
+ /* InboxList-X5Q5WWAI.css */
22115
22368
  /*
22116
22369
  * The inbox's column: groups of rows, each row a control with the task it is
22117
22370
  * about under it, and the quiet toggles at the end.
@@ -22140,6 +22393,9 @@ a.crewlet-icon-btn {
22140
22393
 
22141
22394
  /* The heading's own line box is the label's, so the label sits where it is drawn. */
22142
22395
  .crewlet-inbox-list__label {
22396
+ /* The arrival's wash stands behind the label's words, inside it. */
22397
+ position: relative;
22398
+ isolation: isolate;
22143
22399
  margin: 0;
22144
22400
  padding: var(--spacing-3) var(--spacing-2) var(--spacing-1);
22145
22401
  font: inherit;
@@ -22147,6 +22403,32 @@ a.crewlet-icon-btn {
22147
22403
  line-height: var(--font-line-height-snug);
22148
22404
  }
22149
22405
 
22406
+ /*
22407
+ * A ROW ARRIVED: a wash of the accent that fades back to the ground, over the
22408
+ * row itself, or over a group's label and count where the row landed in a
22409
+ * closed group. The row's keyframes name no last step, so the wash returns
22410
+ * to whatever the row draws of its own (hover, selected).
22411
+ */
22412
+ .crewlet-inbox-list__arrival {
22413
+ position: absolute;
22414
+ inset: 0;
22415
+ z-index: -1;
22416
+ border-radius: var(--radius-xs);
22417
+ pointer-events: none;
22418
+ animation: crewlet-inbox-arrive calc(var(--motion-duration-moderate) * 8) var(--motion-easing-out) both;
22419
+ }
22420
+
22421
+ .crewlet-inbox-row--arrived {
22422
+ animation: crewlet-inbox-arrive calc(var(--motion-duration-moderate) * 8) var(--motion-easing-out);
22423
+ }
22424
+
22425
+ @keyframes crewlet-inbox-arrive {
22426
+ 0%,
22427
+ 40% {
22428
+ background: var(--color-brand-accent-soft-strong);
22429
+ }
22430
+ }
22431
+
22150
22432
  /* The count after a label, in the quiet ink and the label's own register. */
22151
22433
  .crewlet-inbox-list__count {
22152
22434
  margin-inline-start: var(--spacing-1);
@@ -22221,12 +22503,38 @@ a.crewlet-icon-btn {
22221
22503
  * a selected row takes no hover on top of it: both are a background on the
22222
22504
  * same element, and a composite of the two is a colour nothing has measured.
22223
22505
  */
22506
+ /* ONE TRACK, so a leaving row can close its height (below). */
22224
22507
  .crewlet-inbox-row {
22508
+ display: grid;
22509
+ grid-template-rows: 1fr;
22225
22510
  min-width: 0;
22226
22511
  border-radius: var(--radius-md);
22227
22512
  transition: background var(--motion-duration-fast) var(--motion-easing-default);
22228
22513
  }
22229
22514
 
22515
+ .crewlet-inbox-row__body {
22516
+ min-width: 0;
22517
+ min-height: 0;
22518
+ }
22519
+
22520
+ /*
22521
+ * A ROW LEAVING closes its one track to nothing and fades, on the slow step
22522
+ * with the emphasized curve, the motion a column opens and shuts by, so the
22523
+ * rows under it slide up into its place. The shell's presence waits on the
22524
+ * track's transition (`INBOX_ROW_LEAVE`), and the row is inert all the while.
22525
+ */
22526
+ .crewlet-inbox-row--leaving {
22527
+ grid-template-rows: 0fr;
22528
+ opacity: 0;
22529
+ transition:
22530
+ grid-template-rows var(--motion-duration-slow) var(--motion-easing-emphasized),
22531
+ opacity var(--motion-duration-moderate) var(--motion-easing-out);
22532
+ }
22533
+
22534
+ .crewlet-inbox-row--leaving .crewlet-inbox-row__body {
22535
+ overflow: hidden;
22536
+ }
22537
+
22230
22538
  .crewlet-inbox-row:hover {
22231
22539
  background: var(--color-surface-hover);
22232
22540
  }
@@ -22463,7 +22771,7 @@ a.crewlet-icon-btn {
22463
22771
  }
22464
22772
 
22465
22773
  /* A row with no leading slot: the words start at the control's own pad, and so does the task. */
22466
- .crewlet-inbox-row:not(:has(.crewlet-inbox-row__leading)) > .crewlet-inbox-row__aside {
22774
+ .crewlet-inbox-row:not(:has(.crewlet-inbox-row__leading)) .crewlet-inbox-row__aside {
22467
22775
  padding-inline-start: var(--spacing-2);
22468
22776
  }
22469
22777
 
@@ -22499,10 +22807,16 @@ a.crewlet-icon-btn {
22499
22807
  }
22500
22808
 
22501
22809
  @media (prefers-reduced-motion: reduce) {
22502
- .crewlet-inbox-row {
22810
+ .crewlet-inbox-row,
22811
+ .crewlet-inbox-row--leaving {
22503
22812
  transition: none;
22504
22813
  }
22505
22814
 
22815
+ .crewlet-inbox-row--arrived,
22816
+ .crewlet-inbox-list__arrival {
22817
+ animation: none;
22818
+ }
22819
+
22506
22820
  .crewlet-inbox-list__toggle,
22507
22821
  .crewlet-inbox-list__chevron {
22508
22822
  transition: none;
@@ -24725,7 +25039,7 @@ a.crewlet-link-card:hover .crewlet-link-card__title {
24725
25039
  }
24726
25040
 
24727
25041
 
24728
- /* ListDetail-N3L7PB46.css */
25042
+ /* ListDetail-JGESKTR7.css */
24729
25043
  /*
24730
25044
  * ListDetail: a list beside the detail of what is chosen in it, each scrolling
24731
25045
  * on its own in the height it is given, one pane where it is narrow
@@ -24738,6 +25052,17 @@ a.crewlet-link-card:hover .crewlet-link-card__title {
24738
25052
  * drew the detail 130px wide beside a 17rem list. The phone rule below is the
24739
25053
  * one decision that stays the window's: on a phone the page scrolls as a
24740
25054
  * whole rather than each pane on its own.
25055
+ *
25056
+ * ON A SCREEN THAT FILLS THE WINDOW, THE PANE THAT SCROLLS IS ITS OUTERMOST
25057
+ * BOX, and its inset is padding inside it. Standing directly in the fill
25058
+ * column, the ListDetail reaches past the column's end pad to the sheet's
25059
+ * edge (below), so the scrollbar is the sheet's last pixel; the detail then
25060
+ * reserves its scrollbar's gutter whether or not it scrolls, and keeps the
25061
+ * screen's side inset between its content and that gutter, so a trailing
25062
+ * control (a header's Disconnect, a tile's Open) never touches the scrollbar,
25063
+ * does not move when the detail grows long enough to scroll, and ends under
25064
+ * the bar's last control. Anywhere else (a scrolling or a flush screen, or
25065
+ * outside a shell) it is as wide as its box, with nothing reserved.
24741
25066
  */
24742
25067
 
24743
25068
  /* THE HAIRLINE STANDS MIDWAY between the two panes: the list's inset before it
@@ -24745,6 +25070,9 @@ a.crewlet-link-card:hover .crewlet-link-card__title {
24745
25070
  the list than to the detail it divides it from; the two still add to 64. */
24746
25071
  .crewlet-list-detail {
24747
25072
  --crewlet-list-detail-gutter: var(--spacing-7);
25073
+ /* The inset at a scrolling pane's end: the screen's own side inset in a
25074
+ shell, so the page's two edges match. */
25075
+ --crewlet-list-detail-end: var(--crewlet-app-shell-inset, var(--spacing-5));
24748
25076
 
24749
25077
  container: crewlet-list-detail / inline-size;
24750
25078
  display: flex;
@@ -24755,6 +25083,21 @@ a.crewlet-link-card:hover .crewlet-link-card__title {
24755
25083
  min-height: 0;
24756
25084
  }
24757
25085
 
25086
+ /* STANDING IN A FILL SCREEN'S COLUMN, IT TAKES THE COLUMN'S END PAD BACK: the
25087
+ inset and the scrollbar's width, which the shell publishes for exactly
25088
+ this (`--crewlet-app-shell-bleed-end`, AppShell.css). The detail keeps the
25089
+ same inset inside itself, and reserves its gutter, there and only there. */
25090
+ :where(.crewlet-app-shell--fill:not(.crewlet-app-shell--fill-flush) .crewlet-app-shell__content) > .crewlet-list-detail {
25091
+ margin-right: calc(var(--crewlet-app-shell-bleed-end, 0px) * -1);
25092
+ }
25093
+
25094
+ :where(.crewlet-app-shell--fill:not(.crewlet-app-shell--fill-flush) .crewlet-app-shell__content)
25095
+ > .crewlet-list-detail
25096
+ .crewlet-list-detail__detail {
25097
+ padding-right: var(--crewlet-list-detail-end);
25098
+ scrollbar-gutter: stable;
25099
+ }
25100
+
24758
25101
  .crewlet-list-detail__panes {
24759
25102
  display: grid;
24760
25103
  flex: 1 1 auto;
@@ -24796,6 +25139,15 @@ a.crewlet-link-card:hover .crewlet-link-card__title {
24796
25139
  overflow-y: auto;
24797
25140
  }
24798
25141
 
25142
+ /* The list is the pane that scrolls now, and takes the detail's end where
25143
+ the ListDetail reaches the sheet. */
25144
+ :where(.crewlet-app-shell--fill:not(.crewlet-app-shell--fill-flush) .crewlet-app-shell__content)
25145
+ > .crewlet-list-detail
25146
+ .crewlet-list-detail__list {
25147
+ padding-right: var(--crewlet-list-detail-end);
25148
+ scrollbar-gutter: stable;
25149
+ }
25150
+
24799
25151
  .crewlet-list-detail--showing-list .crewlet-list-detail__detail,
24800
25152
  .crewlet-list-detail--showing-detail .crewlet-list-detail__list {
24801
25153
  display: none;
@@ -30925,7 +31277,7 @@ button.crewlet-presence-stack__member:focus-visible {
30925
31277
  }
30926
31278
 
30927
31279
 
30928
- /* ReadingPane-VLYOWMCM.css */
31280
+ /* ReadingPane-VFTRDPC5.css */
30929
31281
  /*
30930
31282
  * One item read in full, in one column.
30931
31283
  *
@@ -30960,6 +31312,25 @@ button.crewlet-presence-stack__member:focus-visible {
30960
31312
  }
30961
31313
  }
30962
31314
 
31315
+ /* A NEW ITEM PLAYS IN (`contentKey`): a short fade and rise, so the reader
31316
+ sees the pane move on rather than its words change under them. */
31317
+ .crewlet-reading-pane__column--entering {
31318
+ animation: crewlet-reading-pane-enter var(--motion-duration-moderate) var(--motion-easing-out);
31319
+ }
31320
+
31321
+ @keyframes crewlet-reading-pane-enter {
31322
+ from {
31323
+ opacity: 0;
31324
+ transform: translateY(var(--spacing-2));
31325
+ }
31326
+ }
31327
+
31328
+ @media (prefers-reduced-motion: reduce) {
31329
+ .crewlet-reading-pane__column--entering {
31330
+ animation: none;
31331
+ }
31332
+ }
31333
+
30963
31334
  /* ---- The byline -------------------------------------------------------- */
30964
31335
 
30965
31336
  .crewlet-reading-pane__byline {
@@ -35989,7 +36360,7 @@ svg.crewlet-select__chevron {
35989
36360
  }
35990
36361
 
35991
36362
 
35992
- /* SidebarNav-E7PZGGA6.css */
36363
+ /* SidebarNav-IKBKGXW4.css */
35993
36364
  /*
35994
36365
  * The rail's navigation.
35995
36366
  *
@@ -36407,6 +36778,26 @@ svg.crewlet-select__chevron {
36407
36778
  line-height: 1;
36408
36779
  }
36409
36780
 
36781
+ /*
36782
+ * A QUIET BADGE keeps the pill, its size and its place at the row's end, and
36783
+ * takes the quiet count's grey: a neutral wash (`--color-fill-soft`, the
36784
+ * ground of a quiet label at rest) carrying the secondary ink, for work that
36785
+ * is the reader's own and waiting, but not calling. The secondary ink rather
36786
+ * than the count's tertiary, because on a wash over a hovered row the
36787
+ * tertiary measured 4.41:1 in light; it is the ink the compact rail's quiet
36788
+ * figure takes, so the two shapes draw the same grey. On the reader's own row
36789
+ * its ink lifts to the row's, as the count's does; the suite measures the
36790
+ * pair on every ground a row can have.
36791
+ */
36792
+ .crewlet-nav-item__badge--quiet {
36793
+ background: var(--color-fill-soft);
36794
+ color: var(--color-text-secondary);
36795
+ }
36796
+
36797
+ .crewlet-nav-item__row[aria-current='page'] .crewlet-nav-item__badge--quiet {
36798
+ color: inherit;
36799
+ }
36800
+
36410
36801
  /* Beside a count the badge is the second figure, not a second push to the
36411
36802
  end: two auto margins would split the room between them and float the
36412
36803
  count into the middle of the row. */