@crewlethq/ui 0.75.3 → 0.76.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 (171) hide show
  1. package/README.md +15 -1
  2. package/dist/AgentHandoffPanel/index.js +4 -4
  3. package/dist/AppShell/index.js +3 -3
  4. package/dist/ArrangeList/index.js +4 -4
  5. package/dist/ArtifactBar/index.js +6 -6
  6. package/dist/ArtifactCard/index.js +4 -4
  7. package/dist/ArtifactPanel/index.js +1 -1
  8. package/dist/AttachmentChip/index.js +3 -3
  9. package/dist/AvatarPicker/index.js +7 -7
  10. package/dist/BriefCard/index.js +4 -4
  11. package/dist/Canvas/index.js +2 -2
  12. package/dist/CanvasBoard/index.js +4 -4
  13. package/dist/CanvasToolbar/index.js +3 -3
  14. package/dist/ChangeList/index.js +3 -3
  15. package/dist/Checkbox/index.js +3 -3
  16. package/dist/ChoiceButtons/ChoiceButtons.d.ts +10 -3
  17. package/dist/ChoiceButtons/index.js +1 -1
  18. package/dist/{ChoiceButtons-3MJQAHHA.css → ChoiceButtons-T3GG6VLG.css} +44 -48
  19. package/dist/ChoiceCards/ChoiceCards.d.ts +80 -0
  20. package/dist/ChoiceCards/index.d.ts +3 -0
  21. package/dist/ChoiceCards/index.js +3 -0
  22. package/dist/ChoiceCards-HAGJMK6Q.css +318 -0
  23. package/dist/ChoiceList/ChoiceList.d.ts +10 -1
  24. package/dist/ChoiceList/index.js +1 -1
  25. package/dist/{ChoiceList-Q772QLFX.css → ChoiceList-JN4PPNFW.css} +22 -1
  26. package/dist/ColorField/index.js +3 -3
  27. package/dist/Combobox/index.js +3 -3
  28. package/dist/CommandPalette/index.js +3 -3
  29. package/dist/CommentThread/index.js +5 -5
  30. package/dist/Composer/index.js +3 -3
  31. package/dist/ConfirmField/index.js +3 -3
  32. package/dist/ContrastBadge/index.js +3 -3
  33. package/dist/ContrastHelp/index.js +5 -5
  34. package/dist/DataGrid/index.js +4 -4
  35. package/dist/DataTable/index.js +5 -5
  36. package/dist/DataView/index.js +8 -8
  37. package/dist/DatasetSource/index.js +3 -3
  38. package/dist/DateTimePicker/index.js +2 -2
  39. package/dist/DeepWorkCard/index.js +5 -5
  40. package/dist/DocTabsEditor/index.js +4 -4
  41. package/dist/EditingStatus/index.js +2 -2
  42. package/dist/{Editor-OLFAUSUA.js → Editor-BXOWAV46.js} +3 -3
  43. package/dist/EntityList/index.js +4 -4
  44. package/dist/HuePicker/index.js +6 -6
  45. package/dist/InlineEditor/index.js +3 -3
  46. package/dist/Input/index.js +2 -2
  47. package/dist/{Input-GEFFMKBS.css → Input-WSMB7JG2.css} +6 -1
  48. package/dist/LinkInterstitial/index.js +1 -1
  49. package/dist/ListInput/index.js +3 -3
  50. package/dist/LogoSlot/index.js +4 -4
  51. package/dist/MarkdownEditor/index.js +6 -6
  52. package/dist/Menu/index.js +2 -2
  53. package/dist/MergeConflicts/index.js +6 -6
  54. package/dist/Modal/index.js +1 -1
  55. package/dist/OpenInAppCard/index.js +5 -5
  56. package/dist/OrgTable/index.js +1 -1
  57. package/dist/PresenterView/index.js +1 -1
  58. package/dist/PricingCard/index.js +3 -3
  59. package/dist/PrincipalPicker/index.js +4 -4
  60. package/dist/ProposalCard/index.js +8 -8
  61. package/dist/RefusalCard/index.js +4 -4
  62. package/dist/ResultTableCard/index.js +4 -4
  63. package/dist/ReviewList/index.js +3 -3
  64. package/dist/RichEditor/index.js +1 -1
  65. package/dist/RunChip/index.js +3 -3
  66. package/dist/SegmentedControl/index.js +5 -5
  67. package/dist/SettingsTable/index.js +2 -2
  68. package/dist/SetupWizard/SetupWizard.d.ts +25 -7
  69. package/dist/SetupWizard/index.js +3 -3
  70. package/dist/{SetupWizard-WDOFFNIM.css → SetupWizard-2SUMQEWU.css} +126 -4
  71. package/dist/ShareDialog/index.js +2 -2
  72. package/dist/SheetColumnEditor/index.js +9 -9
  73. package/dist/SheetGrid/index.js +5 -5
  74. package/dist/SidePanel/index.js +1 -1
  75. package/dist/SlideFilmstrip/index.js +3 -3
  76. package/dist/StatusCard/index.js +3 -3
  77. package/dist/StatusDot/StatusDot.d.ts +7 -0
  78. package/dist/StatusDot/index.js +1 -1
  79. package/dist/{StatusDot-7OMCQCZF.css → StatusDot-FJND3CZY.css} +9 -2
  80. package/dist/Stepper/index.js +2 -2
  81. package/dist/{Stepper-32INSYF7.css → Stepper-YQBNYCIS.css} +31 -8
  82. package/dist/Switcher/index.js +3 -3
  83. package/dist/TableCells/index.js +3 -3
  84. package/dist/Tabs/index.js +4 -4
  85. package/dist/Tag/index.js +2 -2
  86. package/dist/TagsInput/index.js +4 -4
  87. package/dist/ThemeGallery/index.js +3 -3
  88. package/dist/ThemeSwitcher/index.js +6 -6
  89. package/dist/TimeRangePicker/index.js +7 -7
  90. package/dist/TimeWindowPicker/index.js +3 -3
  91. package/dist/TreeCanvas/index.js +3 -3
  92. package/dist/TreeGrid/index.js +1 -1
  93. package/dist/ValueField/index.js +4 -4
  94. package/dist/VersionCompare/index.js +6 -6
  95. package/dist/{chunk-3N36CYTU.js → chunk-2PIH6JHJ.js} +1 -1
  96. package/dist/{chunk-HDF4OGVD.js → chunk-2STOSJT3.js} +3 -3
  97. package/dist/{chunk-P64MIA7C.js → chunk-3JXX5S3Z.js} +2 -2
  98. package/dist/{chunk-UHW7EXWQ.js → chunk-45M73G5A.js} +1 -1
  99. package/dist/{chunk-5JPID3YI.js → chunk-57AKYFML.js} +1 -1
  100. package/dist/{chunk-4KSCGXLJ.js → chunk-5BOFC5OP.js} +2 -2
  101. package/dist/{chunk-SAUIIBNA.js → chunk-5CEQ3HLH.js} +1 -1
  102. package/dist/{chunk-VLGGLLKH.js → chunk-624X3RVA.js} +1 -1
  103. package/dist/{chunk-LWFOX3PB.js → chunk-63GBSOLU.js} +1 -1
  104. package/dist/{chunk-IQQSMK4E.js → chunk-6EWNMSS4.js} +1 -1
  105. package/dist/{chunk-7IW3P6FH.js → chunk-6G6WHTC7.js} +1 -1
  106. package/dist/{chunk-JXJNX7QQ.js → chunk-6LXS3X7A.js} +1 -1
  107. package/dist/{chunk-NQABJAUY.js → chunk-6RW2MUTY.js} +15 -8
  108. package/dist/{chunk-ZD52GKKS.js → chunk-6THG44LI.js} +2 -2
  109. package/dist/{chunk-KWLH45YC.js → chunk-7PJFUQMY.js} +1 -1
  110. package/dist/{chunk-5M64E3HV.js → chunk-ADGNISEI.js} +2 -2
  111. package/dist/{chunk-WQRSZMN4.js → chunk-BBD7PTBG.js} +1 -1
  112. package/dist/{chunk-PYJLHHYF.js → chunk-BKXUZCZX.js} +1 -1
  113. package/dist/{chunk-6RTYHTT7.js → chunk-CFTBESST.js} +1 -1
  114. package/dist/{chunk-WIATRXEJ.js → chunk-CYQBDZ6M.js} +1 -1
  115. package/dist/{chunk-ZKIEOWR6.js → chunk-D7G2QGET.js} +1 -1
  116. package/dist/{chunk-K2RJO72E.js → chunk-DSMQTED5.js} +3 -3
  117. package/dist/{chunk-OXEWUAND.js → chunk-E35HYQMK.js} +1 -1
  118. package/dist/{chunk-DCQ2VTBB.js → chunk-FB3TCNQP.js} +2 -2
  119. package/dist/{chunk-ODAZIKZF.js → chunk-FQI62PIZ.js} +2 -2
  120. package/dist/{chunk-IU5J6BY5.js → chunk-GHQG4VZA.js} +3 -3
  121. package/dist/{chunk-PIAGTZY3.js → chunk-GPFYITOF.js} +1 -1
  122. package/dist/{chunk-R6K62EXV.js → chunk-H22SR76M.js} +1 -1
  123. package/dist/{chunk-IO374IX6.js → chunk-HQOEAUDJ.js} +1 -1
  124. package/dist/{chunk-HKSQ7QHF.js → chunk-HWPP22XG.js} +4 -4
  125. package/dist/{chunk-ILF6KVNK.js → chunk-HZDI2CCS.js} +2 -2
  126. package/dist/{chunk-ZSRRCXUD.js → chunk-I3G5FJ54.js} +1 -1
  127. package/dist/{chunk-5NFYTQK2.js → chunk-IPBSCJIZ.js} +3 -3
  128. package/dist/{chunk-GAT75MN4.js → chunk-IQMWMT4V.js} +2 -2
  129. package/dist/{chunk-GT2OG2XM.js → chunk-JMTBK55P.js} +2 -2
  130. package/dist/{chunk-VDIKDCNE.js → chunk-JQEXAH7G.js} +1 -1
  131. package/dist/{chunk-SQ7GYC4K.js → chunk-KL6A7JGH.js} +1 -1
  132. package/dist/{chunk-TQCSQRKQ.js → chunk-LCZULGMB.js} +1 -1
  133. package/dist/{chunk-EAR2F5OA.js → chunk-LMQG3VPG.js} +1 -1
  134. package/dist/chunk-MKFEVHSR.js +83 -0
  135. package/dist/{chunk-W7OJKHVR.js → chunk-MP7DGKB6.js} +1 -1
  136. package/dist/{chunk-DO4J4TBZ.js → chunk-NKBKQEKS.js} +1 -1
  137. package/dist/{chunk-USO73ZJM.js → chunk-OCGIQGYJ.js} +2 -2
  138. package/dist/{chunk-5U2CYMFU.js → chunk-OOLMTUCO.js} +1 -1
  139. package/dist/{chunk-YUHKRRWO.js → chunk-OWHETZIU.js} +1 -1
  140. package/dist/{chunk-4OX2WVXO.js → chunk-PMBJMNBX.js} +1 -1
  141. package/dist/{chunk-OXB45TG2.js → chunk-RIAPCEB5.js} +2 -2
  142. package/dist/{chunk-HJBHP66O.js → chunk-RJWO2PC5.js} +2 -2
  143. package/dist/{chunk-NTQPJJAN.js → chunk-RTMNULTL.js} +1 -1
  144. package/dist/{chunk-C3SCONKY.js → chunk-RVSNBUIU.js} +4 -2
  145. package/dist/{chunk-SRDZVY5M.js → chunk-SK5SLGZH.js} +1 -1
  146. package/dist/{chunk-CMTLQOJY.js → chunk-T24HBEU6.js} +1 -1
  147. package/dist/{chunk-EEVATVP5.js → chunk-TJIBTHWJ.js} +2 -2
  148. package/dist/{chunk-GAUBP247.js → chunk-TKUAGWNR.js} +1 -1
  149. package/dist/{chunk-HMOGLAXY.js → chunk-TPCBPGSB.js} +1 -1
  150. package/dist/{chunk-CFXDWGQI.js → chunk-TPIMOGOZ.js} +1 -1
  151. package/dist/{chunk-HDLUG3MA.js → chunk-UY3FWQWG.js} +2 -2
  152. package/dist/{chunk-RQHN4J5P.js → chunk-UYF2B2TH.js} +1 -1
  153. package/dist/{chunk-I5OIKDX2.js → chunk-VERJCAJ4.js} +1 -1
  154. package/dist/{chunk-PKVWCKS2.js → chunk-VG3SIJ3M.js} +1 -1
  155. package/dist/{chunk-BAHLBMCH.js → chunk-WK4FQPYW.js} +2 -2
  156. package/dist/{chunk-4RKTZSEW.js → chunk-WL4TC4YZ.js} +1 -1
  157. package/dist/{chunk-SBHAKX2T.js → chunk-X5FKORDM.js} +72 -9
  158. package/dist/{chunk-4DL2BQJE.js → chunk-YL7AR6PR.js} +1 -1
  159. package/dist/{chunk-TF74KS36.js → chunk-YQDRJZ5J.js} +1 -1
  160. package/dist/{chunk-7OFVR7X4.js → chunk-ZKLEAK7M.js} +1 -1
  161. package/dist/{chunk-OUUHIA3B.js → chunk-ZMIVQGAB.js} +4 -4
  162. package/dist/{chunk-352FPJ2Q.js → chunk-ZW5SRQ5M.js} +1 -1
  163. package/dist/generated/index.d.ts +1 -0
  164. package/dist/generated/index.js +94 -93
  165. package/dist/index.js +94 -93
  166. package/dist/styles.css +565 -70
  167. package/package.json +3 -3
  168. package/dist/{chunk-SWLVR54P.js → chunk-HPI5J6AR.js} +1 -1
  169. package/dist/{chunk-EMCVX5FY.js → chunk-OBPINJNO.js} +1 -1
  170. package/dist/{chunk-KNAHKQD4.js → chunk-OQG4P5KU.js} +1 -1
  171. /package/dist/{chunk-TWM6G2I2.js → chunk-PCBPDMNU.js} +0 -0
