@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/README.md CHANGED
@@ -42,7 +42,7 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
42
42
  | ---- | ---------- |
43
43
  | Actions | `Button` and `ButtonLink` (variants `primary`, `secondary`, `outline`, `ghost`, `accent`, `danger`; sizes `small`, `medium`, `large`; shapes `square`, `pill`), `IconButton`, `Menu`, `Link`, `Copyable`, `CopyButton`, `DownloadButton`, `Kbd` |
44
44
  | Content and text | `Text` (the eight registers and `inherit`), `Prose`, `Statement`, `Document`, `DocumentTitle` and `DocumentTitleField`, the Markdown grammar (`parseMarkdown`, `parseMarkdownSpans`, `markdownInline`, `safeHref` and the line readers, with no React in it), `Highlight`, `InlineCode`, `List` and `ListItem`, `DescriptionList`, `Timeline`, `RelativeTime`, `Note`, `Divider` |
45
- | Forms | `Input`, `Textarea`, `Label`, `FormField`, `FormRow`, `Checkbox`, `CheckboxGroup`, `ConfirmField`, `Select`, `Tag`, `TagsInput`, `DateTimePicker`, `TimeWindowPicker`, `TimeRangePicker`, `ImageUpload`, `CharacterPicker`, `HuePicker`, `AvatarPicker`, `FactList`, `ChoiceList`, `Composer`, `MarkdownEditor`, `RichEditor` (with `preloadRichEditor`, and the round trip `roundTripMarkdown` and `canonicalMarkdown` from `@crewlethq/ui/RichEditorMarkdown`) |
45
+ | Forms | `Input`, `Textarea`, `Label`, `FormField`, `FormRow`, `Checkbox`, `CheckboxGroup`, `ConfirmField`, `Select`, `Tag`, `TagsInput`, `DateTimePicker`, `TimeWindowPicker`, `TimeRangePicker`, `ImageUpload`, `CharacterPicker`, `HuePicker`, `AvatarPicker`, `FactList`, `ChoiceList`, `ChoiceCards`, `Composer`, `MarkdownEditor`, `RichEditor` (with `preloadRichEditor`, and the round trip `roundTripMarkdown` and `canonicalMarkdown` from `@crewlethq/ui/RichEditorMarkdown`) |
46
46
  | Data display | `DataGrid` (with `useDataGridDriving`, `useAnyDataGridDriving` and `countDataGridRows`), `DataTable`, `CopyableCell`, `Table`, the read-only table cells (`TableKeyCell`, `TableNumberCell`, `TableDateCell`, `TableEntityCell`, `TableStatusCell`, `TableTagsCell`, `TableTextCell`), `StatCard`, `Meter`, `SegmentedMeter`, `Stepper`, `PricingCard`, `Avatar`, `AvatarStack`, `EntityChip`, `CodeBlock`, `QrCode`, `ObjectHeader`, `FactLine`, `SetByLine`, `Skeleton`, `Eyebrow`, `StatGroup`, `PinTile`, `IconTile`, `SettingsTable` (with `SettingsTable.Row`), `CatalogTile` |
47
47
  | List screens | `DataView`, and its parts on their own: `DataViewToolbar`, `FilterAxisBar`, `FilterAxisChip`, `FilterPill`, plus the filter model (`filterDefsFromColumns`, `applyColumnFilters`, `filterPredicate`, `blankFilterValue`) |
48
48
  | Feedback and overlays | `Callout`, `ConflictNote`, `EditingStatus`, `Toaster`, `Modal` (with `variant="sheet"`), `ConfirmModal`, `CommandPalette`, `Tooltip`, `Popover`, `Announcer` |
@@ -205,6 +205,20 @@ places:
205
205
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
206
206
  when the content beneath it moves, and every panel anchored inside follows.
207
207
 
