@crewlethq/ui 0.75.4 → 0.76.1

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 (145) hide show
  1. package/README.md +21 -1
  2. package/dist/AgentHandoffPanel/index.js +3 -3
  3. package/dist/ArrangeList/index.js +3 -3
  4. package/dist/ArtifactBar/index.js +4 -4
  5. package/dist/ArtifactCard/index.js +3 -3
  6. package/dist/AttachmentChip/index.js +3 -3
  7. package/dist/AvatarPicker/index.js +5 -5
  8. package/dist/BriefCard/index.js +4 -4
  9. package/dist/ChangeList/index.js +3 -3
  10. package/dist/Checkbox/index.js +2 -2
  11. package/dist/ChoiceCards/ChoiceCards.d.ts +80 -0
  12. package/dist/ChoiceCards/index.d.ts +3 -0
  13. package/dist/ChoiceCards/index.js +3 -0
  14. package/dist/ChoiceCards-HAGJMK6Q.css +318 -0
  15. package/dist/ChoiceList/ChoiceList.d.ts +10 -1
  16. package/dist/ChoiceList/index.js +1 -1
  17. package/dist/{ChoiceList-Q772QLFX.css → ChoiceList-JN4PPNFW.css} +22 -1
  18. package/dist/ColorField/index.js +2 -2
  19. package/dist/Combobox/index.js +2 -2
  20. package/dist/CommandPalette/index.js +2 -2
  21. package/dist/CommentThread/index.js +3 -3
  22. package/dist/Composer/index.js +2 -2
  23. package/dist/ConfirmField/index.js +2 -2
  24. package/dist/ContrastBadge/index.js +3 -3
  25. package/dist/ContrastHelp/index.js +4 -4
  26. package/dist/DataGrid/index.js +3 -3
  27. package/dist/DataTable/index.js +3 -3
  28. package/dist/DataView/index.js +5 -5
  29. package/dist/DatasetSource/index.js +3 -3
  30. package/dist/DeepWorkCard/index.js +5 -5
  31. package/dist/DocTabsEditor/index.js +2 -2
  32. package/dist/EditingStatus/index.js +2 -2
  33. package/dist/{Editor-VW5CRDKY.js → Editor-BXOWAV46.js} +1 -1
  34. package/dist/EntityList/index.js +4 -4
  35. package/dist/HuePicker/index.js +4 -4
  36. package/dist/InlineEditor/index.js +3 -3
  37. package/dist/Input/index.js +1 -1
  38. package/dist/{Input-GEFFMKBS.css → Input-WSMB7JG2.css} +6 -1
  39. package/dist/ListInput/index.js +2 -2
  40. package/dist/LogoSlot/index.js +4 -4
  41. package/dist/MarkdownEditor/index.js +4 -4
  42. package/dist/MergeConflicts/index.js +4 -4
  43. package/dist/OpenInAppCard/index.js +5 -5
  44. package/dist/PricingCard/index.js +3 -3
  45. package/dist/PrincipalPicker/index.js +3 -3
  46. package/dist/ProposalCard/index.js +7 -7
  47. package/dist/RefusalCard/index.js +4 -4
  48. package/dist/ResultTableCard/index.js +4 -4
  49. package/dist/ReviewList/index.js +3 -3
  50. package/dist/RichEditor/index.js +1 -1
  51. package/dist/RunChip/index.js +3 -3
  52. package/dist/SegmentedControl/index.js +3 -3
  53. package/dist/SettingsTable/index.js +2 -2
  54. package/dist/SetupWizard/SetupWizard.d.ts +32 -7
  55. package/dist/SetupWizard/index.js +3 -3
  56. package/dist/{SetupWizard-WDOFFNIM.css → SetupWizard-Y2PFPBCZ.css} +151 -4
  57. package/dist/ShareDialog/index.js +1 -1
  58. package/dist/SheetColumnEditor/index.js +7 -7
  59. package/dist/SheetGrid/index.js +3 -3
  60. package/dist/StatusCard/index.js +3 -3
  61. package/dist/StatusDot/StatusDot.d.ts +7 -0
  62. package/dist/StatusDot/index.js +1 -1
  63. package/dist/{StatusDot-7OMCQCZF.css → StatusDot-FJND3CZY.css} +9 -2
  64. package/dist/Stepper/index.js +2 -2
  65. package/dist/{Stepper-32INSYF7.css → Stepper-YQBNYCIS.css} +31 -8
  66. package/dist/Switcher/index.js +2 -2
  67. package/dist/TableCells/index.js +3 -3
  68. package/dist/Tabs/index.js +2 -2
  69. package/dist/Tag/index.js +2 -2
  70. package/dist/TagsInput/index.js +3 -3
  71. package/dist/ThemeGallery/index.js +3 -3
  72. package/dist/ThemeSwitcher/index.js +4 -4
  73. package/dist/TimeRangePicker/index.js +5 -5
  74. package/dist/TimeWindowPicker/index.js +2 -2
  75. package/dist/ValueField/index.js +3 -3
  76. package/dist/VersionCompare/index.js +4 -4
  77. package/dist/{chunk-3N36CYTU.js → chunk-2PIH6JHJ.js} +1 -1
  78. package/dist/{chunk-RNXYNXKN.js → chunk-2STOSJT3.js} +2 -2
  79. package/dist/{chunk-P64MIA7C.js → chunk-3JXX5S3Z.js} +2 -2
  80. package/dist/{chunk-H32JW6CZ.js → chunk-45M73G5A.js} +1 -1
  81. package/dist/{chunk-6C6YK75K.js → chunk-57AKYFML.js} +1 -1
  82. package/dist/{chunk-4KSCGXLJ.js → chunk-5BOFC5OP.js} +2 -2
  83. package/dist/{chunk-NXNLAZPK.js → chunk-5CEQ3HLH.js} +1 -1
  84. package/dist/chunk-5EFLA6BW.js +205 -0
  85. package/dist/{chunk-VLGGLLKH.js → chunk-624X3RVA.js} +1 -1
  86. package/dist/{chunk-LWFOX3PB.js → chunk-63GBSOLU.js} +1 -1
  87. package/dist/{chunk-ZUBFVK6B.js → chunk-6EWNMSS4.js} +1 -1
  88. package/dist/{chunk-7IW3P6FH.js → chunk-6G6WHTC7.js} +1 -1
  89. package/dist/{chunk-JXJNX7QQ.js → chunk-6LXS3X7A.js} +1 -1
  90. package/dist/{chunk-NQABJAUY.js → chunk-6RW2MUTY.js} +15 -8
  91. package/dist/{chunk-IPUEVTRJ.js → chunk-6THG44LI.js} +1 -1
  92. package/dist/{chunk-KWLH45YC.js → chunk-7PJFUQMY.js} +1 -1
  93. package/dist/{chunk-AB6F5YXX.js → chunk-ADGNISEI.js} +1 -1
  94. package/dist/{chunk-WQRSZMN4.js → chunk-BBD7PTBG.js} +1 -1
  95. package/dist/{chunk-TYIHFDMP.js → chunk-BKXUZCZX.js} +1 -1
  96. package/dist/{chunk-NU5RUT7Y.js → chunk-CFTBESST.js} +1 -1
  97. package/dist/{chunk-WIATRXEJ.js → chunk-CYQBDZ6M.js} +1 -1
  98. package/dist/{chunk-ZKIEOWR6.js → chunk-D7G2QGET.js} +1 -1
  99. package/dist/{chunk-3EY5SEGH.js → chunk-DSMQTED5.js} +3 -3
  100. package/dist/{chunk-5OFRDX66.js → chunk-E35HYQMK.js} +1 -1
  101. package/dist/{chunk-ETSF7SU6.js → chunk-FB3TCNQP.js} +1 -1
  102. package/dist/{chunk-BWAUL5MB.js → chunk-GHQG4VZA.js} +3 -3
  103. package/dist/{chunk-PIAGTZY3.js → chunk-GPFYITOF.js} +1 -1
  104. package/dist/{chunk-R6K62EXV.js → chunk-H22SR76M.js} +1 -1
  105. package/dist/{chunk-IO374IX6.js → chunk-HQOEAUDJ.js} +1 -1
  106. package/dist/{chunk-J5WWMC35.js → chunk-HWPP22XG.js} +2 -2
  107. package/dist/{chunk-BWFJB5JD.js → chunk-HZDI2CCS.js} +1 -1
  108. package/dist/{chunk-3WN5HUAK.js → chunk-I3G5FJ54.js} +1 -1
  109. package/dist/{chunk-TKBFRGUV.js → chunk-IPBSCJIZ.js} +1 -1
  110. package/dist/{chunk-ERFXYGRF.js → chunk-IQMWMT4V.js} +2 -2
  111. package/dist/{chunk-GT2OG2XM.js → chunk-JMTBK55P.js} +2 -2
  112. package/dist/{chunk-FURJVZCT.js → chunk-LCZULGMB.js} +1 -1
  113. package/dist/{chunk-PBCNINMB.js → chunk-LMQG3VPG.js} +1 -1
  114. package/dist/chunk-MKFEVHSR.js +83 -0
  115. package/dist/{chunk-JPQSVECQ.js → chunk-MP7DGKB6.js} +1 -1
  116. package/dist/{chunk-DO4J4TBZ.js → chunk-NKBKQEKS.js} +1 -1
  117. package/dist/{chunk-4MVLED6E.js → chunk-OCGIQGYJ.js} +2 -2
  118. package/dist/{chunk-EOXI3CRG.js → chunk-OOLMTUCO.js} +1 -1
  119. package/dist/{chunk-YUHKRRWO.js → chunk-OWHETZIU.js} +1 -1
  120. package/dist/{chunk-VWMB3CJN.js → chunk-PMBJMNBX.js} +1 -1
  121. package/dist/{chunk-ADSOY7UM.js → chunk-RIAPCEB5.js} +1 -1
  122. package/dist/{chunk-HJBHP66O.js → chunk-RJWO2PC5.js} +2 -2
  123. package/dist/{chunk-NTQPJJAN.js → chunk-RTMNULTL.js} +1 -1
  124. package/dist/{chunk-AQIFKLXY.js → chunk-SK5SLGZH.js} +1 -1
  125. package/dist/{chunk-7LSSYHOT.js → chunk-T24HBEU6.js} +1 -1
  126. package/dist/{chunk-W5AXJWOW.js → chunk-TJIBTHWJ.js} +1 -1
  127. package/dist/{chunk-TWJERLT3.js → chunk-TKUAGWNR.js} +1 -1
  128. package/dist/{chunk-JVII5264.js → chunk-TPIMOGOZ.js} +1 -1
  129. package/dist/{chunk-RQHN4J5P.js → chunk-UYF2B2TH.js} +1 -1
  130. package/dist/{chunk-I5OIKDX2.js → chunk-VERJCAJ4.js} +1 -1
  131. package/dist/{chunk-PKVWCKS2.js → chunk-VG3SIJ3M.js} +1 -1
  132. package/dist/{chunk-HEIOLITO.js → chunk-WK4FQPYW.js} +1 -1
  133. package/dist/{chunk-4RKTZSEW.js → chunk-WL4TC4YZ.js} +1 -1
  134. package/dist/{chunk-4DL2BQJE.js → chunk-YL7AR6PR.js} +1 -1
  135. package/dist/{chunk-LQWORB5B.js → chunk-YQDRJZ5J.js} +1 -1
  136. package/dist/{chunk-OOPOQKZZ.js → chunk-ZKLEAK7M.js} +1 -1
  137. package/dist/{chunk-KAA3GFTP.js → chunk-ZMIVQGAB.js} +3 -3
  138. package/dist/{chunk-OXEOC64K.js → chunk-ZW5SRQ5M.js} +1 -1
  139. package/dist/generated/index.d.ts +1 -0
  140. package/dist/generated/index.js +80 -79
  141. package/dist/index.js +80 -79
  142. package/dist/styles.css +545 -21
  143. package/package.json +3 -3
  144. package/dist/chunk-SBHAKX2T.js +0 -124
  145. /package/dist/{chunk-TWM6G2I2.js → chunk-PCBPDMNU.js} +0 -0
