@crewlethq/ui 0.79.0 → 0.81.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 (45) hide show
  1. package/README.md +10 -0
  2. package/dist/ArtifactBar/index.js +3 -3
  3. package/dist/AvatarPicker/index.js +4 -4
  4. package/dist/ChangeList/ChangeList.d.ts +16 -1
  5. package/dist/ChangeList/index.d.ts +1 -1
  6. package/dist/ChangeList/index.js +1 -1
  7. package/dist/{ChangeList-MDFH5NPH.css → ChangeList-ITJMTVDF.css} +53 -0
  8. package/dist/DataTable/DataTable.d.ts +25 -1
  9. package/dist/DataTable/index.d.ts +1 -1
  10. package/dist/DataTable/index.js +1 -1
  11. package/dist/{DataTable-H43JSHOI.css → DataTable-GSLDFY5U.css} +38 -0
  12. package/dist/DataView/index.js +2 -2
  13. package/dist/HuePicker/index.js +3 -3
  14. package/dist/MarkdownEditor/index.js +3 -3
  15. package/dist/MergeConflicts/index.js +3 -3
  16. package/dist/ProposalCard/index.js +2 -2
  17. package/dist/RichEditor/index.js +1 -1
  18. package/dist/SegmentedControl/index.js +2 -2
  19. package/dist/SheetColumnEditor/index.js +4 -4
  20. package/dist/Tabs/Tabs.d.ts +5 -2
  21. package/dist/Tabs/index.js +1 -1
  22. package/dist/ThemeSwitcher/index.js +3 -3
  23. package/dist/TimeRangePicker/index.js +3 -3
  24. package/dist/VersionCompare/index.js +3 -3
  25. package/dist/{chunk-3G2BC4K5.js → chunk-2FMBZCFR.js} +1 -1
  26. package/dist/{chunk-W3VDHUJM.js → chunk-2IIHMJMZ.js} +5 -2
  27. package/dist/{chunk-NSCACX5Y.js → chunk-4WTLT66V.js} +1 -1
  28. package/dist/{chunk-BBD7PTBG.js → chunk-4XF7ENQA.js} +78 -27
  29. package/dist/{chunk-OZAMLQY7.js → chunk-6R334YT3.js} +1 -1
  30. package/dist/{chunk-MP7DGKB6.js → chunk-6X5PGHEX.js} +1 -1
  31. package/dist/{chunk-JNORDILD.js → chunk-7FF6CZW5.js} +2 -2
  32. package/dist/{chunk-DSMQTED5.js → chunk-BLGBD2D2.js} +1 -1
  33. package/dist/{chunk-INO2OXDB.js → chunk-BRWR3QIG.js} +27 -28
  34. package/dist/{chunk-HA3C53OU.js → chunk-EAIOXW2W.js} +1 -1
  35. package/dist/{chunk-ERB7UI3P.js → chunk-HEA6TERQ.js} +1 -1
  36. package/dist/{chunk-3EKXL76Z.js → chunk-LOWQK2PB.js} +1 -1
  37. package/dist/{chunk-Z4H3NF7U.js → chunk-O222F2IX.js} +1 -1
  38. package/dist/{chunk-JBA6ZDPV.js → chunk-SNIPM6K7.js} +1 -1
  39. package/dist/{chunk-QHQGJQV7.js → chunk-YB64PWIN.js} +1 -1
  40. package/dist/{chunk-YT5SWN4Q.js → chunk-Z6JKZI4E.js} +1 -1
  41. package/dist/generated/index.js +27 -27
  42. package/dist/index.js +27 -27
  43. package/dist/styles.css +93 -2
  44. package/package.json +3 -3
  45. package/dist/{Editor-BXOWAV46.js → Editor-IMYESOW7.js} +1 -1
package/README.md CHANGED
@@ -205,6 +205,16 @@ 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.81.0
209
+
210
+ **A `Tabs` dot marker sits beside the count.** A warning or an unsaved change is drawn as its 6px dot after the tab's count rather than in its place ("Agents 5" with a warning), since how many things are behind a tab and whether one needs the reader are two facts. A danger marker, which is a count of problems, still stands in for the tab's count, so two figures never sit side by side.
211
+
212
+ ## Changes in 0.80.0
213
+
214
+ **`DataTable` takes `columnSizing="content"`** (compact variant): each column as wide as what it holds, its header included, the cells' own insets apart, and the spare width given to the trailing spacer. For a short table in a wide pane (an agent, a switch, a level and a status), which the fit spread across the box until a row read as four separate facts. The browser's automatic table layout measures the columns, so no width is stated on a column the caller did not lock with `width`, the fit pass does not run, and no resize handle is drawn. Its cells stay on one line whatever Wrap lines says, since a column as wide as its content truncates nothing, while a panel or strip that spans the row wraps; a row wider than its box scrolls sideways. `fill`, the default, is the table as it was. The type is `DataTableColumnSizing`.
215
+
216
+ **`ChangeList` takes `layout="inline"`**: each row on one line, its label and then its values as chips ("Deployments: Read-only → Read and write"), the old value on an outline chip and the new one on the added tone. A pair is still said "Changed from X to Y" and an added or removed value says so, and a word diff or a block value keeps its own layout under its label. `grid`, the default, is unchanged. The type is `ChangeListLayout`.
217
+
208
218
  ## Changes in 0.78.0
209
219
 
