@crewlethq/ui 0.34.2 → 0.35.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 (98) hide show
  1. package/README.md +51 -0
  2. package/dist/AppShell/index.js +2 -2
  3. package/dist/ArtifactBar/ArtifactBar.d.ts +6 -0
  4. package/dist/ArtifactBar/index.d.ts +1 -0
  5. package/dist/ArtifactBar/index.js +2 -2
  6. package/dist/{ArtifactBar-C462VD4C.css → ArtifactBar-HV5AT4RG.css} +39 -2
  7. package/dist/ArtifactCard/index.d.ts +1 -0
  8. package/dist/ArtifactCard/index.js +2 -2
  9. package/dist/{ArtifactCard-XHRLAL7C.css → ArtifactCard-OGTMO2KI.css} +15 -16
  10. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +14 -1
  11. package/dist/ArtifactKindIllustration/index.d.ts +1 -0
  12. package/dist/ArtifactKindIllustration/index.js +1 -1
  13. package/dist/{ArtifactKindIllustration-4NG6IE3C.css → ArtifactKindIllustration-5FPRJQ3P.css} +32 -26
  14. package/dist/ArtifactKinds-CVD3FCYO.css +15 -0
  15. package/dist/AvatarPicker/index.js +2 -2
  16. package/dist/CanvasBoard/CanvasBoard.d.ts +30 -12
  17. package/dist/CanvasBoard/index.js +1 -1
  18. package/dist/ChangeMark/index.js +2 -2
  19. package/dist/ChoiceList/ChoiceList.d.ts +7 -1
  20. package/dist/ChoiceList/index.js +1 -1
  21. package/dist/{ChoiceList-2PQJS4DX.css → ChoiceList-RBL7FNQL.css} +39 -0
  22. package/dist/DataTable/index.js +2 -2
  23. package/dist/DataView/index.js +3 -3
  24. package/dist/DocTabsEditor/index.js +2 -2
  25. package/dist/{Editor-JMRD6AZW.js → Editor-BVQHBF7L.js} +4 -4
  26. package/dist/FileDrop/FileDrop.d.ts +64 -0
  27. package/dist/FileDrop/index.d.ts +3 -0
  28. package/dist/FileDrop/index.js +4 -0
  29. package/dist/FileDrop-WE7BNZGV.css +80 -0
  30. package/dist/FindingList/FindingList.d.ts +35 -0
  31. package/dist/FindingList/index.d.ts +3 -0
  32. package/dist/FindingList/index.js +3 -0
  33. package/dist/FindingList-PMYA2R6Q.css +71 -0
  34. package/dist/HuePicker/HuePicker.d.ts +9 -0
  35. package/dist/HuePicker/index.d.ts +1 -1
  36. package/dist/HuePicker/index.js +1 -1
  37. package/dist/Markdown/index.js +1 -1
  38. package/dist/Menu/Menu.d.ts +6 -1
  39. package/dist/Menu/index.js +1 -1
  40. package/dist/RichEditor/index.js +3 -3
  41. package/dist/RichEditorMarkdown/index.js +3 -3
  42. package/dist/SheetColumnEditor/SheetColumnEditor.d.ts +94 -0
  43. package/dist/SheetColumnEditor/index.d.ts +3 -0
  44. package/dist/SheetColumnEditor/index.js +23 -0
  45. package/dist/SheetColumnEditor-BO2HKFRB.css +73 -0
  46. package/dist/SheetGrid/SheetGrid.d.ts +19 -1
  47. package/dist/SheetGrid/index.js +5 -4
  48. package/dist/{SheetGrid-GDPCCZ4V.css → SheetGrid-YRDXTIIZ.css} +48 -0
  49. package/dist/SheetModel/columns.d.ts +19 -0
  50. package/dist/SheetModel/index.d.ts +1 -0
  51. package/dist/SheetModel/index.js +1 -1
  52. package/dist/SheetModel/labels.d.ts +6 -0
  53. package/dist/SlideFilmstrip/SlideFilmstrip.d.ts +30 -1
  54. package/dist/SlideFilmstrip/index.js +5 -1
  55. package/dist/{SlideFilmstrip-5U6Z55GS.css → SlideFilmstrip-4ITZLMO4.css} +49 -0
  56. package/dist/SourceEditor/SourceEditor.d.ts +62 -0
  57. package/dist/SourceEditor/index.d.ts +3 -0
  58. package/dist/SourceEditor/index.js +3 -0
  59. package/dist/SourceEditor-G2C3STPX.css +160 -0
  60. package/dist/ThemeGallery/ThemeGallery.d.ts +10 -3
  61. package/dist/ThemeGallery/index.js +1 -1
  62. package/dist/{ThemeGallery-NITASULQ.css → ThemeGallery-HSUKBDWY.css} +9 -0
  63. package/dist/{chunk-UXXJDIYE.js → chunk-22CQQDFW.js} +1 -1
  64. package/dist/{chunk-EQ7P7DGN.js → chunk-3VD3G3IL.js} +2 -2
  65. package/dist/{chunk-SGHIAGPR.js → chunk-47JQAGRV.js} +1 -1
  66. package/dist/{chunk-7T5LSYZ2.js → chunk-7UYONN6K.js} +4 -3
  67. package/dist/{chunk-KK5OYNAF.js → chunk-BAKPMH3S.js} +8 -4
  68. package/dist/{chunk-3EB2AV3H.js → chunk-BUVCV3WI.js} +1 -1
  69. package/dist/{chunk-4B6LSFDS.js → chunk-CSQTDGTS.js} +1 -1
  70. package/dist/{chunk-WPX6A5BV.js → chunk-E35CMI5D.js} +22 -6
  71. package/dist/{chunk-EWAFN2IU.js → chunk-FF5OZV77.js} +281 -234
  72. package/dist/{chunk-OMLACFPP.js → chunk-FJJHD73S.js} +1 -1
  73. package/dist/chunk-J6YZ4IYV.js +341 -0
  74. package/dist/{chunk-VI5FWDZW.js → chunk-LFSIKGRQ.js} +17 -2
  75. package/dist/{chunk-ZADVT7IL.js → chunk-NKZCJRKO.js} +9 -4
  76. package/dist/chunk-NTB5LRRD.js +52 -0
  77. package/dist/{chunk-UOR7TOAU.js → chunk-OSFA5ROT.js} +86 -1
  78. package/dist/{chunk-T46NR3WP.js → chunk-PGZ2R3ON.js} +1 -1
  79. package/dist/chunk-PI7HKLIT.js +245 -0
  80. package/dist/{chunk-YZFLH463.js → chunk-QEFHYUCY.js} +1 -1
  81. package/dist/{chunk-NPQWKZTB.js → chunk-QFNWMWWY.js} +2 -2
  82. package/dist/{chunk-C7DKX453.js → chunk-QH6VYJ3X.js} +1 -1
  83. package/dist/{chunk-XV32RKQZ.js → chunk-QIXMNOBD.js} +67 -6
  84. package/dist/{chunk-GPHWCK7M.js → chunk-SUXP4OBT.js} +6 -3
  85. package/dist/{chunk-TRQCHF2F.js → chunk-SWD4QBL6.js} +1 -1
  86. package/dist/chunk-THDGBD6Y.js +154 -0
  87. package/dist/{chunk-C2FRTWKO.js → chunk-W3UVOZKL.js} +3 -2
  88. package/dist/{chunk-UDQW6UK7.js → chunk-W7QBBKUE.js} +34 -7
  89. package/dist/{chunk-QBXZLGK2.js → chunk-ZU3DUXD2.js} +3 -2
  90. package/dist/generated/index.d.ts +4 -0
  91. package/dist/generated/index.js +53 -49
  92. package/dist/index.js +53 -49
  93. package/dist/styles.css +652 -51
  94. package/dist/utils/csv.d.ts +35 -0
  95. package/dist/utils/index.d.ts +2 -1
  96. package/dist/utils/index.js +1 -1
  97. package/package.json +3 -3
  98. /package/dist/{chunk-VFRSSP3W.js → chunk-3WCNHYXE.js} +0 -0