208
+ ## Changes in 0.76.0
209
+
210
+ **`ChoiceCards`, choices a person compares.** One answer from a few, each a card of the same lines: a picture (`media`), the choice's name (`label`) and its `tag`; one line of `description`; and a few `facts`, one to a line, each a name and a value, with an optional `tone` drawn as a `StatusDot` beside words that say the state. Cards side by side share every line on a CSS subgrid, so their facts stand level; where subgrid is not supported each card is a plain column. A description row is held only when some card has one, and a card without one keeps it empty. `minCardWidth` is the narrowest a card stands (`md`, 20rem, the default, or `lg`, 24rem), which decides how many share a row. The radios are native, so the arrow keys move the choice; each is named by its choice and tag alone and described by the rest of the card. A card that cannot be chosen (`disabled`) stands on the page's ground with a quiet radio and a muted picture, and says why in `disabledReason`, on its last line or, with `disabledReasonAt`, in place of a fact's value, read with the fact's name. A chosen card lays the selected tint over its raised surface inside an edge in the accent's ink. Under forced colours the radio is the platform's own, the chosen card's edge the system's selection colour and an unavailable card the system's disabled ink. The types are `ChoiceCardsProps`, `ChoiceCardOption`, `ChoiceCardFact` and `ChoiceCardsMinWidth`.
211
+
212
+ **`ChoiceList` lets one choice be unavailable.** An option takes `disabled` and `disabledReason`: the choice is skipped by the arrows, keeps its words at full contrast, and gives its reason on its detail line in the warning ink, read once, as its radio's description. Element ids now follow each option's position rather than its `value`, so a value holding a space no longer breaks its radio's name.
213
+
214
+ **`SetupWizard` takes `primaryAction`, and fills its screen.** `primaryAction` is the step's primary action, last in the footer row: its box keeps one width on every step (at least 8rem), so "Create" on the last step moves nothing beside it, and on a phone it takes the whole width of the footer's second row. `footer` is now optional and holds the step's other actions. In a flex column as tall as the view (an `AppShell`'s content) the wizard grows into the room and the footer rests at the bottom on every step, a phone included. On a phone the row of steps is one row that scrolls sideways, with the current step brought to its middle (in either writing direction), an edge that hides steps faded out, and the row reachable by the keyboard and named while it overflows; a thin bar under the position line says how far along. What to change: on a phone the whole-width row now follows `primaryAction` by name rather than whichever action came last, so move the primary action from `footer` to `primaryAction`.
215
+
216
+ **`Stepper`'s pickable pill is pressed through the 24px target floor**: an invisible band of `--size-target-min` centred on the 20px pill, so the pill does not grow. The pill's height is declared once as `--crewlet-stepper-pill-height`, a supported read-only property for a layout that sizes around a pill.
217
+
218
+ **`StatusDot`'s size is `--crewlet-status-dot-size`**, declared once, a supported read-only property for a layout that centres the dot on a wrapped line by the same measure.
219
+
220
+ **A `FormField`'s `labelAction` keeps its own case and letter spacing**, rather than the label's capitals and wide tracking.
221
+
208
222
  ## Changes in 0.73.0
209
223
 
210
224
  **`RecordChip`, a record named inside a sentence.** A button at the text's own size on its baseline, exactly one line of the text it sits in tall (`line-height: calc(1lh - 2px)` with its hairline, standing at the line's top so a key's mono text never moves the line), drawing the record's key in mono (`code`) or its name (`label`), with an optional kind glyph. It opens a **peek**: a `Popover` dialog named after the record (its key, then its name), with one line of context (`meta`), a body for its facts or rows (`children`) and a foot for the host's own link and downloads (`actions`). Focus moves into the peek; Escape, Tab out or a control that closes it returns focus to the chip, and a press outside closes it. A `code` chip's accessible name is the key and then the record's name ("GOP-11, Android 12 crash ..."); a `label` chip is named by its label alone, and carries its whole text as its `title`, so a pointer reader can read one cut at the line's end.
@@ -1,12 +1,12 @@
1
- export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-5JPID3YI.js';
1
+ export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-57AKYFML.js';
2
2
  import '../chunk-4MJN2KN6.js';
3
3
  import '../chunk-WFCWPXJN.js';
4
- import '../chunk-OXEWUAND.js';
4
+ import '../chunk-E35HYQMK.js';
5
5
  import '../chunk-222VILSP.js';
6
6
  import '../chunk-FFGEJUAP.js';
7
7
  import '../chunk-CLJGFOTV.js';
8
8
  import '../chunk-ANTAQAR4.js';
9
- import '../chunk-DCQ2VTBB.js';
9
+ import '../chunk-FB3TCNQP.js';
10
10
  import '../chunk-PGCLHYVP.js';
11
11
  import '../chunk-IVTQWOXV.js';
12
12
  import '../chunk-MLDTLZAO.js';
@@ -18,7 +18,7 @@ import '../chunk-OMV5W53A.js';
18
18
  import '../chunk-2YTOOH3A.js';
19
19
  import '../chunk-XSPCITPN.js';
20
20
  import '../chunk-H5XTJ7GJ.js';
21
- import '../chunk-NUZHC6MM.js';
22
21
  import '../chunk-UAUP6XGK.js';
22
+ import '../chunk-NUZHC6MM.js';
23
23
  import '../chunk-UT6CW3C7.js';