210
220
  **`Tabs` take `actions`, controls at the row's far end in a tab list too.** A screen's own buttons ("Check now", "New") stand beside its tabs, in one bar with them, and never inside the tab list: the actions are the row's next sibling, so a screen reader meets a tab list of tabs alone and then the buttons, and the keyboard reaches the tabs (one stop, the arrows inside) and then each action. In router mode they stand outside the `nav` for the same reason. The actions keep their width at every size and the row gives way first: it takes the room left beside them, and scrolls (`overflow="scroll"`) or folds into "More" (`overflow="menu"`) inside that room, where the slider and the fold are measured. A pill or chip row keeps its width while it fits and scrolls inside the bar once it does not, so no tab paints under an action. An underline row's rule runs on under the actions to the bar's edge. With `actions`, `className` lands on the bar, the outermost element (`.crewlet-tabs-bar`, the actions in `.crewlet-tabs__actions`). Actions that arrive after the row is drawn, or go, never re-parent it: every row now sits in one wrapper element, `display: contents` while there are no actions, so the focused tab keeps focus and the slider and fold measure the live row. Without actions `className` stays on the row. `trailing` is unchanged: router mode only, inside the `nav`.
@@ -1,8 +1,8 @@
1
- export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-HA3C53OU.js';
1
+ export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-EAIOXW2W.js';
2
2
  import '../chunk-36WK24AI.js';
3
3
  import '../chunk-I33UIUZD.js';
4
- import '../chunk-OZAMLQY7.js';
5
- import '../chunk-W3VDHUJM.js';
4
+ import '../chunk-6R334YT3.js';
5
+ import '../chunk-2IIHMJMZ.js';
6
6
  import '../chunk-EGMQURBR.js';
7
7
  import '../chunk-AVL52EME.js';
8
8
  import '../chunk-CYQBDZ6M.js';
@@ -1,10 +1,10 @@
1
- export { AvatarPicker } from '../chunk-3EKXL76Z.js';
2
- import '../chunk-ERB7UI3P.js';
1
+ export { AvatarPicker } from '../chunk-LOWQK2PB.js';
2
+ import '../chunk-HEA6TERQ.js';
3
3
  import '../chunk-KHJIEPZV.js';
4
4
  import '../chunk-AYKXMIOR.js';
5
5
  import '../chunk-I22MUEG7.js';
6
- import '../chunk-OZAMLQY7.js';
7
- import '../chunk-W3VDHUJM.js';
6
+ import '../chunk-6R334YT3.js';
7
+ import '../chunk-2IIHMJMZ.js';
8
8
  import '../chunk-EGMQURBR.js';
9
9
  import '../chunk-CYQBDZ6M.js';
10
10
  import '../chunk-KTIQSSME.js';
@@ -78,8 +78,23 @@ export interface ChangeListLabels {
78
78
  showWhole: string;
79
79
  }
80
80
  export declare const CHANGE_LIST_LABELS: ChangeListLabels;
81
+ /**
82
+ * How the rows are laid out.
83
+ *
84
+ * - 'grid' the labels in one column and the values in the other, the
85
+ * values in DiffList's tints. The default: a record's fields.
86
+ * - 'inline' each row one line, its label and then its values as chips:
87
+ * "Deployments: [Read-only] → [Read and write]". For a short
88
+ * change read in passing, such as a level moved in a review.
89
+ */
90
+ export type ChangeListLayout = 'grid' | 'inline';
81
91
  export interface ChangeListProps {
82
92
  rows: readonly ChangeListRow[];
93
+ /**
94
+ * `inline` sets each row on one line with its values as chips. A word diff
95
+ * and a block value keep their own layout under their label in either.
96
+ */
97
+ layout?: ChangeListLayout | undefined;
83
98
  /** The eyebrow over the rows: "What will change", "What will be created", "What changed". */
84
99
  heading?: ReactNode;
85
100
  /**
@@ -134,5 +149,5 @@ declare function BlockValue({ row, labels }: {
134
149
  * values in the other, rows apart by the list's spacing rather than rules,
135
150
  * and no box of its own inside the card that holds it.
136
151
  */
137
- export declare function ChangeList({ rows, heading, settled, labels: overrides, diffLabels, className }: ChangeListProps): import("react").JSX.Element;
152
+ export declare function ChangeList({ rows, heading, layout, settled, labels: overrides, diffLabels, className, }: ChangeListProps): import("react").JSX.Element;
138
153
  export {};
@@ -1,3 +1,3 @@
1
1
  import './ChangeList.css';
2
2
  export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged } from './ChangeList.js';
3
- export type { ChangeListAddedRow, ChangeListChangedRow, ChangeListFactRow, ChangeListLabels, ChangeListProps, ChangeListRemovedRow, ChangeListRow, ChangeListTextRow, WordDiffPart, } from './ChangeList.js';
3
+ export type { ChangeListAddedRow, ChangeListChangedRow, ChangeListFactRow, ChangeListLabels, ChangeListLayout, ChangeListProps, ChangeListRemovedRow, ChangeListRow, ChangeListTextRow, WordDiffPart, } from './ChangeList.js';
@@ -1,4 +1,4 @@
1
- export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged } from '../chunk-BBD7PTBG.js';
1
+ export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged } from '../chunk-4XF7ENQA.js';
2
2
  import '../chunk-LR4IWUWQ.js';