package/dist/styles.css CHANGED
@@ -10103,7 +10103,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10103
10103
  }
10104
10104
 
10105
10105
 
10106
- /* ChoiceButtons-3MJQAHHA.css */
10106
+ /* ChoiceButtons-T3GG6VLG.css */
10107
10107
  /*
10108
10108
  * One answer, sent with one press: a column of buttons as tall as a touch
10109
10109
  * target, the recommended one first and filled with the accent.
@@ -10111,6 +10111,11 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10111
10111
  * The plain option is the secondary button's recipe (the card's own ground
10112
10112
  * inside the strong hairline), and the recommended one the primary's, so the
10113
10113
  * pair reads as the screen's one primary action and its alternatives.
10114
+ *
10115
+ * AS TOGGLES (`chosen` given, so every option carries `aria-pressed`) the
10116
+ * accent is the chosen option's alone: the recommended one is drawn plain with
10117
+ * its mark kept, so an answer that went against the recommendation never shows
10118
+ * the option NOT chosen as the loudest one on the screen.
10114
10119
  */
10115
10120
 
10116
10121
  .crewlet-choice-buttons {
@@ -10126,7 +10131,6 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10126
10131
 
10127
10132
  display: flex;
10128
10133
  align-items: center;
10129
- justify-content: space-between;
10130
10134
  gap: var(--spacing-3);
10131
10135
  min-width: 0;
10132
10136
  min-height: var(--size-control-lg);
@@ -10171,13 +10175,21 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10171
10175
  }
