@crewlethq/ui 0.75.2 → 0.75.4

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.
@@ -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-FXMYDXCI.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,12 +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
 
139
+ /*
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.
143
+ */
127
144
  .crewlet-choice-buttons__text {
128
145
  display: grid;
146
+ flex: 1 1 auto;
129
147
  gap: 2px;
130
148
  min-width: 0;
131
149
  overflow-wrap: anywhere;
@@ -141,7 +159,7 @@
141
159
  * On the accent fill the detail takes the label's own ink. The tertiary step
142
160
  * is measured on the surfaces, not on the accent, where it does not clear.
143
161
  */
144
- .crewlet-choice-buttons__option--recommended .crewlet-choice-buttons__detail {
162
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]) .crewlet-choice-buttons__detail {
145
163
  color: var(--color-text-on-accent);
146
164
  }
147
165
 
@@ -157,8 +175,12 @@
157
175
  text-transform: uppercase;
158
176
  }
159
177
 
160
- /* The picture before the words, centred on the label's line. */
161
- .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 {
162
184
  display: inline-flex;
163
185
  flex: none;
164
186
  align-items: center;
@@ -167,22 +189,22 @@
167
189
 
168
190
  /*
169
191
  * With a detail under it the label's line is the FIRST line, not the
170
- * option's middle, so the picture stands on a box one line tall at the top.
171
- * Centred on the label and its detail together, a suggestion's swatch sat
172
- * 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.
173
195
  */
174
- .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 {
175
198
  align-self: flex-start;
176
199
  min-height: calc(var(--crewlet-choice-buttons-leading) * 1em);
177
200
  }
178
201
 
179
- /* Before the words, not at the far end with the recommended mark. */
180
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) {
181
- justify-content: flex-start;
182
- }
183
-
184
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) .crewlet-choice-buttons__note {
185
- 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);
186
208
  }
187
209
 
188
210
  /*
@@ -4,9 +4,9 @@ import '../chunk-K4LZXSKZ.js';
4
4
  import '../chunk-BWFJB5JD.js';
5
5
  import '../chunk-HPI5J6AR.js';
6
6
  import '../chunk-C667GCU7.js';
7
- import '../chunk-7KHM2FZH.js';
8
7
  import '../chunk-STJ7QBC3.js';
9
8
  import '../chunk-DTIW4CHZ.js';
9
+ import '../chunk-7KHM2FZH.js';
10
10
  import '../chunk-EE3DJMSQ.js';
11
11
  import '../chunk-NR4CPM4T.js';
12
12
  import '../chunk-KHJIEPZV.js';
@@ -1,10 +1,10 @@
1
1
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-Q2T4L6ML.js';
2
2
  import '../chunk-VK45YJLH.js';
3
3
  import '../chunk-C667GCU7.js';
4
- import '../chunk-7KHM2FZH.js';
5
4
  import '../chunk-T5GBTXNC.js';
6
5
  import '../chunk-STJ7QBC3.js';
7
6
  import '../chunk-DTIW4CHZ.js';
7
+ import '../chunk-7KHM2FZH.js';
8
8
  import '../chunk-BPCY7ZID.js';
9
9
  import '../chunk-N2BF272H.js';
10
10
  import '../chunk-BT3GB7HC.js';
@@ -1,7 +1,8 @@
1
1
  import { VisuallyHidden } from './chunk-UT6CW3C7.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './ChoiceButtons-G7XHZKDP.css';
3
+ import './ChoiceButtons-T3GG6VLG.css';
4
4
  import { useId } from 'react';
5
+ import { CheckGlyph } from '@crewlethq/icons/glyphs';
5
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
7
 
7
8
  function ChoiceButtons({
@@ -65,7 +66,8 @@ function ChoiceButtons({
65
66
  isRecommended ? /* @__PURE__ */ jsxs(Fragment, { children: [
66
67
  " ",
67
68
  /* @__PURE__ */ jsx("span", { className: "crewlet-choice-buttons__note", children: recommendedLabel })
68
- ] }) : null
69
+ ] }) : null,
70
+ isChosen ? /* @__PURE__ */ jsx("span", { className: "crewlet-choice-buttons__check", "aria-hidden": "true", children: /* @__PURE__ */ jsx(CheckGlyph, {}) }) : null
69
71
  ]