3
3
  import '../chunk-VERJCAJ4.js';
4
4
  import '../chunk-CYQBDZ6M.js';
@@ -207,3 +207,56 @@
207
207
  .crewlet-change-list--settled .crewlet-change-list__value {
208
208
  color: var(--color-text-secondary);
209
209
  }
210
+
211
+ /*
212
+ * INLINE: one line a row, the label and then its values as chips. The rows
213
+ * stack; a row wraps as the pair does, the arrow staying with what it points
214
+ * at. A word diff and a block value keep their own layout under the label.
215
+ */
216
+ .crewlet-change-list--inline .crewlet-change-list__rows {
217
+ display: flex;
218
+ flex-direction: column;
219
+ gap: var(--spacing-1);
220
+ }
221
+
222
+ .crewlet-change-list--inline .crewlet-change-list__row {
223
+ display: flex;
224
+ flex-wrap: wrap;
225
+ align-items: center;
226
+ gap: var(--spacing-1) var(--spacing-2);
227
+ }
228
+
229
+ .crewlet-change-list--inline .crewlet-change-list__row--text,
230
+ .crewlet-change-list--inline .crewlet-change-list__row--block {
231
+ flex-direction: column;
232
+ align-items: stretch;
233
+ }
234
+
235
+ /* The label in the secondary ink at the row's own size, closed by a colon. */
236
+ .crewlet-change-list--inline .crewlet-change-list__label {
237
+ font-size: inherit;
238
+ color: var(--color-text-secondary);
239
+ }
240
+
241
+ .crewlet-change-list--inline .crewlet-change-list__row:not(.crewlet-change-list__row--text):not(.crewlet-change-list__row--block) > .crewlet-change-list__label::after {
242
+ content: ':';
243
+ }
244
+
245
+ .crewlet-change-list--inline .crewlet-change-list__pair {
246
+ align-items: center;
247
+ }
248
+
249
+ .crewlet-change-list--inline .crewlet-change-list__next {
250
+ align-items: center;
251
+ }
252
+
253
+ /* THE CHIP IS THE MARK, so the element around it draws none of its own. */
254
+ .crewlet-change-list__chip {
255
+ display: inline-flex;
256
+ text-decoration: none;
257
+ }
258
+
259
+ .crewlet-change-list--inline .crewlet-change-list__note {
260
+ flex-basis: 100%;
261
+ margin-top: 0;
262
+ }
@@ -190,6 +190,17 @@ export type DataTableItemsPerPage = number | typeof ALL_ITEMS;
190
190
  * its own resizable column widths.
191
191
  */
192
192
  export type DataTableDensity = 'compact' | 'comfortable';
193
+ /**
194
+ * How a compact table's columns share its width.
195
+ *
196
+ * - 'fill' every column grows in proportion until the row fills its
197
+ * box. The default: a list page, where the columns are the
198
+ * screen and a reader resizes them.
199
+ * - 'content' each column is as wide as what it holds, its header
200
+ * included, the cells' own insets apart, and the trailing
201
+ * spacer takes the rest.
202
+ */
203
+ export type DataTableColumnSizing = 'fill' | 'content';
193
204
  /**
194
205
  * Every string the table renders on its own behalf, in one prop.
195
206
  *
@@ -344,6 +355,19 @@ export interface DataTableProps<TRow = DataTableRow> {
344
355
  * render anywhere on the table.
345
356
  */
346
357
  resizable?: boolean;
358
+ /**
359
+ * How the columns share the table's width. Compact variant only.
360
+ *
361
+ * `content` IS FOR A SHORT TABLE IN A WIDE PANE: an agent, a switch, a
362
+ * level and a status, spread by the fit across a 900px box, sat so far
363
+ * apart that a row read as four facts about nothing in particular. Sized
364
+ * to content, the columns stand together and the spare width goes to the
365
+ * trailing spacer. Nothing resizes a column then, neither the fit nor a
366
+ * reader, so no resize handle is drawn; a column with a `width` keeps it,
367
+ * and a row wider than its box scrolls sideways as any table here does.
368
+ * `fill` (the default) is the table as it always was.
369
+ */
370
+ columnSizing?: DataTableColumnSizing;
347
371
  onRowAction?: ((row: TRow) => void) | null;
348
372
  actionLabel?: string;
349
373
  /** The action column's glyph. A component, not a name. */
@@ -637,4 +661,4 @@ export interface DataTableProps<TRow = DataTableRow> {
637
661
  /** Every string the table renders itself. Merged over the English defaults. */
638
662
  labels?: Partial<DataTableLabels>;
639
663
  }