package/README.md CHANGED
@@ -204,6 +204,57 @@ places:
204
204
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
205
205
  when the content beneath it moves, and every panel anchored inside follows.
206
206
 
207
+ ## Changes in 0.35.1
208
+
209
+ **A column given another type keeps only what every type has** (`SheetColumnEditor`, and `retypeColumn` in the sheet model). Its field, name, width, freezing, read-only flag and Required stay, and so does its length cap between text and long text, which both read it. Every other setting belongs to the old type and is dropped: a number's bounds, decimals and format, a choice's options, a date's time of day. The column is built up from what is kept rather than pared down from the old one, so a setting a type adds later is dropped without the editor having to name it. Before, a date's time of day and a text's length cap rode along, unseen, into a type that ignores them, and came back if the old type was picked again. A host that relied on a setting surviving a type change sets it again on the column it is handed.
210
+
211
+ ## Changes in 0.35.0
212
+
213
+ **The gallery card is a step smaller and calm under the pointer** (`ArtifactCard`, `size="card"`). Its title is the body size rather than a large one, its body inset is one spacing step tighter, and the kind's badge on the preview's foot is 32px (from 40px) with the small glyph, so a gallery fits four cards across a laptop's page in the same design. Hover no longer lifts the card or casts the wide card shadow: the hairline darkens and an extra-small shadow settles under it, over the fast duration, and the card never moves. The More menu still appears on hover and focus. A host that relied on the lift has nothing to change.
214
+
215
+ **An artifact's bar draws the kind's glyph in the kind's colour** (`ArtifactBar`), as the gallery's badge and the Make row do, on an open artifact and on a create page alike. The kinds' colour classes (`crewlet-kind--<kind>`, which set `--crewlet-kind-ink` and its siblings) moved to a sheet of their own that the bar, the card and the illustrations each import, so the bar is tinted on a page that draws no card. `ArtifactKindGlyph`'s module still carries no stylesheet.
216
+
217
+ **An artifact bar's primary action can take a short word on a narrow bar** (`ArtifactBar`, `shortLabel` on an `ArtifactBarTool`), so "Create and ask SRE Lead" reads "Create" on a phone and keeps its full word as its accessible name. **On a narrow bar the status gives way before the title**: it is cut to an ellipsis instead of drawn over the title, and its words stay whole for a screen reader.
218
+
219
+ **A menu's `label` names its trigger when the trigger shows text** (`Menu`). It was the accessible name of an icon trigger only, so a "New" button that opens a menu of kinds was announced as "New". Keep the visible words in the label ("New artifact"), so a person who speaks what they see still reaches it. A test that found a text trigger by its words alone finds it by its label now.
220
+
221
+ **A choice can carry a picture** (`ChoiceList`, `media` on an option): drawn between the radio and the words and hidden from the name, such as an agent's character in a "who builds it" list. A list without pictures is unchanged.
222
+
223
+ **A Make row's tile keeps its drawing still on hover** (`ArtifactKindTile`). The illustration used to rise and grow inside its frame; the frame's border now steps alone, over the fast duration. Reduced motion drops the transition.
224
+
225
+ **A list marker alone on its line is an empty list item**, as CommonMark reads it: `-`, `*`, `+`, `1.`, `1)` and a task's `- [ ]` or `- [x]` with nothing after them, with or without the trailing space an editor strips. The grammar read a bare `1.` as text, so an outline whose trailing spaces were lost drew "1. 2. 3." inside a paragraph, in `RichEditor` and in every renderer alike. An empty item does not interrupt a paragraph, again as in CommonMark, so a lone `-` under a line of text stays that text's next line. Bodies that already round-tripped still do byte for byte, and the editor's corpus holds the bare forms (`bare-markers.md`).
226
+
227
+ - `SlideFilmstrip` takes a slide's actions, as a presentation editor's
228
+ filmstrip has them: `onDuplicate` (Command+D, Control+D elsewhere, on a
229
+ thumbnail), `onDelete` (Delete or Backspace) and `actions` (further menu
230
+ entries), named with their keys in a per-slide menu that the Menu key or
231
+ Shift+F10 opens from the thumbnail. `footer` holds what follows the last
232
+ slide inside the strip, such as a New slide control.
233
+ - `ThemeGallery` takes `renderPreview`, which draws a card's thumbnail in
234
+ place of its swatch, for a theme of something other than the product's
235
+ chrome (a slide deck's, drawn as its cover). A theme's `swatch` is optional
236
+ when the gallery is given one.
237
+
238
+ **`SheetGrid` shapes its columns in place.** `renderColumnEditor` makes each column header open that column's settings in a popover anchored to it: a press, Enter or Space on a header opens it, Escape closes it and returns focus to the header, and the host draws what is inside. `settingsColumn` and `onSettingsColumnChange` let the host open a column itself (one it has just added). A header that opens settings does not sort on a press; a host that offers both puts its sort in the settings. `onAddColumn` draws Add column after the last header, outside the grid's roles (a grid's rows hold cells only), sticking to the top with the header row and reached as its own tab stop after the grid's. Keys, presses and pastes inside a portalled popover no longer reach the grid's own handlers. New labels: `columnSettings`, `columnSettingsHelp` and `addColumn`.
239
+
240
+ **`SheetColumnEditor`** is one column's settings as a compact panel: its name, its type (each with its `SheetColumnTypeGlyph` and a line on what it holds), the choices a select, multi-select or status column offers (each with its colour from a hue menu, or its category for a status; a new status column starts with Not started, In progress and Done), the stars of a rating, Required, Move left and Move right, Delete column (with `deleteDisabledReason`) and Done. Every change is handed to the host at once as the next `SheetColumn`, so the grid beside it redraws as the reader types; a name cleared to nothing is held and restored. `suggestedType` offers a type the host proposes (from a column's name or its values) as one press, and `typeLockedReason` says why a type cannot change. A choice's id is made once from its label (`optionId` for a store's own rule) and never changes after.
241
+
242
+ **`parseCsv`** reads CSV the way spreadsheets write it: quoted separators, doubled quotes and line breaks inside a field, CRLF, LF or CR line ends, a byte order mark dropped, and the separator found from the first record (a comma, a semicolon or a tab) unless given. It reads back what `toCsv` writes, defused formulas included, keeps every value as text, and refuses an unclosed quote or more than `maxRows` records with the line it happened on rather than cutting silently.
243
+
244
+ **`ChoiceList`'s panel is styled as part of its choice.** A selected choice's `panel` had no styles at all: it sat under the row against the box's edge, outside the selected fill. It now continues the row's fill and starts where the label does.
245
+
246
+ **`HueSwatch`** is the dot `HuePicker` draws for a hue (or the hairline ring of no hue), exported for a hue menu or a list of coloured choices.
247
+
248
+ **`CanvasBoard` can shape a canvas before it is drawn.** An editable board given `onBoardCreate` adds Frame (`F`) to its palette, between Hand and Text: a click on the field hands the caller the canvas point, the caller adds a board of whatever size and name it gives new ones and returns its id, and the canvas selects it and hands back Move. `onBoardRemove` lets Delete (or Backspace) remove a selected board, as it removes a selected note. Neither is offered on a view-only canvas, so a published design's viewer is unchanged. The `Shaping` story lays out a design's boards this way. `@crewlethq/icons` vendors `frame`, `laptop`, `tablet` and `smartphone` for it and for frame presets.
249
+
250
+ **`ArtifactKindTile` can start something in place.** Given `onSelect` and no `href`, the tile is a button drawn exactly as the link is, for a create page's starting points. `face` draws on the kind's ground in place of its drawing (a design layout's `CanvasSchematic`), and `detail` is one quiet line under the name, read as the tile's description. The `StartingPoints` story shows a row of them.
251
+
252
+ **`SourceEditor` writes source text in place**: a real, monospaced textarea with a line gutter, and the lines a checker named (`marks`, each a `line`, a `tone` of `danger` or `warning`, and an optional `message` shown as the gutter number's tooltip) drawn in the gutter and behind the text. Lines never wrap, so a number and a mark always sit on their line. Tab and Shift+Tab indent and outdent the lines under the selection, Escape then Tab leaves the field (the field's description says so to a screen reader, as `SOURCE_EDITOR_KEYS`), Enter keeps the line's indent and Command+Enter (Control+Enter) calls `onSubmit`. A refusal on any line sets `aria-invalid`. The handle's `revealLine(n)` focuses the field with the caret at line `n`, scrolled into view; `fill` makes it take its parent's height.
253
+
254
+ **`FindingList` lists what a checker found**: one row per `Finding` (a `tone` of `danger` or `warning`, an optional `location` such as `index.html, line 6`, and the `message`), refusals before advice, the tone's glyph in its ink and the tone said in words to a screen reader (`toneLabels` renames them). A finding with `onSelect` is a button that takes the reader there, so a keyboard walks the findings with Tab.
255
+
256
+ **`FileDrop` and `FilePickButton` bring files in.** `FileDrop` is a dashed target of its own (a `title`, a `hint` and `actions`) or, given children, a region that takes files dropped on it and shows a frosted overlay saying so only while files are held over it. Dropped folders are walked through the entries API, and every file is answered as a `PickedFile` (`path` with forward slashes, inside the folder it came from, and the `File`). A drag that carries no files (text moved inside an editor) passes through untouched. `FilePickButton` is the keyboard's and the screen reader's way in: a `Button` that opens the system picker, for files (`accept`, `multiple`) or a whole folder (`directory`). `droppedFiles` and `pickedFiles` are the readers, exported for a host with its own target.
257
+
207
258
  ## Changes in 0.34.1
208
259
 
209
260
  **`ArtifactKindGlyph`, `ARTIFACT_KINDS` and `ArtifactKind` have a module of their own** (`@crewlethq/ui/ArtifactKindGlyph`), and it imports nothing but the glyphs. They were defined in `ArtifactCard`'s module, and a bundler places a module whole, so a host that drew one kind glyph in its frame (a sidebar's pins, a command palette's hits) took the whole card into its first screen, and with 0.34.0 the kind illustrations the card draws: about 11 KB of script for a gallery the reader had not opened. Nothing is renamed: the root export and `@crewlethq/ui/ArtifactCard` still answer for all three, and `ArtifactIcon`, `ArtifactBar`, `DashboardCover` and `ArtifactKindIllustration` now import them from the new module.
@@ -1,6 +1,6 @@
1
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-T46NR3WP.js';
1
+ export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-PGZ2R3ON.js';
2
2
  import '../chunk-RTPQDNW3.js';
3
- import '../chunk-3EB2AV3H.js';
3
+ import '../chunk-BUVCV3WI.js';
4
4
  import '../chunk-OMV5W53A.js';
5
5
  import '../chunk-R25RGPUB.js';
6
6
  import '../chunk-OG6CL3EB.js';
@@ -39,6 +39,12 @@ export interface ArtifactBarTool {
39
39
  * every width, because a glyph alone does not say what a press commits.
40
40
  */
41
41
  emphasis?: 'primary' | undefined;
42
+ /**
43
+ * A primary tool's word on a narrow bar, where the full one would push the
44
+ * title out: "Create" for "Create and ask SRE Lead". The full word stays its
45
+ * accessible name at every width, and it is drawn whole while there is room.
46
+ */
47
+ shortLabel?: string | undefined;
42
48
  }
43
49
  /** The ways a kind draws itself, as one choice: a deck's Edit, Grid and Present. */
44
50
  export interface ArtifactBarModes {
@@ -1,3 +1,4 @@
1
+ import '../ArtifactKindIllustration/ArtifactKinds.css';
1
2
  import './ArtifactBar.css';
2
3
  export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from './ArtifactBar.js';
3
4
  export type { ArtifactBarLabels, ArtifactBarModes, ArtifactBarProps, ArtifactBarTool, ArtifactVersionChipProps, } from './ArtifactBar.js';
@@ -1,4 +1,4 @@
1
- export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-ZADVT7IL.js';
1
+ export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-NKZCJRKO.js';
2
2
  import '../chunk-WKEPORNM.js';
3
3
  import '../chunk-SMBKXWML.js';
4
4
  import '../chunk-6ZJ3N7QI.js';
@@ -8,7 +8,7 @@ import '../chunk-RKKO7QHH.js';
8
8
  import '../chunk-ILDNJHRU.js';
9
9
  import '../chunk-CE2THTQR.js';
10
10
  import '../chunk-BHHIIK3M.js';
11
- import '../chunk-3EB2AV3H.js';
11
+ import '../chunk-BUVCV3WI.js';
12
12
  import '../chunk-OMV5W53A.js';
13
13
  import '../chunk-R25RGPUB.js';
14
14
  import '../chunk-OG6CL3EB.js';
@@ -64,6 +64,9 @@
64
64
  align-items: center;
65
65
  }
66
66
 
67
+ /* THE KIND'S GLYPH IN THE KIND'S INK, as the gallery's badge and the Make
68
+ row draw it, so an open artifact and a create page say what they are in the
69
+ same colour the reader picked it by. */
67
70
  .crewlet-artifact-bar__glyph {
68
71
  display: inline-flex;
69
72
  flex: none;
@@ -71,7 +74,7 @@
71
74
  justify-content: center;
72
75
  width: var(--size-control-sm);
73
76
  height: var(--size-control-sm);
74
- color: var(--color-text-secondary);
77
+ color: var(--crewlet-kind-ink, var(--color-text-secondary));
75
78
  }
76
79
 
77
80
  /* THE TITLE. Read only, it is text; renamable, its words are a button drawn
@@ -262,7 +265,8 @@
262
265
 
263
266
  /* Both arrangements are drawn; the bar's width says which one shows. */
264
267
  .crewlet-artifact-bar__narrow,
265
- .crewlet-artifact-bar__tight {
268
+ .crewlet-artifact-bar__tight,
269
+ .crewlet-artifact-bar__word-short {
266
270
  display: none;
267
271
  }
268
272
 
@@ -309,6 +313,39 @@
309
313
  display: inline-flex;
310
314
  }
311
315
 
316
+ /* A PRIMARY ACTION TAKES ITS SHORT WORD, where it has one, so "Create and
317
+ ask SRE Lead" does not push the title out of a phone's bar. */
318
+ .crewlet-artifact-bar__word-full {
319
+ display: none;
320
+ }
321
+
322
+ .crewlet-artifact-bar__word-short {
323
+ display: inline;
324
+ }
325
+
326
+ /* THE STATUS GIVES WAY BEFORE THE TITLE: the end may shrink, and the
327
+ status is the part of it that does, cut to an ellipsis rather than drawn
328
+ over the title. Its words stay whole for a screen reader. */
329
+ .crewlet-artifact-bar__end {
330
+ flex: 0 1 auto;
331
+ min-width: 0;
332
+ }
333
+
334
+ .crewlet-artifact-bar__end > * {
335
+ flex: none;
336
+ }
337
+
338
+ .crewlet-artifact-bar__end > .crewlet-artifact-bar__status {
339
+ display: block;
340
+ flex: 0 1 auto;
341
+ min-width: 0;
342
+ max-width: 30cqi;
343
+ margin-inline-end: var(--spacing-1);
344
+ overflow: hidden;
345
+ text-overflow: ellipsis;
346
+ white-space: nowrap;
347
+ }
348
+
312
349
  /* The views have folded, so there is nothing to centre: the title takes
313
350
  the room. */
314
351
  .crewlet-artifact-bar__row--centred .crewlet-artifact-bar__end {
@@ -1,3 +1,4 @@
1
+ import '../ArtifactKindIllustration/ArtifactKinds.css';
1
2
  import './ArtifactCard.css';
2
3
  export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from './ArtifactCard.js';
3
4
  export type { ArtifactAccess, ArtifactCardLabels, ArtifactCardProps, ArtifactCardSize } from './ArtifactCard.js';
@@ -1,9 +1,9 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-7T5LSYZ2.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-7UYONN6K.js';
2
2
  import '../chunk-TEUQWOWZ.js';
3
3
  import '../chunk-CI3VPIJN.js';
4
4
  import '../chunk-3CZ7XAVY.js';
5
5
  import '../chunk-EUCC37WY.js';
6
- import '../chunk-UDQW6UK7.js';
6
+ import '../chunk-W7QBBKUE.js';
7
7
  import '../chunk-ACA27MZH.js';
8
8
  import '../chunk-AV2DXAEL.js';
9
9
  import '../chunk-5AQBPHZD.js';
@@ -119,7 +119,12 @@
119
119
  * A SOFT PANE WITH A GENEROUS CORNER. The card is the card rung with its
120
120
  * hairline, rounded a step past a plain card's because the preview inside it
121
121
  * is a picture, and a picture in a tight corner reads as a screenshot pasted
122
- * into a box. Hover lifts the edge and the shadow, never the colour.
122
+ * into a box.
123
+ *
124
+ * HOVER IS A STEP, NEVER A MOVE: the hairline darkens and a hairline shadow
125
+ * settles under the card, quickly and with the standard ease. A card that rose
126
+ * and cast a wide shadow made a gallery ripple as the pointer crossed it, and
127
+ * the preview inside it never moves.
123
128
  */
124
129
  .crewlet-artifact-card--card {
125
130
  position: relative;
@@ -130,15 +135,13 @@
130
135
  border-radius: var(--radius-xl);
131
136
  background: var(--color-surface-subtle);
132
137
  transition:
133
- border-color var(--motion-duration-base) var(--motion-easing-out),
134
- box-shadow var(--motion-duration-base) var(--motion-easing-out),
135
- transform var(--motion-duration-base) var(--motion-easing-out);
138
+ border-color var(--motion-duration-fast) var(--motion-easing-out),
139
+ box-shadow var(--motion-duration-fast) var(--motion-easing-out);
136
140
  }
137
141
 
138
142
  .crewlet-artifact-card--card:hover {
139
143
  border-color: var(--color-border-hover);
140
- box-shadow: var(--shadow-card);
141
- transform: translateY(-1px);
144
+ box-shadow: var(--shadow-xs);
142
145
  }
143
146
 
144
147
  .crewlet-artifact-card--card:has(.crewlet-artifact-card__link:focus-visible) {
@@ -178,7 +181,7 @@
178
181
 
179
182
  .crewlet-artifact-card--card .crewlet-artifact-card__body {
180
183
  gap: var(--spacing-1);
181
- padding: 0 var(--spacing-5) var(--spacing-5);
184
+ padding: 0 var(--spacing-4) var(--spacing-4);
182
185
  }
183
186
 
184
187
  /*
@@ -193,19 +196,19 @@
193
196
  align-items: center;
194
197
  justify-content: center;
195
198
  align-self: flex-start;
196
- width: 40px;
197
- height: 40px;
198
- margin-top: -22px;
199
+ width: 32px;
200
+ height: 32px;
201
+ margin-top: -18px;
199
202
  margin-bottom: var(--spacing-2);
200
203
  border: 1px solid var(--color-border-default);
201
- border-radius: var(--radius-lg);
204
+ border-radius: var(--radius-md);
202
205
  background: var(--color-surface-background);
203
206
  box-shadow: var(--shadow-sm);
204
207
  color: var(--crewlet-kind-ink, var(--color-text-secondary));
205
208
  }
206
209
 
207
210
  .crewlet-artifact-card--card .crewlet-artifact-card__title {
208
- font-size: var(--font-size-lg);
211
+ font-size: var(--font-size-md);
209
212
  font-weight: var(--font-weight-medium);
210
213
  line-height: 1.35;
211
214
  }
@@ -274,10 +277,6 @@
274
277
  .crewlet-artifact-card__actions {
275
278
  transition: none;
276
279
  }
277
-
278
- .crewlet-artifact-card--card:hover {
279
- transform: none;
280
- }
281
280
  }
282
281
 
283
282
  .crewlet-artifact-card--skeleton {
@@ -35,6 +35,19 @@ export interface ArtifactKindTileProps {
35
35
  label: string;
36
36
  /** Where starting one goes. Left out with `disabledReason`, the tile starts nothing. */
37
37
  href?: string | undefined;
38
+ /**
39
+ * What a press does, for a tile that starts something in place rather than
40
+ * going somewhere (a create page's starting layouts): the tile is then a
41
+ * button. `href` wins where both are given.
42
+ */
43
+ onSelect?: (() => void) | undefined;
44
+ /**
45
+ * Drawn on the kind's ground in place of its drawing: a picture of this
46
+ * particular starting point, such as a design layout's schematic.
47
+ */
48
+ face?: ReactNode;
49
+ /** One quiet line under the name saying what the tile starts: "3 boards". */
50
+ detail?: ReactNode;
38
51
  /** A short tag after the name ("New", "Beta"), for a kind that is genuinely new. */
39
52
  badge?: string | undefined;
40
53
  /** Why this reader cannot start one. The tile stays focusable and says so. */
@@ -50,4 +63,4 @@ export interface ArtifactKindTileProps {
50
63
  * through it by keyboard hears why (`disabledReason`) rather than finding a
51
64
  * kind missing.
52
65
  */
53
- export declare function ArtifactKindTile({ kind, label, href, badge, disabledReason, className }: ArtifactKindTileProps): import("react").JSX.Element;
66
+ export declare function ArtifactKindTile({ kind, label, href, onSelect, face, detail, badge, disabledReason, className, }: ArtifactKindTileProps): import("react").JSX.Element;
@@ -1,3 +1,4 @@
1
+ import './ArtifactKinds.css';
1
2
  import './ArtifactKindIllustration.css';
2
3
  export { ArtifactKindGround, ArtifactKindIllustration, ArtifactKindTile } from './ArtifactKindIllustration.js';
3
4
  export type { ArtifactKindTileProps } from './ArtifactKindIllustration.js';
@@ -1,3 +1,3 @@
1
- export { ArtifactKindGround, ArtifactKindIllustration, ArtifactKindTile } from '../chunk-UDQW6UK7.js';
1
+ export { ArtifactKindGround, ArtifactKindIllustration, ArtifactKindTile } from '../chunk-W7QBBKUE.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -2,17 +2,11 @@
2
2
  * A kind's drawing, its tinted ground and the Make something new tile.
3
3
  *
4
4
  * Every colour is the kind's token, `--color-artifact-kind-<kind>` and its
5
- * Fill and Line steps, set once per kind on `--crewlet-kind-*` and read by
6
- * every rule below, so the drawing, the ground and the tile repaint together
7
- * with the theme.
5
+ * Fill and Line steps, set once per kind on `--crewlet-kind-*`
6
+ * (`ArtifactKinds.css`) and read by every rule below, so the drawing, the
7
+ * ground and the tile repaint together with the theme.
8
8
  */
9
9
 
10
- .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); }
11
- .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); }
12
- .crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); }
13
- .crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); }
14
- .crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); }
15
- .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
16
10
 