package/dist/styles.css CHANGED
@@ -10353,7 +10353,328 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10353
10353
  }
10354
10354
 
10355
10355
 
10356
- /* 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 */
10357
10678
  /*
10358
10679
  * A short list of answers in one bordered box: a radio, the label with a line
10359
10680
  * of detail under it, and a tag at the row's end. The selected row takes the
@@ -10457,10 +10778,22 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10457
10778
  background: var(--color-surface-selected);
10458
10779
  }
10459
10780
 
10460
- .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 {
10461
10783
  cursor: not-allowed;
10462
10784
  }
10463
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
+
10464
10797
  /*
10465
10798
  * THE RADIO IS DRAWN, not the platform's. In a dark palette the platform's
10466
10799
  * own radio fills an unchosen answer with a grey disc, which beside the one
@@ -10519,6 +10852,15 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10519
10852
  overflow-wrap: anywhere;
10520
10853
  }
10521
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
+
10522
10864
  /* A tag says something ABOUT an answer ("Suggested"), so it is set in the
10523
10865
  tertiary ink: in the accent ink it was a second accent mark on the chosen
10524
10866
  row, beside the radio and the fill that already say which one is chosen. */
@@ -20564,7 +20906,7 @@ a.crewlet-icon-btn {
20564
20906
  }