640
- export declare const DataTable: <TRow>({ data, columns, storageKey, defaultColumnOrder, columnOrder: columnOrderProp, onColumnOrderChange, defaultItemsPerPage, itemsPerPage: itemsPerPageProp, onItemsPerPageChange, page: pageProp, onPageChange, pageCount, minColumnWidth, resizable, itemsPerPageOptions, onRowAction, actionLabel, actionIcon, getRowKey, rowKey, emptyMessage, endMessage, showActions, className, variant, density, maxBodyHeight, sort: sortProp, onSortChange, defaultSort, sortCycle, stableOrder, rowActions, archivedPredicate, archivedLabel, loading, skeletonRows, error, paginated, showSettings, onRowClick, getRowHref, rowTone, isSelected, renderAccessoryRow, renderToolbar, renderFilterBar, onClearFilters, filtersActive, clearFiltersLabel, filterKey, visibleColumns: visibleColumnsProp, onVisibleColumnsChange, renderExpandedRow, defaultExpandedKey, hasMore, onLoadMore, loadingMore, loadMoreLabel, title, ariaLabel, expandLabel, description, icon, defaultWrapLines, labels: labelOverrides, }: DataTableProps<TRow>) => React.JSX.Element;
664
+ export declare const DataTable: <TRow>({ data, columns, storageKey, defaultColumnOrder, columnOrder: columnOrderProp, onColumnOrderChange, defaultItemsPerPage, itemsPerPage: itemsPerPageProp, onItemsPerPageChange, page: pageProp, onPageChange, pageCount, minColumnWidth, resizable, columnSizing, itemsPerPageOptions, onRowAction, actionLabel, actionIcon, getRowKey, rowKey, emptyMessage, endMessage, showActions, className, variant, density, maxBodyHeight, sort: sortProp, onSortChange, defaultSort, sortCycle, stableOrder, rowActions, archivedPredicate, archivedLabel, loading, skeletonRows, error, paginated, showSettings, onRowClick, getRowHref, rowTone, isSelected, renderAccessoryRow, renderToolbar, renderFilterBar, onClearFilters, filtersActive, clearFiltersLabel, filterKey, visibleColumns: visibleColumnsProp, onVisibleColumnsChange, renderExpandedRow, defaultExpandedKey, hasMore, onLoadMore, loadingMore, loadMoreLabel, title, ariaLabel, expandLabel, description, icon, defaultWrapLines, labels: labelOverrides, }: DataTableProps<TRow>) => React.JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import './DataTable.css';
2
2
  export { DataTable, DATA_TABLE_LABELS, ALL_ITEMS } from './DataTable.js';
3
- export type { DataTableColumn, DataTableDensity, DataTableItemsPerPage, DataTableLabels, DataTableProps, DataTableRow, DataTableRowAction, DataTableRowTone, DataTableSortCycle, DataTableSortDirection, DataTableSortState, DataTableVariant, } from './DataTable.js';
3
+ export type { DataTableColumn, DataTableColumnSizing, DataTableDensity, DataTableItemsPerPage, DataTableLabels, DataTableProps, DataTableRow, DataTableRowAction, DataTableRowTone, DataTableSortCycle, DataTableSortDirection, DataTableSortState, DataTableVariant, } from './DataTable.js';
4
4
  export { CopyableCell } from './CopyableCell.js';
5
5
  export type { CopyableCellProps } from './CopyableCell.js';
6
6
  export { RowActionsMenu } from './RowActionsMenu.js';
@@ -1,4 +1,4 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-INO2OXDB.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-BRWR3QIG.js';
2
2
  import '../chunk-C667GCU7.js';
3
3
  import '../chunk-STJ7QBC3.js';
4
4
  import '../chunk-DTIW4CHZ.js';
@@ -797,6 +797,44 @@ body.crewlet-data-table-resizing {
797
797
  width: var(--spacing-6);
798
798
  }
799
799
 
