@crewlethq/ui 0.72.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.
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,14 @@ 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
+
208
216
  ## Changes in 0.72.0
209
217
 
210
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:
@@ -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';
@@ -0,0 +1,46 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface RecordChipProps {
3
+ /** The record's short key, set in mono: "GOP-11". */
4
+ code?: string | undefined;
5
+ /**
6
+ * What the chip says where the record has no key ("QA", "Decisions waiting
7
+ * on you"). With a key, the key is what the chip says.
8
+ */
9
+ label?: string | undefined;
10
+ /** The record's full name, at the head of the peek: "Android 12 crash when lesson audio starts". */
11
+ title: string;
12
+ /** The record's kind as a glyph, before the key. Decoration. */
13
+ glyph?: ReactNode;
14
+ /** What the peek holds under the name: a few facts, a short table. */
15
+ children?: ReactNode;
16
+ /** The peek's controls, at its foot: the way to the record, a download. */
17
+ actions?: ReactNode;
18
+ /** One line of context in the peek's head, under the name: "Task · In progress". */
19
+ meta?: ReactNode;
20
+ className?: string | undefined;
21
+ }
22
+ /**
23
+ * A record named inside a sentence, as a chip that opens a PEEK: its name, a
24
+ * few facts and the way to it, without leaving the sentence.
25
+ *
26
+ * WHY IT EXISTS. An answer that names GOP-11 and also draws a card for it says
27
+ * the same record twice, the card a long way under the sentence that needed
28
+ * it. The chip puts the record where the words already are, and costs the
29
+ * line no height: it is the text's own size, on its baseline, exactly one of
30
+ * the line's own lines tall, hairline included.
31
+ *
32
+ * WHAT IT MAY POINT AT. The host draws a chip only for a record it read and
33
+ * resolved itself; the words around it are prose, and a chip is never made
34
+ * from a key the prose merely spells.
35
+ *
36
+ * A BUTTON THAT OPENS A DIALOG. The peek is a named `Popover` dialog, so focus
37
+ * moves into it when it opens. Escape, Tab out of it, or a control inside it
38
+ * that closes it hands focus back to the chip; a press outside closes it and
39
+ * leaves focus where that press put it. A key chip's name is the key and the
40
+ * record's name after it, so a reader moving by control hears what it opens;
41
+ * a label chip's name is its label, which already names the record.
42
+ *
43
+ * A LONG LABEL IS CUT AT THE LINE'S END and carries its whole text as the
44
+ * chip's title, so a pointer reader can still read it.
45
+ */
46
+ export declare function RecordChip({ code, label, title, glyph, children, actions, meta, className }: RecordChipProps): import("react").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export interface RecordChipListProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
3
+ /** The line's lead, which also names the list: "Also read". */
4
+ label: string;
5
+ /** The records, each a `RecordChip`. */
6
+ children: ReactNode;
7
+ }
8
+ /**
9
+ * Records named on one quiet line under what they support, as chips: what an
10
+ * answer read but never named in its words ("Also read GOP-2 QA").
11
+ *
12
+ * A LIST NAMED BY ITS LEAD, so a screen reader hears "Also read, list, 3
13
+ * items" and then each chip, and the lead is drawn once rather than said
14
+ * again by every chip. The chips wrap onto further lines at a narrow width;
15
+ * the line is in the caption register, a step quieter than the text above it.
16
+ */
17
+ export declare function RecordChipList({ label, children, className, ...rest }: RecordChipListProps): import("react").JSX.Element | null;
@@ -0,0 +1,5 @@
1
+ import './RecordChip.css';
2
+ export { RecordChip } from './RecordChip.js';
3
+ export type { RecordChipProps } from './RecordChip.js';
4
+ export { RecordChipList } from './RecordChipList.js';
5
+ export type { RecordChipListProps } from './RecordChipList.js';
@@ -0,0 +1,6 @@
1
+ export { RecordChip, RecordChipList } from '../chunk-BFM5G2Z6.js';
2
+ import '../chunk-KHJIEPZV.js';
3
+ import '../chunk-OMV5W53A.js';
4
+ import '../chunk-H5XTJ7GJ.js';
5
+ import '../chunk-NUZHC6MM.js';
6
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,184 @@
1
+ /*
2
+ * A record inside a sentence. The text's own size on the text's own
3
+ * baseline, so a line holding one is no taller than a line without: a quiet
4
+ * hairline, the inset ground, and the key in mono.
5
+ */
6
+ .crewlet-record-chip {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: var(--spacing-1);
10
+ max-width: 100%;
11
+ margin: 0 1px;
12
+ padding: 0 var(--spacing-1);
13
+ border: 1px solid var(--color-border-default);
14
+ border-radius: var(--radius-xs);
15
+ background: var(--color-surface-inset);
16
+ color: var(--color-text-primary);
17
+ font: inherit;
18
+ font-weight: var(--font-weight-medium);
19
+ /*
20
+ * EXACTLY ONE OF THE LINE'S OWN LINES, hairline included: `1lh` is the
21
+ * line-height the chip inherits, and the two pixels are its top and bottom
22
+ * border. At the snug step a label chip stood 20.2px in a 19.5px line and
23
+ * moved every line it sat on by a pixel.
24
+ */
25
+ line-height: calc(1lh - 2px);
26
+ /*
27
+ * TOP, NOT BASELINE: a key chip's text is mono at the micro step under the
28
+ * parent's absolute leading, and on the baseline it sat about a pixel off
29
+ * its neighbours' and pushed its line to 20.5px. At the line's top it is
30
+ * the line's own height (19.5px in a 19.5px line) with the key within half
31
+ * a pixel of the surrounding baseline.
32
+ */
33
+ vertical-align: top;
34
+ cursor: pointer;
35
+ transition:
36
+ background var(--motion-duration-fast) var(--motion-easing-default),
37
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
38
+ }
39
+
40
+ .crewlet-record-chip:hover,
41
+ .crewlet-record-chip[data-open] {
42
+ border-color: var(--color-border-hover);
43
+ background: var(--color-surface-hover);
44
+ }
45
+
46
+ /* The chip draws its own hairline, so the ring lands on it rather than standing off it. */
47
+ .crewlet-record-chip:focus-visible {
48
+ outline: 2px solid var(--color-focus);
49
+ outline-offset: var(--size-focus-ring-inset-offset);
50
+ }
51
+
52
+ .crewlet-record-chip--code .crewlet-record-chip__text {
53
+ font-family: var(--font-family-mono);
54
+ font-size: var(--font-size-xs);
55
+ }
56
+
57
+ .crewlet-record-chip__text {
58
+ min-width: 0;
59
+ overflow: hidden;
60
+ text-overflow: ellipsis;
61
+ white-space: nowrap;
62
+ }
63
+
64
+ .crewlet-record-chip__glyph {
65
+ display: inline-flex;
66
+ flex: none;
67
+ color: var(--color-text-tertiary);
68
+ }
69
+
70
+ /* THE PEEK: a name, a few facts and the way to it, at the panel's own inset. */
71
+ .crewlet-popover.crewlet-record-chip__peek {
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: var(--spacing-2);
75
+ max-height: min(420px, 70vh);
76
+ padding: var(--spacing-3);
77
+ font-size: var(--font-size-compact);
78
+ color: var(--color-text-primary);
79
+ }
80
+
81
+ .crewlet-record-chip__head {
82
+ display: flex;
83
+ align-items: flex-start;
84
+ gap: var(--spacing-2);
85
+ }
86
+
87
+ .crewlet-record-chip__head-glyph {
88
+ display: inline-flex;
89
+ flex: none;
90
+ align-items: center;
91
+ height: 1lh;
92
+ color: var(--color-text-tertiary);
93
+ }
94
+
95
+ .crewlet-record-chip__head-words {
96
+ display: flex;
97
+ flex-direction: column;
98
+ gap: 2px;
99
+ min-width: 0;
100
+ }
101
+
102
+ .crewlet-record-chip__name {
103
+ margin: 0;
104
+ font-weight: var(--font-weight-medium);
105
+ line-height: var(--font-line-height-normal);
106
+ }
107
+
108
+ .crewlet-record-chip__name-code {
109
+ font-family: var(--font-family-mono);
110
+ font-size: var(--font-size-xs);
111
+ font-weight: var(--font-weight-regular);
112
+ color: var(--color-text-secondary);
113
+ }
114
+
115
+ .crewlet-record-chip__meta {
116
+ margin: 0;
117
+ font-size: var(--font-size-xs);
118
+ color: var(--color-text-tertiary);
119
+ }
120
+
121
+ .crewlet-record-chip__body {
122
+ display: flex;
123
+ flex-direction: column;
124
+ gap: var(--spacing-2);
125
+ min-width: 0;
126
+ }
127
+
128
+ /* Utilities start on the text edge, a ghost button's padding pulled into the gutter. */
129
+ .crewlet-record-chip__actions {
130
+ display: flex;
131
+ flex-wrap: wrap;
132
+ align-items: center;
133
+ gap: var(--spacing-1);
134
+ margin-inline-start: calc(-1 * (var(--spacing-2) + 1px));
135
+ }
136
+
137
+ @media (prefers-reduced-motion: reduce) {
138
+ .crewlet-record-chip {
139
+ transition: none;
140
+ }
141
+ }
142
+
143
+ /* THE ALSO READ LINE: a caption-register lead and the chips after it, wrapping. */
144
+ .crewlet-record-chip-list {
145
+ display: flex;
146
+ flex-wrap: wrap;
147
+ align-items: baseline;
148
+ gap: var(--spacing-1) var(--spacing-2);
149
+ min-width: 0;
150
+ font-size: var(--font-size-xs);
151
+ line-height: var(--font-line-height-normal);
152
+ color: var(--color-text-secondary);
153
+ }
154
+
155
+ .crewlet-record-chip-list__label {
156
+ flex: none;
157
+ }
158
+
159
+ /*
160
+ * THE LIST IS THE WRAPPING ROW. Not `display: contents`, which older WebKit
161
+ * and Chromium drop from the accessibility tree along with the list's name,
162
+ * so "Also read, list, 3 items" was never said.
163
+ */
164
+ .crewlet-record-chip-list__items {
165
+ display: flex;
166
+ flex: 1 1 auto;
167
+ flex-wrap: wrap;
168
+ align-items: baseline;
169
+ gap: var(--spacing-1) var(--spacing-2);
170
+ min-width: 0;
171
+ margin: 0;
172
+ padding: 0;
173
+ list-style: none;
174
+ }
175
+
176
+ .crewlet-record-chip-list__item {
177
+ display: inline-flex;
178
+ min-width: 0;
179
+ max-width: 100%;
180
+ }
181
+
182
+ .crewlet-record-chip-list .crewlet-record-chip {
183
+ margin: 0;
184
+ }
@@ -1,5 +1,5 @@
1
- export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-SO5SXSTP.js';
2
- import '../chunk-5DJMFRSZ.js';
1
+ export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-JXJNX7QQ.js';
2
+ import '../chunk-75NQV4R4.js';
3
3
  import '../chunk-EHFQMY3B.js';