24
24
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useScreenBelow, useScreenWidth, useStoredWidth } from '../chunk-HDLUG3MA.js';
1
+ export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useScreenBelow, useScreenWidth, useStoredWidth } from '../chunk-UY3FWQWG.js';
2
2
  import '../chunk-RTPQDNW3.js';
3
- import '../chunk-KNAHKQD4.js';
3
+ import '../chunk-OQG4P5KU.js';
4
4
  export { RESIZE_HANDLE_LARGE_STEP, RESIZE_HANDLE_STEP, ResizeHandle, clampSize, useAppShellAside, useAppShellPeek } from '../chunk-PIYJNCN7.js';
5
5
  import '../chunk-DGXZ635L.js';
6
6
  import '../chunk-OMV5W53A.js';
7
7
  import '../chunk-2YTOOH3A.js';
8
8
  import '../chunk-XSPCITPN.js';
9
9
  import '../chunk-H5XTJ7GJ.js';
10
- import '../chunk-NUZHC6MM.js';
11
10
  import '../chunk-UAUP6XGK.js';
11
+ import '../chunk-NUZHC6MM.js';
12
12
  import '../chunk-UT6CW3C7.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { ArrangeList, DEFAULT_ARRANGE_LABELS } from '../chunk-GAUBP247.js';
1
+ export { ArrangeList, DEFAULT_ARRANGE_LABELS } from '../chunk-TKUAGWNR.js';
2
2
  import '../chunk-3XDT5ZWL.js';
3
3
  import '../chunk-MPVMB2DV.js';
4
- import '../chunk-EAR2F5OA.js';
5
- import '../chunk-DCQ2VTBB.js';
4
+ import '../chunk-LMQG3VPG.js';
5
+ import '../chunk-FB3TCNQP.js';
6
6
  import '../chunk-PGCLHYVP.js';
7
7
  import '../chunk-PQADV6P6.js';
8
8
  import '../chunk-2G355KDJ.js';
9
9
  import '../chunk-H5XTJ7GJ.js';
10
- import '../chunk-NUZHC6MM.js';
11
10
  import '../chunk-UAUP6XGK.js';
11
+ import '../chunk-NUZHC6MM.js';
12
12
  import '../chunk-UT6CW3C7.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,21 +1,21 @@
1
- export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-5NFYTQK2.js';
1
+ export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-IPBSCJIZ.js';
2
2
  import '../chunk-25AZQ3GZ.js';
3
3
  import '../chunk-I33UIUZD.js';
4
- import '../chunk-PYJLHHYF.js';
5
- import '../chunk-ZD52GKKS.js';
4
+ import '../chunk-BKXUZCZX.js';
5
+ import '../chunk-6THG44LI.js';
6
6
  import '../chunk-EGMQURBR.js';
7
- import '../chunk-WIATRXEJ.js';
8
7
  import '../chunk-AVL52EME.js';
8
+ import '../chunk-CYQBDZ6M.js';
9
9
  import '../chunk-RSKW25Y5.js';
10
10
  import '../chunk-ANTAQAR4.js';
11
11
  import '../chunk-MLDTLZAO.js';
12
- import '../chunk-KNAHKQD4.js';
12
+ import '../chunk-OQG4P5KU.js';
13
13
  import '../chunk-DGXZ635L.js';
14
14
  import '../chunk-OMV5W53A.js';
15
15
  import '../chunk-2YTOOH3A.js';
16
16
  import '../chunk-XSPCITPN.js';
17
17
  import '../chunk-H5XTJ7GJ.js';
18
- import '../chunk-NUZHC6MM.js';
19
18
  import '../chunk-UAUP6XGK.js';
19
+ import '../chunk-NUZHC6MM.js';
20
20
  import '../chunk-UT6CW3C7.js';
21
21
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-7OFVR7X4.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-ZKLEAK7M.js';
2
2
  import '../chunk-BRLZXYPA.js';
3
3
  import '../chunk-N2BF272H.js';
4
4
  import '../chunk-EJNJMHQG.js';
@@ -8,16 +8,16 @@ import '../chunk-AV2DXAEL.js';
8
8
  import '../chunk-BT3GB7HC.js';
9
9
  import '../chunk-KTIQSSME.js';
10
10
  import '../chunk-NHLNHH4J.js';
11
- import '../chunk-EAR2F5OA.js';
11
+ import '../chunk-LMQG3VPG.js';
12
12
  import '../chunk-DOY3KC6I.js';
13
13
  export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
14
- import '../chunk-DCQ2VTBB.js';
14
+ import '../chunk-FB3TCNQP.js';
15
15
  import '../chunk-PGCLHYVP.js';
16
16
  import '../chunk-MLDTLZAO.js';
17
17
  import '../chunk-PQADV6P6.js';