10172
10176
 
10173
10177
  /*
10174
- * THE OPTION APPLIED is drawn as every chosen option in the package is: the
10175
- * selected edge over the soft selected fill, calm beside the focus ring, and
10176
- * held under the pointer so a hover never makes it look unchosen.
10178
+ * THE OPTION APPLIED stands on the soft selected fill inside an edge in the
10179
+ * accent's ink, with a check mark in the same ink, held under the pointer and
10180
+ * the press so neither makes it look unchosen.
10181
+ *
10182
+ * The edge is the accent's INK, not the selected edge the package's other
10183
+ * chosen options draw. That edge is a tint, as low as 1.65:1 against this fill
10184
+ * (dark, on the raised rung), and here the edge is what tells a pressed toggle
10185
+ * from the others, which WCAG 1.4.11 holds to 3:1. The ink clears 4.71:1 at
10186
+ * its tightest (light, on the frame), and the check mark makes the state more
10187
+ * than a colour.
10177
10188
  */
10178
10189
  .crewlet-choice-buttons__option.is-chosen,
10179
- .crewlet-choice-buttons__option.is-chosen:hover {
10180
- border-color: var(--color-border-selected);
10190
+ .crewlet-choice-buttons__option.is-chosen:hover,
10191
+ .crewlet-choice-buttons__option.is-chosen:active {
10192
+ border-color: var(--color-brand-accent-ink);
10181
10193
  background: var(--color-surface-selected);
10182
10194
  }
10183
10195
 
@@ -10199,7 +10211,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10199
10211
  cursor: progress;
10200
10212
  }
10201
10213
 
10202
- .crewlet-choice-buttons__option--recommended {
10214
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]) {
10203
10215
  background: var(--color-brand-accent);
10204
10216
  border-color: transparent;
10205
10217
  color: var(--color-text-on-accent);
@@ -10212,12 +10224,12 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10212
10224
  --crewlet-inline-ref-mark-ink: currentColor;
10213
10225
  }
10214
10226
 
10215
- .crewlet-choice-buttons__option--recommended:hover:not([aria-disabled='true']) {
10227
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]):hover:not([aria-disabled='true']) {
10216
10228
  background: var(--color-brand-accent-hover);
10217
10229
  border-color: transparent;
10218
10230
  }
10219
10231
 
10220
- .crewlet-choice-buttons__option--recommended:active:not([aria-disabled='true']) {
10232
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]):active:not([aria-disabled='true']) {
10221
10233
  background: var(--color-brand-accent-active);
10222
10234
  }
10223
10235
 
@@ -10226,33 +10238,18 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10226
10238
  * nearly the fill's own colour, so its ring stands off it as a primary
10227
10239
  * button's does.
10228
10240
  */
10229
- .crewlet-choice-buttons__option--recommended:focus-visible {
10241
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]):focus-visible {
10230
10242
  outline-offset: 2px;
10231
10243
  }
10232
10244
 
10233
10245
  /*
10234
- * THE RECOMMENDED OPTION, CHOSEN, is drawn as every chosen option is: the
10235
- * selected edge over the soft selected fill, in the primary ink, its mark kept
10236
- * so a reader still sees which option was recommended. The chosen rule swapped
10237
- * the accent fill for the soft one and left the accent's own ink behind, white
10238
- * on a pale tint, under 1.5:1 in the light theme. Held under the pointer and
10239
- * the press too, which otherwise bring the accent back.
10246
+ * The words take the room the option has to spare, so the recommended mark and
10247
+ * the check mark after them sit together at the far end, and a picture before
10248
+ * them keeps its place at the start.
10240
10249
  */
10241
- .crewlet-choice-buttons__option--recommended.is-chosen,
10242
- .crewlet-choice-buttons__option--recommended.is-chosen:hover:not([aria-disabled='true']),
10243
- .crewlet-choice-buttons__option--recommended.is-chosen:active:not([aria-disabled='true']) {
10244
- border-color: var(--color-border-selected);
10245
- background: var(--color-surface-selected);
10246
- color: var(--color-text-primary);
10247
- }
10248
-
10249
- /* Off the accent, the ring is drawn over the selected edge again. */
10250
- .crewlet-choice-buttons__option--recommended.is-chosen:focus-visible {
10251
- outline-offset: var(--size-focus-ring-inset-offset);
10252
- }
10253
-
10254
10250
  .crewlet-choice-buttons__text {
10255
10251
  display: grid;
10252
+ flex: 1 1 auto;
10256
10253
  gap: 2px;
10257
10254
  min-width: 0;
10258
10255
  overflow-wrap: anywhere;
@@ -10268,15 +10265,10 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10268
10265
  * On the accent fill the detail takes the label's own ink. The tertiary step
10269
10266
  * is measured on the surfaces, not on the accent, where it does not clear.
10270
10267
  */
10271
- .crewlet-choice-buttons__option--recommended .crewlet-choice-buttons__detail {
10268
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]) .crewlet-choice-buttons__detail {
10272
10269
  color: var(--color-text-on-accent);
10273
10270
  }
10274
10271
 