17
11
  /* ---- the drawing ---- */
18
12
 
@@ -135,9 +129,7 @@
135
129
  border: 1px solid var(--color-border-default);
136
130
  border-radius: var(--radius-2xl);
137
131
  background: var(--color-surface-subtle);
138
- transition:
139
- border-color var(--motion-duration-base) var(--motion-easing-out),
140
- box-shadow var(--motion-duration-base) var(--motion-easing-out);
132
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-out);
141
133
  }
142
134
 
143
135
  .crewlet-kind-tile__ground {
@@ -146,10 +138,6 @@
146
138
  overflow: hidden;
147
139
  }
148
140
 
149
- .crewlet-kind-tile__ground > .crewlet-kind-illustration {
150
- transition: transform var(--motion-duration-base) var(--motion-easing-out);
151
- }
152
-
153
141
  .crewlet-kind-tile__label {
154
142
  display: flex;
155
143
  align-items: center;
@@ -177,12 +165,35 @@
177
165
  font-weight: var(--font-weight-medium);
178
166
  }
179
167
 
180
- a.crewlet-kind-tile:hover .crewlet-kind-tile__frame {
181
- border-color: var(--color-border-hover);
168
+ /* A tile that starts something in place is a button, drawn as the link is. */
169
+ .crewlet-kind-tile--button {
170
+ /* A button shrinks to its content where a link in a grid cell fills it. */
171
+ width: 100%;
172
+ padding: 0;
173
+ border: 0;
174
+ background: none;
175
+ font: inherit;
176
+ text-align: start;
177
+ cursor: pointer;
178
+ }
179
+
180
+ /* What the tile starts, under its name, in the quiet ink. */
181
+ .crewlet-kind-tile__detail {
182
+ margin-top: calc(-1 * var(--spacing-1));
183
+ padding-inline: var(--spacing-1);
184
+ overflow: hidden;
185
+ color: var(--color-text-tertiary);
186
+ font-size: var(--font-size-compact);
187
+ line-height: 1.3;
188
+ text-overflow: ellipsis;
189
+ white-space: nowrap;
182
190
  }
183
191
 
184
- a.crewlet-kind-tile:hover .crewlet-kind-tile__ground > .crewlet-kind-illustration {
185
- transform: translateY(-2px) scale(1.03);
192
+ /* HOVER IS THE FRAME'S STEP ALONE: the drawing inside stays still, as a
193
+ card's preview does, so a row of tiles never ripples under the pointer. */
194
+ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
195
+ .crewlet-kind-tile--button:hover .crewlet-kind-tile__frame {
196
+ border-color: var(--color-border-hover);
186
197
  }
187
198
 
188
199
  .crewlet-kind-tile:focus-visible .crewlet-kind-tile__frame {
@@ -200,12 +211,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__ground > .crewlet-kind-illustratio
200
211
  }
201
212
 
202
213
  @media (prefers-reduced-motion: reduce) {
203
- .crewlet-kind-tile__frame,
204
- .crewlet-kind-tile__ground > .crewlet-kind-illustration {
214
+ .crewlet-kind-tile__frame {
205
215
  transition: none;
206
216
  }
207
-
208
- a.crewlet-kind-tile:hover .crewlet-kind-tile__ground > .crewlet-kind-illustration {
209
- transform: none;
210
- }
211
217
  }
@@ -0,0 +1,15 @@
1
+ /*
2
+ * A kind's colours, set once per kind on `--crewlet-kind-*` by its class
3
+ * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps and the ink a
4
+ * glyph is drawn in. Every surface that tints by kind reads these, so a kind
5
+ * glyph in a bar, a card's badge and a Make row's tile repaint together with
6
+ * the theme, and no surface spells a kind's colour of its own. A sheet of
7
+ * its own, imported by each surface that tints, because the glyph's module
8
+ * carries no stylesheet (a frame that draws one glyph takes nothing else).
9
+ */
10
+ .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); }
11
+ .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); }
12
+ .crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); }
13
+ .crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); }
14
+ .crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); }
15
+ .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
@@ -1,5 +1,5 @@
1
- export { AvatarPicker } from '../chunk-OMLACFPP.js';
2
- import '../chunk-GPHWCK7M.js';
1
+ export { AvatarPicker } from '../chunk-FJJHD73S.js';
2
+ import '../chunk-SUXP4OBT.js';
3
3
  import '../chunk-K3IJQNB7.js';
