@crewlethq/ui 0.68.0 → 0.70.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 (174) hide show
  1. package/README.md +24 -2
  2. package/dist/AgentHandoffPanel/index.js +5 -5
  3. package/dist/AppShell/index.js +4 -4
  4. package/dist/ArrangeList/index.js +4 -4
  5. package/dist/ArtifactBar/index.js +7 -7
  6. package/dist/ArtifactCard/index.js +4 -4
  7. package/dist/ArtifactPanel/index.js +1 -1
  8. package/dist/AvatarPicker/index.js +7 -7
  9. package/dist/BriefCard/BriefCard.d.ts +80 -0
  10. package/dist/BriefCard/index.d.ts +3 -0
  11. package/dist/BriefCard/index.js +13 -0
  12. package/dist/BriefCard-L66R5U32.css +127 -0
  13. package/dist/Button/Button.d.ts +10 -0
  14. package/dist/Button/index.js +1 -1
  15. package/dist/{Button-VRRYSXFN.css → Button-GDEBGBX6.css} +30 -3
  16. package/dist/Canvas/index.js +3 -3
  17. package/dist/CanvasBoard/index.js +5 -5
  18. package/dist/CanvasToolbar/index.js +4 -4
  19. package/dist/ChatThread/index.js +2 -2
  20. package/dist/Checkbox/index.js +3 -3
  21. package/dist/CodeBlock/index.js +3 -3
  22. package/dist/ColorField/index.js +3 -3
  23. package/dist/ColorSwatch/index.js +3 -3
  24. package/dist/Combobox/index.js +3 -3
  25. package/dist/CommandPalette/index.js +5 -5
  26. package/dist/CommentThread/index.js +6 -6
  27. package/dist/Composer/index.js +3 -3
  28. package/dist/ConfirmField/index.js +3 -3
  29. package/dist/ConflictNote/index.js +2 -2
  30. package/dist/ContrastHelp/index.js +1 -1
  31. package/dist/Copyable/index.js +2 -2
  32. package/dist/DataGrid/DataGrid.d.ts +50 -4
  33. package/dist/DataGrid/index.d.ts +2 -2
  34. package/dist/DataGrid/index.js +5 -5
  35. package/dist/{DataGrid-NHIN2I42.css → DataGrid-Q26F2V5Q.css} +145 -24
  36. package/dist/DataTable/index.js +7 -7
  37. package/dist/DataView/index.js +10 -9
  38. package/dist/{DataView-RH5UDA5F.css → DataView-L7HLNW7C.css} +1 -112
  39. package/dist/DateTimePicker/index.js +3 -3
  40. package/dist/DeepWorkCard/index.js +3 -3
  41. package/dist/DocTabsEditor/index.js +5 -5
  42. package/dist/DownloadButton/index.js +2 -2
  43. package/dist/{Editor-2MZDDSJF.js → Editor-NNQEALNT.js} +4 -4
  44. package/dist/ErrorBoundary/index.js +2 -2
  45. package/dist/FileDrop/index.js +2 -2
  46. package/dist/FilterPill/FilterPill.d.ts +63 -0
  47. package/dist/FilterPill/index.d.ts +3 -0
  48. package/dist/FilterPill/index.js +4 -0
  49. package/dist/FilterPill-4GMNFZND.css +134 -0
  50. package/dist/FollowBanner/index.js +2 -2
  51. package/dist/HuePicker/index.js +6 -6
  52. package/dist/InlineEditor/index.js +2 -2
  53. package/dist/Input/index.js +2 -2
  54. package/dist/LinkInterstitial/index.js +4 -4
  55. package/dist/ListInput/index.js +4 -4
  56. package/dist/LogoSlot/index.js +3 -3
  57. package/dist/MarkdownEditor/index.js +6 -6
  58. package/dist/Menu/Menu.d.ts +10 -1
  59. package/dist/Menu/index.js +3 -3
  60. package/dist/{Menu-OLUGHX56.css → Menu-I4SNXHOT.css} +12 -0
  61. package/dist/MergeConflicts/index.js +6 -6
  62. package/dist/Modal/index.js +3 -3
  63. package/dist/OpenInAppCard/index.js +3 -3
  64. package/dist/OrgTable/index.js +1 -1
  65. package/dist/PeekRail/index.js +2 -2
  66. package/dist/PeopleRail/index.js +2 -2
  67. package/dist/PresenterView/index.js +3 -3
  68. package/dist/PrincipalPicker/index.js +4 -4
  69. package/dist/ProposalCard/index.js +7 -7
  70. package/dist/ReceiptStrip/index.js +2 -2
  71. package/dist/ResultTableCard/index.js +4 -4
  72. package/dist/RichEditor/index.js +2 -2
  73. package/dist/SandboxedFrame/index.js +2 -2
  74. package/dist/SegmentedControl/index.js +5 -5
  75. package/dist/SelectionBar/index.js +2 -2
  76. package/dist/SetupWizard/index.js +2 -2
  77. package/dist/ShareDialog/index.js +5 -5
  78. package/dist/SheetColumnEditor/index.js +9 -9
  79. package/dist/SheetGrid/index.js +4 -4
  80. package/dist/SidePanel/index.js +1 -1
  81. package/dist/SlideCompare/index.js +2 -2
  82. package/dist/SlideFilmstrip/index.js +4 -4
  83. package/dist/Switcher/index.js +5 -5
  84. package/dist/TableCells/index.js +1 -1
  85. package/dist/{TableCells-F6MUV572.css → TableCells-TKSNLRK3.css} +1 -0
  86. package/dist/Tabs/index.js +4 -4
  87. package/dist/TagsInput/index.js +2 -2
  88. package/dist/ThemeSwitcher/index.js +6 -6
  89. package/dist/TimeRangePicker/index.js +8 -8
  90. package/dist/TimeWindowPicker/index.js +4 -4
  91. package/dist/TreeCanvas/index.js +4 -4
  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/VersionTimeline/index.js +2 -2
  96. package/dist/{chunk-XI56IJGI.js → chunk-3EETQFAM.js} +1 -1
  97. package/dist/{chunk-5FFZED4X.js → chunk-3EY5SEGH.js} +4 -4
  98. package/dist/{chunk-2QMUOUXN.js → chunk-3LP3VPLT.js} +2 -2
  99. package/dist/{chunk-DGG2A6XG.js → chunk-3WN5HUAK.js} +2 -2
  100. package/dist/{chunk-QBWNGNF7.js → chunk-4DL2BQJE.js} +1 -1
  101. package/dist/{chunk-XNYMMLCY.js → chunk-4MVLED6E.js} +4 -4
  102. package/dist/{chunk-OXEWUAND.js → chunk-5OFRDX66.js} +1 -1
  103. package/dist/{chunk-QRKDP7RQ.js → chunk-6C6YK75K.js} +2 -2
  104. package/dist/{chunk-2A6DL3K5.js → chunk-6FBPFG3C.js} +1 -1
  105. package/dist/{chunk-WWXIGN4O.js → chunk-73SAOOR5.js} +3 -3
  106. package/dist/{chunk-CMTLQOJY.js → chunk-7LSSYHOT.js} +1 -1
  107. package/dist/{chunk-COAK5MIF.js → chunk-ADSOY7UM.js} +3 -3
  108. package/dist/{chunk-GNDKUSCG.js → chunk-AGLONIVV.js} +1 -1
  109. package/dist/{chunk-YDXX5UB7.js → chunk-AQIFKLXY.js} +1 -1
  110. package/dist/{chunk-SUJO3AHN.js → chunk-B3PK2LND.js} +1 -1
  111. package/dist/{chunk-IU5J6BY5.js → chunk-BWAUL5MB.js} +2 -2
  112. package/dist/{chunk-ZFFQMRPJ.js → chunk-BWFJB5JD.js} +4 -4
  113. package/dist/{chunk-I24FI46B.js → chunk-C667GCU7.js} +1 -1
  114. package/dist/{chunk-CWYU7DNT.js → chunk-CDNZTCP2.js} +1 -1
  115. package/dist/{chunk-MVQSTBLQ.js → chunk-DB7UVFOY.js} +1 -1
  116. package/dist/{chunk-OJGI4XJH.js → chunk-DGSK4LLS.js} +1 -1
  117. package/dist/{chunk-7QTPJDRF.js → chunk-DGXZ635L.js} +7 -4
  118. package/dist/{chunk-2SU735S3.js → chunk-DV5L2GRY.js} +1 -1
  119. package/dist/{chunk-NSCYGUDG.js → chunk-EHFQMY3B.js} +1 -1
  120. package/dist/{chunk-FPTJMNI3.js → chunk-EN4UJQ63.js} +2 -2
  121. package/dist/{chunk-O3WH7OJE.js → chunk-EOXI3CRG.js} +1 -1
  122. package/dist/{chunk-LUSRKTX6.js → chunk-ERFXYGRF.js} +2 -2
  123. package/dist/{chunk-MCMPQBEV.js → chunk-FQI62PIZ.js} +2 -2
  124. package/dist/{chunk-CLJHQHPS.js → chunk-FURJVZCT.js} +73 -27
  125. package/dist/{chunk-5K7GGQNX.js → chunk-G4QZWVAB.js} +2 -2
  126. package/dist/{chunk-KZ3UXNN7.js → chunk-H32JW6CZ.js} +2 -2
  127. package/dist/{chunk-7DD2GR7I.js → chunk-HPI5J6AR.js} +2 -2
  128. package/dist/{chunk-ZEPUKRO7.js → chunk-IJ7KLXUZ.js} +1 -1
  129. package/dist/{chunk-MVQLCSAC.js → chunk-IPUEVTRJ.js} +1 -1
  130. package/dist/{chunk-4VPDY7AD.js → chunk-J5WWMC35.js} +45 -46
  131. package/dist/{chunk-KQGOVBGF.js → chunk-JD7P2GJP.js} +1 -1
  132. package/dist/{chunk-VMEUY672.js → chunk-JQEXAH7G.js} +1 -1
  133. package/dist/{chunk-K4IVKHKU.js → chunk-JT7WRPZ6.js} +1 -1
  134. package/dist/{chunk-CFXDWGQI.js → chunk-JVII5264.js} +1 -1
  135. package/dist/chunk-K4LZXSKZ.js +62 -0
  136. package/dist/{chunk-JII74OTJ.js → chunk-KAA3GFTP.js} +5 -5
  137. package/dist/{chunk-WYXUDDTY.js → chunk-KL6A7JGH.js} +1 -1
  138. package/dist/{chunk-2JHGPXYG.js → chunk-KQWJWTED.js} +1 -1
  139. package/dist/{chunk-WU5JDEEY.js → chunk-L4HHWG4V.js} +1 -1
  140. package/dist/{chunk-RCHJBKD3.js → chunk-LQWORB5B.js} +2 -2
  141. package/dist/{chunk-2DSHMV6B.js → chunk-MFQPGMJT.js} +1 -1
  142. package/dist/{chunk-XDVQ72BE.js → chunk-NXNLAZPK.js} +2 -2
  143. package/dist/{chunk-WPMZKZUH.js → chunk-O3HCFM3D.js} +1 -1
  144. package/dist/{chunk-NBOFBSVD.js → chunk-OBPINJNO.js} +2 -2
  145. package/dist/{chunk-2566PSQ3.js → chunk-OQG4P5KU.js} +18 -4
  146. package/dist/{chunk-UWOYDHVW.js → chunk-P64MIA7C.js} +1 -1
  147. package/dist/{chunk-EAR2F5OA.js → chunk-PBCNINMB.js} +1 -1
  148. package/dist/{chunk-KHHDCNYM.js → chunk-PRN5IP2R.js} +1 -1
  149. package/dist/{chunk-DMK2A4IK.js → chunk-QSWQJX27.js} +1 -1
  150. package/dist/{chunk-D2ZXIQ23.js → chunk-R5OATXWU.js} +1 -1
  151. package/dist/{chunk-OFABBAUR.js → chunk-SMZPUHBL.js} +1 -1
  152. package/dist/{chunk-7QTJO3PV.js → chunk-SO5SXSTP.js} +1 -1
  153. package/dist/{chunk-IYG4ETAQ.js → chunk-T5GBTXNC.js} +1 -1
  154. package/dist/{chunk-DMY4XEDS.js → chunk-TKBFRGUV.js} +4 -4
  155. package/dist/{chunk-DFU6JGJV.js → chunk-TPCBPGSB.js} +1 -1
  156. package/dist/{chunk-GAUBP247.js → chunk-TWJERLT3.js} +1 -1
  157. package/dist/{chunk-MJTBINIY.js → chunk-TYIHFDMP.js} +1 -1
  158. package/dist/{chunk-PHBMSXVE.js → chunk-UY3FWQWG.js} +2 -2
  159. package/dist/chunk-VBA5FSWV.js +87 -0
  160. package/dist/{chunk-SZEKOW2X.js → chunk-VWMB3CJN.js} +1 -1
  161. package/dist/{chunk-UKYVLQAE.js → chunk-W5AXJWOW.js} +2 -2
  162. package/dist/{chunk-HHZ5ZXYO.js → chunk-YGWIWDXE.js} +3 -3
  163. package/dist/{chunk-2T32N2WD.js → chunk-YUHKRRWO.js} +2 -2
  164. package/dist/{chunk-IQQSMK4E.js → chunk-ZUBFVK6B.js} +1 -1
  165. package/dist/{chunk-M25IV5MH.js → chunk-ZWCK4N4L.js} +1 -1
  166. package/dist/generated/index.d.ts +2 -0
  167. package/dist/generated/index.js +104 -102
  168. package/dist/index.js +104 -102
  169. package/dist/styles.css +463 -146
  170. package/package.json +3 -3
  171. package/dist/{chunk-TXQNWGUD.js → chunk-ABZC3NLM.js} +0 -0
  172. package/dist/{chunk-DCQ2VTBB.js → chunk-ETSF7SU6.js} +1 -1
  173. package/dist/{chunk-BAHLBMCH.js → chunk-HEIOLITO.js} +1 -1
  174. package/dist/{chunk-R2YHKVWN.js → chunk-SBHAKX2T.js} +1 -1
