@crewlethq/ui 0.71.0 → 0.73.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 (87) hide show
  1. package/README.md +19 -1
  2. package/dist/AgentHandoffPanel/index.js +4 -4
  3. package/dist/ArrangeFrame/index.js +2 -2
  4. package/dist/ArrangeList/index.js +4 -4
  5. package/dist/ArtifactCard/index.js +4 -4
  6. package/dist/BriefCard/BriefCard.d.ts +48 -35
  7. package/dist/BriefCard/index.d.ts +2 -2
  8. package/dist/BriefCard/index.js +1 -1
  9. package/dist/{BriefCard-L66R5U32.css → BriefCard-VKTH3BSW.css} +33 -45
  10. package/dist/Checkbox/index.js +3 -3
  11. package/dist/ColorField/index.js +3 -3
  12. package/dist/Combobox/index.js +3 -3
  13. package/dist/CommandPalette/index.js +3 -3
  14. package/dist/CommentThread/index.js +4 -4
  15. package/dist/Composer/index.js +3 -3
  16. package/dist/ConfirmField/index.js +3 -3
  17. package/dist/DataGrid/index.js +4 -4
  18. package/dist/DataTable/index.js +4 -4
  19. package/dist/DataView/index.js +5 -5
  20. package/dist/DeepWorkCard/index.js +2 -2
  21. package/dist/DocTabsEditor/index.js +3 -3
  22. package/dist/{Editor-NNQEALNT.js → Editor-6PBP444G.js} +2 -2
  23. package/dist/Input/index.js +2 -2
  24. package/dist/ListInput/index.js +3 -3
  25. package/dist/PresenterView/index.js +2 -2
  26. package/dist/PrincipalPicker/index.js +4 -4
  27. package/dist/ProposalCard/index.js +4 -4
  28. package/dist/RecordChip/RecordChip.d.ts +46 -0
  29. package/dist/RecordChip/RecordChipList.d.ts +17 -0
  30. package/dist/RecordChip/index.d.ts +5 -0
  31. package/dist/RecordChip/index.js +6 -0
  32. package/dist/RecordChip-53J66RA6.css +184 -0
  33. package/dist/ResultTableCard/index.js +2 -2
  34. package/dist/RichEditor/index.js +1 -1
  35. package/dist/SelectionBar/index.js +2 -2
  36. package/dist/SheetColumnEditor/index.js +4 -4
  37. package/dist/SheetGrid/index.js +1 -1
  38. package/dist/SlideFilmstrip/index.js +1 -1
  39. package/dist/Switcher/index.js +3 -3
  40. package/dist/Table/Table.d.ts +29 -2
  41. package/dist/Table/index.js +1 -1
  42. package/dist/{Table-RUYMMWXT.css → Table-MN3FIA2O.css} +28 -0
  43. package/dist/TagsInput/index.js +2 -2
  44. package/dist/TimeRangePicker/index.js +3 -3
  45. package/dist/TimeWindowPicker/index.js +3 -3
  46. package/dist/ValueField/index.js +4 -4
  47. package/dist/{chunk-3EETQFAM.js → chunk-4HCYBQ6B.js} +1 -1
  48. package/dist/chunk-4KSCGXLJ.js +106 -0
  49. package/dist/{chunk-H32JW6CZ.js → chunk-52D5EFHL.js} +2 -2
  50. package/dist/chunk-75NQV4R4.js +72 -0
  51. package/dist/{chunk-J5WWMC35.js → chunk-AMYU5W2H.js} +2 -2
  52. package/dist/{chunk-KAA3GFTP.js → chunk-AWQQ5I34.js} +2 -2
  53. package/dist/chunk-BFM5G2Z6.js +60 -0
  54. package/dist/{chunk-3LP3VPLT.js → chunk-BW6MQO2B.js} +1 -1
  55. package/dist/{chunk-6C6YK75K.js → chunk-EKZFB34W.js} +1 -1
  56. package/dist/{chunk-LQWORB5B.js → chunk-F5QBQP63.js} +2 -2
  57. package/dist/{chunk-PBCNINMB.js → chunk-FFWMTIMH.js} +1 -1
  58. package/dist/{chunk-YGWIWDXE.js → chunk-FX7FDPCM.js} +1 -1
  59. package/dist/{chunk-4MVLED6E.js → chunk-H6S6NRZL.js} +1 -1
  60. package/dist/{chunk-BWFJB5JD.js → chunk-HGWHIUZ5.js} +1 -1
  61. package/dist/{chunk-ADSOY7UM.js → chunk-I7YQNRTQ.js} +1 -1
  62. package/dist/{chunk-MFQPGMJT.js → chunk-IXPC5D36.js} +1 -1
  63. package/dist/{chunk-7LSSYHOT.js → chunk-J7INWERB.js} +1 -1
  64. package/dist/{chunk-SO5SXSTP.js → chunk-JXJNX7QQ.js} +1 -1
  65. package/dist/{chunk-FURJVZCT.js → chunk-LEM3ZY35.js} +1 -1
  66. package/dist/{chunk-JVII5264.js → chunk-LQXYAB2Q.js} +1 -1
  67. package/dist/{chunk-5OFRDX66.js → chunk-NATDVYEY.js} +1 -1
  68. package/dist/{chunk-W5AXJWOW.js → chunk-O4NQVNO5.js} +1 -1
  69. package/dist/{chunk-ZUBFVK6B.js → chunk-OFARYSWS.js} +1 -1
  70. package/dist/{chunk-3EY5SEGH.js → chunk-OSMR6TSC.js} +1 -1
  71. package/dist/{chunk-NXNLAZPK.js → chunk-SPWBT7FE.js} +1 -1
  72. package/dist/{chunk-BWAUL5MB.js → chunk-YAL6VBRK.js} +2 -2
  73. package/dist/{chunk-TWJERLT3.js → chunk-YZSG3JIY.js} +1 -1
  74. package/dist/generated/index.d.ts +1 -0
  75. package/dist/generated/index.js +64 -63
  76. package/dist/index.js +64 -63
  77. package/dist/styles.css +250 -47
  78. package/package.json +3 -3
  79. package/dist/chunk-5DJMFRSZ.js +0 -58
  80. package/dist/chunk-VBA5FSWV.js +0 -87
  81. package/dist/{chunk-HEIOLITO.js → chunk-5VMAJAVF.js} +1 -1
  82. package/dist/{chunk-ABZC3NLM.js → chunk-ABGLGAFJ.js} +0 -0
  83. package/dist/{chunk-PLNJEDGI.js → chunk-I4IO56EY.js} +1 -1
  84. package/dist/{chunk-P64MIA7C.js → chunk-JKMBC4NB.js} +1 -1
  85. package/dist/{chunk-V6X3DJ2G.js → chunk-PRN5IP2R.js} +1 -1
  86. package/dist/{chunk-L4HHWG4V.js → chunk-V2EV56MY.js} +1 -1
  87. package/dist/{chunk-ETSF7SU6.js → chunk-ZMML6NRS.js} +1 -1