4
4
  import '../chunk-YEVG2X5R.js';
5
5
  import '../chunk-AYKXMIOR.js';
@@ -15,10 +15,12 @@
15
15
  * click on a board or a note selects it, a click on the field clears it, and
16
16
  * the pointer is the arrow. Hand (`H`, or Space held) pans whatever is under
17
17
  * the pointer, boards included, with the open hand. An editable canvas that
18
- * can create notes adds Text (`T`) and Sticky (`S`): a click on the field
19
- * places one there, opens it for typing, and hands back the Move tool. The
20
- * pointer is always the tool's (the Canvas cursors), and a pan in progress is
21
- * always the closed hand.
18
+ * can create boards adds Frame (`F`): a click on the field places a board
19
+ * there, selected, and hands back the Move tool. One that can create notes
20
+ * adds Text (`T`) and Sticky (`S`): a click on the field places one there,
21
+ * opens it for typing, and hands back the Move tool. The pointer is always
22
+ * the tool's (the Canvas cursors), and a pan in progress is always the closed
23
+ * hand.
22
24
  *
23
25
  * A PAGE INSIDE A BOARD NEVER TAKES THE CANVAS'S POINTER BY SURPRISE. A live
24
26
  * board is covered by a shield that pans the canvas like the field around it;
@@ -32,7 +34,8 @@
32
34
  * own paper or its handle, retyped on a double-click, and deleted with Delete