package/README.md CHANGED
@@ -44,10 +44,10 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
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
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`) |
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
- | List screens | `DataView`, and its parts on their own: `DataViewToolbar`, `FilterAxisBar`, `FilterAxisChip`, plus the filter model (`filterDefsFromColumns`, `applyColumnFilters`, `filterPredicate`, `blankFilterValue`) |
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` |
49
49
  | Documents and review | `DiffView` and `DiffSummary` with the line diff they draw (`diffLines`, `diffStat`, `collapseDiff`, `firstChangedLines`, `splitLines`, `MAX_DIFF_LINES`, with no React in it), `DiffList`, `VersionCompare`, `CommentThread` |
50
- | Conversations and the assistant | `ChatThread` (with `ChatThreadHandle`), `MessageBubble`, `RunChip`, `StepList` and `StepStateMark`, `ProposalCard`, `ChangeList` (with `shortenUnchanged`), `StatusCard`, `ReceiptStrip`, `RefusalStrip`, `ResultTableCard`, `OpenInAppCard`, `EntityList`, `RefusalCard`, `SuggestionRow` and `SuggestionList`, `SendButton` |
50
+ | Conversations and the assistant | `ChatThread` (with `ChatThreadHandle`), `MessageBubble`, `RunChip`, `StepList` and `StepStateMark`, `ProposalCard`, `ChangeList` (with `shortenUnchanged`), `StatusCard`, `ReceiptStrip`, `RefusalStrip`, `ResultTableCard`, `OpenInAppCard`, `BriefCard`, `EntityList`, `RefusalCard`, `SuggestionRow` and `SuggestionList`, `SendButton` |
51
51
  | Charts | `Legend`, `BarList`, `StackedBar`, `StackedColumns`, `ActivityStrip`, `TimeSeries`, `Sparkline`, the reading layer they share (`ChartTooltip`, `useChartHover`), and the ramp (`DATA_COLORS`, `DATA_COLOR_OTHER`, `dataColor`) |