4
4
  import '../chunk-YNRKVY7X.js';
5
5
  import '../chunk-DTIW4CHZ.js';
@@ -24,7 +24,7 @@ export interface TableActionButton {
24
24
  }
25
25
  /** Which edge a column's cells stand against: `start` for words, `end` for figures. */
26
26
  export type TableColumnAlign = 'start' | 'end';
27
- export interface TableProps {
27
+ interface TableBaseProps {
28
28
  headers: ReactNode[];
29
29
  /** One array per row, in the header's own order. Cells may be any node. */
30
30
  data: ReactNode[][];
@@ -69,4 +69,31 @@ export interface TableProps {
69
69
  maxHeight?: string;
70
70
  className?: string;
71
71
  }
72
- export declare const Table: ({ headers, data, caption, captionHidden, emptyMessage, actionButton, maxHeight, align, footer, framed, className, }: TableProps) => import("react").JSX.Element;
72
+ /**
73
+ * How the columns share the width. NOWRAP NEEDS COLUMNS SIZED BY THEIR WORDS:
74
+ * under the grid's equal columns a cell held to one line runs into the next
75
+ * one, so the type offers `nowrap` only with `columns="content"`, where the
76
+ * column grows to hold it.
77
+ */
78
+ type TableColumnsProps = {
79
+ /** `even` (the default): the grid's equal columns. */
80
+ columns?: 'even' | undefined;
81
+ nowrap?: undefined;
82
+ } | {
83
+ /**
84
+ * `content`: each column takes the room its words ask for, as a result
85
+ * read beside an answer wants. A sentence wraps between words, a token
86
+ * longer than the table wraps anywhere rather than push the table
87
+ * sideways, and the figures (`end` columns) never wrap.
88
+ */
89
+ columns: 'content';
90
+ /**
91
+ * Columns whose cells never wrap, by index: a short token such as a
92
+ * task's key ("GOP-11"), which a line would otherwise break at its
93
+ * hyphen.
94
+ */
95
+ nowrap?: readonly boolean[] | undefined;
96
+ };
97
+ export type TableProps = TableBaseProps & TableColumnsProps;
98
+ export declare const Table: ({ headers, data, caption, captionHidden, emptyMessage, actionButton, maxHeight, align, footer, framed, columns, nowrap, className, }: TableProps) => import("react").JSX.Element;
99
+ export {};
@@ -1,3 +1,3 @@
1
- export { Table } from '../chunk-5DJMFRSZ.js';
1
+ export { Table } from '../chunk-75NQV4R4.js';
2
2
  import '../chunk-UT6CW3C7.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -216,3 +216,31 @@
216
216
  transition: none;
217
217
  }
218
218
  }