package/README.md CHANGED
@@ -47,7 +47,7 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
47
47
  | List screens | `DataView`, and its parts on their own: `DataViewToolbar`, `FilterAxisBar`, `FilterAxisChip`, `FilterPill`, plus the filter model (`filterDefsFromColumns`, `applyColumnFilters`, `filterPredicate`, `blankFilterValue`) |
48
48
  | Feedback and overlays | `Callout`, `ConflictNote`, `EditingStatus`, `Toaster`, `Modal` (with `variant="sheet"`), `ConfirmModal`, `CommandPalette`, `Tooltip`, `Popover`, `Announcer` |
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`, `BriefCard`, `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`, `RecordChip` and `RecordChipList` (a record named in a sentence, opening a peek, and the Also read line), `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,24 @@ 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.73.0
209
+
210
+ **`RecordChip`, a record named inside a sentence.** A button at the text's own size on its baseline, exactly one line of the text it sits in tall (`line-height: calc(1lh - 2px)` with its hairline, standing at the line's top so a key's mono text never moves the line), drawing the record's key in mono (`code`) or its name (`label`), with an optional kind glyph. It opens a **peek**: a `Popover` dialog named after the record (its key, then its name), with one line of context (`meta`), a body for its facts or rows (`children`) and a foot for the host's own link and downloads (`actions`). Focus moves into the peek; Escape, Tab out or a control that closes it returns focus to the chip, and a press outside closes it. A `code` chip's accessible name is the key and then the record's name ("GOP-11, Android 12 crash ..."); a `label` chip is named by its label alone, and carries its whole text as its `title`, so a pointer reader can read one cut at the line's end.
211
+
212
+ **`RecordChipList`, the Also read line.** A caption-register lead (`label`, "Also read") and its `RecordChip` children on a wrapping row; the row is a list named by the lead. It draws nothing when it holds no chip.
213
+
214
+ **`Table` sizes columns by their words.** `columns="content"` gives each column the room its words ask for rather than an equal share: a sentence wraps between words, a token longer than the table (a digest, a URL) wraps anywhere instead of pushing the table sideways, and `end` columns never wrap. With it, `nowrap` (by column index) holds a column of short tokens, such as a task's key, to one line. `nowrap` is offered only with `columns="content"`, by the type and at runtime: under the default even columns a held cell would run into the next one.
215
+
216
+ ## Changes in 0.72.0
217
+
218
+ **`BriefCard` says whether the reader has anything to do, once, and says the rest in fewer lines.** The head's Tag is the verdict, derived from the rows: "Nothing needs you" in the success tone, or "1 thing needs you", "2 things need you" in the tone of the loudest row (danger when any row is danger, otherwise warning). The body no longer repeats it as "Nothing needs you." under a "Needs you" label. One line says what the page is about (`about`, which wraps anywhere, so a URL, a branch or a hash stays inside the card). The rows are ranked and the first is the recommendation, with the primary button, marked "Do first" on the accent's softest ground when there are two or more rows to rank; the separate recommendation that used to repeat it is gone. A quiet `context` line under the rows holds a fact to know, and the follow-ups are a list named "Ask next". THE HOST RANKS AND CAPS: the card draws at most `BRIEF_CARD_MAX_NEEDS` (3) rows and `BRIEF_CARD_MAX_FOLLOW_UPS` (2) follow-ups, and outside production it warns in the console when handed more, because a row it drops is one the verdict does not count. To move:
219
+
220
+ - Rename `summary` to `about`: one line on what the page or record is about right now.
221
+ - Remove `recommended`, and put the step it named first in `needs`. `BriefCardRecommendation` and the `recommended` and `clear` labels are gone; `labels.first` ("Do first") is new, and `labels.needs` is now the list's accessible name rather than a visible heading.
222
+ - A row's `tone` is `warning` or `danger`. `neutral` is gone: a row is something to do, and a fact to know goes in the new `context` prop.
223
+ - Pass at most two `followUps`; a third is no longer drawn.
224
+ - The CSS classes `crewlet-brief-card__summary`, `__block`, `__label`, `__clear`, `__next` and `__arrow` are gone; `__about`, `__need--first`, `__first` and `__context` are new.
225
+
208
226
  ## Changes in 0.71.0