52
52
  | Marks | `Count`, `StatusDot`, `Spinner`, `EmptyValue`, `VisuallyHidden` |
53
53
  | Hooks and seams | `useModalLayer`, `usePopupLayer`, `LayerHost`, `useListbox`, `useOptionKeys`, `useHighlightRest` and `HIGHLIGHT_REST_MS`, `useClipboard`, `useDownload`, `downloadText`, `downloadBlob`, `safeFilename`, `toCsv`, `elementToPng` and `ElementToPngError`, `useOutcome`, `useAnnouncer`, `useNow`, `formatRelative`, `HeadingLevelProvider`, `cx`, the node hues (`NODE_HUES`, `NODE_HUE_NAMES`, `isNodeHue`) |
@@ -205,6 +205,28 @@ 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.70.0
209
+
210
+ **`FilterPill`, one filter in force as the sentence it is.** `field`, `operator` and `value` are drawn a step apart and separated by real spaces, so a pill reads, copies and is announced as "Status is In progress" rather than running its parts together. The field and the relation are the secondary ink at the regular weight; the value is the accent ink at the semibold weight, and the only part a long filter cuts. With no `operator` the field and the value are joined by a colon ("Role: Admin"); with no `value` the field alone names a switch ("Blocked"). It stands on the accent's soft pair, as a pressed `FilterChip` does. `onRemove` draws the remove control behind a hairline, named by the whole sentence ("Remove the Status is In progress filter") unless `removeLabel` names it. `renderWords` makes the words a control (a popover's trigger), handed the words and `FILTER_PILL_WORDS_CLASS`. `labels` replaces its words (`FILTER_PILL_LABELS`: `remove`, `removeUnnamed`, `fieldEnd`; `FilterPillLabels`). `filterPillSentence` builds the sentence where every part is a word. The remove control's rules outrank IconButton's own, so its height and square corners hold in any bundle order, and its hairline is logical (`border-inline-start`).
211
+
212
+ **`FilterAxisChip` is a `FilterPill`** whose words open its editor, so every filter in force on any list has one look. It draws an unusual operator in the relation's register ("Created on or before 1 March") rather than inside the value. `formatFilterValue` is unchanged. The `.crewlet-filter-axis-chip__*` part classes are gone; the chip's root keeps `.crewlet-filter-axis-chip`.
213
+
214
+ **A sortable `DataGrid` head says so before it is pressed.** It takes the surface hover overlay under the pointer and draws a two-way arrow on hover and on focus; the sorted head always draws an arrow naming its direction (up for ascending, down for descending), before the word in a right-aligned column. The arrow's box is always laid out, so a head never changes width under the pointer; **every sortable head is therefore about 16px wider at rest than before (the arrow and its gap), so the widths at which a grid drops a give-way column or stacks into card rows move accordingly.** A centred sortable head mirrors the arrow's box before its word, so the word stays on the column's middle. Where nothing hovers (`hover: none`, a touch screen) the two-way arrow is shown at rest. The whole head is the press target. Heads that cannot sort stay inert and draw no arrow unless they are the sort in force, which they still announce with `aria-sort`.
215
+
216
+ **`DataGrid` takes `defaultSort`**, the order the rows take while `sort` is empty, drawn on its column's head as the sort in force. A press steps ascending, descending, then back to the default, from the sort in force rather than from the address: a column at its default descending turns ascending, and a step that lands on the default is written as `''`, so an address holds only what the reader chose and no press changes nothing. `nextGridSort(column, sort, defaultSort)` is that cycle, pure.
217
+
218
+ **A `DataGrid` column has one edge, shared by its head and its values.** `align` takes `left` (the default), `right` or `center` (`DataGridAlign`), and the head, its sort button and every cell take the same modifier and the same inline inset, so a head never stands off the values it names. A right-aligned column draws tabular digits, so times and figures end on one edge. A column with `icon` (one glyph or face per row) is drawn in a fixed track (`DATA_GRID_ICON_TRACK`), centred, keeps the cells' own step on both sides even at the grid's edge, and is named by its `label`. `TableDateCell` draws tabular digits.
219
+
220
+ **`Button` takes `flush`, and `Menu` takes `valueTrigger`.** A flush button's words start on the line its box starts on: its padding and edge are taken back at its start by its size's own inset (`--crewlet-btn-inset`), and its focus ring is drawn inside. A ghost button drawn as a value (a status chosen in place, a face that opens a picker) then starts on the line the plain values in its column start on, in a table or a properties rail, instead of one padding and one edge inside it. The outdent reads `--crewlet-btn-flush-outdent`; a container with no gutter to give sets it to 0, which `DataGrid` does for its first column, its right and centred columns and its card rows. The grid's own outdent for a ghost control written straight into a cell is the same declaration, so the old `--crewlet-data-grid-control-outdent` is gone. `Menu`'s `valueTrigger` is a trigger that IS the value it changes: flush, and in the surrounding text's size, weight and ink rather than a button label's, so a writer's row in a table or a properties rail reads as a reader's.
221
+
222
+ **`DataGrid`'s handle activates a row that only links.** `DataGridHandle.activate` calls `onRowActivate` where the row has one, and otherwise follows the cursor row's `rowHref` link as a click would, with the keys held, so Enter opens a row in a grid of links and a modified Enter opens it elsewhere.
223
+
224
+ **The `DataGrid` foot is a caption, not a row.** It takes the micro step of type, the tertiary ink, half the row's inset and the grid's own ground under a hairline, where it took the head's raised ground at nearly a row's height, so a grid's head, rows and foot no longer blur into one stack. A note in the foot takes the foot's size.
225
+
226
+ ## Changes in 0.69.0
227
+
228
+ **`BriefCard`, a brief as the assistant's answer card.** One sentence on what is going on (`summary`), the rows that wait on the reader (`needs`, never more than `BRIEF_CARD_MAX_NEEDS`, three, each with its words, one `detail`, a `tone` of `warning` (the default), `danger` or `neutral` drawn as a `StatusDot`, and one `action` button), one `recommended` next step on the accent's softest ground with an optional primary action (`null` leaves the block out), and `followUps`, the questions to ask next as plain `SuggestionRow`s under an "Ask next" label. An empty `needs` says "Nothing needs you." in words. It stands in a `StatusCard` titled "Brief" with `scope` and `asOf` beside the title and a Tag in the head that counts the rows ("2 need you") or says "All clear", so the card's region name carries the count. Every action is the host's own callback: the card never decides where a row leads. `labels` replaces any of its words (`BRIEF_CARD_LABELS`); the types are `BriefCardProps`, `BriefCardNeed`, `BriefCardNeedTone`, `BriefCardAction`, `BriefCardRecommendation`, `BriefCardFollowUp` and `BriefCardLabels`.
229
+
208
230
  ## Changes in 0.67.0