18
18
  import '../chunk-2G355KDJ.js';
19
19
  import '../chunk-H5XTJ7GJ.js';
20
- import '../chunk-NUZHC6MM.js';
21
20
  import '../chunk-UAUP6XGK.js';
21
+ import '../chunk-NUZHC6MM.js';
22
22
  import '../chunk-UT6CW3C7.js';
23
23
  import '../chunk-ODEQTPFM.js';
@@ -5,7 +5,7 @@ import '../chunk-PIYJNCN7.js';
5
5
  import '../chunk-OMV5W53A.js';
6
6
  import '../chunk-2YTOOH3A.js';
7
7
  import '../chunk-H5XTJ7GJ.js';
8
- import '../chunk-NUZHC6MM.js';
9
8
  import '../chunk-UAUP6XGK.js';
9
+ import '../chunk-NUZHC6MM.js';
10
10
  import '../chunk-UT6CW3C7.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { ATTACHMENT_CHIP_LABELS, AttachmentChip } from '../chunk-3N36CYTU.js';
2
- import '../chunk-I5OIKDX2.js';
3
- import '../chunk-WIATRXEJ.js';
1
+ export { ATTACHMENT_CHIP_LABELS, AttachmentChip } from '../chunk-2PIH6JHJ.js';
2
+ import '../chunk-VERJCAJ4.js';
3
+ import '../chunk-CYQBDZ6M.js';
4
4
  import '../chunk-XSPCITPN.js';
5
5
  import '../chunk-UT6CW3C7.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,21 +1,21 @@
1
- export { AvatarPicker } from '../chunk-352FPJ2Q.js';
2
- import '../chunk-SRDZVY5M.js';
1
+ export { AvatarPicker } from '../chunk-ZW5SRQ5M.js';
2
+ import '../chunk-SK5SLGZH.js';
3
3
  import '../chunk-KHJIEPZV.js';
4
4
  import '../chunk-AYKXMIOR.js';
5
5
  import '../chunk-I22MUEG7.js';
6
- import '../chunk-PYJLHHYF.js';
7
- import '../chunk-ZD52GKKS.js';
6
+ import '../chunk-BKXUZCZX.js';
7
+ import '../chunk-6THG44LI.js';
8
8
  import '../chunk-EGMQURBR.js';
9
- import '../chunk-WIATRXEJ.js';
9
+ import '../chunk-CYQBDZ6M.js';
10
10
  import '../chunk-KTIQSSME.js';
11
11
  import '../chunk-MLDTLZAO.js';
12
- import '../chunk-KNAHKQD4.js';
12
+ import '../chunk-OQG4P5KU.js';
13
13
  import '../chunk-DGXZ635L.js';
14
14
  import '../chunk-OMV5W53A.js';
15
15
  import '../chunk-2YTOOH3A.js';
16
16
  import '../chunk-XSPCITPN.js';
17
17
  import '../chunk-H5XTJ7GJ.js';
18
- import '../chunk-NUZHC6MM.js';
19
18
  import '../chunk-UAUP6XGK.js';
19
+ import '../chunk-NUZHC6MM.js';
20
20
  import '../chunk-UT6CW3C7.js';
21
21
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BriefCard } from '../chunk-4KSCGXLJ.js';
1
+ export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BriefCard } from '../chunk-5BOFC5OP.js';
2
2
  import '../chunk-Y7PVLEZJ.js';
3
- import '../chunk-NTQPJJAN.js';
4
- import '../chunk-I5OIKDX2.js';
5
- import '../chunk-WIATRXEJ.js';
3
+ import '../chunk-RTMNULTL.js';
4
+ import '../chunk-VERJCAJ4.js';
5
+ import '../chunk-CYQBDZ6M.js';
6
6
  import '../chunk-4AUTALJA.js';
7
7
  import '../chunk-AV2DXAEL.js';
8
8
  import '../chunk-MLDTLZAO.js';
@@ -1,4 +1,4 @@
1
- export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-EMCVX5FY.js';
1
+ export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-OBPINJNO.js';
2
2
  import '../chunk-LM3ISVJA.js';
3
3
  import '../chunk-I33UIUZD.js';
4
4
  import '../chunk-ANTAQAR4.js';
@@ -6,7 +6,7 @@ import '../chunk-DGXZ635L.js';
6
6
  import '../chunk-OMV5W53A.js';
7
7
  import '../chunk-XSPCITPN.js';
8
8
  import '../chunk-H5XTJ7GJ.js';
9
- import '../chunk-NUZHC6MM.js';
10
9
  import '../chunk-UAUP6XGK.js';