70
72
  },
71
73
  option.value
@@ -3,8 +3,8 @@ export { WidgetFrame } from '../chunk-S5QJZOPL.js';
3
3
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from '../chunk-FEJANUZK.js';
4
4
  export { TreeCanvas } from '../chunk-JQEXAH7G.js';
5
5
  export { TypeSpecimen } from '../chunk-JKAFEFFC.js';
6
- export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from '../chunk-BWAUL5MB.js';
7
6
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-EOXI3CRG.js';
7
+ export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from '../chunk-BWAUL5MB.js';
8
8
  export { VersionTimeline } from '../chunk-53J2YNQA.js';
9
9
  export { ThemeToggle } from '../chunk-IPMJGK2Q.js';
10
10
  export { ThinkingIndicator } from '../chunk-M73MMEZY.js';
@@ -40,10 +40,10 @@ export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } f
40
40
  export { Select } from '../chunk-VK45YJLH.js';
41
41
  export { RichEditor, preloadRichEditor } from '../chunk-JPQSVECQ.js';
42
42
  export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-2DMTW2Y3.js';
43
- export { canonicalMarkdown, roundTripMarkdown } from '../chunk-GBASM5EV.js';
44
- import '../chunk-7CSTEH5I.js';
45
- export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from '../chunk-DGSK4LLS.js';
46
43
  export { RUN_STATES, RunChip } from '../chunk-PIAGTZY3.js';
44
+ export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from '../chunk-DGSK4LLS.js';
45
+ export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-JXJNX7QQ.js';
46
+ export { Table } from '../chunk-75NQV4R4.js';
47
47
  export { SearchTrigger } from '../chunk-ERNT3UTB.js';
48
48
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from '../chunk-G4CGDUCP.js';
49
49
  export { NavGroup, NavItem, SidebarNav } from '../chunk-WCDPFTJZ.js';
@@ -52,8 +52,8 @@ export { REFUSAL_CARD_LABELS, RefusalCard } from '../chunk-RQHN4J5P.js';
52
52
  export { RelatedRow } from '../chunk-CNEHFH2A.js';
53
53
  export { Text } from '../chunk-QP2P6GDQ.js';
54
54
  export { ReviewList } from '../chunk-DO4J4TBZ.js';
55
- export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-JXJNX7QQ.js';
56
- export { Table } from '../chunk-75NQV4R4.js';
55
+ export { canonicalMarkdown, roundTripMarkdown } from '../chunk-GBASM5EV.js';
56
+ import '../chunk-7CSTEH5I.js';
57
57
  export { PricingCard } from '../chunk-ZKIEOWR6.js';
58
58
  export { PrincipalPicker } from '../chunk-NU5RUT7Y.js';
59
59
  export { PropertyList } from '../chunk-HIWPPWNY.js';
@@ -78,22 +78,22 @@ export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, lay
78
78
  export { OrgLabel } from '../chunk-LM6VYJTV.js';
79
79
  export { Outline, scrollToHeading, useActiveHeading } from '../chunk-A5YKNRG6.js';
80
80
  export { PageNote } from '../chunk-CV4NES3P.js';
81
- export { MessageBubble } from '../chunk-KAQ2L74F.js';
82
81
  export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-3WN5HUAK.js';
82
+ export { MessageBubble } from '../chunk-KAQ2L74F.js';
83
83
  export { NewItemsNotice } from '../chunk-463DNZXI.js';
84
- export { ListInput, withDraft } from '../chunk-H32JW6CZ.js';
84
+ export { ListDetail } from '../chunk-YBC2CYPD.js';
85
85
  export { LIVE_CURSOR_HIDE_MS, LIVE_CURSOR_REST_MS, LiveCursor } from '../chunk-DPNVKWJX.js';
86
86
  export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from '../chunk-CQFQGAZI.js';
87
87
  export { LockedLabel } from '../chunk-TEV5REGB.js';
88
- import '../chunk-KOJPDCGQ.js';
89
88
  export { LogoSlot, LogoSlotGroup } from '../chunk-YUHKRRWO.js';
89
+ import '../chunk-KOJPDCGQ.js';
90
90
  export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-ERFXYGRF.js';
91
91
  export { LAYERS_LIST_LABELS, LayersList } from '../chunk-VUYNNILP.js';