800
+ /*
801
+ * A TABLE SIZED TO ITS CONTENT (`columnSizing="content"`) is laid out by the
802
+ * automatic algorithm, with no width stated on its columns. The spacer asks
803
+ * for the whole row, so every other column gives up all it can: down to its
804
+ * widest cell. What is left over is the spacer's.
805
+ *
806
+ * Its cells never wrap, Wrap lines or not. A cell that may break anywhere is
807
+ * a column the automatic layout squeezes to a few letters a line, which is
808
+ * what a name became the first time this was drawn; and with every column as
809
+ * wide as its content there is nothing to truncate, so the toggle has nothing
810
+ * to decide.
811
+ *
812
+ * After the gutter rule above and as specific, so a pinned column keeps its
813
+ * gutter as the spacer's floor while the spacer still takes the rest of the
814
+ * row. The panels that span the row wrap, as their content does at any width:
815
+ * kept on one line, a sentence in one would be measured as the narrowest the
816
+ * table may be.
817
+ */
818
+ .crewlet-data-table--compact .crewlet-data-table__table.crewlet-data-table__table--content {
819
+ table-layout: auto;
820
+ }
821
+
822
+ .crewlet-data-table--compact .crewlet-data-table__table.crewlet-data-table__table--content td:not(.crewlet-data-table__expanded-cell):not(.crewlet-data-table__accessory-cell) {
823
+ white-space: nowrap;
824
+ overflow-wrap: normal;
825
+ word-break: normal;
826
+ }
827
+
828
+ .crewlet-data-table--compact .crewlet-data-table__table.crewlet-data-table__table--content .crewlet-data-table__th--spacer,
829
+ .crewlet-data-table--compact .crewlet-data-table__table.crewlet-data-table__table--content .crewlet-data-table__td--spacer {
830
+ width: 100%;
831
+ }
832
+
833
+ .crewlet-data-table__table--content td.crewlet-data-table__expanded-cell,
834
+ .crewlet-data-table__table--content td.crewlet-data-table__accessory-cell {
835
+ white-space: normal;
836
+ }
837
+
800
838
  /*
801
839
  * Row actions column: pinned to the viewport's right edge with
802
840
  * position: sticky so the kebab affordance stays visible during
@@ -1,8 +1,8 @@
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-NSCACX5Y.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-4WTLT66V.js';
2
2
  import '../chunk-FPDIHEM4.js';
3
3
  import '../chunk-K4LZXSKZ.js';
4
4
  import '../chunk-HPI5J6AR.js';
5
- import '../chunk-INO2OXDB.js';
5
+ import '../chunk-BRWR3QIG.js';
6
6
  import '../chunk-C667GCU7.js';
7
7
  import '../chunk-7KHM2FZH.js';
8
8
  import '../chunk-STJ7QBC3.js';
@@ -1,8 +1,8 @@
1
1
  import '../chunk-FFMCMSJB.js';
2
- export { HuePicker, HueSwatch } from '../chunk-ERB7UI3P.js';
2
+ export { HuePicker, HueSwatch } from '../chunk-HEA6TERQ.js';
3
3
  import '../chunk-AYKXMIOR.js';
4
- import '../chunk-OZAMLQY7.js';
5
- import '../chunk-W3VDHUJM.js';
4
+ import '../chunk-6R334YT3.js';
5
+ import '../chunk-2IIHMJMZ.js';
6
6
  import '../chunk-EGMQURBR.js';
7
7
  import '../chunk-CYQBDZ6M.js';
8
8
  import '../chunk-MLDTLZAO.js';
@@ -1,8 +1,8 @@
1
- export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-JNORDILD.js';
1
+ export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-7FF6CZW5.js';
2
2
  import '../chunk-NR4CPM4T.js';
3
3
  import '../chunk-36WK24AI.js';
4
- import '../chunk-OZAMLQY7.js';
5
- import '../chunk-W3VDHUJM.js';
4
+ import '../chunk-6R334YT3.js';
5
+ import '../chunk-2IIHMJMZ.js';
6
6
  import '../chunk-EGMQURBR.js';
7
7
  import '../chunk-CYQBDZ6M.js';
8
8
  import '../chunk-MLDTLZAO.js';
@@ -1,7 +1,7 @@
1
- export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-3G2BC4K5.js';
1
+ export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-2FMBZCFR.js';
2
2
  import '../chunk-36WK24AI.js';
3
- import '../chunk-OZAMLQY7.js';
4
- import '../chunk-W3VDHUJM.js';
3
+ import '../chunk-6R334YT3.js';
4
+ import '../chunk-2IIHMJMZ.js';
5
5
  import '../chunk-EGMQURBR.js';
6
6
  import '../chunk-CYQBDZ6M.js';
7
7
  import '../chunk-MLDTLZAO.js';
@@ -1,6 +1,6 @@
1
- export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, PROPOSAL_TONES, ProposalCard } from '../chunk-DSMQTED5.js';
1
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, PROPOSAL_TONES, ProposalCard } from '../chunk-BLGBD2D2.js';
2
2
  import '../chunk-ZWCK4N4L.js';
3
- import '../chunk-BBD7PTBG.js';
3
+ import '../chunk-4XF7ENQA.js';
4
4
  import '../chunk-LR4IWUWQ.js';
5
5
  import '../chunk-RTMNULTL.js';
6
6
  import '../chunk-VERJCAJ4.js';
@@ -1,4 +1,4 @@
1
- export { RichEditor, preloadRichEditor } from '../chunk-MP7DGKB6.js';
1
+ export { RichEditor, preloadRichEditor } from '../chunk-6X5PGHEX.js';
2
2
  export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-2DMTW2Y3.js';
3
3
  import '../chunk-KOJPDCGQ.js';
4
4
  import '../chunk-KBZO4B33.js';
@@ -1,6 +1,6 @@
1
1
  import '../chunk-36WK24AI.js';
2
- export { SegmentedControl } from '../chunk-OZAMLQY7.js';
3
- import '../chunk-W3VDHUJM.js';
2
+ export { SegmentedControl } from '../chunk-6R334YT3.js';
3
+ import '../chunk-2IIHMJMZ.js';
4
4
  import '../chunk-EGMQURBR.js';
5
5
  import '../chunk-CYQBDZ6M.js';
6
6
  import '../chunk-MLDTLZAO.js';
@@ -1,13 +1,13 @@
1
- export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-Z4H3NF7U.js';
1
+ export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-O222F2IX.js';
2
2
  import '../chunk-VK45YJLH.js';
3
3
  import '../chunk-FFMCMSJB.js';
4
4
  import '../chunk-7KHM2FZH.js';
5
5
  import '../chunk-LFSIKGRQ.js';
6
6
  import '../chunk-Z7JYG5TF.js';
7
- import '../chunk-ERB7UI3P.js';
7
+ import '../chunk-HEA6TERQ.js';
8
8
  import '../chunk-AYKXMIOR.js';
9
- import '../chunk-OZAMLQY7.js';
10
- import '../chunk-W3VDHUJM.js';
9
+ import '../chunk-6R334YT3.js';
10
+ import '../chunk-2IIHMJMZ.js';
11
11
  import '../chunk-EGMQURBR.js';
12
12
  import '../chunk-CYQBDZ6M.js';
13
13
  import '../chunk-LMQG3VPG.js';
@@ -28,8 +28,11 @@ export interface TabsItem {
28
28
  count?: number | string | null;
29
29
  /**
30
30
  * What needs the reader behind this tab, drawn after the label: problems
31
- * as a danger count, a warning or an unsaved change as a 6px dot. It
32
- * replaces the count while it is set. `label` is what a screen reader hears.
31
+ * as a danger count, a warning or an unsaved change as a 6px dot. A danger
32
+ * count replaces the tab's count while it is set, since two figures side by
33
+ * side read as one; a dot sits after the count, since how many things are
34
+ * behind a tab and whether one needs the reader are two facts ("Agents 5"
35
+ * with a warning). `label` is what a screen reader hears.
33
36
  */