33
35
  * while selected. Each finished gesture is reported once, with whole canvas
34
36
  * pixels, and the caller decides what a change is (for a design, a new
35
- * version of its canvas).
37
+ * version of its canvas). Delete removes a selected note, and a selected
38
+ * board where the caller removes boards (`onBoardRemove`).
36
39
  *
37
40
  * HOVER AND SELECTION ARE OUTLINES IN THE ACCENT, at one screen pixel and two,
38
41
  * over a board's own hairline edge; hovering a board's name outlines its board,
@@ -125,18 +128,21 @@ export interface CanvasBoardLabels {
125
128
  /** Each tool's name. */
126
129
  moveTool: string;
127
130
  handTool: string;
131
+ frameTool: string;
128
132
  textTool: string;
129
133
  stickyTool: string;
130
134
  }
131
135
  /**
132
- * The tools a board canvas offers. Move and Hand always; Text and Sticky only
133
- * where a person may edit and the caller places notes (`onNoteCreate`).
136
+ * The tools a board canvas offers. Move and Hand always; Frame only where a
137
+ * person may edit and the caller places boards (`onBoardCreate`), and Text and
138
+ * Sticky only where the caller places notes (`onNoteCreate`).
134
139
  *
135
- * NO FRAME TOOL. A board is a page an agent or an upload made, with a file
136
- * behind it, and an empty frame drawn here would be a board with nothing to
137
- * render. NO COMMENT TOOL until a canvas has comments to anchor.
140
+ * FRAME IS FOR SHAPING A CANVAS BEFORE IT IS DRAWN: a design's create page,
141
+ * where a person lays out the boards an agent then fills. A published design's
142
+ * board is a page with a file behind it, so its viewer offers no Frame. NO
143
+ * COMMENT TOOL until a canvas has comments to anchor.
138
144
  */