20565
20907
 
20566
20908
 
20567
- /* Input-GEFFMKBS.css */
20909
+ /* Input-WSMB7JG2.css */
20568
20910
  /*
20569
20911
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
20570
20912
  * ReadOnlyField.
@@ -21113,13 +21455,18 @@ a.crewlet-icon-btn {
21113
21455
  }
21114
21456
 
21115
21457
  /* Raised over the field it overhangs, so the ring a focused action draws two
21116
- 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. */
21117
21462
  .crewlet-label__action {
21118
21463
  position: relative;
21119
21464
  z-index: var(--z-index-raised);
21120
21465
  display: inline-flex;
21121
21466
  align-items: center;
21122
21467
  block-size: 1lh;
21468
+ letter-spacing: var(--font-letter-spacing-normal);
21469
+ text-transform: none;
21123
21470
  }
21124
21471
 
21125
21472
  /* ── FormField ───────────────────────────────────────────────────────── */
@@ -31084,7 +31431,7 @@ svg.crewlet-select__chevron {
31084
31431
  }
31085
31432
 
31086
31433
 
31087
- /* SetupWizard-WDOFFNIM.css */
31434
+ /* SetupWizard-Y2PFPBCZ.css */
31088
31435
  /*
31089
31436
  * SetupWizard: a setup walked step by step on a page of its own
31090
31437
  * (SetupWizard.tsx).
@@ -31116,9 +31463,20 @@ svg.crewlet-select__chevron {
31116
31463
 
31117
31464
  container-type: inline-size;
31118
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;
31119
31476
  }
31120
31477
 
31121
31478
  .crewlet-setup-wizard__frame {
31479
+ flex: 1 0 auto;
31122
31480
  display: grid;
31123
31481
  grid-template-columns: var(--crewlet-setup-wizard-rail) minmax(0, var(--crewlet-setup-wizard-column));
31124
31482
  grid-template-areas:
@@ -31265,6 +31623,25 @@ svg.crewlet-select__chevron {
31265
31623
  margin-inline-start: auto;
31266
31624
  }
31267
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
+
31268
31645
  /*
31269
31646
  * A GHOST AT THE ROW'S START is pulled out by its padding and edge, as a card
31270
31647
  * foot's is (StatusCard.css), so "Exit" starts on the line the title and the
@@ -31328,7 +31705,14 @@ svg.crewlet-select__chevron {
31328
31705
  'content'
31329
31706
  'aside'
31330
31707
  'foot';
31331
- 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;
31332
31716
  row-gap: var(--spacing-5);
31333
31717
  }
31334
31718
 
@@ -31338,6 +31722,7 @@ svg.crewlet-select__chevron {
31338
31722
  'rail'
31339
31723
  'content'
31340
31724
  'foot';
31725
+ grid-template-rows: auto auto 1fr auto;
31341
31726
  }
31342
31727
 
31343
31728
  .crewlet-setup-wizard__rail {
@@ -31347,6 +31732,114 @@ svg.crewlet-select__chevron {
31347
31732
  gap: var(--spacing-2);
31348
31733
  }
31349
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
+ * THE FADE NEVER DIMS A FOCUS RING. A mask fades everything the element
31748
+ * paints, its own outline included, so the scroller's ring is drawn by the
31749
+ * frame around it, which is not masked. And a pill that takes focus is
31750
+ * scrolled clear of the faded edges, so its ring is never in the fade
31751
+ * either: `scroll-padding-inline` is the fade's own width, which the wizard
31752
+ * reads to place it (SetupWizard.tsx, `clearOfFade`).
31753
+ */
31754
+ .crewlet-setup-wizard__steps-frame {
31755
+ --crewlet-setup-wizard-fade: var(--spacing-6);
31756
+
31757
+ min-width: 0;
31758
+ }
31759
+
31760
+ .crewlet-setup-wizard__steps {
31761
+ --crewlet-setup-wizard-fade-left: 0px;
31762
+ --crewlet-setup-wizard-fade-right: 0px;
31763
+
31764
+ min-width: 0;
31765
+ overflow-x: auto;
31766
+ scroll-padding-inline: var(--crewlet-setup-wizard-fade);
31767
+ overscroll-behavior-x: contain;
31768
+ scrollbar-width: none;
31769
+ -webkit-mask-image: linear-gradient(
31770
+ to right,
31771
+ transparent,
31772
+ #000 var(--crewlet-setup-wizard-fade-left),
31773
+ #000 calc(100% - var(--crewlet-setup-wizard-fade-right)),
31774
+ transparent
31775
+ );
31776
+ mask-image: linear-gradient(
31777
+ to right,
31778
+ transparent,
31779
+ #000 var(--crewlet-setup-wizard-fade-left),
31780
+ #000 calc(100% - var(--crewlet-setup-wizard-fade-right)),
31781
+ transparent
31782
+ );
31783
+ }
31784
+
31785
+ .crewlet-setup-wizard__steps::-webkit-scrollbar {
31786
+ display: none;
31787
+ }
31788
+
31789
+ .crewlet-setup-wizard__steps[data-fade-left] {
31790
+ --crewlet-setup-wizard-fade-left: var(--crewlet-setup-wizard-fade);
31791
+ }
31792
+
31793
+ .crewlet-setup-wizard__steps[data-fade-right] {
31794
+ --crewlet-setup-wizard-fade-right: var(--crewlet-setup-wizard-fade);
31795
+ }
31796
+
31797
+ /*
31798
+ * A row that overflows takes the keyboard, so it can be scrolled without a
31799
+ * pointer. Its ring is the frame's, unmasked, inside the frame's edge, and
31800
+ * the frame's ring is the one that carries the focus in a forced-colours
31801
+ * mode too. The scroller's own outline is transparent only to turn off the
31802
+ * browser's default ring, which would sit under the mask, dimmed, beside
31803
+ * the frame's (transparent rather than none, as the kit's focus check asks
31804
+ * of every focus style).
31805
+ */
31806
+ .crewlet-setup-wizard__steps:focus-visible {
31807
+ outline: 2px solid transparent;
31808
+ }
31809
+
31810
+ .crewlet-setup-wizard__steps-frame:has(> .crewlet-setup-wizard__steps:focus-visible) {
31811
+ outline: 2px solid var(--color-focus);
31812
+ outline-offset: var(--size-focus-ring-inset-offset);
31813
+ }
31814
+
31815
+ .crewlet-setup-wizard__steps .crewlet-stepper {
31816
+ flex-wrap: nowrap;
31817
+ inline-size: max-content;
31818
+ max-inline-size: none;
31819
+ padding-block: calc((var(--size-target-min) - var(--crewlet-stepper-pill-height)) / 2);
31820
+ }
31821
+
31822
+ .crewlet-setup-wizard__steps .crewlet-stepper__step {
31823
+ flex: none;
31824
+ }
31825
+
31826
+ /* How far along, as a thin bar under the position line, in the accent. */
31827
+ .crewlet-setup-wizard__progress {
31828
+ display: block;
31829
+ block-size: 2px;
31830
+ overflow: hidden;
31831
+ border-radius: var(--radius-pill);
31832
+ background: var(--color-border-default);
31833
+ }
31834
+
31835
+ .crewlet-setup-wizard__progress::before {
31836
+ content: '';
31837
+ display: block;
31838
+ block-size: 100%;
31839
+ inline-size: calc(var(--crewlet-setup-wizard-progress, 0) * 100%);
31840
+ background: var(--color-brand-accent);
31841
+ }
31842
+
31350
31843
  /*
31351
31844
  * THE FOLDED PREVIEW HANGS IN THE GUTTER, as a change list's disclosure
31352
31845
  * does: the trigger's padding and the panel's inset stand outside the
@@ -31377,18 +31870,19 @@ svg.crewlet-select__chevron {
31377
31870
  display: contents;
31378
31871
  }
31379
31872
 
31380
- .crewlet-setup-wizard__footer-end > :first-child {
31873
+ .crewlet-setup-wizard__footer-end > :first-child:not(.crewlet-setup-wizard__primary) {
31381
31874
  margin-inline-start: auto;
31382
31875
  }
31383
31876
 
31384
- .crewlet-setup-wizard__footer-end > :last-child {
31877
+ /* The primary action, named, takes the second row; the actions given in `footer` share the first, whatever their count. */
31878
+ .crewlet-setup-wizard__primary {
31385
31879
  flex: 1 1 100%;
31386
31880
  }