34
37
  marker?: TabsMarker | undefined;
35
38
  /**
@@ -1,4 +1,4 @@
1
- export { TabPanel, Tabs, tabId } from '../chunk-W3VDHUJM.js';
1
+ export { TabPanel, Tabs, tabId } from '../chunk-2IIHMJMZ.js';
2
2
  import '../chunk-EGMQURBR.js';
3
3
  import '../chunk-CYQBDZ6M.js';
4
4
  import '../chunk-MLDTLZAO.js';
@@ -1,9 +1,9 @@
1
- export { DensitySwitcher, ThemeSwitcher } from '../chunk-QHQGJQV7.js';
1
+ export { DensitySwitcher, ThemeSwitcher } from '../chunk-YB64PWIN.js';
2
2
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
3
3
  export { DENSITY_PREFERENCES, PALETTE_ID, THEME_PREFERENCES, applyDensity, applyPalette, applyTheme, isDensityPreference, isPaletteId, isThemePreference } from '../chunk-ZXXDZJQN.js';
4
4
  import '../chunk-36WK24AI.js';
5
- import '../chunk-OZAMLQY7.js';
6
- import '../chunk-W3VDHUJM.js';
5
+ import '../chunk-6R334YT3.js';
6
+ import '../chunk-2IIHMJMZ.js';
7
7
  import '../chunk-EGMQURBR.js';
8
8
  import '../chunk-CYQBDZ6M.js';
9
9
  import '../chunk-MLDTLZAO.js';
@@ -1,9 +1,9 @@
1
- export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from '../chunk-JBA6ZDPV.js';
1
+ export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from '../chunk-SNIPM6K7.js';
2
2
  import '../chunk-C667GCU7.js';
3
3
  import '../chunk-BPCY7ZID.js';
4
4
  import '../chunk-36WK24AI.js';
5
- import '../chunk-OZAMLQY7.js';
6
- import '../chunk-W3VDHUJM.js';
5
+ import '../chunk-6R334YT3.js';
6
+ import '../chunk-2IIHMJMZ.js';
7
7
  import '../chunk-EGMQURBR.js';
8
8
  import '../chunk-CYQBDZ6M.js';
9
9
  import '../chunk-FB3TCNQP.js';
@@ -1,8 +1,8 @@
1
- export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-YT5SWN4Q.js';
1
+ export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-Z6JKZI4E.js';
2
2
  import '../chunk-AOFVXE6V.js';
3
3
  import '../chunk-36WK24AI.js';
4
- import '../chunk-OZAMLQY7.js';
5
- import '../chunk-W3VDHUJM.js';
4
+ import '../chunk-6R334YT3.js';
5
+ import '../chunk-2IIHMJMZ.js';
6
6
  import '../chunk-EGMQURBR.js';
7
7
  import '../chunk-CYQBDZ6M.js';
8
8
  import '../chunk-PPUR46MK.js';
@@ -1,4 +1,4 @@
1
- import { SegmentedControl } from './chunk-OZAMLQY7.js';
1
+ import { SegmentedControl } from './chunk-6R334YT3.js';
2
2
  import { Button } from './chunk-DGXZ635L.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import './MergeConflicts-HCXPRQVR.css';
@@ -201,10 +201,13 @@ function Tabs({
201
201
  item.label,
202
202
  item.live ? /* @__PURE__ */ jsx(VisuallyHidden, { children: `, ${item.live}` }) : null
203
203
  ] }),
204
- item.marker ? item.marker.tone === "danger" ? /* @__PURE__ */ jsxs("span", { className: "crewlet-tabs__marker crewlet-tabs__marker--danger", children: [
204
+ item.marker?.tone === "danger" ? /* @__PURE__ */ jsxs("span", { className: "crewlet-tabs__marker crewlet-tabs__marker--danger", children: [
205
205
  /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: item.marker.count }),
206
206
  /* @__PURE__ */ jsx(VisuallyHidden, { children: item.marker.label })
207
- ] }) : /* @__PURE__ */ jsx("span", { className: `crewlet-tabs__marker crewlet-tabs__marker--${item.marker.tone}`, children: /* @__PURE__ */ jsx(VisuallyHidden, { children: item.marker.label }) }) : item.count != null && item.count !== "" ? /* @__PURE__ */ jsx(Count, { value: item.count }) : null
207
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
208
+ item.count != null && item.count !== "" ? /* @__PURE__ */ jsx(Count, { value: item.count }) : null,
209
+ item.marker ? /* @__PURE__ */ jsx("span", { className: `crewlet-tabs__marker crewlet-tabs__marker--${item.marker.tone}`, children: /* @__PURE__ */ jsx(VisuallyHidden, { children: item.marker.label }) }) : null
210
+ ] })
208
211
  ] });