209
227
 
210
228
  **A toast that goes by itself stays as long as it takes to read.** An `info` or `success` toast with no `duration` used to go after a fixed four seconds, which fits a title and nothing longer: a thirty-word sentence went before its second line was read. It now stays two seconds plus 300 ms a word of its string `title` and `message`, never less than four seconds and never more than fifteen; a toast whose words are not strings stays four. Words are counted by the runtime's word segmentation (`Intl.Segmenter`), so Japanese or Chinese written without spaces is counted in its words rather than as one. A `warning`, a `danger` and a variant of your own that names no duration still stay until they are dismissed, and a `duration` you pass is still yours (`null` reads as unset, as `undefined` does). An update in place that changes a toast's words moves its end by the difference and keeps the time already shown; only a new `version` restarts the countdown. `readingDuration(text)` is the same rule, exported for a host that sizes something else to a toast's lifetime. Nothing to change unless a test advances a fake clock by four seconds past a long toast: advance it by `readingDuration` of that toast's words instead.
@@ -1,17 +1,16 @@
1
- export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-6C6YK75K.js';
1
+ export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-EKZFB34W.js';
2
2
  import '../chunk-4MJN2KN6.js';
3
3
  import '../chunk-WFCWPXJN.js';
4
- import '../chunk-5OFRDX66.js';
4
+ import '../chunk-NATDVYEY.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-ETSF7SU6.js';
9
+ import '../chunk-ZMML6NRS.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
- import '../chunk-2G355KDJ.js';
15
14
  import '../chunk-PIYJNCN7.js';
16
15
  import '../chunk-DGXZ635L.js';
17
16
  import '../chunk-OMV5W53A.js';
@@ -20,5 +19,6 @@ import '../chunk-XSPCITPN.js';
20
19
  import '../chunk-H5XTJ7GJ.js';
21
20
  import '../chunk-UAUP6XGK.js';
22
21
  import '../chunk-NUZHC6MM.js';
22
+ import '../chunk-2G355KDJ.js';
23
23
  import '../chunk-UT6CW3C7.js';
24
24
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,5 @@
1
- export { ArrangeFrame, useGridResize } from '../chunk-PLNJEDGI.js';
2
- import '../chunk-2G355KDJ.js';
1
+ export { ArrangeFrame, useGridResize } from '../chunk-I4IO56EY.js';
3
2
  import '../chunk-UAUP6XGK.js';
3
+ import '../chunk-2G355KDJ.js';
4
4
  import '../chunk-UT6CW3C7.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { ArrangeList, DEFAULT_ARRANGE_LABELS } from '../chunk-TWJERLT3.js';
1
+ export { ArrangeList, DEFAULT_ARRANGE_LABELS } from '../chunk-YZSG3JIY.js';
2
2
  import '../chunk-3XDT5ZWL.js';
3
3
  import '../chunk-MPVMB2DV.js';
4
- import '../chunk-PBCNINMB.js';
5
- import '../chunk-ETSF7SU6.js';
4
+ import '../chunk-FFWMTIMH.js';
5
+ import '../chunk-ZMML6NRS.js';
6
6
  import '../chunk-PGCLHYVP.js';
7
7
  import '../chunk-PQADV6P6.js';
8
- import '../chunk-2G355KDJ.js';
9
8
  import '../chunk-H5XTJ7GJ.js';
10
9
  import '../chunk-UAUP6XGK.js';
11
10
  import '../chunk-NUZHC6MM.js';