10275
- /* Chosen, it is off the accent, and the detail takes its tertiary step again. */
10276
- .crewlet-choice-buttons__option--recommended.is-chosen .crewlet-choice-buttons__detail {
10277
- color: var(--color-text-tertiary);
10278
- }
10279
-
10280
10272
  /*
10281
10273
  * The mark, in the micro-label register. Full ink rather than a faded one:
10282
10274
  * eleven pixels of white on the accent clears 4.5:1 only at full strength.
@@ -10289,8 +10281,12 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10289
10281
  text-transform: uppercase;
10290
10282
  }
10291
10283
 
10292
- /* The picture before the words, centred on the label's line. */
10293
- .crewlet-choice-buttons__media {
10284
+ /*
10285
+ * The picture before the words and the check mark at the far end, each
10286
+ * centred on the label's line.
10287
+ */
10288
+ .crewlet-choice-buttons__media,
10289
+ .crewlet-choice-buttons__check {
10294
10290
  display: inline-flex;
10295
10291
  flex: none;
10296
10292
  align-items: center;
@@ -10299,22 +10295,22 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10299
10295
 
10300
10296
  /*
10301
10297
  * With a detail under it the label's line is the FIRST line, not the
10302
- * option's middle, so the picture stands on a box one line tall at the top.
10303
- * Centred on the label and its detail together, a suggestion's swatch sat
10304
- * 7px under the value it shows.
10298
+ * option's middle, so the picture and the check mark stand on a box one line
10299
+ * tall at the top. Centred on the label and its detail together, a
10300
+ * suggestion's swatch sat 7px under the value it shows.
10305
10301
  */
10306
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) .crewlet-choice-buttons__media {
10302
+ .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) .crewlet-choice-buttons__media,
10303
+ .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) .crewlet-choice-buttons__check {
10307
10304
  align-self: flex-start;
10308
10305
  min-height: calc(var(--crewlet-choice-buttons-leading) * 1em);
10309
10306
  }
10310
10307
 
