@crewlethq/ui 0.37.1 → 0.39.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 (101) hide show
  1. package/README.md +70 -2
  2. package/dist/Accordion/index.js +1 -1
  3. package/dist/AgentHandoffPanel/index.js +2 -2
  4. package/dist/AppShell/index.js +1 -1
  5. package/dist/{AppShell-JBCZSSX3.css → AppShell-NDU4XMGF.css} +39 -6
  6. package/dist/ArtifactBar/index.js +1 -1
  7. package/dist/{ArtifactBar-FWPBBKQ5.css → ArtifactBar-6PGWGKN2.css} +13 -1
  8. package/dist/ArtifactCard/index.js +2 -2
  9. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +3 -1
  10. package/dist/ArtifactMakeRow/index.js +1 -1
  11. package/dist/{ArtifactMakeRow-W3RD5YWZ.css → ArtifactMakeRow-6UX2LTF7.css} +43 -5
  12. package/dist/AuthLayout/index.js +2 -2
  13. package/dist/Card/Card.d.ts +14 -2
  14. package/dist/Card/index.js +1 -1
  15. package/dist/{Card-QOVASQNU.css → Card-JR2UPQH7.css} +63 -0
  16. package/dist/CatalogTile/CatalogTile.d.ts +47 -0
  17. package/dist/CatalogTile/index.d.ts +3 -0
  18. package/dist/CatalogTile/index.js +3 -0
  19. package/dist/CatalogTile-TGR2ZZVQ.css +131 -0
  20. package/dist/CodeBlock/index.js +1 -1
  21. package/dist/{CodeBlock-GYNJ2HI6.css → CodeBlock-N5ETJF24.css} +13 -0
  22. package/dist/CommandPalette/index.js +2 -2
  23. package/dist/DataTable/index.js +2 -2
  24. package/dist/DataView/index.js +3 -3
  25. package/dist/DatasetSource/DatasetSource.d.ts +7 -1
  26. package/dist/DatasetSource/index.js +2 -2
  27. package/dist/DescriptionList/DescriptionList.d.ts +12 -1
  28. package/dist/DescriptionList/index.js +1 -1
  29. package/dist/{DescriptionList-IXMRCSMK.css → DescriptionList-DEZISDLQ.css} +8 -1
  30. package/dist/Disclosure/index.js +1 -1
  31. package/dist/{Disclosure-VKBJJIZ7.css → Disclosure-P4FH3C35.css} +28 -2
  32. package/dist/LinkInterstitial/index.js +2 -2
  33. package/dist/List/List.d.ts +8 -0
  34. package/dist/List/index.js +1 -1
  35. package/dist/{List-MYJIV6MP.css → List-YHLIZFK4.css} +46 -0
  36. package/dist/ListInput/ListInput.d.ts +9 -1
  37. package/dist/ListInput/index.js +1 -1
  38. package/dist/Modal/index.js +1 -1
  39. package/dist/{Modal-7MWRCWAI.css → Modal-TOEWHDCQ.css} +5 -0
  40. package/dist/ObjectHeader/index.js +1 -1
  41. package/dist/{ObjectHeader-D7GU7QNI.css → ObjectHeader-ZOS22FKX.css} +7 -8
  42. package/dist/PricingCard/index.js +2 -2
  43. package/dist/SettingsTable/SettingsTable.d.ts +66 -0
  44. package/dist/SettingsTable/index.d.ts +3 -0
  45. package/dist/SettingsTable/index.js +3 -0
  46. package/dist/SettingsTable-6DUFAFXG.css +160 -0
  47. package/dist/ShareDialog/index.js +2 -2
  48. package/dist/SheetGrid/index.js +2 -2
  49. package/dist/StatCard/index.js +1 -1
  50. package/dist/{StatCard-4T7TMWMN.css → StatCard-HAA3F5GX.css} +8 -3
  51. package/dist/StatGroup/StatGroup.d.ts +11 -7
  52. package/dist/StatGroup/index.js +1 -1
  53. package/dist/StatGroup-ZMW7VQWP.css +195 -0
  54. package/dist/Switcher/index.js +2 -2
  55. package/dist/TableCells/index.js +2 -2
  56. package/dist/Tag/index.js +1 -1
  57. package/dist/{Tag-SRGTK5KI.css → Tag-2DQOVE6W.css} +15 -5
  58. package/dist/TagsInput/index.js +2 -2
  59. package/dist/TileGrid/TileGrid.d.ts +33 -0
  60. package/dist/TileGrid/index.d.ts +3 -0
  61. package/dist/TileGrid/index.js +2 -0
  62. package/dist/TileGrid-I6LNYD2H.css +52 -0
  63. package/dist/{chunk-YSG3DW7W.js → chunk-3TXY3PJZ.js} +1 -1
  64. package/dist/{chunk-K4VP6ZKE.js → chunk-4BJK7FE5.js} +1 -1
  65. package/dist/chunk-4RKTZSEW.js +64 -0
  66. package/dist/{chunk-3SBM4DGI.js → chunk-BH52LIY6.js} +1 -1
  67. package/dist/{chunk-HDHZWIFL.js → chunk-DYB66CNM.js} +16 -2
  68. package/dist/{chunk-A23KDROH.js → chunk-FXBGEANQ.js} +1 -1
  69. package/dist/{chunk-HMLAWVG6.js → chunk-HQJ24WPM.js} +5 -3
  70. package/dist/{chunk-SVGARBDY.js → chunk-IAGYPTEJ.js} +2 -2
  71. package/dist/{chunk-5QXRI35B.js → chunk-INHXF2CL.js} +24 -11
  72. package/dist/{chunk-6NNY5WBF.js → chunk-JKAGN4V4.js} +1 -1
  73. package/dist/{chunk-DZSBFITC.js → chunk-JZPK4IXR.js} +1 -1
  74. package/dist/{chunk-UWRBD2YO.js → chunk-KNHUBHFX.js} +1 -1
  75. package/dist/{chunk-GFV4LJHH.js → chunk-KYIAFNU7.js} +1 -1
  76. package/dist/{chunk-F2XSYBKH.js → chunk-MFS6F2P7.js} +4 -1
  77. package/dist/{chunk-NRBAXRWE.js → chunk-N3TFYBN3.js} +1 -1
  78. package/dist/chunk-NNTO3TNC.js +9 -0
  79. package/dist/{chunk-DS2C73RJ.js → chunk-NZWX27J7.js} +2 -2
  80. package/dist/{chunk-VGE3G3T4.js → chunk-ODOJJGXH.js} +1 -1
  81. package/dist/{chunk-MICH6QSJ.js → chunk-OGXHZHRX.js} +1 -1
  82. package/dist/{chunk-JXRI5YD2.js → chunk-OUD75UB2.js} +2 -1
  83. package/dist/{chunk-MG3HTY6F.js → chunk-QRKT4XTT.js} +1 -1
  84. package/dist/{chunk-NS4NSHVX.js → chunk-R2IBCEU6.js} +12 -2
  85. package/dist/{chunk-WX2NIG4G.js → chunk-S4DREXGM.js} +1 -1
  86. package/dist/{chunk-GDDE4UM7.js → chunk-SEC2GR2V.js} +1 -1
  87. package/dist/{chunk-S27UBCVX.js → chunk-TZYFTC4M.js} +1 -1
  88. package/dist/{chunk-OHA6WSAG.js → chunk-U2XAJONO.js} +1 -1
  89. package/dist/{chunk-DQSXWQMJ.js → chunk-U3ILLCR2.js} +1 -1
  90. package/dist/{chunk-DOLATMGF.js → chunk-WYYCPV46.js} +5 -0
  91. package/dist/{chunk-A72JPXIV.js → chunk-XGBUUQDU.js} +1 -1
  92. package/dist/chunk-XNXK5MA4.js +48 -0
  93. package/dist/{chunk-XO7PUL4F.js → chunk-YPTTSJPM.js} +1 -1
  94. package/dist/{chunk-RIAZM6L3.js → chunk-ZNOXQACX.js} +1 -1
  95. package/dist/generated/index.d.ts +3 -0
  96. package/dist/generated/index.js +56 -53
  97. package/dist/index.js +56 -53
  98. package/dist/styles.css +782 -64
  99. package/package.json +3 -3
  100. package/dist/StatGroup-PADTJCUQ.css +0 -86
  101. /package/dist/{chunk-4QQ3MND5.js → chunk-QRLIWCLX.js} +0 -0