92
92
  export { AutoGrid, Inline, Spacer, Stack } from '../chunk-ZAC7SKUN.js';
93
93
  export { Link } from '../chunk-QF5UNP4T.js';
94
94
  export { LinkInterstitial, openExternal } from '../chunk-JD7P2GJP.js';
95
95
  export { List, ListItem } from '../chunk-PS5ZYIA6.js';
96
- export { ListDetail } from '../chunk-YBC2CYPD.js';
96
+ export { ListInput, withDraft } from '../chunk-H32JW6CZ.js';
97
97
  export { ImageUpload } from '../chunk-ZQEJSEPS.js';
98
98
  export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from '../chunk-QPHD4UUG.js';
99
99
  export { IndicatorAnchor } from '../chunk-27MJPU7G.js';
@@ -139,26 +139,26 @@ export { FILTER_PILL_LABELS, FILTER_PILL_WORDS_CLASS, FilterPill, filterPillSent
139
139
  export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-BWFJB5JD.js';
140
140
  export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-R6K62EXV.js';
141
141
  export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-HPI5J6AR.js';
142
- export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-AB6F5YXX.js';
143
142
  export { CommandPalette } from '../chunk-NXNLAZPK.js';
144
143
  export { ConfirmModal, Modal } from '../chunk-C667GCU7.js';
144
+ export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-AB6F5YXX.js';
145
145
  export { ConfirmField, confirmMatches } from '../chunk-JVII5264.js';
146
146
  export { InlineCode } from '../chunk-PLL7ZJHY.js';
147
147
  export { CONFLICT_NOTE_LABELS, ConflictNote } from '../chunk-B3PK2LND.js';
148
148
  export { Container } from '../chunk-HJO4WCH6.js';
149
149
  export { ContrastHelp } from '../chunk-IO374IX6.js';
150
150
  export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from '../chunk-KWLH45YC.js';
151
- export { ChoiceButtons } from '../chunk-FXMYDXCI.js';
151
+ export { ChoiceButtons } from '../chunk-RVSNBUIU.js';
152
152
  export { ChoiceList } from '../chunk-NQABJAUY.js';
153
153
  export { CodeBlock } from '../chunk-QSWQJX27.js';
154
- export { ColorField } from '../chunk-7LSSYHOT.js';
155
154
  export { ColorChip } from '../chunk-C6T4VBEY.js';
156
- export { Combobox } from '../chunk-ZUBFVK6B.js';
157
- export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, useOptionKeys } from '../chunk-7KHM2FZH.js';
155
+ export { ColorField } from '../chunk-7LSSYHOT.js';
158
156
  export { ColorSwatch } from '../chunk-6FBPFG3C.js';
159
157
  export { CopyButton, Copyable } from '../chunk-T5GBTXNC.js';
160
158
  export { useClipboard, writeClipboard } from '../chunk-STJ7QBC3.js';
161
159
  export { useOutcome } from '../chunk-DTIW4CHZ.js';
160
+ export { Combobox } from '../chunk-ZUBFVK6B.js';
161
+ export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, useOptionKeys } from '../chunk-7KHM2FZH.js';
162
162
  export { CatalogTile } from '../chunk-QE4OIE3Q.js';
163
163
  export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged } from '../chunk-WQRSZMN4.js';
164
164
  export { DIFF_LIST_LABELS, DiffList } from '../chunk-LR4IWUWQ.js';
@@ -231,7 +231,6 @@ export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
231
231
  export { ACCESS_DENIED_REASONS, AccessDeniedCard } from '../chunk-QTMUKRTN.js';
232
232
  export { EmptyState } from '../chunk-PPUR46MK.js';
233
233
  export { Accordion, AccordionItem } from '../chunk-5NJMSYDZ.js';
234
- export { ADD_PILL_MS, AddPill } from '../chunk-CVKANYHD.js';
235
234
  export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-6C6YK75K.js';
236
235
  export { Timeline, TimelineItem } from '../chunk-4MJN2KN6.js';
237
236
  export { Section } from '../chunk-WFCWPXJN.js';