10
+ import '../chunk-NUZHC6MM.js';
11
11
  import '../chunk-UT6CW3C7.js';
12
12
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from '../chunk-ODAZIKZF.js';
1
+ export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from '../chunk-FQI62PIZ.js';
2
2
  import '../chunk-5SZGKSGL.js';
3
- import '../chunk-SQ7GYC4K.js';
3
+ import '../chunk-KL6A7JGH.js';
4
4
  import '../chunk-NR4CPM4T.js';
5
- import '../chunk-EMCVX5FY.js';
5
+ import '../chunk-OBPINJNO.js';
6
6
  import '../chunk-LM3ISVJA.js';
7
7
  import '../chunk-I33UIUZD.js';
8
8
  import '../chunk-ANTAQAR4.js';
@@ -10,7 +10,7 @@ import '../chunk-DGXZ635L.js';
10
10
  import '../chunk-OMV5W53A.js';
11
11
  import '../chunk-XSPCITPN.js';
12
12
  import '../chunk-H5XTJ7GJ.js';
13
- import '../chunk-NUZHC6MM.js';
14
13
  import '../chunk-UAUP6XGK.js';
14
+ import '../chunk-NUZHC6MM.js';
15
15
  import '../chunk-UT6CW3C7.js';
16
16
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { CanvasToolbar, toolForKey } from '../chunk-SQ7GYC4K.js';
1
+ export { CanvasToolbar, toolForKey } from '../chunk-KL6A7JGH.js';
2
2
  import '../chunk-NR4CPM4T.js';
3
- import '../chunk-EMCVX5FY.js';
3
+ import '../chunk-OBPINJNO.js';
4
4
  import '../chunk-LM3ISVJA.js';
5
5
  import '../chunk-I33UIUZD.js';
6
6
  import '../chunk-ANTAQAR4.js';
@@ -8,7 +8,7 @@ import '../chunk-DGXZ635L.js';
8
8
  import '../chunk-OMV5W53A.js';
9
9
  import '../chunk-XSPCITPN.js';
10
10
  import '../chunk-H5XTJ7GJ.js';
11
- import '../chunk-NUZHC6MM.js';
12
11
  import '../chunk-UAUP6XGK.js';
12
+ import '../chunk-NUZHC6MM.js';
13
13
  import '../chunk-UT6CW3C7.js';
14
14
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged } from '../chunk-WQRSZMN4.js';
1
+ export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged } from '../chunk-BBD7PTBG.js';
2
2
  import '../chunk-LR4IWUWQ.js';
3
- import '../chunk-I5OIKDX2.js';
4
- import '../chunk-WIATRXEJ.js';
3
+ import '../chunk-VERJCAJ4.js';
4
+ import '../chunk-CYQBDZ6M.js';
5
5
  import '../chunk-222VILSP.js';
6
6
  import '../chunk-IVTQWOXV.js';
7
7
  import '../chunk-MLDTLZAO.js';
@@ -1,10 +1,10 @@
1
- export { Checkbox, CheckboxGroup } from '../chunk-EAR2F5OA.js';
2
- import '../chunk-DCQ2VTBB.js';
1
+ export { Checkbox, CheckboxGroup } from '../chunk-LMQG3VPG.js';
2
+ import '../chunk-FB3TCNQP.js';
3
3
  import '../chunk-PGCLHYVP.js';
4
4
  import '../chunk-PQADV6P6.js';
5
5
  import '../chunk-2G355KDJ.js';
6
6
  import '../chunk-H5XTJ7GJ.js';
7
- import '../chunk-NUZHC6MM.js';
8
7
  import '../chunk-UAUP6XGK.js';
8
+ import '../chunk-NUZHC6MM.js';
9
9
  import '../chunk-UT6CW3C7.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -19,7 +19,12 @@ export interface ChoiceButtonsProps extends Omit<HTMLAttributes<HTMLDivElement>,
19
19
  /** Names the group: "Answers". */
20
20
  label: string;
21
21
  options: readonly ChoiceButtonOption[];
22
- /** The option the asker recommends: drawn first, filled, and marked. */
22
+ /**
23
+ * The option the asker recommends: drawn first and marked, and filled with
24
+ * the accent while the options send rather than toggle (`chosen` left out).
25
+ * As toggles it is drawn plain with its mark kept, so the chosen option is
26
+ * always the most prominent one.
27
+ */
23
28
  recommended?: string | null | undefined;
24
29
  /** The mark on the recommended option, read as part of its name. */
25
30
  recommendedLabel?: string | undefined;
@@ -31,8 +36,10 @@ export interface ChoiceButtonsProps extends Omit<HTMLAttributes<HTMLDivElement>,
31
36
  * The option already applied, for options that stay on screen after a