219
+
220
+ /*
221
+ * COLUMNS SIZED BY THEIR WORDS (`columns="content"`), for a result read
222
+ * beside an answer. Each column takes the room its words ask for, so a short
223
+ * key keeps its line and the longest text takes the most and wraps between
224
+ * words. A token longer than the table (a digest, a URL) wraps ANYWHERE: with
225
+ * `break-word` it did not, because under an auto layout a word's whole width
226
+ * is the column's minimum, and a sha256 in a 350px table pushed it to 606px.
227
+ * `anywhere` lets the minimum shrink to a character. The figures (`end`
228
+ * columns) and the nowrap columns never wrap, and the figures stay tabular.
229
+ */
230
+ .crewlet-table--content .crewlet-table__table {
231
+ table-layout: auto;
232
+ font-variant-numeric: tabular-nums;
233
+ }
234
+
235
+ .crewlet-table--content td:not(.crewlet-table__cell--nowrap, .crewlet-table__cell--end) {
236
+ overflow-wrap: anywhere;
237
+ }
238
+
239
+ .crewlet-table--content .crewlet-table__cell--end {
240
+ white-space: nowrap;
241
+ }
242
+
243
+ /* A column of short tokens (a task's key) keeps each on one line; only content columns offer it. */
244
+ .crewlet-table--content .crewlet-table__cell--nowrap {
245
+ white-space: nowrap;
246
+ }
@@ -0,0 +1,72 @@
1
+ import { VisuallyHidden } from './chunk-UT6CW3C7.js';
2
+ import { cx } from './chunk-ODEQTPFM.js';
3
+ import './Table-MN3FIA2O.css';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var Table = ({
7
+ headers,
8
+ data,
9
+ caption,
10
+ captionHidden = false,
11
+ emptyMessage = "No data available",
12
+ actionButton,
13
+ maxHeight,
14
+ align,
15
+ footer,
16
+ framed = true,
17
+ columns = "even",
18
+ nowrap,
19
+ className = ""
20
+ }) => {
21
+ const columnCount = Math.max(1, headers.length);
22
+ const held = columns === "content" ? nowrap : void 0;
23
+ const edge = (index) => cx(align?.[index] === "end" && "crewlet-table__cell--end", held?.[index] === true && "crewlet-table__cell--nowrap") || void 0;
24
+ return /* @__PURE__ */ jsxs(
25
+ "div",
26
+ {
27
+ className: cx(
28
+ "crewlet-table",
29
+ !framed && "crewlet-table--flush",
30
+ columns === "content" && "crewlet-table--content",
31
+ className
32
+ ),
33
+ children: [
34
+ /* @__PURE__ */ jsx(
35
+ "div",
36
+ {
37
+ className: "crewlet-table__container",
38
+ style: (
39
+ // Only the height: the stylesheet scrolls both axes unconditionally,
40
+ // because with `overflow-x: auto` declared beside it a `visible`
41
+ // vertical axis was never reachable. See Table.css.
42
+ maxHeight ? { "--crewlet-table-max-height": maxHeight } : void 0
43
+ ),
44
+ children: /* @__PURE__ */ jsxs("table", { className: "crewlet-table__table", children: [
45
+ caption != null && (captionHidden ? /* @__PURE__ */ jsx("caption", { children: /* @__PURE__ */ jsx(VisuallyHidden, { children: caption }) }) : /* @__PURE__ */ jsx("caption", { className: "crewlet-table__caption", children: caption })),
46
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: "crewlet-table__header", children: headers.map((header, index) => (
47
+ // The index is the key because a header is a position: the
48
+ // columns of one table do not reorder between renders.
49
+ /* @__PURE__ */ jsx("th", { scope: "col", className: edge(index), children: header }, index)
50
+ )) }) }),
51
+ /* @__PURE__ */ jsx("tbody", { children: data && data.length > 0 ? data.map((row, rowIndex) => /* @__PURE__ */ jsx("tr", { className: "crewlet-table__row", children: row.map((cell, cellIndex) => /* @__PURE__ */ jsx("td", { className: edge(cellIndex), children: cell }, cellIndex)) }, rowIndex)) : /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { className: "crewlet-table__empty", colSpan: columnCount, children: emptyMessage }) }) }),
52
+ footer && footer.length > 0 ? /* @__PURE__ */ jsx("tfoot", { children: /* @__PURE__ */ jsx("tr", { className: "crewlet-table__footer", children: footer.map(
53
+ (cell, index) => index === 0 ? /* @__PURE__ */ jsx("th", { scope: "row", className: edge(index), children: cell }, index) : /* @__PURE__ */ jsx("td", { className: edge(index), children: cell }, index)
54
+ ) }) }) : null
55
+ ] })
56
+ }
57
+ ),
58
+ actionButton && /* @__PURE__ */ jsx(
59
+ "button",
60
+ {
61
+ type: "button",
62
+ className: "crewlet-table__action-btn",
63
+ onClick: actionButton.onClick,
64
+ children: /* @__PURE__ */ jsx("span", { className: "crewlet-table__action-text", children: actionButton.label })
65
+ }
66
+ )
67
+ ]
68
+ }
69
+ );
70
+ };
71
+
72
+ export { Table };
@@ -0,0 +1,60 @@
1
+ import { Popover } from './chunk-KHJIEPZV.js';
2
+ import { cx } from './chunk-ODEQTPFM.js';
3
+ import './RecordChip-53J66RA6.css';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+ import { useId, Children, isValidElement } from 'react';
6
+
7
+ function RecordChip({ code, label, title, glyph, children, actions, meta, className }) {
8
+ const said = code ?? label ?? title;
9
+ const hasBody = !(children === void 0 || children === null || children === false);
10
+ const hasActions = !(actions === void 0 || actions === null || actions === false);
11
+ return /* @__PURE__ */ jsxs(
12
+ Popover,
13
+ {
14
+ label: code ? `${code} ${title}` : title,
15
+ align: "start",
16
+ className: "crewlet-record-chip__peek",
17
+ trigger: (open, toggle) => /* @__PURE__ */ jsxs(
18
+ "button",
19
+ {
20
+ type: "button",
21
+ className: cx("crewlet-record-chip", code ? "crewlet-record-chip--code" : null, className),
22
+ "data-open": open || void 0,
23
+ "aria-label": code ? `${code}, ${title}` : void 0,
24
+ title: code ? void 0 : said,
25
+ onClick: toggle,
26
+ children: [
27
+ glyph === void 0 || glyph === null ? null : /* @__PURE__ */ jsx("span", { className: "crewlet-record-chip__glyph", "aria-hidden": "true", children: glyph }),
28
+ /* @__PURE__ */ jsx("span", { className: "crewlet-record-chip__text", children: said })
29
+ ]
30
+ }
31
+ ),
32
+ children: [
33
+ /* @__PURE__ */ jsxs("div", { className: "crewlet-record-chip__head", children: [
34
+ glyph === void 0 || glyph === null ? null : /* @__PURE__ */ jsx("span", { className: "crewlet-record-chip__head-glyph", "aria-hidden": "true", children: glyph }),
35
+ /* @__PURE__ */ jsxs("div", { className: "crewlet-record-chip__head-words", children: [
36
+ /* @__PURE__ */ jsxs("p", { className: "crewlet-record-chip__name", children: [
37
+ code ? /* @__PURE__ */ jsx("span", { className: "crewlet-record-chip__name-code", children: code }) : null,
38
+ code ? " " : null,
39
+ title
40
+ ] }),
41
+ meta === void 0 || meta === null ? null : /* @__PURE__ */ jsx("p", { className: "crewlet-record-chip__meta", children: meta })
42
+ ] })
43
+ ] }),
44
+ hasBody ? /* @__PURE__ */ jsx("div", { className: "crewlet-record-chip__body", children }) : null,
45
+ hasActions ? /* @__PURE__ */ jsx("div", { className: "crewlet-record-chip__actions", children: actions }) : null
46
+ ]
47
+ }
48
+ );
49
+ }
50
+ function RecordChipList({ label, children, className, ...rest }) {
51
+ const id = useId();
52
+ const items = Children.toArray(children).filter(isValidElement);
53
+ if (items.length === 0) return null;
54
+ return /* @__PURE__ */ jsxs("div", { ...rest, className: cx("crewlet-record-chip-list", className), children: [
55
+ /* @__PURE__ */ jsx("span", { id, className: "crewlet-record-chip-list__label", children: label }),
56
+ /* @__PURE__ */ jsx("ul", { role: "list", "aria-labelledby": id, className: "crewlet-record-chip-list__items", children: items.map((item, i) => /* @__PURE__ */ jsx("li", { className: "crewlet-record-chip-list__item", children: item }, item.key ?? i)) })
57
+ ] });
58
+ }
59
+
60
+ export { RecordChip, RecordChipList };
@@ -1,4 +1,4 @@
1
- import { Table } from './chunk-5DJMFRSZ.js';
1
+ import { Table } from './chunk-75NQV4R4.js';
2
2
  import { DownloadButton } from './chunk-EHFQMY3B.js';
3
3
  import { StatusCard } from './chunk-NTQPJJAN.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
@@ -157,6 +157,7 @@ export * from '../Prose/index.js';
157
157
  export * from '../QrCode/index.js';
158
158
  export * from '../ReadingPane/index.js';
159
159
  export * from '../ReceiptStrip/index.js';
160
+ export * from '../RecordChip/index.js';
160
161
  export * from '../RefusalCard/index.js';
161
162
  export * from '../RelatedRow/index.js';
162
163
  export * from '../RelativeTime/index.js';
@@ -1,26 +1,26 @@
1
- import '../chunk-ABZC3NLM.js';
1
+ import '../chunk-ABGLGAFJ.js';
2
+ export { StatCard } from '../chunk-G5IZGAWS.js';
2
3
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from '../chunk-FEJANUZK.js';
3
- export { TreeCanvas } from '../chunk-JQEXAH7G.js';
4
4
  export { TypeSpecimen } from '../chunk-JKAFEFFC.js';
5
5
  export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from '../chunk-YAL6VBRK.js';
6
6
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-EOXI3CRG.js';
7
7
  export { VersionTimeline } from '../chunk-O3HCFM3D.js';
8
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-AGLONIVV.js';
8
9
  export { WidgetFrame } from '../chunk-S5QJZOPL.js';
9
- export { TileGrid } from '../chunk-Q6CQMS6R.js';
10
10
  export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from '../chunk-H6S6NRZL.js';
11
11
  export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-I7YQNRTQ.js';
12
12
  export { ToastProvider, Toaster, readingDuration, toasterInsetStyle, useToast } from '../chunk-JIBWNHTC.js';
13
+ export { TreeCanvas } from '../chunk-JQEXAH7G.js';
13
14
  export { TagsInput } from '../chunk-5VMAJAVF.js';
14
15
  export { ThemeGallery } from '../chunk-LWFOX3PB.js';
15
16
  export { ThemeSwatch } from '../chunk-3XQUEF5C.js';
16
- export { ThemeToggle } from '../chunk-IPMJGK2Q.js';
17
- export { ThinkingIndicator } from '../chunk-M73MMEZY.js';
18
17
  export { DensitySwitcher, ThemeSwitcher } from '../chunk-VWMB3CJN.js';
18
+ export { ThemeToggle } from '../chunk-IPMJGK2Q.js';
19
19
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
20
+ export { ThinkingIndicator } from '../chunk-M73MMEZY.js';
21
+ export { TileGrid } from '../chunk-Q6CQMS6R.js';
20
22
  export { Switcher } from '../chunk-F5QBQP63.js';
21
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-AGLONIVV.js';
22
23
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from '../chunk-4TMBAOXK.js';
23
- export { StatCard } from '../chunk-G5IZGAWS.js';
24
24
  export { StatGroup } from '../chunk-OUD75UB2.js';
25
25
  export { Statement } from '../chunk-MZJKPTA5.js';
26
26
  export { matchesShortcut, useShortcut } from '../chunk-AYHIF6DH.js';
@@ -34,39 +34,39 @@ export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
34
34
  export { SetupWizard } from '../chunk-SBHAKX2T.js';
35
35
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-73SAOOR5.js';
36
36
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-AWQQ5I34.js';
37
+ export { Select } from '../chunk-VK45YJLH.js';
37
38
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-EN4UJQ63.js';
38
39
  export { TagGroup } from '../chunk-UEOEBOBR.js';
40
+ export { RichEditor, preloadRichEditor } from '../chunk-BW6MQO2B.js';
41
+ export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
39
42
  export { RUN_STATES, RunChip } from '../chunk-PIAGTZY3.js';
40
43
  export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from '../chunk-DGSK4LLS.js';
41
44
  export { SearchTrigger } from '../chunk-ERNT3UTB.js';
42
45
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from '../chunk-G4CGDUCP.js';
43
46
  export { NavGroup, NavItem, SidebarNav } from '../chunk-WCDPFTJZ.js';