@@ -245,6 +244,7 @@ export { CHARACTER_COUNT_LABELS, CHARACTER_COUNT_NEAR, CharacterCount, character
245
244
  export { DisclosureAnatomy } from '../chunk-IVTQWOXV.js';
246
245
  export { Count } from '../chunk-MLDTLZAO.js';
247
246
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from '../chunk-PQADV6P6.js';
247
+ export { ADD_PILL_MS, AddPill } from '../chunk-CVKANYHD.js';
248
248
  export { Announcer, announce, useAnnouncer } from '../chunk-2G355KDJ.js';
249
249
  export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useScreenBelow, useScreenWidth, useStoredWidth } from '../chunk-UY3FWQWG.js';
250
250
  export { useMediaMatch } from '../chunk-RTPQDNW3.js';
package/dist/index.js CHANGED
@@ -3,8 +3,8 @@ export { WidgetFrame } from './chunk-S5QJZOPL.js';
3
3
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from './chunk-FEJANUZK.js';
4
4
  export { TreeCanvas } from './chunk-JQEXAH7G.js';
5
5
  export { TypeSpecimen } from './chunk-JKAFEFFC.js';
6
- export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from './chunk-BWAUL5MB.js';
7
6
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from './chunk-EOXI3CRG.js';
7
+ export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from './chunk-BWAUL5MB.js';
8
8
  export { VersionTimeline } from './chunk-53J2YNQA.js';
9
9
  export { ThemeToggle } from './chunk-IPMJGK2Q.js';
10
10
  export { ThinkingIndicator } from './chunk-M73MMEZY.js';
@@ -40,10 +40,10 @@ export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } f
40
40
  export { Select } from './chunk-VK45YJLH.js';
41
41
  export { RichEditor, preloadRichEditor } from './chunk-JPQSVECQ.js';
42
42
  export { RICH_EDITOR_LABELS, richEditorLabels } from './chunk-2DMTW2Y3.js';
43
- export { canonicalMarkdown, roundTripMarkdown } from './chunk-GBASM5EV.js';
44
- import './chunk-7CSTEH5I.js';
45
- export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from './chunk-DGSK4LLS.js';
46
43
  export { RUN_STATES, RunChip } from './chunk-PIAGTZY3.js';
44
+ export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from './chunk-DGSK4LLS.js';
45
+ export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from './chunk-JXJNX7QQ.js';
46
+ export { Table } from './chunk-75NQV4R4.js';
47
47
  export { SearchTrigger } from './chunk-ERNT3UTB.js';
48
48
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from './chunk-G4CGDUCP.js';
49
49
  export { NavGroup, NavItem, SidebarNav } from './chunk-WCDPFTJZ.js';
@@ -52,8 +52,8 @@ export { REFUSAL_CARD_LABELS, RefusalCard } from './chunk-RQHN4J5P.js';
52
52
  export { RelatedRow } from './chunk-CNEHFH2A.js';
53
53
  export { Text } from './chunk-QP2P6GDQ.js';
54
54
  export { ReviewList } from './chunk-DO4J4TBZ.js';
55
- export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from './chunk-JXJNX7QQ.js';
56
- export { Table } from './chunk-75NQV4R4.js';
55
+ export { canonicalMarkdown, roundTripMarkdown } from './chunk-GBASM5EV.js';
56
+ import './chunk-7CSTEH5I.js';
57
57
  export { PricingCard } from './chunk-ZKIEOWR6.js';
58
58
  export { PrincipalPicker } from './chunk-NU5RUT7Y.js';
59
59
  export { PropertyList } from './chunk-HIWPPWNY.js';
@@ -78,22 +78,22 @@ export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, lay
78
78
  export { OrgLabel } from './chunk-LM6VYJTV.js';
79
79
  export { Outline, scrollToHeading, useActiveHeading } from './chunk-A5YKNRG6.js';
80
80
  export { PageNote } from './chunk-CV4NES3P.js';
81
- export { MessageBubble } from './chunk-KAQ2L74F.js';
82
81
  export { MERGE_CONFLICTS_LABELS, MergeConflicts } from './chunk-3WN5HUAK.js';
82
+ export { MessageBubble } from './chunk-KAQ2L74F.js';
83
83
  export { NewItemsNotice } from './chunk-463DNZXI.js';