209
231
 
210
232
  **The product marks are redrawn as one family** (`@crewlethq/icons`). Each stands on the Crewlet octagon in the brand violet with a deeper lower facet (`#6a3cff`, was `#5c24ff`) and one white figure: Worklet a tick over one open task, Doclet a page with a chamfer fold, Chat a speech bubble with the crewmate's visor, and the Assistant two sparks. The `dim` and `eye` parts are gone, and every drawing carries a hidden `keyline` part that the soon state paints. Nothing to change unless a stylesheet of your own reads those parts.
@@ -1,24 +1,24 @@
1
- export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-QRKDP7RQ.js';
1
+ export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-6C6YK75K.js';
2
2
  import '../chunk-4MJN2KN6.js';
3
3
  import '../chunk-WFCWPXJN.js';
4
- import '../chunk-OXEWUAND.js';
4
+ import '../chunk-5OFRDX66.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-ETSF7SU6.js';
10
10
  import '../chunk-PGCLHYVP.js';
11
11
  import '../chunk-IVTQWOXV.js';
12
12
  import '../chunk-MLDTLZAO.js';
13
13
  import '../chunk-PQADV6P6.js';
14
14
  import '../chunk-2G355KDJ.js';
15
15
  import '../chunk-PIYJNCN7.js';