44
47
  export { SegmentedMeter, segmentedMeterLabel } from '../chunk-4AK52VHB.js';
45
- export { Select } from '../chunk-VK45YJLH.js';
48
+ export { RecordChip, RecordChipList } from '../chunk-BFM5G2Z6.js';
46
49
  export { REFUSAL_CARD_LABELS, RefusalCard } from '../chunk-RQHN4J5P.js';
47
50
  export { RelatedRow } from '../chunk-CNEHFH2A.js';
48
51
  export { Text } from '../chunk-QP2P6GDQ.js';
49
- export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-SO5SXSTP.js';
50
- export { Table } from '../chunk-5DJMFRSZ.js';
52
+ export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-JXJNX7QQ.js';
53
+ export { Table } from '../chunk-75NQV4R4.js';
51
54
  export { ReviewList } from '../chunk-DO4J4TBZ.js';
52
- export { RichEditor, preloadRichEditor } from '../chunk-BW6MQO2B.js';
53
- export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
54
55
  export { canonicalMarkdown, roundTripMarkdown } from '../chunk-SWD4QBL6.js';
55
56
  import '../chunk-QH6VYJ3X.js';
56
- export { PropertyList } from '../chunk-HIWPPWNY.js';
57
57
  export { PrincipalPicker } from '../chunk-IXPC5D36.js';
58
+ export { PropertyList } from '../chunk-HIWPPWNY.js';
58
59
  export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, PROPOSAL_TONES, ProposalCard } from '../chunk-OSMR6TSC.js';
59
60
  export { Prose } from '../chunk-DVVP27OD.js';
60
61
  export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from '../chunk-Y56FM3K4.js';
61
62
  export { ReadingPane, ReadingPaneByline, ReadingPaneLead, ReadingPaneOutcome, ReadingPaneQuote, ReadingPaneReasoning, ReadingPaneSection, ReadingPaneTitle } from '../chunk-ZAJHGDAW.js';
63
+ export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-3WN5HUAK.js';
62
64
  export { PinTile } from '../chunk-LJ3KWQLP.js';
63
- export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from '../chunk-CDNZTCP2.js';
64
65
  export { PresenceStack } from '../chunk-EVXXY75R.js';
65
66
  export { PresenterView, formatStopwatch } from '../chunk-PRN5IP2R.js';
66
67
  export { SLIDE_NAV_LABELS, SlideNav } from '../chunk-5AJR6X75.js';
67
68
  export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from '../chunk-RMEBFYL7.js';
68
69
  export { PricingCard } from '../chunk-ZKIEOWR6.js';
69
- export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-G4QZWVAB.js';
70
70
  export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-RUBKDJAQ.js';
71
71
  export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-FWUX3F6Q.js';
72
72
  export { TreeGrid } from '../chunk-IL3XLDW7.js';
@@ -74,18 +74,19 @@ export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, lay
74
74
  export { OrgLabel } from '../chunk-ONQKKHON.js';
75
75
  export { Outline, scrollToHeading, useActiveHeading } from '../chunk-A5YKNRG6.js';
76
76
  export { PageNote } from '../chunk-CV4NES3P.js';
77
+ export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from '../chunk-CDNZTCP2.js';
77
78
  export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from '../chunk-SMZPUHBL.js';
78
79
  import '../chunk-CENOOTAV.js';
79
- export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-3WN5HUAK.js';
80
80
  export { MessageBubble } from '../chunk-KAQ2L74F.js';
81
81
  export { NewItemsNotice } from '../chunk-463DNZXI.js';
82
82
  export { FactLine, ObjectHeader, SetByLine } from '../chunk-S7WG53JB.js';
83
+ export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-G4QZWVAB.js';
83
84
  export { LIVE_CURSOR_HIDE_MS, LIVE_CURSOR_REST_MS, LiveCursor } from '../chunk-DPNVKWJX.js';
84
85
  export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from '../chunk-CQFQGAZI.js';
85
86
  export { LockedLabel } from '../chunk-TEV5REGB.js';
86
87
  export { MARKDOWN_CALLOUT_NAMES, MARKDOWN_CALLOUT_TONES, markdownBreaks, markdownClosesFence, markdownCodeText, markdownFenceOf, markdownHeadingOf, markdownInline, markdownLines, parseMarkdown, parseMarkdownSpans, safeHref } from '../chunk-BAKPMH3S.js';
87
- export { LogoSlot, LogoSlotGroup } from '../chunk-YUHKRRWO.js';
88
88
  export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-ERFXYGRF.js';
89
+ export { LogoSlot, LogoSlotGroup } from '../chunk-YUHKRRWO.js';
89
90
  export { LAYERS_LIST_LABELS, LayersList } from '../chunk-VUYNNILP.js';
90
91
  export { AutoGrid, Inline, Spacer, Stack } from '../chunk-ZAC7SKUN.js';
91
92
  export { Link } from '../chunk-QF5UNP4T.js';
@@ -95,8 +96,8 @@ export { ListDetail } from '../chunk-YBC2CYPD.js';
95
96
  export { ListInput, withDraft } from '../chunk-52D5EFHL.js';
96
97
  export { IconTile } from '../chunk-3LI4TRUR.js';
97
98
  export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from '../chunk-QPHD4UUG.js';
98
- export { IndicatorAnchor } from '../chunk-27MJPU7G.js';
99
99
  export { INLINE_EDITOR_LABELS, InlineEditor } from '../chunk-4DL2BQJE.js';
100
+ export { IndicatorAnchor } from '../chunk-27MJPU7G.js';
100
101
  export { FollowBanner } from '../chunk-JT7WRPZ6.js';
101
102
  export { DEFAULT_FRAME_THEME, EXTERNAL_URL_MAX, FRAME_BRIDGE, FRAME_MESSAGE, FRAME_ORIGIN_MODES, FRAME_SANDBOX_TOKENS, applyFrameTheme, checkFrameSandbox, externalUrl, frameFragment, frameOriginMatches, frameThemeMessage, httpOrigin, isFocusExit, isFrameNonce, negotiateBridge, parseFrameFragment, portTargetOrigin, readFrameHello, readFramePortMessage, readFrameTheme, readOpenLink } from '../chunk-F6V2PTN6.js';
102
103
  export { DENSITY_PREFERENCES, PALETTE_ID, THEME_PREFERENCES, applyDensity, applyPalette, applyTheme, isDensityPreference, isPaletteId, isThemePreference } from '../chunk-ZXXDZJQN.js';
@@ -105,23 +106,23 @@ export { Highlight, highlightRanges, highlightTerms } from '../chunk-H6VKCIWV.js
105
106
  import '../chunk-MICRGE3J.js';
106
107
  import '../chunk-FFMCMSJB.js';
107
108
  export { ImageUpload } from '../chunk-56IFLQGF.js';
108
- export { Eyebrow } from '../chunk-RK4XPHVG.js';
109
109
  export { FactList } from '../chunk-CSXJIIO4.js';
110
+ export { ErrorBoundary } from '../chunk-IJ7KLXUZ.js';
110
111
  export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from '../chunk-KQWJWTED.js';
111
112
  export { FileList } from '../chunk-5WRWBDML.js';
112
113
  export { FILTER_CHIP_ATTRIBUTE, FilterChip, FilterChipGroup } from '../chunk-IWZG7NPV.js';
113
- export { FindingList } from '../chunk-LSRQ2A6B.js';
114
114
  export { FolderTile, describeFolderContents, folderContentsParts } from '../chunk-WTXCK46H.js';
115
+ export { FindingList } from '../chunk-LSRQ2A6B.js';
115
116
  export { DownloadButton } from '../chunk-EHFQMY3B.js';
116
117
  export { downloadBlob, downloadText, safeFilename, useDownload } from '../chunk-YNRKVY7X.js';
117
118
  export { EditingStatus } from '../chunk-VLGGLLKH.js';
118
119
  export { EntityChip } from '../chunk-OSKJZNBT.js';
119
120
  export { EntityList } from '../chunk-7IW3P6FH.js';
120
- export { ErrorBoundary } from '../chunk-IJ7KLXUZ.js';
121
- export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-P64MIA7C.js';
121
+ export { Eyebrow } from '../chunk-RK4XPHVG.js';
122
+ export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-JKMBC4NB.js';
122
123
  export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from '../chunk-HJBHP66O.js';
123
- export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-ZWCK4N4L.js';
124
124
  export { DEFAULT_METER_THRESHOLDS, METER_STATES, Meter, meterState, meterStateTone, meterTone, progressTone } from '../chunk-RQFRRPV6.js';
125
+ export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-ZWCK4N4L.js';
125
126
  export { DescriptionList, DescriptionListItem } from '../chunk-MFS6F2P7.js';