@@ -0,0 +1,131 @@
1
+ /*
2
+ * CatalogTile: mark, name and state, one sentence, and a foot with a quiet
3
+ * fact and one action.
4
+ *
5
+ * ONE WELL FOR EVERY MARK. A vendor's mark is drawn in the vendor's colours,
6
+ * so the box it stands in is the one thing a catalogue can hold constant: the
7
+ * same size, the same raised ground and the same hairline for every tile,
8
+ * set up or not. A drained mark on a grey box read as a placeholder image
9
+ * (a white plate on grey is not a logo), so a tile not yet set up says so by
10
+ * its ground, never by its mark.
11
+ */
12
+
13
+ .crewlet-catalog-tile {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--spacing-3);
17
+ min-width: 0;
18
+ padding: var(--spacing-4);
19
+ background: var(--color-surface-subtle);
20
+ border: 1px solid var(--color-border-default);
21
+ border-radius: var(--radius-lg);
22
+ color: var(--color-text-primary);
23
+ }
24
+
25
+ .crewlet-catalog-tile--quiet {
26
+ background: var(--color-surface-background);
27
+ }
28
+
29
+ .crewlet-catalog-tile__head {
30
+ display: flex;
31
+ align-items: center;
32
+ gap: var(--spacing-3);
33
+ min-width: 0;
34
+ }
35
+
36
+ .crewlet-catalog-tile__mark {
37
+ display: inline-flex;
38
+ flex: none;
39
+ align-items: center;
40
+ justify-content: center;
41
+ width: var(--size-row-lg);
42
+ height: var(--size-row-lg);
43
+ border-radius: var(--radius-md);
44
+ background: var(--color-surface-elevated);
45
+ border: 1px solid var(--color-border-default);
46
+ color: var(--color-text-primary);
47
+ }
48
+
49
+ /* The name, and under it the state when there is one; centred on the mark
50
+ either way, so a tile with no state is not a tile with a hole in it. */
51
+ .crewlet-catalog-tile__title {
52
+ display: flex;
53
+ flex-direction: column;
54
+ align-items: flex-start;
55
+ justify-content: center;
56
+ gap: var(--spacing-1);
57
+ min-width: 0;
58
+ }
59
+
60
+ .crewlet-catalog-tile__name {
61
+ margin: 0;
62
+ font-family: var(--font-family-sans);
63
+ font-size: var(--font-size-sm);
64
+ font-weight: var(--font-weight-semibold);
65
+ line-height: var(--font-line-height-snug);
66
+ color: var(--color-text-primary);
67
+ overflow-wrap: anywhere;
68
+ }
69
+
70
+ .crewlet-catalog-tile__status {
71
+ display: inline-flex;
72
+ }
73
+
74
+ .crewlet-catalog-tile__description {
75
+ flex: 1;
76
+ margin: 0;
77
+ /* Two lines reserved, so a tile saying what it is for and one saying what
78
+ is owed keep their feet on one line in a row. */
79
+ min-height: calc(2em * var(--font-line-height-body));
80
+ font-size: var(--font-size-compact);
81
+ line-height: var(--font-line-height-body);
82
+ color: var(--color-text-secondary);
83
+ }
84
+
85
+ .crewlet-catalog-tile__foot {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: var(--spacing-2);
89
+ /* A SMALL CONTROL'S HEIGHT OF CONTENT, under the rule and the padding: a
90
+ foot holding only a fact stands as tall as one holding a button, so the
91
+ rules of every foot in a row sit on one line. Measured on the content
92
+ box, since under border-box sizing the padding spent the floor and a
93
+ fact-only foot stood 8px shorter. */
94
+ box-sizing: content-box;
95
+ min-height: var(--size-control-sm);
96
+ padding-top: var(--spacing-3);
97
+ border-top: 1px solid var(--color-border-default);
98
+ }
99
+
100
+ .crewlet-catalog-tile__meta {
101
+ flex: 1;
102
+ min-width: 0;
103
+ overflow: hidden;
104
+ text-overflow: ellipsis;
105
+ white-space: nowrap;
106
+ font-size: var(--font-size-xs);
107
+ color: var(--color-text-tertiary);
108
+ }
109
+
110
+ .crewlet-catalog-tile__action {
111
+ display: inline-flex;
112
+ flex: none;
113
+ }
114
+
115
+ /*
116
+ * ONE TILE A ROW RESERVES NOTHING. The two reserved lines exist to keep the
117
+ * feet of tiles side by side on one line; a grid folded to one track has no
118
+ * neighbours to line up with, and on a phone the reserve was a blank line in
119
+ * every short tile.
120
+ */
121
+ @container crewlet-tile-grid (width < 40rem) {
122
+ .crewlet-tile-grid[data-columns='3'] .crewlet-catalog-tile__description {
123
+ min-height: 0;
124
+ }
125
+ }
126
+
127
+ @container crewlet-tile-grid (width < 28rem) {
128
+ .crewlet-tile-grid .crewlet-catalog-tile__description {
129
+ min-height: 0;
130
+ }
131
+ }
@@ -1,4 +1,4 @@
1
- export { CodeBlock } from '../chunk-GDDE4UM7.js';
1
+ export { CodeBlock } from '../chunk-SEC2GR2V.js';
2
2
  import '../chunk-W46LPU4R.js';