32
37
  * press (a suggestion that updated a field). Given, every option is a
33
38
  * toggle button that says whether it is the one applied, and that one is
34
- * drawn chosen: the selected edge and fill, never the accent. `null` when
35
- * none is; left out, the options send and say nothing of a choice.
39
+ * drawn chosen: the selected fill inside an edge in the accent's ink, with a
40
+ * check mark. The recommended option leaves the accent fill and keeps its
41
+ * mark. `null` when none is; left out, the options send and say nothing of
42
+ * a choice.
36
43
  */
37
44
  chosen?: string | null | undefined;
38
45
  /**
@@ -1,3 +1,3 @@
1
- export { ChoiceButtons } from '../chunk-C3SCONKY.js';
1
+ export { ChoiceButtons } from '../chunk-RVSNBUIU.js';
2
2
  import '../chunk-UT6CW3C7.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -5,6 +5,11 @@
5
5
  * The plain option is the secondary button's recipe (the card's own ground
6
6
  * inside the strong hairline), and the recommended one the primary's, so the
7
7
  * pair reads as the screen's one primary action and its alternatives.
8
+ *
9
+ * AS TOGGLES (`chosen` given, so every option carries `aria-pressed`) the
10
+ * accent is the chosen option's alone: the recommended one is drawn plain with
11
+ * its mark kept, so an answer that went against the recommendation never shows
12
+ * the option NOT chosen as the loudest one on the screen.
8
13
  */
9
14
 
10
15
  .crewlet-choice-buttons {
@@ -20,7 +25,6 @@
20
25
 
21
26
  display: flex;
22
27
  align-items: center;
23
- justify-content: space-between;
24
28
  gap: var(--spacing-3);
25
29
  min-width: 0;
26
30
  min-height: var(--size-control-lg);
@@ -65,13 +69,21 @@
65
69
  }
66
70
 
67
71
  /*
68
- * THE OPTION APPLIED is drawn as every chosen option in the package is: the
69
- * selected edge over the soft selected fill, calm beside the focus ring, and
70
- * held under the pointer so a hover never makes it look unchosen.
72
+ * THE OPTION APPLIED stands on the soft selected fill inside an edge in the
73
+ * accent's ink, with a check mark in the same ink, held under the pointer and
74
+ * the press so neither makes it look unchosen.
75
+ *
76
+ * The edge is the accent's INK, not the selected edge the package's other
77
+ * chosen options draw. That edge is a tint, as low as 1.65:1 against this fill
78
+ * (dark, on the raised rung), and here the edge is what tells a pressed toggle
79
+ * from the others, which WCAG 1.4.11 holds to 3:1. The ink clears 4.71:1 at
80
+ * its tightest (light, on the frame), and the check mark makes the state more
81
+ * than a colour.
71
82
  */
72
83
  .crewlet-choice-buttons__option.is-chosen,
73
- .crewlet-choice-buttons__option.is-chosen:hover {
74
- border-color: var(--color-border-selected);
84
+ .crewlet-choice-buttons__option.is-chosen:hover,
85
+ .crewlet-choice-buttons__option.is-chosen:active {
86
+ border-color: var(--color-brand-accent-ink);
75
87
  background: var(--color-surface-selected);
76
88
  }
77
89
 
@@ -93,7 +105,7 @@
93
105
  cursor: progress;
94
106
  }
95
107
 
96
- .crewlet-choice-buttons__option--recommended {
108
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]) {
97
109
  background: var(--color-brand-accent);
98
110
  border-color: transparent;
99
111
  color: var(--color-text-on-accent);
@@ -106,12 +118,12 @@
106
118
  --crewlet-inline-ref-mark-ink: currentColor;
107
119
  }
108
120
 
109
- .crewlet-choice-buttons__option--recommended:hover:not([aria-disabled='true']) {
121
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]):hover:not([aria-disabled='true']) {
110
122
  background: var(--color-brand-accent-hover);
111
123
  border-color: transparent;
112
124
  }
113
125
 
114
- .crewlet-choice-buttons__option--recommended:active:not([aria-disabled='true']) {
126
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]):active:not([aria-disabled='true']) {
115
127
  background: var(--color-brand-accent-active);
116
128
  }
117
129
 
@@ -120,33 +132,18 @@
120
132
  * nearly the fill's own colour, so its ring stands off it as a primary
121
133
  * button's does.
122
134
  */
123
- .crewlet-choice-buttons__option--recommended:focus-visible {
135
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]):focus-visible {
124
136
  outline-offset: 2px;
125
137
  }
126
138
 