11
+ import '../chunk-2G355KDJ.js';
12
12
  import '../chunk-UT6CW3C7.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-3EETQFAM.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-4HCYBQ6B.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-PBCNINMB.js';
11
+ import '../chunk-FFWMTIMH.js';
12
12
  import '../chunk-DOY3KC6I.js';
13
13
  export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
14
- import '../chunk-ETSF7SU6.js';
14
+ import '../chunk-ZMML6NRS.js';
15
15
  import '../chunk-PGCLHYVP.js';
16
16
  import '../chunk-MLDTLZAO.js';
17
17
  import '../chunk-PQADV6P6.js';
18
- import '../chunk-2G355KDJ.js';
19
18
  import '../chunk-H5XTJ7GJ.js';
20
19
  import '../chunk-UAUP6XGK.js';
21
20
  import '../chunk-NUZHC6MM.js';
21
+ import '../chunk-2G355KDJ.js';
22
22
  import '../chunk-UT6CW3C7.js';
23
23
  import '../chunk-ODEQTPFM.js';
@@ -1,32 +1,33 @@
1
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. */
2
+ /**
3
+ * The most rows a brief draws: what waits on the reader is a short list or it
4
+ * is not a brief. The host ranks and caps; the card's own cut is a guard.
5
+ */
3
6
  export declare const BRIEF_CARD_MAX_NEEDS = 3;
4
- /** The one thing a row or the recommendation lets the reader do, in one press. */
7
+ /** The most follow-ups a brief draws: the next questions, not a menu. The host caps them. */
8
+ export declare const BRIEF_CARD_MAX_FOLLOW_UPS = 2;
9
+ /** The one thing a row lets the reader do, in one press. */
5
10
  export interface BriefCardAction {
6
11
  /** A verb and its object: "Answer", "Open GOP-11", "Ask why". */
7
12
  label: string;
8
13
  onSelect: () => void;
9
14
  }
10
15
  /**
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`.
16
+ * How loud a row is. Every row is something to act on, so `warning` is the
17
+ * default; `danger` is for a fact the host knows (an agent stopped, a failed
18
+ * turn, a task marked urgent), never for urgency a writer chose.
13
19
  */
14
- export type BriefCardNeedTone = 'danger' | 'warning' | 'neutral';
15
- /** One thing that waits on the reader, pointing at the record it is about. */
20
+ export type BriefCardNeedTone = 'danger' | 'warning';
21
+ /** One thing the reader has to do, pointing at the record it is about. */
16
22
  export interface BriefCardNeed {
17
23
  key: string;
18
- /** What waits, with its number and its name: "QA asks which store build to test on GOP-11". */
24
+ /** What to do, as an instruction naming its record: "Answer GOP-11: which build QA tests". */
19
25
  text: ReactNode;
20
- /** One fact under it: "Asked 2 hours ago". */
26
+ /** Why now, in one fact: "Asked 2 hours ago, blocks the beta". */
21
27
  detail?: ReactNode;
22
28
  tone?: BriefCardNeedTone | undefined;
23
29
  action?: BriefCardAction | undefined;
24
30
  }
25
- /** The one next step the brief recommends. */
26
- export interface BriefCardRecommendation {
27
- text: ReactNode;
28
- action?: BriefCardAction | undefined;
29
- }
30
31
  /** A question the reader can ask next, in the same conversation. */