139
- export type CanvasBoardTool = 'move' | 'hand' | 'text' | 'sticky';
145
+ export type CanvasBoardTool = 'move' | 'hand' | 'frame' | 'text' | 'sticky';
140
146
  /**
141
147
  * The smallest zoom a board canvas fits at. A design laid out across many
142
148
  * full-size pages is many screens wide, and every board has to be on screen
@@ -166,6 +172,18 @@ export interface CanvasBoardProps {
166
172
  onNoteChange?: ((note: CanvasBoardNote) => void) | undefined;
167
173
  /** A note was deleted. */
168
174
  onNoteRemove?: ((id: string) => void) | undefined;
175
+ /**
176
+ * The Frame tool placed a board at a canvas point (its top left, in canvas
177
+ * pixels). The caller adds the board, with whatever size and name it gives
178
+ * new boards, and returns its id, which the canvas then selects. Absent, or
179
+ * on a canvas that is not editable, the tool is not offered.
180
+ */
181
+ onBoardCreate?: ((at: CanvasPoint) => string | undefined) | undefined;
182
+ /**
183
+ * Delete pressed on a selected board. Absent, a board is not deleted from
184
+ * the canvas.
185
+ */
186
+ onBoardRemove?: ((id: string) => void) | undefined;
169
187
  /**
170
188
  * The Text or Sticky tool placed a note at a canvas point (its top left, in
171
189
  * canvas pixels). The caller adds the note, with whatever size and starting
@@ -212,4 +230,4 @@ export declare function boardRoom(width: number, height: number): {
212
230
  };
213
231
  /** The narrowest a board is drawn, in screen pixels, with its name above it. */