31387
31881
 
31388
31882
  /* The first row's last action ends it, at the row's end: a ghost there is
31389
31883
  pulled out as "Exit" is at its start, so the two words stand level with
31390
31884
  the primary's edges under them. */
31391
- .crewlet-setup-wizard__footer-end > .crewlet-btn--ghost.crewlet-btn--medium:nth-last-child(2) {
31885
+ .crewlet-setup-wizard__footer-end > .crewlet-btn--ghost.crewlet-btn--medium:has(+ .crewlet-setup-wizard__primary) {
31392
31886
  margin-inline-end: calc(-1 * (var(--spacing-3) + 1px));
31393
31887
  }
31394
31888
  }
@@ -35368,7 +35862,7 @@ svg.crewlet-select__chevron {
35368
35862
  }
35369
35863
 
35370
35864
 
35371
- /* StatusDot-7OMCQCZF.css */
35865
+ /* StatusDot-FJND3CZY.css */
35372
35866
  /*
35373
35867
  * The status dot: a 7px mark in its tone's fill, beside the word it belongs
35374
35868
  * to. See the component doc for why it is hidden from assistive technology.
@@ -35387,10 +35881,17 @@ svg.crewlet-select__chevron {
35387
35881
  * reader notice it" difference to. Every soft step does, by 4.48 at the least.
35388
35882
  */