84
- export { ListInput, withDraft } from './chunk-H32JW6CZ.js';
84
+ export { ListDetail } from './chunk-YBC2CYPD.js';
85
85
  export { LIVE_CURSOR_HIDE_MS, LIVE_CURSOR_REST_MS, LiveCursor } from './chunk-DPNVKWJX.js';
86
86
  export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from './chunk-CQFQGAZI.js';
87
87
  export { LockedLabel } from './chunk-TEV5REGB.js';
88
- import './chunk-KOJPDCGQ.js';
89
88
  export { LogoSlot, LogoSlotGroup } from './chunk-YUHKRRWO.js';
89
+ import './chunk-KOJPDCGQ.js';
90
90
  export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from './chunk-ERFXYGRF.js';
91
91
  export { LAYERS_LIST_LABELS, LayersList } from './chunk-VUYNNILP.js';
92
92
  export { AutoGrid, Inline, Spacer, Stack } from './chunk-ZAC7SKUN.js';
93
93
  export { Link } from './chunk-QF5UNP4T.js';
94
94
  export { LinkInterstitial, openExternal } from './chunk-JD7P2GJP.js';
95
95
  export { List, ListItem } from './chunk-PS5ZYIA6.js';
96
- export { ListDetail } from './chunk-YBC2CYPD.js';
96
+ export { ListInput, withDraft } from './chunk-H32JW6CZ.js';
97
97
  export { ImageUpload } from './chunk-ZQEJSEPS.js';
98
98
  export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from './chunk-QPHD4UUG.js';
99
99
  export { IndicatorAnchor } from './chunk-27MJPU7G.js';
@@ -139,26 +139,26 @@ export { FILTER_PILL_LABELS, FILTER_PILL_WORDS_CLASS, FilterPill, filterPillSent
139
139
  export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from './chunk-BWFJB5JD.js';
140
140
  export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from './chunk-R6K62EXV.js';
141
141
  export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from './chunk-HPI5J6AR.js';
142
- export { COMMENT_THREAD_LABELS, CommentThread } from './chunk-AB6F5YXX.js';
143
142
  export { CommandPalette } from './chunk-NXNLAZPK.js';
144
143
  export { ConfirmModal, Modal } from './chunk-C667GCU7.js';
144
+ export { COMMENT_THREAD_LABELS, CommentThread } from './chunk-AB6F5YXX.js';
145
145
  export { ConfirmField, confirmMatches } from './chunk-JVII5264.js';
146
146
  export { InlineCode } from './chunk-PLL7ZJHY.js';
147
147
  export { CONFLICT_NOTE_LABELS, ConflictNote } from './chunk-B3PK2LND.js';
148
148
  export { Container } from './chunk-HJO4WCH6.js';
149
149
  export { ContrastHelp } from './chunk-IO374IX6.js';
150
150
  export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from './chunk-KWLH45YC.js';
151
- export { ChoiceButtons } from './chunk-FXMYDXCI.js';
151
+ export { ChoiceButtons } from './chunk-RVSNBUIU.js';
152
152
  export { ChoiceList } from './chunk-NQABJAUY.js';
153
153
  export { CodeBlock } from './chunk-QSWQJX27.js';
154
- export { ColorField } from './chunk-7LSSYHOT.js';
155
154
  export { ColorChip } from './chunk-C6T4VBEY.js';
156
- export { Combobox } from './chunk-ZUBFVK6B.js';
157
- export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, useOptionKeys } from './chunk-7KHM2FZH.js';
155
+ export { ColorField } from './chunk-7LSSYHOT.js';
158
156
  export { ColorSwatch } from './chunk-6FBPFG3C.js';
159
157
  export { CopyButton, Copyable } from './chunk-T5GBTXNC.js';
160
158
  export { useClipboard, writeClipboard } from './chunk-STJ7QBC3.js';
161
159
  export { useOutcome } from './chunk-DTIW4CHZ.js';
160
+ export { Combobox } from './chunk-ZUBFVK6B.js';
161
+ export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, useOptionKeys } from './chunk-7KHM2FZH.js';
162
162
  export { CatalogTile } from './chunk-QE4OIE3Q.js';
163
163
  export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged } from './chunk-WQRSZMN4.js';
164
164
  export { DIFF_LIST_LABELS, DiffList } from './chunk-LR4IWUWQ.js';