16
- import '../chunk-7QTPJDRF.js';
16
+ import '../chunk-DGXZ635L.js';
17
17
  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-PHBMSXVE.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-2566PSQ3.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
- import '../chunk-7QTPJDRF.js';
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-TWJERLT3.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-PBCNINMB.js';
5
+ import '../chunk-ETSF7SU6.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-DMY4XEDS.js';
1
+ export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-TKBFRGUV.js';
2
2
  import '../chunk-25AZQ3GZ.js';
3
3
  import '../chunk-I33UIUZD.js';
4
- import '../chunk-MJTBINIY.js';
5
- import '../chunk-MVQLCSAC.js';
4
+ import '../chunk-TYIHFDMP.js';
5
+ import '../chunk-IPUEVTRJ.js';
6
6
  import '../chunk-EGMQURBR.js';
7
- import '../chunk-WIATRXEJ.js';
8
7
  import '../chunk-AVL52EME.js';
8
+ import '../chunk-WIATRXEJ.js';
9
9
  import '../chunk-RSKW25Y5.js';
10
10
  import '../chunk-ANTAQAR4.js';
11
11
  import '../chunk-MLDTLZAO.js';
12
- import '../chunk-2566PSQ3.js';
13
- import '../chunk-7QTPJDRF.js';
12
+ import '../chunk-OQG4P5KU.js';
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-XI56IJGI.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-3EETQFAM.js';
2
2
  import '../chunk-BRLZXYPA.js';
3
3
  import '../chunk-CI3VPIJN.js';
4
4
  import '../chunk-EJNJMHQG.js';
@@ -8,16 +8,16 @@ import '../chunk-AV2DXAEL.js';
8
8
  import '../chunk-BKP6XCAJ.js';
9
9
  import '../chunk-PZKHBB7D.js';
10
10
  import '../chunk-NHLNHH4J.js';
11
- import '../chunk-EAR2F5OA.js';
11
+ import '../chunk-PBCNINMB.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-ETSF7SU6.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,21 +1,21 @@
1
- export { AvatarPicker } from '../chunk-MVQSTBLQ.js';
2
- import '../chunk-YDXX5UB7.js';
1
+ export { AvatarPicker } from '../chunk-DB7UVFOY.js';
2
+ import '../chunk-AQIFKLXY.js';
3
3
  import '../chunk-KHJIEPZV.js';
4
4
  import '../chunk-AYKXMIOR.js';
5
5
  import '../chunk-SNQRGH4A.js';
6
- import '../chunk-MJTBINIY.js';
7
- import '../chunk-MVQLCSAC.js';
6
+ import '../chunk-TYIHFDMP.js';
7
+ import '../chunk-IPUEVTRJ.js';
8
8
  import '../chunk-EGMQURBR.js';
9
9
  import '../chunk-WIATRXEJ.js';
10
10
  import '../chunk-PZKHBB7D.js';
11
11
  import '../chunk-MLDTLZAO.js';