126
127
  export { DIFF_SUMMARY_LABELS, DIFF_VIEW_LABELS, DiffSummary, DiffView, MAX_DIFF_LINES, collapseDiff, diffLines, diffStat, firstChangedLines, splitLines } from '../chunk-AOFVXE6V.js';
127
128
  export { DirectoryList } from '../chunk-SRDNGGZE.js';
@@ -163,16 +164,16 @@ export { ChangeMark } from '../chunk-Z2MZTI3H.js';
163
164
  export { LONGTEXT_MAX_DEFAULT, RATING_MAX_CEILING, RATING_MAX_DEFAULT, SHEET_COLUMN_BOUNDS, SHEET_COLUMN_TYPES, SHEET_COLUMN_WIDTHS, SHEET_FIT_SAMPLES, SHEET_LABELS, SHEET_ROW_HEIGHT, SHEET_ROW_NUMBER_WIDTH, SheetPendingEdits, TEXT_MAX_DEFAULT, URL_MAX, cellDescription, cellKey, cellSpeech, changeText, changeTime, checkValue, columnOffsets, columnWidth, compareValues, displayText, drawnColumns, editText, editorSide, findOption, findPerson, fitSamples, fittedWidth, flagText, hasPrevious, inRange, isEmptyValue, isMod, isMultiCell, isSheetColumnType, isTypingKey, liveOptions, moveFrom, nextSort, normalizeValue, optionHue, parseOptionList, parseTSV, parseText, planClear, planPaste, presenceByCell, presenceByColumn, presenceByRow, rangeOf, ratingMax, refusalText, retypeColumn, rowName, sameValue, scrollToRow, sheetLabels, sortRows, spokenText, statusTone, textMax, toTSV, visibleRows } from '../chunk-LFSIKGRQ.js';
164
165
  export { PRESENCE_ACTIVITIES, PRESENCE_HUES, PRESENCE_LABELS, assignPresenceHues, collapseSessions, joinNames, presenceLabels, presenceOrder } from '../chunk-Z7JYG5TF.js';
165
166
  import '../chunk-3L5NHASN.js';
166
- export { ActivityStrip, BarList, ChartEmpty, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Histogram, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, histogramTicks, niceScale, useChartHover } from '../chunk-YWVT7B6N.js';
167
167
  export { CHAT_THREAD_FOLLOW_WITHIN, CHAT_THREAD_LABELS, ChatThread } from '../chunk-R5OATXWU.js';
168
+ export { ActivityStrip, BarList, ChartEmpty, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Histogram, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, histogramTicks, niceScale, useChartHover } from '../chunk-YWVT7B6N.js';
168
169
  export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BriefCard } from '../chunk-4KSCGXLJ.js';
169
170
  export { SuggestionList, SuggestionRow } from '../chunk-Y7PVLEZJ.js';
170
171
  export { StatusCard } from '../chunk-NTQPJJAN.js';
171
172
  export { CalendarGrid, compareDays, daysInMonth, sameDay, shiftDay, shiftMonth, today } from '../chunk-EE3DJMSQ.js';
172
173
  export { Callout } from '../chunk-BPCY7ZID.js';
174
+ export { CanvasSchematic } from '../chunk-NBWNLYWZ.js';
173
175
  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';
174
176
  export { Note } from '../chunk-5SZGKSGL.js';
175
- export { CanvasSchematic } from '../chunk-NBWNLYWZ.js';
176
177
  export { CanvasToolbar, toolForKey } from '../chunk-KL6A7JGH.js';
177
178
  export { Toolbar, ToolbarOverflow, ToolbarWide } from '../chunk-NR4CPM4T.js';
178
179
  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';
@@ -191,8 +192,8 @@ import '../chunk-5SGHW42B.js';
191
192
  import '../chunk-7W3LYIOC.js';
192
193
  export { Breadcrumb } from '../chunk-M52HLPOG.js';
193
194
  export { KeyChip } from '../chunk-HBDA76EZ.js';
194
- export { ArtifactMakeRow } from '../chunk-37U3Z65B.js';
195
195
  export { ArtifactNameCell } from '../chunk-4MRFLHJC.js';
196
+ export { ArtifactMakeRow } from '../chunk-37U3Z65B.js';
196
197
  export { AsideLayout } from '../chunk-QOXLP5PE.js';
197
198
  export { ATTACHMENT_CHIP_LABELS, AttachmentChip } from '../chunk-3N36CYTU.js';
198
199
  export { Tag } from '../chunk-I5OIKDX2.js';
package/dist/index.js CHANGED
@@ -1,26 +1,26 @@
1
- import './chunk-ABZC3NLM.js';
1
+ import './chunk-ABGLGAFJ.js';
2
+ export { StatCard } from './chunk-G5IZGAWS.js';
2
3
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from './chunk-FEJANUZK.js';
3
- export { TreeCanvas } from './chunk-JQEXAH7G.js';
4
4
  export { TypeSpecimen } from './chunk-JKAFEFFC.js';
5
5
  export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from './chunk-YAL6VBRK.js';
6
6
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from './chunk-EOXI3CRG.js';
7
7
  export { VersionTimeline } from './chunk-O3HCFM3D.js';
8
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-AGLONIVV.js';
8
9
  export { WidgetFrame } from './chunk-S5QJZOPL.js';
9
- export { TileGrid } from './chunk-Q6CQMS6R.js';
10
10
  export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from './chunk-H6S6NRZL.js';
11
11
  export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from './chunk-I7YQNRTQ.js';
12
12
  export { ToastProvider, Toaster, readingDuration, toasterInsetStyle, useToast } from './chunk-JIBWNHTC.js';
13
+ export { TreeCanvas } from './chunk-JQEXAH7G.js';
13
14
  export { TagsInput } from './chunk-5VMAJAVF.js';
14
15
  export { ThemeGallery } from './chunk-LWFOX3PB.js';
15
16
  export { ThemeSwatch } from './chunk-3XQUEF5C.js';
16
- export { ThemeToggle } from './chunk-IPMJGK2Q.js';
17
- export { ThinkingIndicator } from './chunk-M73MMEZY.js';
18
17
  export { DensitySwitcher, ThemeSwitcher } from './chunk-VWMB3CJN.js';
18
+ export { ThemeToggle } from './chunk-IPMJGK2Q.js';
19
19
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from './chunk-Z24ZUSTX.js';
20
+ export { ThinkingIndicator } from './chunk-M73MMEZY.js';
21
+ export { TileGrid } from './chunk-Q6CQMS6R.js';
20
22
  export { Switcher } from './chunk-F5QBQP63.js';
21
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-AGLONIVV.js';
22
23
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from './chunk-4TMBAOXK.js';
23
- export { StatCard } from './chunk-G5IZGAWS.js';
24
24
  export { StatGroup } from './chunk-OUD75UB2.js';
25
25
  export { Statement } from './chunk-MZJKPTA5.js';
26
26
  export { matchesShortcut, useShortcut } from './chunk-AYHIF6DH.js';
@@ -34,39 +34,39 @@ export { SettingsTable, SettingsTableRow } from './chunk-4RKTZSEW.js';
34
34
  export { SetupWizard } from './chunk-SBHAKX2T.js';
35
35
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from './chunk-73SAOOR5.js';
36
36
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from './chunk-AWQQ5I34.js';
37
+ export { Select } from './chunk-VK45YJLH.js';
37
38
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from './chunk-EN4UJQ63.js';
38
39
  export { TagGroup } from './chunk-UEOEBOBR.js';
40
+ export { RichEditor, preloadRichEditor } from './chunk-BW6MQO2B.js';
41
+ export { RICH_EDITOR_LABELS, richEditorLabels } from './chunk-CSQTDGTS.js';
39
42
  export { RUN_STATES, RunChip } from './chunk-PIAGTZY3.js';
40
43
  export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from './chunk-DGSK4LLS.js';
41
44
  export { SearchTrigger } from './chunk-ERNT3UTB.js';
42
45
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from './chunk-G4CGDUCP.js';
43
46
  export { NavGroup, NavItem, SidebarNav } from './chunk-WCDPFTJZ.js';
44
47
  export { SegmentedMeter, segmentedMeterLabel } from './chunk-4AK52VHB.js';
45
- export { Select } from './chunk-VK45YJLH.js';
48
+ export { RecordChip, RecordChipList } from './chunk-BFM5G2Z6.js';
46
49
  export { REFUSAL_CARD_LABELS, RefusalCard } from './chunk-RQHN4J5P.js';
47
50
  export { RelatedRow } from './chunk-CNEHFH2A.js';
48
51
  export { Text } from './chunk-QP2P6GDQ.js';
49
- export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from './chunk-SO5SXSTP.js';
50
- export { Table } from './chunk-5DJMFRSZ.js';
52
+ export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from './chunk-JXJNX7QQ.js';
53
+ export { Table } from './chunk-75NQV4R4.js';
51
54
  export { ReviewList } from './chunk-DO4J4TBZ.js';