@@ -231,7 +231,6 @@ export { ARTIFACT_KINDS, ArtifactKindGlyph } from './chunk-RSKW25Y5.js';
231
231
  export { ACCESS_DENIED_REASONS, AccessDeniedCard } from './chunk-QTMUKRTN.js';
232
232
  export { EmptyState } from './chunk-PPUR46MK.js';
233
233
  export { Accordion, AccordionItem } from './chunk-5NJMSYDZ.js';
234
- export { ADD_PILL_MS, AddPill } from './chunk-CVKANYHD.js';
235
234
  export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from './chunk-6C6YK75K.js';
236
235
  export { Timeline, TimelineItem } from './chunk-4MJN2KN6.js';
237
236
  export { Section } from './chunk-WFCWPXJN.js';
@@ -245,6 +244,7 @@ export { CHARACTER_COUNT_LABELS, CHARACTER_COUNT_NEAR, CharacterCount, character
245
244
  export { DisclosureAnatomy } from './chunk-IVTQWOXV.js';
246
245
  export { Count } from './chunk-MLDTLZAO.js';
247
246
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from './chunk-PQADV6P6.js';
247
+ export { ADD_PILL_MS, AddPill } from './chunk-CVKANYHD.js';
248
248
  export { Announcer, announce, useAnnouncer } from './chunk-2G355KDJ.js';
249
249
  export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useScreenBelow, useScreenWidth, useStoredWidth } from './chunk-UY3FWQWG.js';
250
250
  export { useMediaMatch } from './chunk-RTPQDNW3.js';
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-G7XHZKDP.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,12 +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
 
10245
+ /*
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.
10249
+ */
10233
10250
  .crewlet-choice-buttons__text {
10234
10251
  display: grid;
10252
+ flex: 1 1 auto;
10235
10253
  gap: 2px;
10236
10254
  min-width: 0;
10237
10255
  overflow-wrap: anywhere;
@@ -10247,7 +10265,7 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10247
10265
  * On the accent fill the detail takes the label's own ink. The tertiary step
10248
10266
  * is measured on the surfaces, not on the accent, where it does not clear.
10249
10267
  */
10250
- .crewlet-choice-buttons__option--recommended .crewlet-choice-buttons__detail {
10268
+ .crewlet-choice-buttons__option--recommended:not([aria-pressed]) .crewlet-choice-buttons__detail {
10251
10269
  color: var(--color-text-on-accent);
10252
10270
  }
10253
10271
 
@@ -10263,8 +10281,12 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10263
10281
  text-transform: uppercase;
10264
10282
  }
10265
10283
 
10266
- /* The picture before the words, centred on the label's line. */
10267
- .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 {
10268
10290
  display: inline-flex;
10269
10291
  flex: none;
10270
10292
  align-items: center;
@@ -10273,22 +10295,22 @@ button.crewlet-histogram__bar[data-empty]:focus-visible > .crewlet-histogram__fi
10273
10295
 
10274
10296
  /*
10275
10297
  * With a detail under it the label's line is the FIRST line, not the
10276
- * option's middle, so the picture stands on a box one line tall at the top.
10277
- * Centred on the label and its detail together, a suggestion's swatch sat
10278
- * 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.
10279
10301
  */
10280
- .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 {
10281
10304
  align-self: flex-start;
10282
10305
  min-height: calc(var(--crewlet-choice-buttons-leading) * 1em);
10283
10306
  }
10284
10307
 
10285
- /* Before the words, not at the far end with the recommended mark. */
10286
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) {
10287
- justify-content: flex-start;
10288
- }
10289
-
10290
- .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__media) .crewlet-choice-buttons__note {
10291
- 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);
10292
10314
  }
10293
10315
 
10294
10316
  /*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.75.2",
3
+ "version": "0.75.4",
4
4
  "description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,8 +42,8 @@
42
42
  "clean": "rm -rf dist src/generated"
43
43
  },
44
44
  "dependencies": {
45
- "@crewlethq/icons": "0.75.2",
46
- "@crewlethq/tokens": "0.75.2",
45
+ "@crewlethq/icons": "0.75.4",
46
+ "@crewlethq/tokens": "0.75.4",
47
47
  "prosemirror-commands": "1.7.2",
48
48
  "prosemirror-gapcursor": "1.4.1",
49
49
  "prosemirror-history": "1.5.1",