12
- import '../chunk-2566PSQ3.js';
13
- import '../chunk-7QTPJDRF.js';
12
+ import '../chunk-OQG4P5KU.js';
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';
@@ -0,0 +1,80 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ /** The most rows a brief draws: what waits on the reader is a short list or it is not a brief. */
3
+ export declare const BRIEF_CARD_MAX_NEEDS = 3;
4
+ /** The one thing a row or the recommendation lets the reader do, in one press. */
5
+ export interface BriefCardAction {
6
+ /** A verb and its object: "Answer", "Open GOP-11", "Ask why". */
7
+ label: string;
8
+ onSelect: () => void;
9
+ }
10
+ /**
11
+ * How loud a row is. `danger` is for a fact the host knows (an agent stopped,
12
+ * a failed turn), never for urgency a writer chose; most rows are `warning`.
13
+ */
14
+ export type BriefCardNeedTone = 'danger' | 'warning' | 'neutral';
15
+ /** One thing that waits on the reader, pointing at the record it is about. */
16
+ export interface BriefCardNeed {
17
+ key: string;
18
+ /** What waits, with its number and its name: "QA asks which store build to test on GOP-11". */
19
+ text: ReactNode;
20
+ /** One fact under it: "Asked 2 hours ago". */
21
+ detail?: ReactNode;
22
+ tone?: BriefCardNeedTone | undefined;
23
+ action?: BriefCardAction | undefined;
24
+ }
25
+ /** The one next step the brief recommends. */
26
+ export interface BriefCardRecommendation {
27
+ text: ReactNode;
28
+ action?: BriefCardAction | undefined;
29
+ }
30
+ /** A question the reader can ask next, in the same conversation. */
31
+ export interface BriefCardFollowUp {
32
+ key: string;
33
+ question: string;
34
+ onSelect: () => void;
35
+ }
36
+ export interface BriefCardLabels {
37
+ /** The card's title. */
38
+ heading: string;
39
+ needs: string;
40
+ /** Said in the needs block when nothing waits on the reader. */
41
+ clear: string;
42
+ recommended: string;
43
+ followUps: string;
44
+ /** The head's Tag: how many rows wait on the reader. */
45
+ count: (n: number) => string;
46
+ /** The head's Tag when nothing waits. */
47
+ allClear: string;
48
+ }
49
+ export declare const BRIEF_CARD_LABELS: BriefCardLabels;
50
+ export interface BriefCardProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
51
+ /** What the brief covers, beside the title: "Inbox", "Decision on GOP-11". */
52
+ scope?: ReactNode;
53
+ /** When the brief was written, as the reader reads a time: "Just now". */
54
+ asOf?: ReactNode;
55
+ /** What is going on, in one sentence with numbers and names. */
56
+ summary: ReactNode;
57
+ /** What waits on the reader, at most [BRIEF_CARD_MAX_NEEDS]. An empty list says `labels.clear`. */
58
+ needs: readonly BriefCardNeed[];
59
+ /** The one next step, or `null` where nothing is worth recommending. */
60
+ recommended: BriefCardRecommendation | null;
61
+ /** Questions to ask next, drawn as suggestion rows under the recommendation. */
62
+ followUps?: readonly BriefCardFollowUp[] | undefined;
63
+ labels?: Partial<BriefCardLabels> | undefined;
64
+ }
65
+ /**
66
+ * A brief, as the assistant's answer card: one sentence on what is going on,
67
+ * the rows that wait on the reader (never more than three, each pointing at
68
+ * its record with the one press that deals with it), one recommended next
69
+ * step, and the questions worth asking next.
70
+ *
71
+ * A FIXED SHAPE, NOT PROSE. A reader who asks for a brief on every page learns
72
+ * where each answer sits and reads only the part they need. Nothing waiting is
73
+ * said in words, "Nothing needs you.", rather than drawn as an empty block, and
74
+ * the head's Tag says the count before the body is read.
75
+ *
76
+ * THE CARD DRAWS, THE HOST DECIDES. Every action is the host's own callback,
77
+ * so where a row leads (a record opened, a question asked) is settled by the
78
+ * code that built the brief, never by text inside it.
79
+ */
80
+ export declare function BriefCard({ scope, asOf, summary, needs, recommended, followUps, labels: overrides, className, ...rest }: BriefCardProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './BriefCard.css';
2
+ export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_NEEDS, BriefCard } from './BriefCard.js';
3
+ export type { BriefCardAction, BriefCardFollowUp, BriefCardLabels, BriefCardNeed, BriefCardNeedTone, BriefCardProps, BriefCardRecommendation, } from './BriefCard.js';
@@ -0,0 +1,13 @@
1
+ export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_NEEDS, BriefCard } from '../chunk-VBA5FSWV.js';
2
+ import '../chunk-Y7PVLEZJ.js';
3
+ import '../chunk-NTQPJJAN.js';
4
+ import '../chunk-I5OIKDX2.js';
5
+ import '../chunk-WIATRXEJ.js';
6
+ import '../chunk-4AUTALJA.js';
7
+ import '../chunk-AV2DXAEL.js';
8
+ import '../chunk-MLDTLZAO.js';
9
+ import '../chunk-PQADV6P6.js';
10
+ import '../chunk-DGXZ635L.js';
11
+ import '../chunk-XSPCITPN.js';
12
+ import '../chunk-UT6CW3C7.js';
13
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,127 @@
1
+ /*
2
+ * A brief inside the product's status card: one sentence, the rows that wait
3
+ * on the reader, one recommendation and the questions to ask next, each block
4
+ * under a quiet label so a reader scans straight to the part they need.
5
+ */
6
+ .crewlet-brief-card__where {
7
+ display: inline-flex;
8
+ flex-wrap: wrap;
9
+ gap: var(--spacing-1);
10
+ }
11
+
12
+ .crewlet-brief-card__asof {
13
+ white-space: nowrap;
14
+ }
15
+
16
+ .crewlet-brief-card__body {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: var(--spacing-4);
20
+ min-width: 0;
21
+ }
22
+
23
+ .crewlet-brief-card__summary {
24
+ margin: 0;
25
+ font-size: var(--font-size-md);
26
+ font-weight: var(--font-weight-medium);
27
+ line-height: var(--font-line-height-snug);
28
+ text-wrap: pretty;
29
+ }
30
+
31
+ .crewlet-brief-card__block {
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: var(--spacing-2);
35
+ min-width: 0;
36
+ }
37
+
38
+ .crewlet-brief-card__label {
39
+ margin: 0;
40
+ font-size: var(--font-size-2xs);
41
+ font-weight: var(--font-weight-medium);
42
+ letter-spacing: var(--font-letter-spacing-wide);
43
+ text-transform: uppercase;
44
+ line-height: var(--font-line-height-snug);
45
+ color: var(--color-text-tertiary);
46
+ }
47
+
48
+ .crewlet-brief-card__needs {
49
+ display: flex;
50
+ flex-direction: column;
51
+ margin: 0;
52
+ padding: 0;
53
+ list-style: none;
54
+ }
55
+
56
+ /*
57
+ * A ROW IS THE LIST ROW'S GRAMMAR: the dot on the first line, the words and
58
+ * their one fact, and the action centred at the end, so a column of rows reads
59
+ * down the dots and across to the presses.
60
+ */
61
+ .crewlet-brief-card__need {
62
+ display: grid;
63
+ grid-template-columns: auto minmax(0, 1fr) auto;
64
+ align-items: start;
65
+ gap: var(--spacing-3);
66
+ padding-block: var(--spacing-2);
67
+ }
68
+
69
+ .crewlet-brief-card__need + .crewlet-brief-card__need {
70
+ border-top: 1px solid var(--color-border-default);
71
+ }
72
+
73
+ .crewlet-brief-card__need > .crewlet-button {
74
+ align-self: center;
75
+ }
76
+
77
+ .crewlet-brief-card__dot {
78
+ display: inline-flex;
79
+ align-items: center;
80
+ height: 1lh;
81
+ font-size: var(--font-size-compact);
82
+ }
83
+
84
+ .crewlet-brief-card__words {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: var(--spacing-0);
88
+ min-width: 0;
89
+ overflow-wrap: anywhere;
90
+ font-size: var(--font-size-compact);
91
+ }
92
+
93
+ .crewlet-brief-card__detail {
94
+ font-size: var(--font-size-xs);
95
+ color: var(--color-text-tertiary);
96
+ }
97
+
98
+ .crewlet-brief-card__clear {
99
+ display: inline-flex;
100
+ align-items: center;
101
+ gap: var(--spacing-2);
102
+ margin: 0;
103
+ font-size: var(--font-size-compact);
104
+ color: var(--color-feedback-success-ink);
105
+ }
106
+
107
+ /* The recommendation: one step, on the accent's softest ground. */
108
+ .crewlet-brief-card__next {
109
+ display: grid;
110
+ grid-template-columns: auto minmax(0, 1fr) auto;
111
+ align-items: center;
112
+ gap: var(--spacing-3);
113
+ padding: var(--spacing-2) var(--spacing-3);
114
+ border-radius: var(--radius-md);
115
+ background: var(--color-brand-accent-soft);
116
+ overflow-wrap: anywhere;
117
+ font-size: var(--font-size-compact);
118
+ }
119
+
120
+ .crewlet-brief-card__arrow {
121
+ color: var(--color-brand-accent-ink);
122
+ }
123
+
124
+ /* The questions to ask next sit on the card's text edge: each row's own inset is pulled out. */
125
+ .crewlet-brief-card__follow-ups {
126
+ margin-inline: calc(-1 * var(--spacing-3));
127
+ }
@@ -18,6 +18,16 @@ interface ButtonLook {
18
18
  trailingIcon?: ReactNode;
19
19
  /** Fills the line it is on. */
20
20
  block?: boolean | undefined;
21
+ /**
22
+ * Its words start on the line its box starts on: the padding and the edge
23
+ * are taken back at the start, so only the hover ground and the focus ring
24
+ * reach past them. For a GHOST button drawn as a value (a status chosen in
25
+ * place, a face that opens a picker), which then starts on the same line as
26
+ * the plain values above and below it, in a table column or a properties
27
+ * rail. Its focus ring is drawn inside it, so a container's clip never cuts
28
+ * it.
29
+ */
30
+ flush?: boolean | undefined;
21
31
  className?: string | undefined;
22
32
  children?: ReactNode;
23
33
  }