35389
35883
 
35884
+ /*
35885
+ * The size is a property of the dot rather than two bare numbers so that a
35886
+ * layout placing the dot against a line it does not share a box with (a
35887
+ * ChoiceCards fact that wraps) centres it on that line by the same measure.
35888
+ */
35390
35889
  .crewlet-status-dot {
35890
+ --crewlet-status-dot-size: 7px;
35891
+
35391
35892
  display: inline-block;
35392
- width: 7px;
35393
- height: 7px;
35893
+ width: var(--crewlet-status-dot-size);
35894
+ height: var(--crewlet-status-dot-size);
35394
35895
  border-radius: var(--radius-circle);
35395
35896
  /*
35396
35897
  * The quiet state is still a mark, so it takes the tertiary step rather than
@@ -35679,7 +36180,7 @@ svg.crewlet-select__chevron {
35679
36180
  }
35680
36181
 
35681
36182
 
35682
- /* Stepper-32INSYF7.css */
36183
+ /* Stepper-YQBNYCIS.css */
35683
36184
  /*
35684
36185
  * The stepper: where a sequence has got to (Stepper.tsx).
35685
36186
  *
@@ -35703,6 +36204,11 @@ svg.crewlet-select__chevron {
35703
36204
  a half), named because the gap and the rule both measure by it (see THE
35704
36205
  RULE BETWEEN TWO STEPS). */
35705
36206
  --crewlet-stepper-rule-clearance: calc(var(--spacing-1) * 1.5);
36207
+ /* The design's 20px pill (and a column's mark), following the density with
36208
+ every other step height in the kit. Declared once, and read where a layout
36209
+ sizes around a pill: SetupWizard's row of steps clears the target band
36210
+ above and under it by this height. Read it; do not set it. */
36211
+ --crewlet-stepper-pill-height: calc(20px * var(--density, 1));
35706
36212
 
35707
36213
  display: flex;
35708
36214
  flex-wrap: wrap;
@@ -35755,9 +36261,9 @@ svg.crewlet-select__chevron {
35755
36261
  gap: calc(var(--spacing-1) * 1.25);
35756
36262
  box-sizing: border-box;
35757
36263
  /* The design's 20px pill, which follows the density with every other step
35758
- height in the kit. It labels and takes no press, so the 24px target floor
35759
- is not its to clear. */
35760
- height: calc(20px * var(--density, 1));
36264
+ height in the kit. A pill that only labels takes no press; one a reader
36265
+ can pick clears the 24px target floor through the band below. */
36266
+ height: var(--crewlet-stepper-pill-height);
35761
36267
  max-width: 100%;
35762
36268
  padding: 0 var(--spacing-2);
35763
36269
  border: 1px solid var(--color-border-default);
@@ -35893,12 +36399,30 @@ svg.crewlet-select__chevron {
35893
36399
  }
35894
36400
 
35895
36401
  .crewlet-stepper__chip.crewlet-stepper__target {
36402
+ position: relative;
35896
36403
  font-family: var(--font-family-sans);
35897
36404
  font-size: var(--font-size-2xs);
35898
36405
  font-weight: var(--font-weight-medium);
35899
36406
  line-height: 1;
35900
36407
  }
35901
36408
 
36409
+ /*
36410
+ * A PICKABLE PILL IS PRESSED THROUGH THE TARGET FLOOR, not its own 20px: an
36411
+ * invisible band of --size-target-min, centred on the pill, reaches above and
36412
+ * under it, so a phone's row of steps takes a thumb without the pill growing
36413
+ * past the design's height. The band is sized and centred rather than inset
36414
+ * from the pill: an inset counts from inside the pill's hairline, which left
36415
+ * it 22px.
36416
+ */
36417
+ .crewlet-stepper__chip.crewlet-stepper__target::after {
36418
+ content: '';
36419
+ position: absolute;
36420
+ inset-inline: 0;
36421
+ top: 50%;
36422
+ height: var(--size-target-min);
36423
+ translate: 0 -50%;
36424
+ }
36425
+
35902
36426
  .crewlet-stepper__target:hover {
35903
36427
  background: var(--color-surface-hover);
35904
36428
  }
@@ -35939,9 +36463,9 @@ svg.crewlet-select__chevron {
35939
36463
  .crewlet-stepper--vertical .crewlet-stepper__step:not(:last-child)::after {
35940
36464
  content: '';
35941
36465
  position: absolute;
35942
- top: calc(var(--spacing-2) + 20px * var(--density, 1) + 4px);
36466
+ top: calc(var(--spacing-2) + var(--crewlet-stepper-pill-height) + 4px);
35943
36467
  bottom: calc(4px - var(--spacing-2));
35944
- left: calc(var(--spacing-2) + 10px * var(--density, 1));
36468
+ left: calc(var(--spacing-2) + var(--crewlet-stepper-pill-height) / 2);
35945
36469
  width: 1px;
35946
36470
  background: var(--color-border-strong);
35947
36471
  pointer-events: none;
@@ -35967,8 +36491,8 @@ svg.crewlet-select__chevron {
35967
36491
  align-items: center;
35968
36492
  justify-content: center;
35969
36493
  box-sizing: border-box;
35970
- width: calc(20px * var(--density, 1));
35971
- height: calc(20px * var(--density, 1));
36494
+ width: var(--crewlet-stepper-pill-height);
36495
+ height: var(--crewlet-stepper-pill-height);
35972
36496
  border: 1px solid var(--color-border-default);
35973
36497
  border-radius: var(--radius-pill);
35974
36498
  font-size: var(--font-size-2xs);
@@ -35985,7 +36509,7 @@ svg.crewlet-select__chevron {
35985
36509
  }
35986
36510
 
35987
36511
  .crewlet-stepper__title {
35988
- line-height: calc(20px * var(--density, 1));
36512
+ line-height: var(--crewlet-stepper-pill-height);
35989
36513
  overflow-wrap: anywhere;
35990
36514
  }
35991
36515