127
139
  /*
128
- * THE RECOMMENDED OPTION, CHOSEN, is drawn as every chosen option is: the
129
- * selected edge over the soft selected fill, in the primary ink, its mark kept
130
- * so a reader still sees which option was recommended. The chosen rule swapped
131
- * the accent fill for the soft one and left the accent's own ink behind, white
132
- * on a pale tint, under 1.5:1 in the light theme. Held under the pointer and
133
- * the press too, which otherwise bring the accent back.
140
+ * The words take the room the option has to spare, so the recommended mark and
141
+ * the check mark after them sit together at the far end, and a picture before
142
+ * them keeps its place at the start.
134
143
  */
135
- .crewlet-choice-buttons__option--recommended.is-chosen,
136
- .crewlet-choice-buttons__option--recommended.is-chosen:hover:not([aria-disabled='true']),
137
- .crewlet-choice-buttons__option--recommended.is-chosen:active:not([aria-disabled='true']) {
138
- border-color: var(--color-border-selected);
139
- background: var(--color-surface-selected);
140
- color: var(--color-text-primary);
141
- }
142
-
143
- /* Off the accent, the ring is drawn over the selected edge again. */
144
- .crewlet-choice-buttons__option--recommended.is-chosen:focus-visible {
145
- outline-offset: var(--size-focus-ring-inset-offset);
146
- }
147
-
148
144
  .crewlet-choice-buttons__text {
149
145
  display: grid;
146
+ flex: 1 1 auto;
150
147
  gap: 2px;
151
148
  min-width: 0;
152
149
  overflow-wrap: anywhere;
@@ -162,15 +159,10 @@
162
159
  * On the accent fill the detail takes the label's own ink. The tertiary step
163
160
  * is measured on the surfaces, not on the accent, where it does not clear.
164
161
  */
165
- .crewlet-choice-buttons__option--recommended .crewlet-choice-buttons__detail {
162
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]) .crewlet-choice-buttons__detail {
166
163
  color: var(--color-text-on-accent);
167
164
  }
168
165
 
169
- /* Chosen, it is off the accent, and the detail takes its tertiary step again. */
170
- .crewlet-choice-buttons__option--recommended.is-chosen .crewlet-choice-buttons__detail {
171
- color: var(--color-text-tertiary);
172
- }
173
-
174
166
  /*
175
167
  * The mark, in the micro-label register. Full ink rather than a faded one:
176
168
  * eleven pixels of white on the accent clears 4.5:1 only at full strength.
@@ -183,8 +175,12 @@
183
175
  text-transform: uppercase;
184
176
  }
185
177
 
186
- /* The picture before the words, centred on the label's line. */
187
- .crewlet-choice-buttons__media {
178
+ /*
179
+ * The picture before the words and the check mark at the far end, each
180
+ * centred on the label's line.
181
+ */
182
+ .crewlet-choice-buttons__media,
183
+ .crewlet-choice-buttons__check {
188
184
  display: inline-flex;
189
185
  flex: none;
190
186
  align-items: center;
@@ -193,22 +189,22 @@
193
189
 
194
190
  /*
195
191
  * With a detail under it the label's line is the FIRST line, not the
196
- * option's middle, so the picture stands on a box one line tall at the top.
197
- * Centred on the label and its detail together, a suggestion's swatch sat
198
- * 7px under the value it shows.
192
+ * option's middle, so the picture and the check mark stand on a box one line
193
+ * tall at the top. Centred on the label and its detail together, a
194
+ * suggestion's swatch sat 7px under the value it shows.
199
195
  */
200
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) .crewlet-choice-buttons__media {
196
+ .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) .crewlet-choice-buttons__media,
197
+ .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) .crewlet-choice-buttons__check {
201
198
  align-self: flex-start;
202
199
  min-height: calc(var(--crewlet-choice-buttons-leading) * 1em);
203
200
  }
204
201
 