3
3
  import '../chunk-STJ7QBC3.js';
4
4
  import '../chunk-DTIW4CHZ.js';
@@ -16,6 +16,19 @@
16
16
  min-width: 0;
17
17
  }
18
18
 
19
+ /*
20
+ * A BLOCK THAT IS A CARD'S CONTENT IS THAT CARD'S SURFACE. Placed straight in
21
+ * a card (with `padding="none"`), it gives up its own edge, corner and ground,
22
+ * so the card's head rule is the only line over the code and there is no box
23
+ * inside a box. In a padded body it stays a well, which is what tells code
24
+ * from the prose beside it.
25
+ */
26
+ .crewlet-card > .crewlet-codeblock {
27
+ border: 0;
28
+ border-radius: var(--radius-none);
29
+ background: transparent;
30
+ }
31
+
19
32
  .crewlet-codeblock__header {
20
33
  display: flex;
21
34
  align-items: center;
@@ -1,5 +1,5 @@
1
- export { CommandPalette } from '../chunk-A72JPXIV.js';
2
- import '../chunk-SVGARBDY.js';
1
+ export { CommandPalette } from '../chunk-XGBUUQDU.js';
2
+ import '../chunk-IAGYPTEJ.js';
3
3
  import '../chunk-7KHM2FZH.js';
4
4
  import '../chunk-TYONQSOK.js';
5
5
  import '../chunk-SMBKXWML.js';
@@ -1,7 +1,7 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-A23KDROH.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-FXBGEANQ.js';
2
2
  import '../chunk-STJ7QBC3.js';
3
3
  import '../chunk-DTIW4CHZ.js';
4
- import '../chunk-SVGARBDY.js';
4
+ import '../chunk-IAGYPTEJ.js';
5
5
  import '../chunk-AXS6MBNH.js';
6
6
  import '../chunk-EUCC37WY.js';
7
7
  import '../chunk-AV2DXAEL.js';
@@ -1,10 +1,10 @@
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-MG3HTY6F.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-QRKT4XTT.js';
2
2
  import '../chunk-HOXGBLEY.js';
3
- import '../chunk-A23KDROH.js';
4
3
  import '../chunk-UB6MLXUL.js';
4
+ import '../chunk-FXBGEANQ.js';
5
5
  import '../chunk-STJ7QBC3.js';
6
6
  import '../chunk-DTIW4CHZ.js';
7
- import '../chunk-SVGARBDY.js';
7
+ import '../chunk-IAGYPTEJ.js';
8
8
  import '../chunk-7KHM2FZH.js';
9
9
  import '../chunk-KHJIEPZV.js';
10
10
  import '../chunk-GXQ3B46I.js';
@@ -26,7 +26,13 @@ export interface DatasetSourceLabels {
26
26
  export interface DatasetSourceProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'children' | 'onSelect'> {
27
27
  /** The dataset's title, which every figure drawn from it cites. */
28
28
  title: string;
29
- kind: DatasetSourceKind;
29
+ /**
30
+ * Where the dataset reads from, drawn as a tag beside the title. Left out
31
+ * where every entry of a list reads from one place (a picker of the
32
+ * engine's own sources, grouped under headings of their own), since the
33
+ * same tag on every row is a column a reader learns to skip.
34
+ */
35
+ kind?: DatasetSourceKind | undefined;
30
36
  /** What the dataset reads, in the author's terms: "tracker.items, scope mine". */
31
37
  definition: ReactNode;
32
38
  /** How it is kept current, in words: "Live", "Every 2 min", "On change". */
@@ -1,5 +1,5 @@
1
- export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-HMLAWVG6.js';
2
- import '../chunk-GFV4LJHH.js';
1
+ export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-HQJ24WPM.js';
2
+ import '../chunk-KYIAFNU7.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-3CZ7XAVY.js';
5
5
  import '../chunk-EUCC37WY.js';
@@ -12,6 +12,17 @@ export interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {
12
12
  * space after "Up" and stacks a list the panel had room to lay side by side.
13
13
  */
14
14
  fit?: boolean | undefined;
15
+ /**
16
+ * The term column's width, as a CSS track: `12rem`, or
17
+ * `minmax(120px, 14rem)`. For lists that have to line up with each other,
18
+ * stacked cards of settings on one page, where each list sizing the column
19
+ * to its own longest term starts its values somewhere else. The same track
20
+ * can be set once for a whole page as `--crewlet-description-list-term`,
21
+ * which every list under it inherits. Ignored with `fit`, whose column is
22
+ * its own longest term by definition, and under the narrow step, where a
23
+ * term stands over its detail.
24
+ */
25
+ termWidth?: string | undefined;
15
26
  /**
16
27
  * The pairs. Given as tuples so a caller can build them from a record
17
28
  * without inventing a key for each one; `DescriptionList.Item` children are
@@ -32,7 +43,7 @@ export interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {
32
43
  * Each pair is wrapped in a `div`, which HTML allows inside a `dl` and which
33
44
  * is what lets one pair be one grid row.
34
45
  */
35
- export declare function DescriptionList({ dense, fit, items, className, children, ...rest }: DescriptionListProps): import("react").JSX.Element;
46
+ export declare function DescriptionList({ dense, fit, termWidth, items, className, style, children, ...rest }: DescriptionListProps): import("react").JSX.Element;
36
47
  export declare namespace DescriptionList {
37
48
  var Item: typeof DescriptionListItem;
38
49
  }
@@ -1,2 +1,2 @@
1
- export { DescriptionList, DescriptionListItem } from '../chunk-F2XSYBKH.js';
1
+ export { DescriptionList, DescriptionListItem } from '../chunk-MFS6F2P7.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -4,11 +4,18 @@
4
4
  * The term track is `minmax(120px, max-content)`: wide enough that short terms
5
5
  * line up with each other, and free to grow for a long one rather than
6
6
  * wrapping it into two lines beside a one-word value.
7
+ *
8
+ * ONE LIST'S TRACK IS ITS OWN, which is wrong for a page of them. Four cards
9
+ * of limits stacked on one page each sized the column to their own longest
10
+ * term, so their values started at four different places and the cards did
11
+ * not read as one table. `--crewlet-description-list-term` names the track
12
+ * instead, and it is inherited: set once on the page (or passed to each list
13
+ * as `termWidth`), every list under it shares one column.
7
14
  */
8
15
 
9
16
  .crewlet-description-list {
10
17
  display: grid;
11
- grid-template-columns: minmax(120px, max-content) 1fr;
18
+ grid-template-columns: var(--crewlet-description-list-term, minmax(120px, max-content)) 1fr;
12
19
  gap: var(--spacing-2) var(--spacing-4);
13
20
  margin: 0;
14
21
  font-size: var(--font-size-compact);
@@ -1,4 +1,4 @@
1
- export { Disclosure } from '../chunk-MICH6QSJ.js';
1
+ export { Disclosure } from '../chunk-OGXHZHRX.js';
2
2
  export { DisclosureAnatomy } from '../chunk-FZVJDJFN.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -115,9 +115,35 @@
115
115
  font-variant-ligatures: none;
116
116
  }
117
117
 
118
- /* A fact inside the button: quieter than the title it belongs to. */
118
+ /*
119
+ * A fact inside the button: quieter than the title it belongs to, and the
120
+ * first thing to give up room when the row runs short.
121
+ *
122
+ * IT USED TO TAKE NONE. `flex: none` held a fact at its full width while the
123
+ * title, which may shrink, was the only thing that could, so a long fact (a
124
+ * log's replay mode, generation, range and size, beside a status badge in the
125
+ * actions) took the whole trigger: the title shrank to nothing, so a row no
126
+ * longer said which log it was, and the fact ran out of the button and under
127
+ * the badge beside it.
128
+ *
129
+ * A HUNDRED TO THE TITLE'S ONE, as a card's subtitle gives way to its title:
130
+ * two items that may shrink give up space in proportion to their widths, so
131
+ * at that ratio the fact absorbs effectively all of it, and ends in an
132
+ * ellipsis, before the title gives up a pixel. The fact is still the button's
133
+ * name in full; only its drawing is cut.
134
+ *
135
+ * NEVER TO NOTHING. The floor is one glyph wide, because a fact is often a
136
+ * mark (a failed call's glyph beside a tool's name), and a mark that shrank
137
+ * to nothing would say nothing at all. A long fact keeps an ellipsis there,
138
+ * which says a fact was cut. Once the fact is at its floor the title shrinks
139
+ * and ends in its own ellipsis.
140
+ */
119
141
  .crewlet-disclosure__meta {
120
- flex: none;
142
+ flex: 0 100 auto;
143
+ min-width: 1.5em;
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
146
+ white-space: nowrap;
121
147
  color: var(--color-text-tertiary);
122
148
  font-size: var(--font-size-xs);
123
149
  }
@@ -1,5 +1,5 @@
1
- export { LinkInterstitial, openExternal } from '../chunk-NRBAXRWE.js';
2
- import '../chunk-SVGARBDY.js';
1
+ export { LinkInterstitial, openExternal } from '../chunk-N3TFYBN3.js';
2
+ import '../chunk-IAGYPTEJ.js';
3
3
  import '../chunk-5CLW2CXT.js';
4
4
  import '../chunk-SZZRIHGT.js';
5
5
  import '../chunk-PQADV6P6.js';
@@ -9,6 +9,14 @@ export type ListVariant =
9
9
  | 'bulleted'
10
10
  /** A number per row: an order somebody follows. */
11
11
  | 'numbered'
12
+ /**
13
+ * A number per row in a column of its own, with a hairline between rows:
14
+ * statements a reader counts and cites by number (a company's standing
15
+ * policies), each of which may run to several lines. The numbers are the
16
+ * list's own (an `ol`), drawn in tabular figures so a tenth row's number
17
+ * stands where the first one's does.
18
+ */
19
+ | 'numbered-divided'
12
20
  /**
13
21
  * A hairline between rows: a feed, a set of results, a conversation. THE
14
22
  * DEFAULT, because it is the list every screen in the product draws: rows a
@@ -1,3 +1,3 @@
1
- export { List, ListItem } from '../chunk-DS2C73RJ.js';
1
+ export { List, ListItem } from '../chunk-NZWX27J7.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -120,6 +120,52 @@
120
120
  padding-inline: 0;
121
121
  }
122
122
 
123
+ /*
124
+ * NUMBERED AND DIVIDED: the divided list's hairlines, with the number in a
125
+ * column of its own rather than in the margin, so a statement that runs to a
126
+ * second line wraps under its own first word and not under its number. The
127
+ * row grows with its text (no row height), at the body's leading, and the
128
+ * number stands on the first line's baseline.
129
+ *
130
+ * The number is the list's counter, drawn by the row. The `ol` already
131
+ * announces each item's position, so the drawn figure is given empty
132
+ * alternative text and is not read a second time.
133
+ */
134
+ .crewlet-list--numbered-divided {
135
+ counter-reset: crewlet-list-item;
136
+ }
137
+
138
+ .crewlet-list--numbered-divided .crewlet-list__item {
139
+ counter-increment: crewlet-list-item;
140
+ border-bottom: 1px solid var(--color-border-default);
141
+ }
142
+
143
+ .crewlet-list--numbered-divided .crewlet-list__item:last-child {
144
+ border-bottom: none;
145
+ }
146
+
147
+ .crewlet-list--numbered-divided .crewlet-list__row {
148
+ align-items: baseline;
149
+ min-height: 0;
150
+ /* At a card's own inset, since a card is where these stand: the numbers
151
+ line up under the card head's glyph rather than 4px left of it. */
152
+ padding: var(--spacing-3) var(--spacing-4);
153
+ border-radius: 0;
154
+ line-height: var(--font-line-height-body);
155
+ }
156
+
157
+ .crewlet-list--numbered-divided .crewlet-list__row::before {
158
+ content: counter(crewlet-list-item);
159
+ content: counter(crewlet-list-item) / '';
160
+ flex: none;
161
+ min-width: 2ch;
162
+ text-align: end;
163
+ font-size: var(--font-size-xs);
164
+ font-weight: var(--font-weight-medium);
165
+ font-variant-numeric: tabular-nums;
166
+ color: var(--color-text-tertiary);
167
+ }
168
+
123
169
  /* ---- States ------------------------------------------------------------ */
124
170
 
125
171
  /*
@@ -21,6 +21,14 @@ export interface ListInputProps {
21
21
  optional?: boolean | undefined;
22
22
  /** Draws the Enter keycap inside the new-item box, which is what adds one. */
23
23
  enterHint?: boolean | undefined;
24
+ /**
25
+ * Puts the focus in the new-item box when the list mounts, for a form
26
+ * opened to change THIS list ("Edit policies"): the reader lands where the
27
+ * next item is written rather than on the form's first field. It is taken
28
+ * during mount, so a dialog the list opens in keeps it rather than moving
29
+ * focus to its own first control. Named as `TagsInput`'s is.
30
+ */
31
+ focusOnMount?: boolean | undefined;
24
32
  /** The name of the control beside the legend that appends what the box holds. */
25
33
  addLabel?: ((itemName: string) => string) | undefined;
26
34
  itemLabel?: ((name: string, position: string) => string) | undefined;
@@ -67,4 +75,4 @@ export interface ListInputProps {
67
75
  *
68
76
  * Ported from the engine dashboard's `ui/ListField.tsx`.
69
77
  */
70
- export declare function ListInput({ label, itemName, value, onChange, multiline, helper, helperOnFocus, error, placeholder, disabled, optional, enterHint, addLabel, itemLabel, newItemLabel, moveUpLabel, moveDownLabel, removeLabel, addedMessage, removedMessage, movedMessage, }: ListInputProps): import("react").JSX.Element;
78
+ export declare function ListInput({ label, itemName, value, onChange, multiline, helper, helperOnFocus, error, placeholder, disabled, optional, enterHint, focusOnMount, addLabel, itemLabel, newItemLabel, moveUpLabel, moveDownLabel, removeLabel, addedMessage, removedMessage, movedMessage, }: ListInputProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { ListInput } from '../chunk-DOLATMGF.js';
1
+ export { ListInput } from '../chunk-WYYCPV46.js';
2
2
  import '../chunk-TYONQSOK.js';
3
3
  import '../chunk-SMBKXWML.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -1,4 +1,4 @@
1
- export { ConfirmModal, Modal } from '../chunk-SVGARBDY.js';
1
+ export { ConfirmModal, Modal } from '../chunk-IAGYPTEJ.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-OMV5W53A.js';
4
4
  import '../chunk-H5XTJ7GJ.js';
@@ -379,6 +379,11 @@
379
379
  */
380
380
  .crewlet-modal__title {
381
381
  margin: 0;
382
+ /* The text face at its own tracking, never the display face every heading
383
+ element takes from the baseline: the title is an h1 for the outline, at
384
+ the dialog's own register. */
385
+ font-family: var(--font-family-sans);
386
+ letter-spacing: var(--font-letter-spacing-normal);
382
387
  font-size: var(--font-size-sm);
383
388
  font-weight: var(--font-weight-semibold);
384
389
  line-height: var(--font-line-height-tight);
@@ -1,4 +1,4 @@
1
- export { FactLine, ObjectHeader, SetByLine } from '../chunk-VGE3G3T4.js';
1
+ export { FactLine, ObjectHeader, SetByLine } from '../chunk-ODOJJGXH.js';
2
2
  import '../chunk-FBSEJO2C.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,10 @@
1
1
  /*
2
2
  * The header of an object: its eyebrow, its head row and its fact line.
3
+ *
4
+ * SENTENCE CASE, both the eyebrow and the fact labels, as `StatCard`'s label
5
+ * is: the uppercase, tracked-open micro-caps are a table's column head, and
6
+ * over an object's name ("UNIT", then TYPE, LEAD and SEATS under it) they put
7
+ * a heading on every fact and read as a form rather than a record.
3
8
  */
4
9
  .crewlet-object-header {
5
10
  display: flex;
@@ -18,9 +23,7 @@
18
23
  align-items: center;
19
24
  gap: var(--spacing-2);
20
25
  min-width: 0;
21
- font-size: var(--font-size-2xs);
22
- letter-spacing: var(--font-letter-spacing-wide);
23
- text-transform: uppercase;
26
+ font-size: var(--font-size-xs);
24
27
  color: var(--color-text-tertiary);
25
28
  }
26
29
 
@@ -35,8 +38,6 @@
35
38
  overflow: hidden;
36
39
  text-overflow: ellipsis;
37
40
  white-space: nowrap;
38
- letter-spacing: normal;
39
- text-transform: none;
40
41
  }
41
42
 
42
43
  .crewlet-object-header__id--mono {
@@ -138,9 +139,7 @@
138
139
  }
139
140
 
140
141
  .crewlet-fact-line__label {
141
- font-size: var(--font-size-2xs);
142
- letter-spacing: var(--font-letter-spacing-wide);
143
- text-transform: uppercase;
142
+ font-size: var(--font-size-xs);
144
143
  color: var(--color-text-tertiary);
145
144
  }
146
145
 
@@ -1,4 +1,4 @@
1
- export { PricingCard } from '../chunk-DQSXWQMJ.js';
2
- import '../chunk-GFV4LJHH.js';
1
+ export { PricingCard } from '../chunk-U3ILLCR2.js';
2
+ import '../chunk-KYIAFNU7.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,66 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ /** The words the three columns are named by, for assistive technology and the optional header row. */
3
+ export interface SettingsTableColumns {
4
+ setting?: string | undefined;
5
+ value?: string | undefined;
6
+ source?: string | undefined;
7
+ }
8
+ export interface SettingsTableProps extends HTMLAttributes<HTMLDivElement> {
9
+ /**
10
+ * Draws the column names as a header row. Off by default: a page that
11
+ * stacks one table per group (a card each) would repeat the same three
12
+ * words over every card. The names are always exposed to assistive
13
+ * technology, drawn or not.
14
+ */
15
+ header?: boolean | undefined;
16
+ /** The column names. Defaults to Setting, Value and Source. */
17
+ columns?: SettingsTableColumns | undefined;
18
+ children?: ReactNode;
19
+ }
20
+ /**
21
+ * A read-only table of settings: what each is called, the value in force and
22
+ * where that value comes from.
23
+ *
24
+ * ONE COLUMN GRID FOR EVERY TABLE ON A PAGE. The tracks are fractions of the
25
+ * table's own width (`--crewlet-settings-table-columns`), never the width of
26
+ * the longest label, so a page that stacks a table per group in cards of one
27
+ * width puts every value and every source on one vertical line down the page.
28
+ * A term column sized to its own longest term started the values at a
29
+ * different place in every card, and a fixed one left them floating a third
30
+ * of the way across a wide card with the rest of the row empty.
31
+ *
32
+ * THE SOURCE IS QUIET UNLESS IT IS NEWS. A value that is the default says so
33
+ * in the tertiary ink, as a word rather than a tag: a tag on every row is
34
+ * noise that teaches a reader to skip the column. A value that differs from
35
+ * its default (`changed`) carries a mark before its source, which is the one
36
+ * row in the table a reader scanning it came to find.
37
+ *
38
+ * A TABLE, BECAUSE IT IS ONE. Every row carries the same three fields, so it
39
+ * is announced as a table with its column names, and each setting's name is
40
+ * the row's header. The roles are written out rather than taken from table
41
+ * elements because the row folds into two lines on a narrow table, and a
42
+ * table element that changes its display loses its semantics in some
43
+ * browsers.
44
+ */
45
+ export declare function SettingsTable({ header, columns, className, children, ...rest }: SettingsTableProps): import("react").JSX.Element;
46
+ export declare namespace SettingsTable {
47
+ var Row: typeof SettingsTableRow;
48
+ }
49
+ export interface SettingsTableRowProps extends HTMLAttributes<HTMLDivElement> {
50
+ /** What the setting is called, in a reader's words. */
51
+ label: ReactNode;
52
+ /**
53
+ * The setting's address in the document it is written in
54
+ * (`turn_engine.max_iterations`), drawn quietly under its name in the
55
+ * monospace face. For the reader who will go and change it there.
56
+ */
57
+ settingKey?: string | undefined;
58
+ /** The value in force, in its own unit. Drawn in tabular figures. */
59
+ children?: ReactNode;
60
+ /** Where the value comes from: "Default", "Set in the company document". */
61
+ source?: ReactNode;
62
+ /** The value differs from its default: the source carries a mark. */
63
+ changed?: boolean | undefined;
64
+ }
65
+ /** One setting: its name (and key), its value and its source. */
66
+ export declare function SettingsTableRow({ label, settingKey, source, changed, className, children, ...rest }: SettingsTableRowProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './SettingsTable.css';
2
+ export { SettingsTable, SettingsTableRow } from './SettingsTable.js';
3
+ export type { SettingsTableColumns, SettingsTableProps, SettingsTableRowProps } from './SettingsTable.js';
@@ -0,0 +1,3 @@
1
+ export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
2
+ import '../chunk-WIATRXEJ.js';
3
+ import '../chunk-ODEQTPFM.js';