10311
- /* Before the words, not at the far end with the recommended mark. */
10312
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) {
10313
- justify-content: flex-start;
10314
- }
10315
-
10316
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) .crewlet-choice-buttons__note {
10317
- margin-inline-start: auto;
10308
+ /*
10309
+ * The chosen option's check mark, at the label's size and in the edge's ink,
10310
+ * which clears the 3:1 a mark has to on the selected fill in every theme.
10311
+ */
10312
+ .crewlet-choice-buttons__check {
10313
+ color: var(--color-brand-accent-ink);
10318
10314
  }
10319
10315
 
10320
10316
  /*
@@ -10357,7 +10353,328 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10357
10353
  }
10358
10354
 
10359
10355
 
10360
- /* ChoiceList-Q772QLFX.css */
10356
+ /* ChoiceCards-HAGJMK6Q.css */
10357
+ /*
10358
+ * Choices a person compares, as cards in a grid that wraps. The chosen card
10359
+ * takes the selected fill and the strong boundary, as a chosen ChoiceList row
10360
+ * does; the radio stays the mark, drawn in the card's corner; and no card is
10361
+ * ringed in the accent except by the focus ring itself.
10362
+ *
10363
+ * ONE LINE A ROW, THE SAME ROWS IN EVERY CARD: the picture, the name and its
10364
+ * tag on the first; the description on the second; then each fact on a line
10365
+ * of its own, its name and its value; and a reason line where any card has
10366
+ * one. Every card spans the same rows of the group's grid and lays its lines
10367
+ * on them as a subgrid, so cards side by side share each row: a description
10368
+ * that wraps in one card moves the facts of all of them, and Runs stays level
10369
+ * with Runs. Facts run together as one line of meta wrapped differently in
10370
+ * each card, and three cards read as three different shapes.
10371
+ *
10372
+ * A card is at least 20rem (24rem at `lg`), the width a fact's name and a
10373
+ * short value keep to one line in: a form's column holds one to a row, and a
10374
+ * wider surface two or three, aligned.
10375
+ */
10376
+ .crewlet-choice-cards {
10377
+ --crewlet-choice-cards-min: 20rem;
10378
+ --crewlet-choice-cards-radio: 16px;
10379
+ /* How many rows a card spans, set from the options: the name, the description, the most facts, a reason. */
10380
+ --crewlet-choice-cards-rows: 3;
10381
+ display: grid;
10382
+ grid-template-columns: repeat(
10383
+ auto-fit,
10384
+ minmax(min(100%, var(--crewlet-choice-cards-min)), 1fr)
10385
+ );
10386
+ grid-auto-rows: auto;
10387
+ column-gap: var(--spacing-3);
10388
+ row-gap: 0;
10389
+ }
10390
+
10391
+ .crewlet-choice-cards--lg {
10392
+ --crewlet-choice-cards-min: 24rem;
10393
+ }
10394
+
10395
+ /*
10396
+ * THE CARD is a column of its lines. The space under a card is its margin,
10397
+ * the gap between one row of cards and the next; the lines inside a card keep
10398
+ * their own, smaller gap.
10399
+ *
10400
+ * Its first line is as tall as the largest picture a card set draws (a
10401
+ * product's mark), so the radio and every name sit on one line whatever
10402
+ * picture each card has.
10403
+ */
10404
+ .crewlet-choice-cards__card {
10405
+ --crewlet-choice-cards-title: var(--size-control-sm);
10406
+
10407
+ position: relative;
10408
+ display: flex;
10409
+ flex-direction: column;
10410
+ gap: var(--spacing-1);
10411
+ min-width: 0;
10412
+ margin-block-end: var(--spacing-3);
10413
+ padding: var(--spacing-3);
10414
+ border: 1px solid var(--color-border-default);
10415
+ border-radius: var(--radius-md);
10416
+ background: var(--color-surface-elevated);
10417
+ cursor: pointer;
10418
+ transition:
10419
+ background-color var(--motion-duration-fast) var(--motion-easing-default),
10420
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
10421
+ }
10422
+
10423
+ .crewlet-choice-cards__card:hover {
10424
+ background: var(--color-surface-hover);
10425
+ }
10426
+
10427
+ /*
10428
+ * THE CHOSEN CARD wears the soft selected tint laid OVER the raised surface,
10429
+ * inside an edge in the accent's ink, as a chosen ChoiceButtons option does.
10430
+ * The tint is translucent: laid on its own it let the page's ground through,
10431
+ * darker than the raised cards beside it in dark, and the chosen card looked
10432
+ * recessed. The edge is the accent's ink rather than the strong border,
10433
+ * because the edge is what tells the chosen card from the others at 3:1.
10434
+ */
10435
+ .crewlet-choice-cards__card.is-checked {
10436
+ border-color: var(--color-brand-accent-ink);
10437
+ background-color: var(--color-surface-elevated);
10438
+ background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
10439
+ }
10440
+
10441
+ /*
10442
+ * A CARD THAT CANNOT BE CHOSEN stands on the page's own ground and takes no
10443
+ * hover: the subtle surface it took is brighter than the raised one in light,
10444
+ * so the card that could not be chosen read as the most inviting. Its radio is
10445
+ * drawn quiet, as ChoiceList's disabled radio is, and its picture muted; its
10446
+ * words stay at full contrast, and its reason says why.
10447
+ */
10448
+ .crewlet-choice-cards__card.is-disabled {
10449
+ cursor: not-allowed;
10450
+ background: transparent;
10451
+ }
10452
+
10453
+ .crewlet-choice-cards__card.is-disabled:hover {
10454
+ background: transparent;
10455
+ }
10456
+
10457
+ .crewlet-choice-cards__card.is-disabled .crewlet-choice-cards__radio {
10458
+ border-color: var(--color-border-default);
10459
+ background: var(--color-surface-subtle);
10460
+ }
10461
+
10462
+ .crewlet-choice-cards__card.is-disabled .crewlet-choice-cards__media {
10463
+ color: var(--color-text-tertiary);
10464
+ filter: grayscale(1);
10465
+ }
10466
+
10467
+ /* The ring sits inside the card's own box, over its border, rather than a second line beside it. */
10468
+ .crewlet-choice-cards__card:has(.crewlet-choice-cards__radio:focus-visible) {
10469
+ outline: 2px solid var(--color-focus);
10470
+ outline-offset: var(--size-focus-ring-inset-offset);
10471
+ }
10472
+
10473
+ /* The radio, drawn in the card's top end and centred on the first line: an empty ring, or the accent ring round an accent dot. */
10474
+ .crewlet-choice-cards__radio {
10475
+ appearance: none;
10476
+ position: absolute;
10477
+ inset-block-start: calc(var(--spacing-3) + (var(--crewlet-choice-cards-title) - var(--crewlet-choice-cards-radio)) / 2);
10478
+ inset-inline-end: var(--spacing-3);
10479
+ display: inline-grid;
10480
+ place-content: center;
10481
+ width: var(--crewlet-choice-cards-radio);
10482
+ height: var(--crewlet-choice-cards-radio);
10483
+ margin: 0;
10484
+ border: 1px solid var(--color-border-control);
10485
+ border-radius: var(--radius-circle);
10486
+ background: var(--color-surface-elevated);
10487
+ }
10488
+
10489
+ .crewlet-choice-cards__radio:checked {
10490
+ border-color: var(--color-brand-accent);
10491
+ }
10492
+
10493
+ .crewlet-choice-cards__radio:checked::after {
10494
+ content: "";
10495
+ width: 8px;
10496
+ height: 8px;
10497
+ border-radius: var(--radius-circle);
10498
+ background: var(--color-brand-accent);
10499
+ }
10500
+
10501
+ /*
10502
+ * THE CARD DRAWS THE RING (above), so the radio's own is transparent rather
10503
+ * than off: invisible beside the card's, and still a ring where forced-colors
10504
+ * mode repaints every outline in the system's colour.
10505
+ */
10506
+ .crewlet-choice-cards__radio:focus-visible {
10507
+ outline: 2px solid transparent;
10508
+ }
10509
+
10510
+ /* The first line: the picture, the name and its tag, stopping short of the radio. */
10511
+ .crewlet-choice-cards__title {
10512
+ display: flex;
10513
+ align-items: center;
10514
+ gap: var(--spacing-2);
10515
+ grid-row: 1;
10516
+ min-width: 0;
10517
+ min-height: var(--crewlet-choice-cards-title);
10518
+ padding-inline-end: calc(var(--spacing-2) + var(--crewlet-choice-cards-radio));
10519
+ }
10520
+
10521
+ .crewlet-choice-cards__media {
10522
+ display: inline-flex;
10523
+ flex: none;
10524
+ color: var(--color-text-secondary);
10525
+ }
10526
+
10527
+ .crewlet-choice-cards__tag {
10528
+ padding: 0 var(--spacing-2);
10529
+ border: 1px solid var(--color-border-default);
10530
+ border-radius: var(--radius-pill);
10531
+ color: var(--color-text-secondary);
10532
+ font-size: var(--font-size-xs);
10533
+ white-space: nowrap;
10534
+ }
10535
+
10536
+ /* On the chosen card's tint the default edge all but vanishes in light, so the tag takes the strong one. */
10537
+ .crewlet-choice-cards__card.is-checked .crewlet-choice-cards__tag {
10538
+ border-color: var(--color-border-strong);
10539
+ }
10540
+
10541
+ .crewlet-choice-cards__label {
10542
+ min-width: 0;
10543
+ color: var(--color-text-primary);
10544
+ font-weight: var(--font-weight-medium);
10545
+ }
10546
+
10547
+ /*
10548
+ * The second row is the description's in every card once any card has one: a
10549
+ * card without one keeps an empty cell there, so its facts stay level with
10550
+ * the facts beside them.
10551
+ */
10552
+ .crewlet-choice-cards__description {
10553
+ grid-row: 2;
10554
+ color: var(--color-text-secondary);
10555
+ font-size: var(--font-size-sm);
10556
+ }
10557
+
10558
+ /* The facts give each of their lines to the card's grid, one row a fact. */
10559
+ .crewlet-choice-cards__facts {
10560
+ display: contents;
10561
+ }
10562
+
10563
+ /*
10564
+ * A fact: its name in the quiet ink, then its value, on one line while there
10565
+ * is room. Its two parts share one size and line height and align to the top,
10566
+ * so a fact with a dot is no taller than one without: aligned on a baseline,
10567
+ * the dot (a box with no text) gave the line a baseline of its own and the
10568
+ * Needs line stood a pixel taller than Runs.
10569
+ */
10570
+ .crewlet-choice-cards__fact {
10571
+ display: flex;
10572
+ align-items: flex-start;
10573
+ gap: var(--spacing-2);
10574
+ min-width: 0;
10575
+ font-size: var(--font-size-xs);
10576
+ }
10577
+
10578
+ .crewlet-choice-cards__fact-label {
10579
+ flex: none;
10580
+ color: var(--color-text-tertiary);
10581
+ }
10582
+
10583
+ .crewlet-choice-cards__fact-value {
10584
+ min-width: 0;
10585
+ color: var(--color-text-secondary);
10586
+ }
10587
+
10588
+ /*
10589
+ * A FACT WRAPS RATHER THAN CLIPS. A StatusDot is one line and its word gives
10590
+ * way with an ellipsis, which is right in a table cell and wrong here: a
10591
+ * fact is read to choose between the cards, and a narrow card cut "Docker
10592
+ * 24.0.7 found" to "Docker 24.0..." with nothing to reveal the rest. The word
10593
+ * wraps under itself, and the dot stays on the first line's centre, where it
10594
+ * sat while the fact was one line.
10595
+ */
10596
+ .crewlet-choice-cards__fact-value > .crewlet-status {
10597
+ display: flex;
10598
+ align-items: flex-start;
10599
+ }
10600
+
10601
+ .crewlet-choice-cards__fact-value > .crewlet-status > .crewlet-status-dot {
10602
+ margin-block-start: calc((1lh - var(--crewlet-status-dot-size)) / 2);
10603
+ }
10604
+
10605
+ .crewlet-choice-cards__fact-value > .crewlet-status > .crewlet-status__label {
10606
+ overflow: visible;
10607
+ white-space: normal;
10608
+ overflow-wrap: anywhere;
10609
+ }
10610
+
10611
+ /* A reason given on a fact's line (`disabledReasonAt`) takes that line's value, in the same ink. */
10612
+ .crewlet-choice-cards__fact.is-reason .crewlet-choice-cards__fact-value {
10613
+ color: var(--color-feedback-warning-ink);
10614
+ }
10615
+
10616
+ /* The reason a disabled card cannot be chosen: the card's last row, in the warning ink. */
10617
+ .crewlet-choice-cards__reason {
10618
+ grid-row: -2;
10619
+ color: var(--color-feedback-warning-ink);
10620
+ font-size: var(--font-size-xs);
10621
+ }
10622
+
10623
+
10624
+ /*
10625
+ * WHERE SUBGRID IS SUPPORTED, every card spans the same rows of the group and
10626
+ * takes them from it, so a row is as tall as its tallest line across the cards
10627
+ * beside it and their facts stand level. Elsewhere each card stays the plain
10628
+ * column above: its lines still read in order, only not level with the next
10629
+ * card's.
10630
+ */
10631
+ @supports (grid-template-rows: subgrid) {
10632
+ .crewlet-choice-cards__card {
10633
+ display: grid;
10634
+ grid-row: span var(--crewlet-choice-cards-rows);
10635
+ grid-template-rows: subgrid;
10636
+ grid-template-columns: minmax(0, 1fr);
10637
+ row-gap: var(--spacing-1);
10638
+ align-content: start;
10639
+ }
10640
+ }
10641
+
10642
+ /*
10643
+ * UNDER FORCED COLOURS the system repaints every colour above, so the drawn
10644
+ * radio's dot and the tint vanish together: the radio becomes the platform's
10645
+ * own, which marks itself; the chosen card's edge takes the system's
10646
+ * selection colour, twice as wide; and a card that cannot be chosen takes the
10647
+ * system's disabled ink, edge and words, rather than reading as one that can.
10648
+ */
10649
+ @media (forced-colors: active) {
10650
+ .crewlet-choice-cards__radio {
10651
+ appearance: auto;
10652
+ }
10653
+
10654
+ .crewlet-choice-cards__card.is-checked {
10655
+ border-width: 2px;
10656
+ border-color: Highlight;
10657
+ }
10658
+
10659
+ .crewlet-choice-cards__card.is-disabled {
10660
+ border-color: GrayText;
10661
+ color: GrayText;
10662
+ }
10663
+
10664
+ .crewlet-choice-cards__card.is-disabled :is(.crewlet-choice-cards__label, .crewlet-choice-cards__description, .crewlet-choice-cards__fact-label, .crewlet-choice-cards__fact-value) {
10665
+ color: GrayText;
10666
+ }
10667
+ }
10668
+
10669
+ /* The border's ease into its hover and checked inks is held for a reader who asked for no motion. */
10670
+ @media (prefers-reduced-motion: reduce) {
10671
+ .crewlet-choice-cards__card {
10672
+ transition: none;
10673
+ }
10674
+ }
10675
+
10676
+
10677
+ /* ChoiceList-JN4PPNFW.css */
10361
10678
  /*
10362
10679
  * A short list of answers in one bordered box: a radio, the label with a line
10363
10680
  * of detail under it, and a tag at the row's end. The selected row takes the
@@ -10461,10 +10778,22 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10461
10778
  background: var(--color-surface-selected);
10462
10779
  }
10463
10780
 
10464
- .crewlet-choice-list.is-disabled .crewlet-choice-list__row {
10781
+ .crewlet-choice-list.is-disabled .crewlet-choice-list__row,
10782
+ .crewlet-choice-list__row.is-disabled {
10465
10783
  cursor: not-allowed;
10466
10784
  }
10467
10785
 
10786
+ /* A choice that cannot be made takes no hover: the ground would offer it. */
10787
+ .crewlet-choice-list__row.is-disabled:hover {
10788
+ background: none;
10789
+ }
10790
+
10791
+ /* Its ring is drawn on the quiet boundary and ground; its words stay at full contrast. */
10792
+ .crewlet-choice-list__row.is-disabled .crewlet-choice-list__radio {
10793
+ border-color: var(--color-border-default);
10794
+ background: var(--color-surface-subtle);
10795
+ }
10796
+
10468
10797
  /*
10469
10798
  * THE RADIO IS DRAWN, not the platform's. In a dark palette the platform's
10470
10799
  * own radio fills an unchosen answer with a grey disc, which beside the one
@@ -10523,6 +10852,15 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10523
10852
  overflow-wrap: anywhere;
10524
10853
  }
10525
10854
 
10855
+ /* Why a disabled choice cannot be made, after its detail on the same line, in the warning ink. */
10856
+ .crewlet-choice-list__reason {
10857
+ color: var(--color-feedback-warning-ink);
10858
+ }
10859
+
10860
+ .crewlet-choice-list__detail > .crewlet-choice-list__reason:not(:first-child) {
10861
+ margin-inline-start: var(--spacing-2);
10862
+ }
10863
+
10526
10864
  /* A tag says something ABOUT an answer ("Suggested"), so it is set in the
10527
10865
  tertiary ink: in the accent ink it was a second accent mark on the chosen
10528
10866
  row, beside the radio and the fill that already say which one is chosen. */
@@ -20568,7 +20906,7 @@ a.crewlet-icon-btn {
20568
20906
  }
20569
20907
 
20570
20908
 
20571
- /* Input-GEFFMKBS.css */
20909
+ /* Input-WSMB7JG2.css */
20572
20910
  /*
20573
20911
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
20574
20912
  * ReadOnlyField.
@@ -21117,13 +21455,18 @@ a.crewlet-icon-btn {
21117
21455
  }
21118
21456
 
21119
21457
  /* Raised over the field it overhangs, so the ring a focused action draws two
21120
- pixels out from its edge is not painted over by the box under it. */
21458
+ pixels out from its edge is not painted over by the box under it. The
21459
+ action is a control, not part of the label, so it keeps its own case and
21460
+ spacing: inside the label's capitals a link read "CLAUDE CODE'S MODEL
21461
+ NAMES", and a button's word was set in capitals no other button has. */
21121
21462
  .crewlet-label__action {
21122
21463
  position: relative;
21123
21464
  z-index: var(--z-index-raised);
21124
21465
  display: inline-flex;
21125
21466
  align-items: center;
21126
21467
  block-size: 1lh;
21468
+ letter-spacing: var(--font-letter-spacing-normal);
21469
+ text-transform: none;
21127
21470
  }
21128
21471
 
21129
21472
  /* ── FormField ───────────────────────────────────────────────────────── */
@@ -31088,7 +31431,7 @@ svg.crewlet-select__chevron {
31088
31431
  }
31089
31432
 
31090
31433
 
31091
- /* SetupWizard-WDOFFNIM.css */
31434
+ /* SetupWizard-2SUMQEWU.css */
31092
31435
  /*
31093
31436
  * SetupWizard: a setup walked step by step on a page of its own
31094
31437
  * (SetupWizard.tsx).
@@ -31120,9 +31463,20 @@ svg.crewlet-select__chevron {
31120
31463
 
31121
31464
  container-type: inline-size;
31122
31465
  min-width: 0;
31466
+ /*
31467
+ * IT FILLS ITS SCREEN, so the footer rests at the bottom of the view on
31468
+ * every step: sized to its content, a short step lifted the footer and its
31469
+ * Continue hundreds of pixels up the page, and the next step dropped them
31470
+ * again, so the button a person pressed moved on every press. Stretched,
31471
+ * the content row takes the slack and the footer stays where it was.
31472
+ */
31473
+ flex: 1 0 auto;
31474
+ display: flex;
31475
+ flex-direction: column;
31123
31476
  }