214
232
  export declare const BOARD_TITLE_MIN_WIDTH = 40;
215
- export declare function CanvasBoard({ label, boards, notes, renderBoard, maxLive, minLiveWidth, editable, minSide, maxSide, onBoardChange, onNoteChange, onNoteRemove, onNoteCreate, onOpen, onActivate, selected: heldSelection, onSelectedChange, controlsExtra, toolbar, labels, canvasLabels, canvasRef, className, }: CanvasBoardProps): import("react").JSX.Element;
233
+ export declare function CanvasBoard({ label, boards, notes, renderBoard, maxLive, minLiveWidth, editable, minSide, maxSide, onBoardChange, onNoteChange, onNoteRemove, onNoteCreate, onBoardCreate, onBoardRemove, onOpen, onActivate, selected: heldSelection, onSelectedChange, controlsExtra, toolbar, labels, canvasLabels, canvasRef, className, }: CanvasBoardProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { BOARD_TITLE_MIN_WIDTH, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardRoom, liveBoards, titleSize } from '../chunk-WPX6A5BV.js';
1
+ export { BOARD_TITLE_MIN_WIDTH, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardRoom, liveBoards, titleSize } from '../chunk-E35CMI5D.js';
2
2
  import '../chunk-5SZGKSGL.js';
3
3
  import '../chunk-3Y56GQPM.js';
4
4
  import '../chunk-PGRPNDWM.js';
@@ -1,5 +1,5 @@
1
- export { ChangeMark } from '../chunk-SGHIAGPR.js';
2
- import '../chunk-VI5FWDZW.js';
1
+ export { ChangeMark } from '../chunk-47JQAGRV.js';
2
+ import '../chunk-LFSIKGRQ.js';
3
3
  import '../chunk-Z7JYG5TF.js';
4
4
  import '../chunk-AYKXMIOR.js';
5
5
  import '../chunk-6ZJ3N7QI.js';
@@ -5,6 +5,11 @@ export interface ChoiceListOption {
5
5
  value: string;
6
6
  /** What the choice is, in a few words. */
7
7
  label: ReactNode;
8
+ /**
9
+ * A picture of the choice, drawn between the radio and the words: an
10
+ * agent's character, a kind's glyph. Decorative; the label names it.
11
+ */
12
+ media?: ReactNode;
8
13
  /** One line under the label saying what choosing it means. */
9
14
  detail?: ReactNode;
10
15
  /** A short word at the row's end, such as "Recommended". */
@@ -34,7 +39,8 @@ export interface ChoiceListProps {
34
39
  }
35
40
  /**
36
41
  * One answer from a short list, each choice a row with its label, a line of
37
- * detail and an optional tag, in one bordered box.
42
+ * detail, an optional picture (`media`) and an optional tag, in one bordered
43
+ * box.
38
44
  *
39
45
  * NATIVE RADIOS, so the arrow keys move the choice and Tab leaves the group as
40
46
  * the platform does, and every row is its radio's label, so the whole row
@@ -1,2 +1,2 @@
1
- export { ChoiceList } from '../chunk-QBXZLGK2.js';
1
+ export { ChoiceList } from '../chunk-ZU3DUXD2.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -4,6 +4,8 @@
4
4
  * accent's soft fill, so the answer reads at a glance without the radio.
5
5
  */
6
6
  .crewlet-choice-list {
7
+ /* The platform's radio, sized here so a panel can line up with the text beside it. */
8
+ --crewlet-choice-list-radio-size: 13px;
7
9
  display: grid;
8
10
  gap: var(--spacing-1);
9
11
  padding: var(--spacing-1);
@@ -43,6 +45,22 @@
43
45
  transition: background-color var(--motion-duration-fast) var(--motion-easing-default);
44
46
  }
45
47
 
48
+ /* A choice with a picture: the radio, the picture, the words, the tag. The
49
+ picture centres on the label and its detail together. */
50
+ .crewlet-choice-list__row.has-media {
51
+ grid-template-columns: auto auto minmax(0, 1fr) auto;
52
+ align-items: center;
53
+ }
54
+
55
+ .crewlet-choice-list__row.has-media .crewlet-choice-list__radio {
56
+ margin-top: 0;
57
+ }
58
+
59
+ .crewlet-choice-list__media {
60
+ display: inline-flex;
61
+ flex: none;
62
+ }
63
+
46
64
  .crewlet-choice-list__row:hover {
47
65
  background: var(--color-surface-hover);
48
66
  }
@@ -56,6 +74,8 @@
56
74
  }
57
75
 
58
76
  .crewlet-choice-list__radio {
77
+ width: var(--crewlet-choice-list-radio-size);
78
+ height: var(--crewlet-choice-list-radio-size);
59
79
  margin: 3px 0 0;
60
80
  accent-color: var(--color-brand-accent);
61
81
  cursor: inherit;
@@ -95,6 +115,25 @@
95
115
  white-space: nowrap;
96
116
  }
97
117
 
118
+ /* A SELECTED CHOICE'S PANEL is part of the choice: it continues the row's
119
+ fill under it, and its content starts where the label does, not under the
120
+ radio. */
121
+ .crewlet-choice-list__item:has(> .crewlet-choice-list__panel) {
122
+ gap: 0;
123
+ }
124
+
125
+ .crewlet-choice-list__item:has(> .crewlet-choice-list__panel) > .crewlet-choice-list__row {
126
+ border-end-start-radius: 0;
127
+ border-end-end-radius: 0;
128
+ }
129
+
130
+ .crewlet-choice-list__panel {
131
+ padding: var(--spacing-1) var(--spacing-2) var(--spacing-3) calc(var(--spacing-2) + var(--crewlet-choice-list-radio-size) + var(--spacing-3));
132
+ border-end-start-radius: var(--radius-sm);
133
+ border-end-end-radius: var(--radius-sm);
134
+ background: var(--color-brand-accent-soft);
135
+ }
136
+
98
137
  .crewlet-choice-list__footer {
99
138
  display: flex;
100
139
  justify-content: flex-end;