52
- export { RichEditor, preloadRichEditor } from './chunk-BW6MQO2B.js';
53
- export { RICH_EDITOR_LABELS, richEditorLabels } from './chunk-CSQTDGTS.js';
54
55
  export { canonicalMarkdown, roundTripMarkdown } from './chunk-SWD4QBL6.js';
55
56
  import './chunk-QH6VYJ3X.js';
56
- export { PropertyList } from './chunk-HIWPPWNY.js';
57
57
  export { PrincipalPicker } from './chunk-IXPC5D36.js';
58
+ export { PropertyList } from './chunk-HIWPPWNY.js';
58
59
  export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, PROPOSAL_TONES, ProposalCard } from './chunk-OSMR6TSC.js';
59
60
  export { Prose } from './chunk-DVVP27OD.js';
60
61
  export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from './chunk-Y56FM3K4.js';
61
62
  export { ReadingPane, ReadingPaneByline, ReadingPaneLead, ReadingPaneOutcome, ReadingPaneQuote, ReadingPaneReasoning, ReadingPaneSection, ReadingPaneTitle } from './chunk-ZAJHGDAW.js';
63
+ export { MERGE_CONFLICTS_LABELS, MergeConflicts } from './chunk-3WN5HUAK.js';
62
64
  export { PinTile } from './chunk-LJ3KWQLP.js';
63
- export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from './chunk-CDNZTCP2.js';
64
65
  export { PresenceStack } from './chunk-EVXXY75R.js';
65
66
  export { PresenterView, formatStopwatch } from './chunk-PRN5IP2R.js';
66
67
  export { SLIDE_NAV_LABELS, SlideNav } from './chunk-5AJR6X75.js';
67
68
  export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from './chunk-RMEBFYL7.js';
68
69
  export { PricingCard } from './chunk-ZKIEOWR6.js';
69
- export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from './chunk-G4QZWVAB.js';
70
70
  export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from './chunk-RUBKDJAQ.js';
71
71
  export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from './chunk-FWUX3F6Q.js';
72
72
  export { TreeGrid } from './chunk-IL3XLDW7.js';
@@ -74,18 +74,19 @@ export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, lay
74
74
  export { OrgLabel } from './chunk-ONQKKHON.js';
75
75
  export { Outline, scrollToHeading, useActiveHeading } from './chunk-A5YKNRG6.js';
76
76
  export { PageNote } from './chunk-CV4NES3P.js';
77
+ export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from './chunk-CDNZTCP2.js';
77
78
  export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from './chunk-SMZPUHBL.js';
78
79
  import './chunk-CENOOTAV.js';
79
- export { MERGE_CONFLICTS_LABELS, MergeConflicts } from './chunk-3WN5HUAK.js';
80
80
  export { MessageBubble } from './chunk-KAQ2L74F.js';
81
81
  export { NewItemsNotice } from './chunk-463DNZXI.js';
82
82
  export { FactLine, ObjectHeader, SetByLine } from './chunk-S7WG53JB.js';
83
+ export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from './chunk-G4QZWVAB.js';
83
84
  export { LIVE_CURSOR_HIDE_MS, LIVE_CURSOR_REST_MS, LiveCursor } from './chunk-DPNVKWJX.js';
84
85
  export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from './chunk-CQFQGAZI.js';
85
86
  export { LockedLabel } from './chunk-TEV5REGB.js';
86
87
  export { MARKDOWN_CALLOUT_NAMES, MARKDOWN_CALLOUT_TONES, markdownBreaks, markdownClosesFence, markdownCodeText, markdownFenceOf, markdownHeadingOf, markdownInline, markdownLines, parseMarkdown, parseMarkdownSpans, safeHref } from './chunk-BAKPMH3S.js';
87
- export { LogoSlot, LogoSlotGroup } from './chunk-YUHKRRWO.js';
88
88
  export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from './chunk-ERFXYGRF.js';
89
+ export { LogoSlot, LogoSlotGroup } from './chunk-YUHKRRWO.js';
89
90
  export { LAYERS_LIST_LABELS, LayersList } from './chunk-VUYNNILP.js';
90
91
  export { AutoGrid, Inline, Spacer, Stack } from './chunk-ZAC7SKUN.js';
91
92
  export { Link } from './chunk-QF5UNP4T.js';
@@ -95,8 +96,8 @@ export { ListDetail } from './chunk-YBC2CYPD.js';
95
96
  export { ListInput, withDraft } from './chunk-52D5EFHL.js';
96
97
  export { IconTile } from './chunk-3LI4TRUR.js';
97
98
  export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from './chunk-QPHD4UUG.js';
98
- export { IndicatorAnchor } from './chunk-27MJPU7G.js';
99
99
  export { INLINE_EDITOR_LABELS, InlineEditor } from './chunk-4DL2BQJE.js';
100
+ export { IndicatorAnchor } from './chunk-27MJPU7G.js';
100
101
  export { FollowBanner } from './chunk-JT7WRPZ6.js';
101
102
  export { DEFAULT_FRAME_THEME, EXTERNAL_URL_MAX, FRAME_BRIDGE, FRAME_MESSAGE, FRAME_ORIGIN_MODES, FRAME_SANDBOX_TOKENS, applyFrameTheme, checkFrameSandbox, externalUrl, frameFragment, frameOriginMatches, frameThemeMessage, httpOrigin, isFocusExit, isFrameNonce, negotiateBridge, parseFrameFragment, portTargetOrigin, readFrameHello, readFramePortMessage, readFrameTheme, readOpenLink } from './chunk-F6V2PTN6.js';
102
103
  export { DENSITY_PREFERENCES, PALETTE_ID, THEME_PREFERENCES, applyDensity, applyPalette, applyTheme, isDensityPreference, isPaletteId, isThemePreference } from './chunk-ZXXDZJQN.js';
@@ -105,23 +106,23 @@ export { Highlight, highlightRanges, highlightTerms } from './chunk-H6VKCIWV.js'
105
106
  import './chunk-MICRGE3J.js';
106
107
  import './chunk-FFMCMSJB.js';
107
108
  export { ImageUpload } from './chunk-56IFLQGF.js';
108
- export { Eyebrow } from './chunk-RK4XPHVG.js';
109
109
  export { FactList } from './chunk-CSXJIIO4.js';
110
+ export { ErrorBoundary } from './chunk-IJ7KLXUZ.js';
110
111
  export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from './chunk-KQWJWTED.js';
111
112
  export { FileList } from './chunk-5WRWBDML.js';
112
113
  export { FILTER_CHIP_ATTRIBUTE, FilterChip, FilterChipGroup } from './chunk-IWZG7NPV.js';
113
- export { FindingList } from './chunk-LSRQ2A6B.js';
114
114
  export { FolderTile, describeFolderContents, folderContentsParts } from './chunk-WTXCK46H.js';
115
+ export { FindingList } from './chunk-LSRQ2A6B.js';
115
116
  export { DownloadButton } from './chunk-EHFQMY3B.js';
116
117
  export { downloadBlob, downloadText, safeFilename, useDownload } from './chunk-YNRKVY7X.js';
117
118
  export { EditingStatus } from './chunk-VLGGLLKH.js';
118
119
  export { EntityChip } from './chunk-OSKJZNBT.js';
119
120
  export { EntityList } from './chunk-7IW3P6FH.js';
120
- export { ErrorBoundary } from './chunk-IJ7KLXUZ.js';
121
- export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from './chunk-P64MIA7C.js';
121
+ export { Eyebrow } from './chunk-RK4XPHVG.js';
122
+ export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from './chunk-JKMBC4NB.js';
122
123
  export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from './chunk-HJBHP66O.js';
123
- export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from './chunk-ZWCK4N4L.js';
124
124
  export { DEFAULT_METER_THRESHOLDS, METER_STATES, Meter, meterState, meterStateTone, meterTone, progressTone } from './chunk-RQFRRPV6.js';
125
+ export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from './chunk-ZWCK4N4L.js';
125
126
  export { DescriptionList, DescriptionListItem } from './chunk-MFS6F2P7.js';
126
127
  export { DIFF_SUMMARY_LABELS, DIFF_VIEW_LABELS, DiffSummary, DiffView, MAX_DIFF_LINES, collapseDiff, diffLines, diffStat, firstChangedLines, splitLines } from './chunk-AOFVXE6V.js';
127
128
  export { DirectoryList } from './chunk-SRDNGGZE.js';