31124
31477
 
31125
31478
  .crewlet-setup-wizard__frame {
31479
+ flex: 1 0 auto;
31126
31480
  display: grid;
31127
31481
  grid-template-columns: var(--crewlet-setup-wizard-rail) minmax(0, var(--crewlet-setup-wizard-column));
31128
31482
  grid-template-areas:
@@ -31269,6 +31623,25 @@ svg.crewlet-select__chevron {
31269
31623
  margin-inline-start: auto;
31270
31624
  }
31271
31625
 
31626
+ /*
31627
+ * THE STEP'S PRIMARY ACTION (`primaryAction`) KEEPS ONE WIDTH on every step.
31628
+ * Sized to its word, "Continue" grew into "Create model" or "Save changes" on
31629
+ * the last step, and every button before it in the row moved 30px to make
31630
+ * room: the Back a person had just pressed was no longer under the pointer.
31631
+ * 8rem holds the longest of those words at the kit's medium button; a longer
31632
+ * one still grows rather than clips. The box carries the width and the button
31633
+ * fills it, so the rule names the primary action rather than whichever
31634
+ * element happens to come last.
31635
+ */
31636
+ .crewlet-setup-wizard__primary {
31637
+ display: flex;
31638
+ min-inline-size: 8rem;
31639
+ }
31640
+
31641
+ .crewlet-setup-wizard__primary > * {
31642
+ flex: 1 1 auto;
31643
+ }
31644
+
31272
31645
  /*
31273
31646
  * A GHOST AT THE ROW'S START is pulled out by its padding and edge, as a card
31274
31647
  * foot's is (StatusCard.css), so "Exit" starts on the line the title and the
@@ -31332,7 +31705,14 @@ svg.crewlet-select__chevron {
31332
31705
  'content'
31333
31706
  'aside'
31334
31707
  'foot';
31335
- grid-template-rows: auto;
31708
+ /*
31709
+ * THE CONTENT'S ROW TAKES THE SLACK here too. Every row auto shared a
31710
+ * short step's spare height among all four, the footer's with them, so the
31711
+ * footer stood 20px above the view's bottom on a step shorter than the
31712
+ * view and on it on every step that scrolls: Continue moved under the
31713
+ * thumb between presses.
31714
+ */
31715
+ grid-template-rows: auto auto 1fr auto auto;
31336
31716
  row-gap: var(--spacing-5);
31337
31717
  }