@@ -1,4 +1,4 @@
1
- export { Button, ButtonLink } from '../chunk-7QTPJDRF.js';
1
+ export { Button, ButtonLink } from '../chunk-DGXZ635L.js';
2
2
  import '../chunk-XSPCITPN.js';
3
3
  import '../chunk-UT6CW3C7.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -110,23 +110,50 @@
110
110
  per size. min-height rather than height, so a label that wraps is read
111
111
  rather than clipped. */
112
112
  .crewlet-btn--small {
113
+ --crewlet-btn-inset: var(--spacing-2);
114
+
113
115
  min-height: var(--size-control-sm);
114
- padding: 0 var(--spacing-2);
116
+ padding: 0 var(--crewlet-btn-inset);
115
117
  font-size: var(--font-size-xs);
116
118
  }
117
119
 
118
120
  .crewlet-btn--medium {
121
+ --crewlet-btn-inset: var(--spacing-3);
122
+
119
123
  min-height: var(--size-control-md);
120
- padding: 0 var(--spacing-3);
124
+ padding: 0 var(--crewlet-btn-inset);
121
125
  font-size: var(--font-size-compact);
122
126
  }
123
127
 
124
128
  .crewlet-btn--large {
129
+ --crewlet-btn-inset: var(--spacing-4);
130
+
125
131
  min-height: var(--size-control-lg);
126
- padding: 0 var(--spacing-4);
132
+ padding: 0 var(--crewlet-btn-inset);
127
133
  font-size: var(--font-size-sm);
128
134
  }