209
212
  const onSelect = () => {
210
213
  if (item.disabled) return;
@@ -1,7 +1,7 @@
1
1
  import { PageHeader } from './chunk-FPDIHEM4.js';
2
2
  import { FilterPill } from './chunk-K4LZXSKZ.js';
3
3
  import { DateTimePicker } from './chunk-HPI5J6AR.js';
4
- import { DataTable } from './chunk-INO2OXDB.js';
4
+ import { DataTable } from './chunk-BRWR3QIG.js';
5
5
  import { useListbox, useOptionKeys } from './chunk-7KHM2FZH.js';
6
6
  import { Toolbar } from './chunk-NR4CPM4T.js';
7
7
  import { Popover } from './chunk-KHJIEPZV.js';
@@ -3,7 +3,7 @@ import { Tag } from './chunk-VERJCAJ4.js';
3
3
  import { Disclosure } from './chunk-222VILSP.js';
4
4
  import { VisuallyHidden } from './chunk-UT6CW3C7.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
- import './ChangeList-MDFH5NPH.css';
6
+ import './ChangeList-ITJMTVDF.css';
7
7
  import { useId } from 'react';
8
8
  import { ArrowRightGlyph } from '@crewlethq/icons/glyphs';
9
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -100,8 +100,40 @@ function BlockValue({ row, labels }) {
100
100
  ] });
101
101
  }
102
102
  }
103
- function Value({ row, labels }) {
103
+ function ChipValue({ row, labels }) {
104
+ switch (row.kind) {
105
+ case "fact":
106
+ return /* @__PURE__ */ jsx(Tag, { size: "sm", variant: "neutral", children: row.value });
107
+ case "changed":
108
+ return /* @__PURE__ */ jsxs("span", { className: "crewlet-change-list__pair", children: [
109
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: `${labels.changedFrom} ` }),
110
+ /* @__PURE__ */ jsx("del", { className: "crewlet-change-list__chip", children: /* @__PURE__ */ jsx(Tag, { size: "sm", variant: "neutral", appearance: "outline", children: row.from }) }),
111
+ /* @__PURE__ */ jsxs("span", { className: "crewlet-change-list__next", children: [
112
+ /* @__PURE__ */ jsx(ArrowRightGlyph, { size: "sm", className: "crewlet-change-list__arrow" }),
113
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: ` ${labels.to} ` }),
114
+ /* @__PURE__ */ jsx("ins", { className: "crewlet-change-list__chip", children: /* @__PURE__ */ jsx(Tag, { size: "sm", variant: "success", children: row.to }) })
115
+ ] })
116
+ ] });
117
+ case "added":
118
+ return /* @__PURE__ */ jsxs("span", { className: "crewlet-change-list__pair", children: [
119
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: `${labels.added} ` }),
120
+ /* @__PURE__ */ jsx("ins", { className: "crewlet-change-list__chip", children: /* @__PURE__ */ jsx(Tag, { size: "sm", variant: "success", children: row.to }) }),
121
+ row.isNew ? /* @__PURE__ */ jsx(Tag, { size: "xs", variant: "success", appearance: "outline", children: labels.isNew }) : null
122
+ ] });
123
+ case "removed":
124
+ return /* @__PURE__ */ jsxs("span", { className: "crewlet-change-list__pair", children: [
125
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: `${labels.removed} ` }),
126
+ /* @__PURE__ */ jsx("del", { className: "crewlet-change-list__chip", children: /* @__PURE__ */ jsx(Tag, { size: "sm", variant: "danger", appearance: "outline", children: row.from }) })
127
+ ] });
128
+ }
129
+ }
130
+ function Value({
131
+ row,
132
+ labels,
133
+ inline
134
+ }) {
104
135
  if (row.block) return /* @__PURE__ */ jsx(BlockValue, { row, labels });
136
+ if (inline) return /* @__PURE__ */ jsx(ChipValue, { row, labels });
105
137
  switch (row.kind) {
106
138
  case "fact":
107
139
  return /* @__PURE__ */ jsx("span", { className: "crewlet-change-list__fact", children: row.value });
@@ -130,33 +162,52 @@ function Value({ row, labels }) {
130
162
  ] });
131
163
  }
132
164
  }