31338
31718
 
@@ -31342,6 +31722,7 @@ svg.crewlet-select__chevron {
31342
31722
  'rail'
31343
31723
  'content'
31344
31724
  'foot';
31725
+ grid-template-rows: auto auto 1fr auto;
31345
31726
  }
31346
31727
 
31347
31728
  .crewlet-setup-wizard__rail {
@@ -31351,6 +31732,89 @@ svg.crewlet-select__chevron {
31351
31732
  gap: var(--spacing-2);
31352
31733
  }
31353
31734
 
31735
+ /*
31736
+ * THE ROW OF STEPS SCROLLS RATHER THAN WRAPS: eight steps wrapped into three
31737
+ * rows of pills between the position line and the step. The row is as wide
31738
+ * as its steps, inside a scroller of the wizard's own that brings the
31739
+ * current step into view (SetupWizard.tsx), with room above and under the
31740
+ * pills for the 24px band a pill that can be picked is pressed through,
31741
+ * which the scroller would otherwise clip.
31742
+ *
31743
+ * THE SCROLLER SAYS IT SCROLLS: with its bar hidden, an edge that hides
31744
+ * steps fades out, at whichever side has steps beyond it, so a row cut at
31745
+ * the screen's edge reads as more to come rather than as the last step.
31746
+ */
31747
+ .crewlet-setup-wizard__steps {
31748
+ --crewlet-setup-wizard-fade: var(--spacing-6);
31749
+ --crewlet-setup-wizard-fade-left: 0px;
31750
+ --crewlet-setup-wizard-fade-right: 0px;
31751
+
31752
+ min-width: 0;
31753
+ overflow-x: auto;
31754
+ overscroll-behavior-x: contain;
31755
+ scrollbar-width: none;
31756
+ -webkit-mask-image: linear-gradient(
31757
+ to right,
31758
+ transparent,
31759
+ #000 var(--crewlet-setup-wizard-fade-left),
31760
+ #000 calc(100% - var(--crewlet-setup-wizard-fade-right)),
31761
+ transparent
31762
+ );
31763
+ mask-image: linear-gradient(
31764
+ to right,
31765
+ transparent,
31766
+ #000 var(--crewlet-setup-wizard-fade-left),
31767
+ #000 calc(100% - var(--crewlet-setup-wizard-fade-right)),
31768
+ transparent
31769
+ );
31770
+ }
31771
+
31772
+ .crewlet-setup-wizard__steps::-webkit-scrollbar {
31773
+ display: none;
31774
+ }
31775
+
31776
+ .crewlet-setup-wizard__steps[data-fade-left] {
31777
+ --crewlet-setup-wizard-fade-left: var(--crewlet-setup-wizard-fade);
31778
+ }
31779
+
31780
+ .crewlet-setup-wizard__steps[data-fade-right] {
31781
+ --crewlet-setup-wizard-fade-right: var(--crewlet-setup-wizard-fade);
31782
+ }
31783
+
31784
+ /* A row that overflows takes the keyboard, so it can be scrolled without a pointer; it draws no edge, so the ring sits inside it. */
31785
+ .crewlet-setup-wizard__steps:focus-visible {
31786
+ outline: 2px solid var(--color-focus);
31787
+ outline-offset: var(--size-focus-ring-inset-offset);
31788
+ }
31789
+
31790
+ .crewlet-setup-wizard__steps .crewlet-stepper {
31791
+ flex-wrap: nowrap;
31792
+ inline-size: max-content;
31793
+ max-inline-size: none;
31794
+ padding-block: calc((var(--size-target-min) - var(--crewlet-stepper-pill-height)) / 2);
31795
+ }
31796
+
31797
+ .crewlet-setup-wizard__steps .crewlet-stepper__step {
31798
+ flex: none;
31799
+ }
31800
+
31801
+ /* How far along, as a thin bar under the position line, in the accent. */
31802
+ .crewlet-setup-wizard__progress {
31803
+ display: block;
31804
+ block-size: 2px;
31805
+ overflow: hidden;
31806
+ border-radius: var(--radius-pill);
31807
+ background: var(--color-border-default);
31808
+ }
31809
+
31810
+ .crewlet-setup-wizard__progress::before {
31811
+ content: '';
31812
+ display: block;
31813
+ block-size: 100%;
31814
+ inline-size: calc(var(--crewlet-setup-wizard-progress, 0) * 100%);
31815
+ background: var(--color-brand-accent);
31816
+ }
31817
+
31354
31818
  /*
31355
31819
  * THE FOLDED PREVIEW HANGS IN THE GUTTER, as a change list's disclosure
31356
31820
  * does: the trigger's padding and the panel's inset stand outside the
@@ -31381,18 +31845,19 @@ svg.crewlet-select__chevron {
31381
31845
  display: contents;
31382
31846
  }
31383
31847
 
31384
- .crewlet-setup-wizard__footer-end > :first-child {
31848
+ .crewlet-setup-wizard__footer-end > :first-child:not(.crewlet-setup-wizard__primary) {
31385
31849
  margin-inline-start: auto;
31386
31850
  }
31387
31851
 
31388
- .crewlet-setup-wizard__footer-end > :last-child {
31852
+ /* The primary action, named, takes the second row; the actions given in `footer` share the first, whatever their count. */
31853
+ .crewlet-setup-wizard__primary {
31389
31854
  flex: 1 1 100%;
31390
31855
  }
31391
31856
 
31392
31857
  /* The first row's last action ends it, at the row's end: a ghost there is
31393
31858
  pulled out as "Exit" is at its start, so the two words stand level with
31394
31859
  the primary's edges under them. */
31395
- .crewlet-setup-wizard__footer-end > .crewlet-btn--ghost.crewlet-btn--medium:nth-last-child(2) {
31860
+ .crewlet-setup-wizard__footer-end > .crewlet-btn--ghost.crewlet-btn--medium:has(+ .crewlet-setup-wizard__primary) {
31396
31861
  margin-inline-end: calc(-1 * (var(--spacing-3) + 1px));
31397
31862
  }
31398
31863
  }
@@ -35372,7 +35837,7 @@ svg.crewlet-select__chevron {
35372
35837
  }
35373
35838
 
35374
35839
 
35375
- /* StatusDot-7OMCQCZF.css */
35840
+ /* StatusDot-FJND3CZY.css */
35376
35841
  /*
35377
35842
  * The status dot: a 7px mark in its tone's fill, beside the word it belongs
35378
35843
  * to. See the component doc for why it is hidden from assistive technology.
@@ -35391,10 +35856,17 @@ svg.crewlet-select__chevron {
35391
35856
  * reader notice it" difference to. Every soft step does, by 4.48 at the least.
35392
35857
  */
35393
35858
 
35859
+ /*
35860
+ * The size is a property of the dot rather than two bare numbers so that a
35861
+ * layout placing the dot against a line it does not share a box with (a
35862
+ * ChoiceCards fact that wraps) centres it on that line by the same measure.
35863
+ */
35394
35864
  .crewlet-status-dot {
35865
+ --crewlet-status-dot-size: 7px;
35866
+
35395
35867
  display: inline-block;
35396
- width: 7px;
35397
- height: 7px;
35868
+ width: var(--crewlet-status-dot-size);
35869
+ height: var(--crewlet-status-dot-size);
35398
35870
  border-radius: var(--radius-circle);
35399
35871
  /*
35400
35872
  * The quiet state is still a mark, so it takes the tertiary step rather than
@@ -35683,7 +36155,7 @@ svg.crewlet-select__chevron {
35683
36155
  }
35684
36156
 
35685
36157
 
35686
- /* Stepper-32INSYF7.css */
36158
+ /* Stepper-YQBNYCIS.css */
35687
36159
  /*
35688
36160
  * The stepper: where a sequence has got to (Stepper.tsx).
35689
36161
  *
@@ -35707,6 +36179,11 @@ svg.crewlet-select__chevron {
35707
36179
  a half), named because the gap and the rule both measure by it (see THE
35708
36180
  RULE BETWEEN TWO STEPS). */
35709
36181
  --crewlet-stepper-rule-clearance: calc(var(--spacing-1) * 1.5);
36182
+ /* The design's 20px pill (and a column's mark), following the density with
36183
+ every other step height in the kit. Declared once, and read where a layout
36184
+ sizes around a pill: SetupWizard's row of steps clears the target band
36185
+ above and under it by this height. Read it; do not set it. */
36186
+ --crewlet-stepper-pill-height: calc(20px * var(--density, 1));
35710
36187
 
35711
36188
  display: flex;
35712
36189
  flex-wrap: wrap;
@@ -35759,9 +36236,9 @@ svg.crewlet-select__chevron {
35759
36236
  gap: calc(var(--spacing-1) * 1.25);
35760
36237
  box-sizing: border-box;
35761
36238
  /* The design's 20px pill, which follows the density with every other step
35762
- height in the kit. It labels and takes no press, so the 24px target floor
35763
- is not its to clear. */
35764
- height: calc(20px * var(--density, 1));
36239
+ height in the kit. A pill that only labels takes no press; one a reader
36240
+ can pick clears the 24px target floor through the band below. */
36241
+ height: var(--crewlet-stepper-pill-height);
35765
36242
  max-width: 100%;
35766
36243
  padding: 0 var(--spacing-2);
35767
36244
  border: 1px solid var(--color-border-default);
@@ -35897,12 +36374,30 @@ svg.crewlet-select__chevron {
35897
36374
  }
35898
36375
 
35899
36376
  .crewlet-stepper__chip.crewlet-stepper__target {
36377
+ position: relative;
35900
36378
  font-family: var(--font-family-sans);
35901
36379
  font-size: var(--font-size-2xs);
35902
36380
  font-weight: var(--font-weight-medium);
35903
36381
  line-height: 1;
35904
36382
  }
35905
36383
 
36384
+ /*
36385
+ * A PICKABLE PILL IS PRESSED THROUGH THE TARGET FLOOR, not its own 20px: an
36386
+ * invisible band of --size-target-min, centred on the pill, reaches above and
36387
+ * under it, so a phone's row of steps takes a thumb without the pill growing
36388
+ * past the design's height. The band is sized and centred rather than inset
36389
+ * from the pill: an inset counts from inside the pill's hairline, which left
36390
+ * it 22px.
36391
+ */
36392
+ .crewlet-stepper__chip.crewlet-stepper__target::after {
36393
+ content: '';
36394
+ position: absolute;
36395
+ inset-inline: 0;
36396
+ top: 50%;
36397
+ height: var(--size-target-min);
36398
+ translate: 0 -50%;
36399
+ }
36400
+
35906
36401
  .crewlet-stepper__target:hover {
35907
36402
  background: var(--color-surface-hover);
35908
36403
  }
@@ -35943,9 +36438,9 @@ svg.crewlet-select__chevron {
35943
36438
  .crewlet-stepper--vertical .crewlet-stepper__step:not(:last-child)::after {
35944
36439
  content: '';
35945
36440
  position: absolute;
35946
- top: calc(var(--spacing-2) + 20px * var(--density, 1) + 4px);
36441
+ top: calc(var(--spacing-2) + var(--crewlet-stepper-pill-height) + 4px);
35947
36442
  bottom: calc(4px - var(--spacing-2));
35948
- left: calc(var(--spacing-2) + 10px * var(--density, 1));
36443
+ left: calc(var(--spacing-2) + var(--crewlet-stepper-pill-height) / 2);
35949
36444
  width: 1px;
35950
36445
  background: var(--color-border-strong);
35951
36446
  pointer-events: none;
@@ -35971,8 +36466,8 @@ svg.crewlet-select__chevron {
35971
36466
  align-items: center;
35972
36467
  justify-content: center;
35973
36468
  box-sizing: border-box;
35974
- width: calc(20px * var(--density, 1));
35975
- height: calc(20px * var(--density, 1));
36469
+ width: var(--crewlet-stepper-pill-height);
36470
+ height: var(--crewlet-stepper-pill-height);
35976
36471
  border: 1px solid var(--color-border-default);
35977
36472
  border-radius: var(--radius-pill);
35978
36473
  font-size: var(--font-size-2xs);
@@ -35989,7 +36484,7 @@ svg.crewlet-select__chevron {
35989
36484
  }
35990
36485
 
35991
36486
  .crewlet-stepper__title {
35992
- line-height: calc(20px * var(--density, 1));
36487
+ line-height: var(--crewlet-stepper-pill-height);
35993
36488
  overflow-wrap: anywhere;
35994
36489
  }
35995
36490