205
- /* Before the words, not at the far end with the recommended mark. */
206
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) {
207
- justify-content: flex-start;
208
- }
209
-
210
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) .crewlet-choice-buttons__note {
211
- margin-inline-start: auto;
202
+ /*
203
+ * The chosen option's check mark, at the label's size and in the edge's ink,
204
+ * which clears the 3:1 a mark has to on the selected fill in every theme.
205
+ */
206
+ .crewlet-choice-buttons__check {
207
+ color: var(--color-brand-accent-ink);
212
208
  }
213
209
 
214
210
  /*
@@ -0,0 +1,80 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Tone } from '../utils/tone.js';
3
+ /** One short fact on a card: what it needs, how ready that is, how it behaves. */
4
+ export interface ChoiceCardFact {
5
+ /** The fact's name, a word or two: "Needs", "Isolation". */
6
+ label: ReactNode;
7
+ /** The fact: "Docker 24.0.7 found". */
8
+ value: ReactNode;
9
+ /** A state the fact reports, drawn as a dot beside it; none for a plain fact. */
10
+ tone?: Tone | undefined;
11
+ }
12
+ /** One choice in [ChoiceCards]. */
13
+ export interface ChoiceCardOption {
14
+ /** Stable identity, and what `onChange` is called with. */
15
+ value: string;
16
+ /** What the choice is, in a few words: its radio's name, with the tag. */
17
+ label: ReactNode;
18
+ /** A picture of the choice before its name: a product's mark, a glyph. Decorative; the label names it. */
19
+ media?: ReactNode;
20
+ /** A short word beside the choice's name, read as part of its name: "Company default". */
21
+ tag?: ReactNode;
22
+ /** One plain line saying what choosing it means. */
23
+ description?: ReactNode;
24
+ /** A few short facts, one to a line under the description, each its name and its value. */
25
+ facts?: readonly ChoiceCardFact[] | undefined;
26
+ /** The choice cannot be made now. */
27
+ disabled?: boolean | undefined;
28
+ /**
29
+ * Why not, and what fixes it ("Add E2B_API_KEY to use it"), in the warning
30
+ * ink and read with its radio: the one way a card gives its reason. It is
31
+ * the card's last line, or, with `disabledReasonAt`, the value of a fact.
32
+ */
33
+ disabledReason?: ReactNode;
34
+ /**
35
+ * The index of the fact whose value the reason takes the place of ("Needs:
36
+ * E2B key not set. Add E2B_API_KEY"), so a card that cannot be chosen keeps
37
+ * the same lines as the cards beside it rather than growing one.
38
+ */
39
+ disabledReasonAt?: number | undefined;
40
+ }
41
+ /** The narrowest a card stands: `md` 20rem, `lg` 24rem. */
42
+ export type ChoiceCardsMinWidth = 'md' | 'lg';
43
+ export interface ChoiceCardsProps {
44
+ /** Names the group for a screen reader. */
45
+ label: string;
46
+ options: readonly ChoiceCardOption[];
47
+ /** The selected choice's `value`, or null when none is. */
48
+ value: string | null;
49
+ onChange: (value: string) => void;
50
+ /**
51
+ * The narrowest a card stands, which decides how many share a row: `md`
52
+ * (20rem) for a short name and facts, `lg` (24rem) for choices with more to
53
+ * say. A form's column holds one to a row; a wider surface two or three.
54
+ */
55
+ minCardWidth?: ChoiceCardsMinWidth | undefined;
56
+ className?: string | undefined;
57
+ }
58
+ /**
59
+ * One answer from a few, each a card of the same lines: a picture, the
60
+ * choice's name and its tag; one line of description; and a few facts, one to
61
+ * a line. Cards side by side share every line (a subgrid), so the facts of
62
+ * every card stand level, in a grid that wraps.
63
+ *
64
+ * FOR CHOICES A PERSON COMPARES rather than reads down: a product to run, a
65
+ * place to run it, what a new thing is for. Where each answer is a line of
66
+ * words, [ChoiceList] is the lighter control.
67
+ *
68
+ * NATIVE RADIOS, so the arrow keys move the choice and Tab leaves the group as
69
+ * the platform does, and each card is its radio's label, so the whole card
70
+ * takes the pointer. The radio is NAMED by the choice's name and tag alone
71
+ * and DESCRIBED by the rest (the description, the facts, the reason): named by
72
+ * the whole card, it was read as some twenty-five words on every arrow press,
73
+ * a link's words among them. A disabled card is skipped by the arrows, keeps
74
+ * its words at full contrast, and says why it is unavailable and what fixes
75
+ * it, because a choice greyed out with no reason is a dead end.
76
+ *
77
+ * A FACT'S STATE IS NEVER ONLY A COLOUR: the dot sits beside words that say
78
+ * it ("Docker 24.0.7 found", "E2B key not set").
79
+ */
80
+ export declare function ChoiceCards({ label, options, value, onChange, minCardWidth, className }: ChoiceCardsProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './ChoiceCards.css';
2
+ export { ChoiceCards } from './ChoiceCards.js';
3
+ export type { ChoiceCardFact, ChoiceCardOption, ChoiceCardsMinWidth, ChoiceCardsProps } from './ChoiceCards.js';
@@ -0,0 +1,3 @@
1
+ export { ChoiceCards } from '../chunk-MKFEVHSR.js';
2
+ import '../chunk-CYQBDZ6M.js';
3
+ import '../chunk-ODEQTPFM.js';