31
32
  export interface BriefCardFollowUp {
32
33
  key: string;
@@ -36,45 +37,57 @@ export interface BriefCardFollowUp {
36
37
  export interface BriefCardLabels {
37
38
  /** The card's title. */
38
39
  heading: string;
40
+ /** The list's accessible name. */
39
41
  needs: string;
40
- /** Said in the needs block when nothing waits on the reader. */
41
- clear: string;
42
- recommended: string;
42
+ /** The mark on the first row, the one the brief recommends, where there are rows to rank. */
43
+ first: string;
43
44
  followUps: string;
44
- /** The head's Tag: how many rows wait on the reader. */
45
+ /** The verdict in the head while rows wait: "2 things need you". */
45
46
  count: (n: number) => string;
46
- /** The head's Tag when nothing waits. */
47
+ /** The verdict in the head when nothing waits. */
47
48
  allClear: string;
48
49
  }
49
50
  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". */
51
+ export interface BriefCardProps extends Omit<HTMLAttributes<HTMLElement>, 'title' | 'about'> {
52
+ /** What the brief covers, beside the title: "Inbox", "Decision GOP-11". */
52
53
  scope?: ReactNode;
53
54
  /** When the brief was written, as the reader reads a time: "Just now". */
54
55
  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`. */
56
+ /** What the page or record is about right now, in one line. */
57
+ about: ReactNode;
58
+ /**
59
+ * What the reader has to do, most pressing first, at most
60
+ * [BRIEF_CARD_MAX_NEEDS]. THE HOST RANKS AND CAPS: the first row is the
61
+ * recommendation, and a row past the cap is dropped with a warning outside
62
+ * production, since the verdict in the head counts only the rows drawn. An
63
+ * empty list is "Nothing needs you".
64
+ */
58
65
  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. */
66
+ /** One fact from elsewhere that bears on what to do, drawn quiet under the rows. */
67
+ context?: ReactNode;
68
+ /** Questions to ask next, at most [BRIEF_CARD_MAX_FOLLOW_UPS], drawn as suggestion rows at the foot. */
62
69
  followUps?: readonly BriefCardFollowUp[] | undefined;
63
70
  labels?: Partial<BriefCardLabels> | undefined;
64
71
  }
65
72
  /**
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.
73
+ * A brief, as the assistant's answer card: a verdict, one line on what the
74
+ * page is about, and the things the reader has to do (never more than three,
75
+ * ranked, each pointing at its record with the one press that deals with it).
76
+ *
77
+ * THE VERDICT IS SAID ONCE, IN THE HEAD, AND THE CARD DERIVES IT. The Tag
78
+ * counts the rows ("2 things need you") or says "Nothing needs you", so the
79
+ * card's region name answers "do I need to do anything" before the body is
80
+ * read, and no writer can put a verdict beside rows that contradict it.
81
+ *
82
+ * THE HEAD'S TONE IS THE LOUDEST ROW'S: danger when any row is danger,
83
+ * otherwise warning, and the success tone for "Nothing needs you".
70
84
  *
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.
85
+ * THE FIRST ROW IS THE RECOMMENDATION. Its press is the card's primary button,
86
+ * and where there are two or more rows to rank it is marked "Do first"; a
87
+ * separate recommendation would say the first row again.
75
88
  *
76
89
  * THE CARD DRAWS, THE HOST DECIDES. Every action is the host's own callback,
77
90
  * so where a row leads (a record opened, a question asked) is settled by the
78
91
  * code that built the brief, never by text inside it.
79
92
  */
80
- export declare function BriefCard({ scope, asOf, summary, needs, recommended, followUps, labels: overrides, className, ...rest }: BriefCardProps): import("react").JSX.Element;
93
+ export declare function BriefCard({ scope, asOf, about, needs, context, followUps, labels: overrides, className, ...rest }: BriefCardProps): import("react").JSX.Element;
@@ -1,3 +1,3 @@
1
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';
2
+ export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BriefCard } from './BriefCard.js';
3
+ export type { BriefCardAction, BriefCardFollowUp, BriefCardLabels, BriefCardNeed, BriefCardNeedTone, BriefCardProps, } from './BriefCard.js';
@@ -1,4 +1,4 @@
1
- export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_NEEDS, BriefCard } from '../chunk-VBA5FSWV.js';
1
+ export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BriefCard } from '../chunk-4KSCGXLJ.js';
2
2
  import '../chunk-Y7PVLEZJ.js';
3
3
  import '../chunk-NTQPJJAN.js';
4
4
  import '../chunk-I5OIKDX2.js';
@@ -1,7 +1,8 @@
1
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.
2
+ * A brief inside the product's status card: the verdict in the head, then one
3
+ * line on what the page is about, the ranked rows that wait on the reader, a
4
+ * quiet line of context and the questions to ask next. No block carries a
5
+ * label: the verdict already says what the rows are.
5
6
  */
6
7
  .crewlet-brief-card__where {
7
8
  display: inline-flex;
@@ -16,35 +17,19 @@
16
17
  .crewlet-brief-card__body {
17
18
  display: flex;
18
19
  flex-direction: column;
19
- gap: var(--spacing-4);
20
+ gap: var(--spacing-3);
20
21
  min-width: 0;
21
22
  }
22
23
 
23
- .crewlet-brief-card__summary {
24
+ .crewlet-brief-card__about {
24
25
  margin: 0;
26
+ overflow-wrap: anywhere;
25
27
  font-size: var(--font-size-md);
26
28
  font-weight: var(--font-weight-medium);
27
29
  line-height: var(--font-line-height-snug);
28
30
  text-wrap: pretty;
29
31
  }
30
32
 
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
33
  .crewlet-brief-card__needs {
49
34
  display: flex;
50
35
  flex-direction: column;
@@ -56,7 +41,8 @@
56
41
  /*
57
42
  * A ROW IS THE LIST ROW'S GRAMMAR: the dot on the first line, the words and
58
43
  * 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.
44
+ * down the dots and across to the presses. The first row, the one the brief
45
+ * recommends, stands on the accent's softest ground.
60
46
  */
61
47
  .crewlet-brief-card__need {
62
48
  display: grid;
@@ -70,6 +56,26 @@
70
56
  border-top: 1px solid var(--color-border-default);
71
57
  }
72
58
 
59
+ .crewlet-brief-card__need--first {
60
+ padding-inline: var(--spacing-3);
61
+ margin-inline: calc(-1 * var(--spacing-3));
62
+ border-radius: var(--radius-md);
63
+ background: var(--color-brand-accent-soft);
64
+ }
65
+
66
+ .crewlet-brief-card__need--first + .crewlet-brief-card__need {
67
+ border-top: 0;
68
+ }
69
+
70
+ .crewlet-brief-card__first {
71
+ font-size: var(--font-size-2xs);
72
+ font-weight: var(--font-weight-medium);
73
+ letter-spacing: var(--font-letter-spacing-wide);
74
+ text-transform: uppercase;
75
+ line-height: var(--font-line-height-snug);
76
+ color: var(--color-brand-accent-ink);
77
+ }
78
+
73
79
  .crewlet-brief-card__need > .crewlet-button {
74
80
  align-self: center;
75
81
  }
@@ -95,30 +101,12 @@
95
101
  color: var(--color-text-tertiary);
96
102
  }
97
103
 
98
- .crewlet-brief-card__clear {
99
- display: inline-flex;
100
- align-items: center;
101
- gap: var(--spacing-2);
104
+ .crewlet-brief-card__context {
102
105
  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);
106
+ font-size: var(--font-size-xs);
107
+ line-height: var(--font-line-height-snug);
108
+ color: var(--color-text-tertiary);
116
109
  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
110
  }
123
111
 
124
112
  /* The questions to ask next sit on the card's text edge: each row's own inset is pulled out. */
@@ -1,10 +1,10 @@
1
- export { Checkbox, CheckboxGroup } from '../chunk-PBCNINMB.js';
2
- import '../chunk-ETSF7SU6.js';
1
+ export { Checkbox, CheckboxGroup } from '../chunk-FFWMTIMH.js';
2
+ import '../chunk-ZMML6NRS.js';
3
3
  import '../chunk-PGCLHYVP.js';
4
4
  import '../chunk-PQADV6P6.js';
5
- import '../chunk-2G355KDJ.js';
6
5
  import '../chunk-H5XTJ7GJ.js';
7
6
  import '../chunk-UAUP6XGK.js';
8
7
  import '../chunk-NUZHC6MM.js';
8
+ import '../chunk-2G355KDJ.js';
9
9
  import '../chunk-UT6CW3C7.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -1,11 +1,11 @@
1
- export { ColorField } from '../chunk-7LSSYHOT.js';
1
+ export { ColorField } from '../chunk-J7INWERB.js';
2
2
  import '../chunk-7W3LYIOC.js';
3
- import '../chunk-ETSF7SU6.js';
3
+ import '../chunk-ZMML6NRS.js';
4
4
  import '../chunk-PGCLHYVP.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-2G355KDJ.js';
7
6
  import '../chunk-H5XTJ7GJ.js';
8
7
  import '../chunk-UAUP6XGK.js';
9
8
  import '../chunk-NUZHC6MM.js';
9
+ import '../chunk-2G355KDJ.js';
10
10
  import '../chunk-UT6CW3C7.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -1,12 +1,12 @@
1
- export { Combobox } from '../chunk-ZUBFVK6B.js';
1
+ export { Combobox } from '../chunk-OFARYSWS.js';
2
2
  import '../chunk-7KHM2FZH.js';
3
- import '../chunk-ETSF7SU6.js';
3
+ import '../chunk-ZMML6NRS.js';
4
4
  import '../chunk-PGCLHYVP.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-2G355KDJ.js';
7
6
  import '../chunk-2YTOOH3A.js';
8
7
  import '../chunk-H5XTJ7GJ.js';
9
8
  import '../chunk-UAUP6XGK.js';
10
9
  import '../chunk-NUZHC6MM.js';
10
+ import '../chunk-2G355KDJ.js';
11
11
  import '../chunk-UT6CW3C7.js';
12
12
  import '../chunk-ODEQTPFM.js';
@@ -1,12 +1,11 @@
1
- export { CommandPalette } from '../chunk-NXNLAZPK.js';
1
+ export { CommandPalette } from '../chunk-SPWBT7FE.js';
2
2
  import '../chunk-C667GCU7.js';
3
3
  import '../chunk-7KHM2FZH.js';
4
4
  import '../chunk-ANTAQAR4.js';
5
- import '../chunk-ETSF7SU6.js';
5
+ import '../chunk-ZMML6NRS.js';
6
6
  import '../chunk-PGCLHYVP.js';
7
7
  import '../chunk-MLDTLZAO.js';
8
8
  import '../chunk-PQADV6P6.js';
9
- import '../chunk-2G355KDJ.js';
10
9
  import '../chunk-DGXZ635L.js';
11
10
  import '../chunk-OMV5W53A.js';
12
11
  import '../chunk-2YTOOH3A.js';
@@ -14,5 +13,6 @@ import '../chunk-XSPCITPN.js';
14
13
  import '../chunk-H5XTJ7GJ.js';
15
14
  import '../chunk-UAUP6XGK.js';
16
15
  import '../chunk-NUZHC6MM.js';
16
+ import '../chunk-2G355KDJ.js';
17
17
  import '../chunk-UT6CW3C7.js';
18
18
  import '../chunk-ODEQTPFM.js';
@@ -1,22 +1,22 @@
1
- export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-YGWIWDXE.js';
1
+ export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-FX7FDPCM.js';
2
2
  import '../chunk-CI3VPIJN.js';
3
3
  import '../chunk-EJNJMHQG.js';
4
4
  import '../chunk-RE3FBGQQ.js';
5
5
  import '../chunk-BKP6XCAJ.js';
6
6
  import '../chunk-PZKHBB7D.js';
7
7
  import '../chunk-BXCL6P5Z.js';
8
- import '../chunk-5OFRDX66.js';
8
+ import '../chunk-NATDVYEY.js';
9
9
  import '../chunk-ANTAQAR4.js';
10
- import '../chunk-ETSF7SU6.js';
10
+ import '../chunk-ZMML6NRS.js';
11
11
  import '../chunk-PGCLHYVP.js';
12
12
  import '../chunk-MLDTLZAO.js';
13
13
  import '../chunk-PQADV6P6.js';
14
- import '../chunk-2G355KDJ.js';
15
14
  import '../chunk-DGXZ635L.js';
16
15
  import '../chunk-OMV5W53A.js';
17
16
  import '../chunk-XSPCITPN.js';
18
17
  import '../chunk-H5XTJ7GJ.js';
19
18
  import '../chunk-UAUP6XGK.js';
20
19
  import '../chunk-NUZHC6MM.js';
20
+ import '../chunk-2G355KDJ.js';
21
21
  import '../chunk-UT6CW3C7.js';
22
22
  import '../chunk-ODEQTPFM.js';
@@ -1,12 +1,12 @@
1
- export { COMPOSER_COUNTER_AT, Composer } from '../chunk-5OFRDX66.js';
1
+ export { COMPOSER_COUNTER_AT, Composer } from '../chunk-NATDVYEY.js';
2
2
  import '../chunk-ANTAQAR4.js';
3
- import '../chunk-ETSF7SU6.js';
3
+ import '../chunk-ZMML6NRS.js';
4
4
  import '../chunk-PGCLHYVP.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-2G355KDJ.js';
7
6
  import '../chunk-OMV5W53A.js';
8
7
  import '../chunk-H5XTJ7GJ.js';
9
8
  import '../chunk-UAUP6XGK.js';
10
9
  import '../chunk-NUZHC6MM.js';
10
+ import '../chunk-2G355KDJ.js';
11
11
  import '../chunk-UT6CW3C7.js';
12
12
  import '../chunk-ODEQTPFM.js';
@@ -1,11 +1,11 @@
1
- export { ConfirmField, confirmMatches } from '../chunk-JVII5264.js';
1
+ export { ConfirmField, confirmMatches } from '../chunk-LQXYAB2Q.js';
2
2
  import '../chunk-PLL7ZJHY.js';
3
- import '../chunk-ETSF7SU6.js';
3
+ import '../chunk-ZMML6NRS.js';
4
4
  import '../chunk-PGCLHYVP.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-2G355KDJ.js';
7
6
  import '../chunk-H5XTJ7GJ.js';
8
7
  import '../chunk-UAUP6XGK.js';
9
8
  import '../chunk-NUZHC6MM.js';
9
+ import '../chunk-2G355KDJ.js';
10
10
  import '../chunk-UT6CW3C7.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -1,15 +1,15 @@
1
- export { ChooserList, ColumnChooser, DATA_GRID_ICON_TRACK, DataGrid, columnChoicesOf, countDataGridRows, fitGridColumns, nextGridSort, parseGridSort, useAnyDataGridDriving, useDataGridDriving } from '../chunk-FURJVZCT.js';
2
- import '../chunk-PBCNINMB.js';
1
+ export { ChooserList, ColumnChooser, DATA_GRID_ICON_TRACK, DataGrid, columnChoicesOf, countDataGridRows, fitGridColumns, nextGridSort, parseGridSort, useAnyDataGridDriving, useDataGridDriving } from '../chunk-LEM3ZY35.js';
2
+ import '../chunk-FFWMTIMH.js';
3
3
  import '../chunk-PPUR46MK.js';
4
- import '../chunk-ETSF7SU6.js';
4
+ import '../chunk-ZMML6NRS.js';
5
5
  import '../chunk-PGCLHYVP.js';
6
6
  import '../chunk-PQADV6P6.js';
7
- import '../chunk-2G355KDJ.js';
8
7
  import '../chunk-RTPQDNW3.js';
9
8
  import '../chunk-DGXZ635L.js';
10
9
  import '../chunk-XSPCITPN.js';
11
10
  import '../chunk-H5XTJ7GJ.js';
12
11
  import '../chunk-UAUP6XGK.js';
13
12
  import '../chunk-NUZHC6MM.js';
13
+ import '../chunk-2G355KDJ.js';
14
14
  import '../chunk-UT6CW3C7.js';
15
15
  import '../chunk-ODEQTPFM.js';
@@ -1,14 +1,13 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-BWFJB5JD.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-HGWHIUZ5.js';
2
2
  import '../chunk-C667GCU7.js';
3
3
  import '../chunk-STJ7QBC3.js';
4
4
  import '../chunk-DTIW4CHZ.js';
5
5
  import '../chunk-RE3FBGQQ.js';
6
6
  import '../chunk-AV2DXAEL.js';
7
- import '../chunk-PBCNINMB.js';
8
- import '../chunk-ETSF7SU6.js';
7
+ import '../chunk-FFWMTIMH.js';
8
+ import '../chunk-ZMML6NRS.js';
9
9
  import '../chunk-PGCLHYVP.js';
10
10
  import '../chunk-PQADV6P6.js';
11
- import '../chunk-2G355KDJ.js';
12
11
  import '../chunk-OQG4P5KU.js';
13
12
  import '../chunk-DGXZ635L.js';
14
13
  import '../chunk-OMV5W53A.js';
@@ -16,5 +15,6 @@ import '../chunk-XSPCITPN.js';
16
15
  import '../chunk-H5XTJ7GJ.js';
17
16
  import '../chunk-UAUP6XGK.js';
18
17
  import '../chunk-NUZHC6MM.js';
18
+ import '../chunk-2G355KDJ.js';
19
19
  import '../chunk-UT6CW3C7.js';
20
20
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-J5WWMC35.js';
1
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-AMYU5W2H.js';
2
2
  import '../chunk-FPDIHEM4.js';
3
3
  import '../chunk-K4LZXSKZ.js';
4
- import '../chunk-BWFJB5JD.js';
4
+ import '../chunk-HGWHIUZ5.js';
5
5
  import '../chunk-HPI5J6AR.js';
6
6
  import '../chunk-C667GCU7.js';
7
7
  import '../chunk-STJ7QBC3.js';
@@ -13,13 +13,12 @@ import '../chunk-KHJIEPZV.js';
13
13
  import '../chunk-EJNJMHQG.js';
14
14
  import '../chunk-RE3FBGQQ.js';
15
15
  import '../chunk-AV2DXAEL.js';
16
- import '../chunk-PBCNINMB.js';
16
+ import '../chunk-FFWMTIMH.js';
17
17
  import '../chunk-ANTAQAR4.js';
18
- import '../chunk-ETSF7SU6.js';
18
+ import '../chunk-ZMML6NRS.js';
19
19
  import '../chunk-PGCLHYVP.js';
20
20
  import '../chunk-MLDTLZAO.js';
21
21
  import '../chunk-PQADV6P6.js';
22
- import '../chunk-2G355KDJ.js';
23
22
  import '../chunk-OQG4P5KU.js';
24
23
  import '../chunk-DGXZ635L.js';
25
24
  import '../chunk-OMV5W53A.js';
@@ -27,5 +26,6 @@ import '../chunk-XSPCITPN.js';
27
26
  import '../chunk-H5XTJ7GJ.js';
28
27
  import '../chunk-UAUP6XGK.js';
29
28
  import '../chunk-NUZHC6MM.js';
29
+ import '../chunk-2G355KDJ.js';
30
30
  import '../chunk-UT6CW3C7.js';
31
31
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-P64MIA7C.js';
1
+ export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-JKMBC4NB.js';
2
2
  import '../chunk-HJBHP66O.js';
3
- import '../chunk-ZWCK4N4L.js';
4
3
  import '../chunk-RQFRRPV6.js';
4
+ import '../chunk-ZWCK4N4L.js';
5
5
  import '../chunk-NTQPJJAN.js';
6
6
  import '../chunk-I5OIKDX2.js';
7
7
  import '../chunk-WIATRXEJ.js';
@@ -1,9 +1,8 @@
1
- export { DOC_TABS_EDITOR_LABELS, DocTabsEditor } from '../chunk-W5AXJWOW.js';
1
+ export { DOC_TABS_EDITOR_LABELS, DocTabsEditor } from '../chunk-O4NQVNO5.js';
2
2
  import '../chunk-MPVMB2DV.js';
3
- import '../chunk-ETSF7SU6.js';
3
+ import '../chunk-ZMML6NRS.js';
4
4
  import '../chunk-PGCLHYVP.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-2G355KDJ.js';
7
6
  import '../chunk-OQG4P5KU.js';
8
7
  import '../chunk-DGXZ635L.js';
9
8
  import '../chunk-OMV5W53A.js';
@@ -11,5 +10,6 @@ import '../chunk-XSPCITPN.js';
11
10
  import '../chunk-H5XTJ7GJ.js';
12
11
  import '../chunk-UAUP6XGK.js';
13
12
  import '../chunk-NUZHC6MM.js';
13
+ import '../chunk-2G355KDJ.js';
14
14
  import '../chunk-UT6CW3C7.js';
15
15
  import '../chunk-ODEQTPFM.js';