@@ -163,16 +164,16 @@ export { ChangeMark } from './chunk-Z2MZTI3H.js';
163
164
  export { LONGTEXT_MAX_DEFAULT, RATING_MAX_CEILING, RATING_MAX_DEFAULT, SHEET_COLUMN_BOUNDS, SHEET_COLUMN_TYPES, SHEET_COLUMN_WIDTHS, SHEET_FIT_SAMPLES, SHEET_LABELS, SHEET_ROW_HEIGHT, SHEET_ROW_NUMBER_WIDTH, SheetPendingEdits, TEXT_MAX_DEFAULT, URL_MAX, cellDescription, cellKey, cellSpeech, changeText, changeTime, checkValue, columnOffsets, columnWidth, compareValues, displayText, drawnColumns, editText, editorSide, findOption, findPerson, fitSamples, fittedWidth, flagText, hasPrevious, inRange, isEmptyValue, isMod, isMultiCell, isSheetColumnType, isTypingKey, liveOptions, moveFrom, nextSort, normalizeValue, optionHue, parseOptionList, parseTSV, parseText, planClear, planPaste, presenceByCell, presenceByColumn, presenceByRow, rangeOf, ratingMax, refusalText, retypeColumn, rowName, sameValue, scrollToRow, sheetLabels, sortRows, spokenText, statusTone, textMax, toTSV, visibleRows } from './chunk-LFSIKGRQ.js';
164
165
  export { PRESENCE_ACTIVITIES, PRESENCE_HUES, PRESENCE_LABELS, assignPresenceHues, collapseSessions, joinNames, presenceLabels, presenceOrder } from './chunk-Z7JYG5TF.js';
165
166
  import './chunk-3L5NHASN.js';
166
- export { ActivityStrip, BarList, ChartEmpty, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Histogram, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, histogramTicks, niceScale, useChartHover } from './chunk-YWVT7B6N.js';
167
167
  export { CHAT_THREAD_FOLLOW_WITHIN, CHAT_THREAD_LABELS, ChatThread } from './chunk-R5OATXWU.js';
168
+ export { ActivityStrip, BarList, ChartEmpty, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Histogram, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, histogramTicks, niceScale, useChartHover } from './chunk-YWVT7B6N.js';
168
169
  export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BriefCard } from './chunk-4KSCGXLJ.js';
169
170
  export { SuggestionList, SuggestionRow } from './chunk-Y7PVLEZJ.js';
170
171
  export { StatusCard } from './chunk-NTQPJJAN.js';
171
172
  export { CalendarGrid, compareDays, daysInMonth, sameDay, shiftDay, shiftMonth, today } from './chunk-EE3DJMSQ.js';
172
173
  export { Callout } from './chunk-BPCY7ZID.js';
174
+ export { CanvasSchematic } from './chunk-NBWNLYWZ.js';
173
175
  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';
174
176
  export { Note } from './chunk-5SZGKSGL.js';
175
- export { CanvasSchematic } from './chunk-NBWNLYWZ.js';
176
177
  export { CanvasToolbar, toolForKey } from './chunk-KL6A7JGH.js';
177
178
  export { Toolbar, ToolbarOverflow, ToolbarWide } from './chunk-NR4CPM4T.js';
178
179
  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';
@@ -191,8 +192,8 @@ import './chunk-5SGHW42B.js';
191
192
  import './chunk-7W3LYIOC.js';
192
193
  export { Breadcrumb } from './chunk-M52HLPOG.js';
193
194
  export { KeyChip } from './chunk-HBDA76EZ.js';
194
- export { ArtifactMakeRow } from './chunk-37U3Z65B.js';
195
195
  export { ArtifactNameCell } from './chunk-4MRFLHJC.js';
196
+ export { ArtifactMakeRow } from './chunk-37U3Z65B.js';
196
197
  export { AsideLayout } from './chunk-QOXLP5PE.js';
197
198
  export { ATTACHMENT_CHIP_LABELS, AttachmentChip } from './chunk-3N36CYTU.js';
198
199
  export { Tag } from './chunk-I5OIKDX2.js';
package/dist/styles.css CHANGED
@@ -28040,6 +28040,193 @@ button.crewlet-presence-stack__member:focus-visible {
28040
28040
  }
28041
28041
 
28042
28042
 
28043
+ /* RecordChip-53J66RA6.css */
28044
+ /*
28045
+ * A record inside a sentence. The text's own size on the text's own
28046
+ * baseline, so a line holding one is no taller than a line without: a quiet
28047
+ * hairline, the inset ground, and the key in mono.
28048
+ */
28049
+ .crewlet-record-chip {
28050
+ display: inline-flex;
28051
+ align-items: center;
28052
+ gap: var(--spacing-1);
28053
+ max-width: 100%;
28054
+ margin: 0 1px;
28055
+ padding: 0 var(--spacing-1);
28056
+ border: 1px solid var(--color-border-default);
28057
+ border-radius: var(--radius-xs);
28058
+ background: var(--color-surface-inset);
28059
+ color: var(--color-text-primary);
28060
+ font: inherit;
28061
+ font-weight: var(--font-weight-medium);
28062
+ /*
28063
+ * EXACTLY ONE OF THE LINE'S OWN LINES, hairline included: `1lh` is the
28064
+ * line-height the chip inherits, and the two pixels are its top and bottom
28065
+ * border. At the snug step a label chip stood 20.2px in a 19.5px line and
28066
+ * moved every line it sat on by a pixel.
28067
+ */
28068
+ line-height: calc(1lh - 2px);
28069
+ /*
28070
+ * TOP, NOT BASELINE: a key chip's text is mono at the micro step under the
28071
+ * parent's absolute leading, and on the baseline it sat about a pixel off
28072
+ * its neighbours' and pushed its line to 20.5px. At the line's top it is
28073
+ * the line's own height (19.5px in a 19.5px line) with the key within half
28074
+ * a pixel of the surrounding baseline.
28075
+ */
28076
+ vertical-align: top;
28077
+ cursor: pointer;
28078
+ transition:
28079
+ background var(--motion-duration-fast) var(--motion-easing-default),
28080
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
28081
+ }
28082
+
28083
+ .crewlet-record-chip:hover,
28084
+ .crewlet-record-chip[data-open] {
28085
+ border-color: var(--color-border-hover);
28086
+ background: var(--color-surface-hover);
28087
+ }
28088
+
28089
+ /* The chip draws its own hairline, so the ring lands on it rather than standing off it. */
28090
+ .crewlet-record-chip:focus-visible {
28091
+ outline: 2px solid var(--color-focus);
28092
+ outline-offset: var(--size-focus-ring-inset-offset);
28093
+ }
28094
+
28095
+ .crewlet-record-chip--code .crewlet-record-chip__text {
28096
+ font-family: var(--font-family-mono);
28097
+ font-size: var(--font-size-xs);
28098
+ }
28099
+
28100
+ .crewlet-record-chip__text {
28101
+ min-width: 0;
28102
+ overflow: hidden;
28103
+ text-overflow: ellipsis;
28104
+ white-space: nowrap;
28105
+ }
28106
+
28107
+ .crewlet-record-chip__glyph {
28108
+ display: inline-flex;
28109
+ flex: none;
28110
+ color: var(--color-text-tertiary);
28111
+ }
28112
+
28113
+ /* THE PEEK: a name, a few facts and the way to it, at the panel's own inset. */
28114
+ .crewlet-popover.crewlet-record-chip__peek {
28115
+ display: flex;
28116
+ flex-direction: column;
28117
+ gap: var(--spacing-2);
28118
+ max-height: min(420px, 70vh);
28119
+ padding: var(--spacing-3);
28120
+ font-size: var(--font-size-compact);
28121
+ color: var(--color-text-primary);
28122
+ }
28123
+
28124
+ .crewlet-record-chip__head {
28125
+ display: flex;
28126
+ align-items: flex-start;
28127
+ gap: var(--spacing-2);
28128
+ }
28129
+
28130
+ .crewlet-record-chip__head-glyph {
28131
+ display: inline-flex;
28132
+ flex: none;
28133
+ align-items: center;
28134
+ height: 1lh;
28135
+ color: var(--color-text-tertiary);
28136
+ }
28137
+
28138
+ .crewlet-record-chip__head-words {
28139
+ display: flex;
28140
+ flex-direction: column;
28141
+ gap: 2px;
28142
+ min-width: 0;
28143
+ }
28144
+
28145
+ .crewlet-record-chip__name {
28146
+ margin: 0;
28147
+ font-weight: var(--font-weight-medium);
28148
+ line-height: var(--font-line-height-normal);
28149
+ }
28150
+
28151
+ .crewlet-record-chip__name-code {
28152
+ font-family: var(--font-family-mono);
28153
+ font-size: var(--font-size-xs);
28154
+ font-weight: var(--font-weight-regular);
28155
+ color: var(--color-text-secondary);
28156
+ }
28157
+
28158
+ .crewlet-record-chip__meta {
28159
+ margin: 0;
28160
+ font-size: var(--font-size-xs);
28161
+ color: var(--color-text-tertiary);
28162
+ }
28163
+
28164
+ .crewlet-record-chip__body {
28165
+ display: flex;
28166
+ flex-direction: column;
28167
+ gap: var(--spacing-2);
28168
+ min-width: 0;
28169
+ }
28170
+
28171
+ /* Utilities start on the text edge, a ghost button's padding pulled into the gutter. */
28172
+ .crewlet-record-chip__actions {
28173
+ display: flex;
28174
+ flex-wrap: wrap;
28175
+ align-items: center;
28176
+ gap: var(--spacing-1);
28177
+ margin-inline-start: calc(-1 * (var(--spacing-2) + 1px));
28178
+ }
28179
+
28180
+ @media (prefers-reduced-motion: reduce) {
28181
+ .crewlet-record-chip {
28182
+ transition: none;
28183
+ }
28184
+ }
28185
+
28186
+ /* THE ALSO READ LINE: a caption-register lead and the chips after it, wrapping. */
28187
+ .crewlet-record-chip-list {
28188
+ display: flex;
28189
+ flex-wrap: wrap;
28190
+ align-items: baseline;
28191
+ gap: var(--spacing-1) var(--spacing-2);
28192
+ min-width: 0;
28193
+ font-size: var(--font-size-xs);
28194
+ line-height: var(--font-line-height-normal);
28195
+ color: var(--color-text-secondary);
28196
+ }
28197
+
28198
+ .crewlet-record-chip-list__label {
28199
+ flex: none;
28200
+ }
28201
+
28202
+ /*
28203
+ * THE LIST IS THE WRAPPING ROW. Not `display: contents`, which older WebKit
28204
+ * and Chromium drop from the accessibility tree along with the list's name,
28205
+ * so "Also read, list, 3 items" was never said.
28206
+ */
28207
+ .crewlet-record-chip-list__items {
28208
+ display: flex;
28209
+ flex: 1 1 auto;
28210
+ flex-wrap: wrap;
28211
+ align-items: baseline;
28212
+ gap: var(--spacing-1) var(--spacing-2);
28213
+ min-width: 0;
28214
+ margin: 0;
28215
+ padding: 0;
28216
+ list-style: none;
28217
+ }
28218
+
28219
+ .crewlet-record-chip-list__item {
28220
+ display: inline-flex;
28221
+ min-width: 0;
28222
+ max-width: 100%;
28223
+ }
28224
+
28225
+ .crewlet-record-chip-list .crewlet-record-chip {
28226
+ margin: 0;
28227
+ }
28228
+
28229
+
28043
28230
  /* RefusalCard-UM67F5HB.css */