133
- function ChangeList({ rows, heading, settled = false, labels: overrides, diffLabels, className }) {
165
+ function ChangeList({
166
+ rows,
167
+ heading,
168
+ layout = "grid",
169
+ settled = false,
170
+ labels: overrides,
171
+ diffLabels,
172
+ className
173
+ }) {
134
174
  const labels = overrides ? { ...CHANGE_LIST_LABELS, ...overrides } : CHANGE_LIST_LABELS;
135
175
  const headingId = useId();
136
- return /* @__PURE__ */ jsxs("div", { className: cx("crewlet-change-list", settled && "crewlet-change-list--settled", className), children: [
137
- heading === void 0 || heading === null ? null : /* @__PURE__ */ jsx("div", { id: headingId, className: "crewlet-change-list__heading", children: heading }),
138
- /* @__PURE__ */ jsx("dl", { className: "crewlet-change-list__rows", "aria-labelledby": heading === void 0 || heading === null ? void 0 : headingId, children: rows.map((row, index) => /* @__PURE__ */ jsxs(
139
- "div",
140
- {
141
- className: cx(
142
- "crewlet-change-list__row",
143
- `crewlet-change-list__row--${row.kind}`,
144
- row.kind !== "text" && row.block && "crewlet-change-list__row--block"
145
- ),
146
- children: [
147
- /* @__PURE__ */ jsx("dt", { className: "crewlet-change-list__label", children: row.label }),
148
- /* @__PURE__ */ jsxs("dd", { className: "crewlet-change-list__value", children: [
149
- row.kind === "text" ? /* @__PURE__ */ jsxs(Fragment, { children: [
150
- /* @__PURE__ */ jsx(WordDiff, { row, labels }),
151
- row.whole && row.whole.length > 0 ? /* @__PURE__ */ jsx(Disclosure, { title: labels.showWhole, headingLevel: "none", size: "compact", className: "crewlet-change-list__whole", children: /* @__PURE__ */ jsx(DiffList, { rows: [...row.whole], layout: "auto", labels: diffLabels }) }) : null
152
- ] }) : /* @__PURE__ */ jsx(Value, { row, labels }),
153
- row.note === void 0 || row.note === null ? null : /* @__PURE__ */ jsx("span", { className: "crewlet-change-list__note", children: row.note })
154
- ] })
155
- ]
156
- },
157
- `${index}:${row.label}`
158
- )) })
159
- ] });
176
+ return /* @__PURE__ */ jsxs(
177
+ "div",
178
+ {
179
+ className: cx(
180
+ "crewlet-change-list",
181
+ layout === "inline" && "crewlet-change-list--inline",
182
+ settled && "crewlet-change-list--settled",
183
+ className
184
+ ),
185
+ children: [
186
+ heading === void 0 || heading === null ? null : /* @__PURE__ */ jsx("div", { id: headingId, className: "crewlet-change-list__heading", children: heading }),
187
+ /* @__PURE__ */ jsx("dl", { className: "crewlet-change-list__rows", "aria-labelledby": heading === void 0 || heading === null ? void 0 : headingId, children: rows.map((row, index) => /* @__PURE__ */ jsxs(
188
+ "div",
189
+ {
190
+ className: cx(
191
+ "crewlet-change-list__row",
192
+ `crewlet-change-list__row--${row.kind}`,
193
+ row.kind !== "text" && row.block && "crewlet-change-list__row--block"
194
+ ),
195
+ children: [
196
+ /* @__PURE__ */ jsx("dt", { className: "crewlet-change-list__label", children: row.label }),
197
+ /* @__PURE__ */ jsxs("dd", { className: "crewlet-change-list__value", children: [
198
+ row.kind === "text" ? /* @__PURE__ */ jsxs(Fragment, { children: [
199
+ /* @__PURE__ */ jsx(WordDiff, { row, labels }),
200
+ row.whole && row.whole.length > 0 ? /* @__PURE__ */ jsx(Disclosure, { title: labels.showWhole, headingLevel: "none", size: "compact", className: "crewlet-change-list__whole", children: /* @__PURE__ */ jsx(DiffList, { rows: [...row.whole], layout: "auto", labels: diffLabels }) }) : null
201
+ ] }) : /* @__PURE__ */ jsx(Value, { row, labels, inline: layout === "inline" }),
202
+ row.note === void 0 || row.note === null ? null : /* @__PURE__ */ jsx("span", { className: "crewlet-change-list__note", children: row.note })
203
+ ] })
204
+ ]
205
+ },
206
+ `${index}:${row.label}`
207
+ )) })
208
+ ]
209
+ }
210
+ );
160
211
  }
161
212
 
162
213
  export { CHANGE_LIST_COLLAPSE_OVER, CHANGE_LIST_LABELS, ChangeList, ChangeListItems, shortenUnchanged };
@@ -1,4 +1,4 @@
1
- import { tabId } from './chunk-W3VDHUJM.js';
1
+ import { tabId } from './chunk-2IIHMJMZ.js';
2
2
  import { useRoving, tabStop } from './chunk-EGMQURBR.js';
3
3
  import { Count } from './chunk-MLDTLZAO.js';
4
4
  import { HIT_AREA_CLASS } from './chunk-2YTOOH3A.js';
@@ -9,7 +9,7 @@ import { jsx } from 'react/jsx-runtime';
9
9
  var engine = null;
10
10
  var loading = null;
11
11
  function loadEngine() {
12
- loading ??= import('./Editor-BXOWAV46.js').then(
12
+ loading ??= import('./Editor-IMYESOW7.js').then(
13
13
  (module) => {
14
14
  engine = module.Editor;
15
15
  return engine;
@@ -1,6 +1,6 @@
1
1
  import { Toolbar } from './chunk-NR4CPM4T.js';
2
- import { SegmentedControl } from './chunk-OZAMLQY7.js';
3
- import { tabId } from './chunk-W3VDHUJM.js';
2
+ import { SegmentedControl } from './chunk-6R334YT3.js';
3
+ import { tabId } from './chunk-2IIHMJMZ.js';
4
4
  import { IconButton } from './chunk-UAUP6XGK.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
6
  import './MarkdownEditor-BLCJRGDC.css';
@@ -1,5 +1,5 @@
1
1
  import { RefusalStrip, ReceiptStrip } from './chunk-ZWCK4N4L.js';
2
- import { ChangeList } from './chunk-BBD7PTBG.js';
2
+ import { ChangeList } from './chunk-4XF7ENQA.js';
3
3
  import { StatusCard } from './chunk-RTMNULTL.js';
4
4
  import { Checkbox } from './chunk-LMQG3VPG.js';
5
5
  import { Disclosure } from './chunk-222VILSP.js';