129
135
 
136
+ /*
137
+ * FLUSH: the words start on the line. The padding and the 1px edge are taken
138
+ * back at the start, so a ghost button drawn as a value starts on the line
139
+ * the plain values in its column start on, and only the hover ground and the
140
+ * ring reach past it, into the gutter before it. The START ONLY: taken back at
141
+ * the end too, the box overran its cell's content edge, which a column that
142
+ * measures what it cuts short reads as a value that does not fit. The ring is
143
+ * drawn inside, so a container that clips (a table, a card) never cuts it.
144
+ *
145
+ * A CONTAINER WITH NO GUTTER TO GIVE sets `--crewlet-btn-flush-outdent` to 0:
146
+ * a table's first column and its card rows (DataGrid.css), where the outdent
147
+ * would pull the control toward the frame.
148
+ */
149
+ .crewlet-btn--flush {
150
+ margin-inline-start: var(--crewlet-btn-flush-outdent, calc(-1 * (var(--crewlet-btn-inset) + 1px)));
151
+ }
152
+
153
+ .crewlet-btn--flush:focus-visible {
154
+ outline-offset: var(--size-focus-ring-inset-offset);
155
+ }
156
+
130
157
  .crewlet-btn--square {
131
158
  border-radius: var(--radius-md);
132
159
  }
@@ -1,12 +1,12 @@
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-NBOFBSVD.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';
5
- import '../chunk-7QTPJDRF.js';
5
+ 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,16 +1,16 @@
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-MCMPQBEV.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-WYXUDDTY.js';
3
+ import '../chunk-KL6A7JGH.js';
4
4
  import '../chunk-NR4CPM4T.js';
5
- import '../chunk-NBOFBSVD.js';
5
+ import '../chunk-OBPINJNO.js';
6
6
  import '../chunk-LM3ISVJA.js';
7
7
  import '../chunk-I33UIUZD.js';
8
8
  import '../chunk-ANTAQAR4.js';
9
- import '../chunk-7QTPJDRF.js';
9
+ 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,14 +1,14 @@
1
- export { CanvasToolbar, toolForKey } from '../chunk-WYXUDDTY.js';
1
+ export { CanvasToolbar, toolForKey } from '../chunk-KL6A7JGH.js';
2
2
  import '../chunk-NR4CPM4T.js';
3
- import '../chunk-NBOFBSVD.js';
3
+ import '../chunk-OBPINJNO.js';
4
4
  import '../chunk-LM3ISVJA.js';
5
5
  import '../chunk-I33UIUZD.js';
6
6
  import '../chunk-ANTAQAR4.js';
7
- import '../chunk-7QTPJDRF.js';
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,6 +1,6 @@
1
- export { CHAT_THREAD_FOLLOW_WITHIN, CHAT_THREAD_LABELS, ChatThread } from '../chunk-D2ZXIQ23.js';
1
+ export { CHAT_THREAD_FOLLOW_WITHIN, CHAT_THREAD_LABELS, ChatThread } from '../chunk-R5OATXWU.js';
2
2
  import '../chunk-RTPQDNW3.js';
3
- import '../chunk-7QTPJDRF.js';
3
+ import '../chunk-DGXZ635L.js';
4
4
  import '../chunk-XSPCITPN.js';
5
5
  import '../chunk-UT6CW3C7.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,10 +1,10 @@
1
- export { Checkbox, CheckboxGroup } from '../chunk-EAR2F5OA.js';
2
- import '../chunk-DCQ2VTBB.js';
1
+ export { Checkbox, CheckboxGroup } from '../chunk-PBCNINMB.js';
2
+ import '../chunk-ETSF7SU6.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';
@@ -1,8 +1,8 @@
1
- export { CodeBlock } from '../chunk-DMK2A4IK.js';
2
- import '../chunk-IYG4ETAQ.js';
1
+ export { CodeBlock } from '../chunk-QSWQJX27.js';
2
+ import '../chunk-T5GBTXNC.js';
3
3
  import '../chunk-STJ7QBC3.js';
4
4
  import '../chunk-DTIW4CHZ.js';
5
- import '../chunk-7QTPJDRF.js';
5
+ import '../chunk-DGXZ635L.js';
6
6
  import '../chunk-XSPCITPN.js';
7
7
  import '../chunk-UAUP6XGK.js';
8
8
  import '../chunk-UT6CW3C7.js';
@@ -1,11 +1,11 @@
1
- export { ColorField } from '../chunk-CMTLQOJY.js';
1
+ export { ColorField } from '../chunk-7LSSYHOT.js';
2
2
  import '../chunk-7W3LYIOC.js';
3
- import '../chunk-DCQ2VTBB.js';
3
+ import '../chunk-ETSF7SU6.js';
4
4
  import '../chunk-PGCLHYVP.js';
5
5
  import '../chunk-PQADV6P6.js';
6
6
  import '../chunk-2G355KDJ.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';