28044
28231
  /* The first sentence carries the weight; "Nothing changed." closes in the secondary ink. */
28045
28232
  .crewlet-refusal-card__heading {
@@ -36303,7 +36490,7 @@ b.crewlet-switcher__match {
36303
36490
  }
36304
36491
 
36305
36492
 
36306
- /* Table-RUYMMWXT.css */
36493
+ /* Table-MN3FIA2O.css */
36307
36494
  /*
36308
36495
  * Table: the operator's table, on the elements a table is made of.
36309
36496
  *
@@ -36523,6 +36710,34 @@ b.crewlet-switcher__match {
36523
36710
  }
36524
36711
  }
36525
36712
 
36713
+ /*
36714
+ * COLUMNS SIZED BY THEIR WORDS (`columns="content"`), for a result read
36715
+ * beside an answer. Each column takes the room its words ask for, so a short
36716
+ * key keeps its line and the longest text takes the most and wraps between
36717
+ * words. A token longer than the table (a digest, a URL) wraps ANYWHERE: with
36718
+ * `break-word` it did not, because under an auto layout a word's whole width
36719
+ * is the column's minimum, and a sha256 in a 350px table pushed it to 606px.
36720
+ * `anywhere` lets the minimum shrink to a character. The figures (`end`
36721
+ * columns) and the nowrap columns never wrap, and the figures stay tabular.
36722
+ */
36723
+ .crewlet-table--content .crewlet-table__table {
36724
+ table-layout: auto;
36725
+ font-variant-numeric: tabular-nums;
36726
+ }
36727
+
36728
+ .crewlet-table--content td:not(.crewlet-table__cell--nowrap, .crewlet-table__cell--end) {
36729
+ overflow-wrap: anywhere;
36730
+ }
36731
+
36732
+ .crewlet-table--content .crewlet-table__cell--end {
36733
+ white-space: nowrap;
36734
+ }
36735
+
36736
+ /* A column of short tokens (a task's key) keeps each on one line; only content columns offer it. */
36737
+ .crewlet-table--content .crewlet-table__cell--nowrap {
36738
+ white-space: nowrap;
36739
+ }
36740
+
36526
36741
 
36527
36742
  /* TableCells-TKSNLRK3.css */
36528
36743
  /* The read-only table cells. Each one holds a single line and shrinks inside
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.72.0",
3
+ "version": "0.73.0",
4
4
  "description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,8 +42,8 @@
42
42
  "clean": "rm -rf dist src/generated"
43
43
  },
44
44
  "dependencies": {
45
- "@crewlethq/icons": "0.72.0",
46
- "@crewlethq/tokens": "0.72.0",
45
+ "@crewlethq/icons": "0.73.0",
46
+ "@crewlethq/tokens": "0.73.0",
47
47
  "prosemirror-commands": "1.7.2",
48
48
  "prosemirror-gapcursor": "1.4.1",
49
49
  "prosemirror-history": "1.5.1",
@@ -1,58 +0,0 @@
1
- import { VisuallyHidden } from './chunk-UT6CW3C7.js';
2
- import { cx } from './chunk-ODEQTPFM.js';
3
- import './Table-RUYMMWXT.css';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
5
-
6
- var Table = ({
7
- headers,
8
- data,
9
- caption,
10
- captionHidden = false,
11
- emptyMessage = "No data available",
12
- actionButton,
13
- maxHeight,
14
- align,
15
- footer,
16
- framed = true,
17
- className = ""
18
- }) => {
19
- const columnCount = Math.max(1, headers.length);
20
- const edge = (index) => align?.[index] === "end" ? "crewlet-table__cell--end" : void 0;
21
- return /* @__PURE__ */ jsxs("div", { className: cx("crewlet-table", !framed && "crewlet-table--flush", className), children: [
22
- /* @__PURE__ */ jsx(
23
- "div",
24
- {
25
- className: "crewlet-table__container",
26
- style: (
27
- // Only the height: the stylesheet scrolls both axes unconditionally,
28
- // because with `overflow-x: auto` declared beside it a `visible`
29
- // vertical axis was never reachable. See Table.css.
30
- maxHeight ? { "--crewlet-table-max-height": maxHeight } : void 0
31
- ),
32
- children: /* @__PURE__ */ jsxs("table", { className: "crewlet-table__table", children: [
33
- caption != null && (captionHidden ? /* @__PURE__ */ jsx("caption", { children: /* @__PURE__ */ jsx(VisuallyHidden, { children: caption }) }) : /* @__PURE__ */ jsx("caption", { className: "crewlet-table__caption", children: caption })),
34
- /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: "crewlet-table__header", children: headers.map((header, index) => (
35
- // The index is the key because a header is a position: the
36
- // columns of one table do not reorder between renders.
37
- /* @__PURE__ */ jsx("th", { scope: "col", className: edge(index), children: header }, index)
38
- )) }) }),
39
- /* @__PURE__ */ jsx("tbody", { children: data && data.length > 0 ? data.map((row, rowIndex) => /* @__PURE__ */ jsx("tr", { className: "crewlet-table__row", children: row.map((cell, cellIndex) => /* @__PURE__ */ jsx("td", { className: edge(cellIndex), children: cell }, cellIndex)) }, rowIndex)) : /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { className: "crewlet-table__empty", colSpan: columnCount, children: emptyMessage }) }) }),
40
- footer && footer.length > 0 ? /* @__PURE__ */ jsx("tfoot", { children: /* @__PURE__ */ jsx("tr", { className: "crewlet-table__footer", children: footer.map(
41
- (cell, index) => index === 0 ? /* @__PURE__ */ jsx("th", { scope: "row", className: edge(index), children: cell }, index) : /* @__PURE__ */ jsx("td", { className: edge(index), children: cell }, index)
42
- ) }) }) : null
43
- ] })
44
- }
45
- ),
46
- actionButton && /* @__PURE__ */ jsx(
47
- "button",
48
- {
49
- type: "button",
50
- className: "crewlet-table__action-btn",
51
- onClick: actionButton.onClick,
52
- children: /* @__PURE__ */ jsx("span", { className: "crewlet-table__action-text", children: actionButton.label })
53
- }
54
- )
55
- ] });
56
- };
57
-
58
- export { Table };
File without changes
@@ -1,6 +1,6 @@
1
1
  import { StepList } from './chunk-HJBHP66O.js';
2
- import { ReceiptStrip } from './chunk-ZWCK4N4L.js';
3
2
  import { Meter } from './chunk-RQFRRPV6.js';
3
+ import { ReceiptStrip } from './chunk-ZWCK4N4L.js';
4
4
  import { StatusCard } from './chunk-NTQPJJAN.js';
5
5
  import { Disclosure } from './chunk-222VILSP.js';
6
6
  import { Spinner } from './chunk-XSPCITPN.js';