@crewlethq/ui 0.84.2 → 0.86.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 (103) hide show
  1. package/README.md +53 -5
  2. package/dist/Accordion/index.js +1 -1
  3. package/dist/AgentHandoffPanel/index.js +2 -2
  4. package/dist/ArtifactBar/index.js +1 -1
  5. package/dist/AttentionList/AttentionList.d.ts +82 -0
  6. package/dist/AttentionList/index.d.ts +3 -0
  7. package/dist/AttentionList/index.js +9 -0
  8. package/dist/AttentionList-LVX7KRET.css +212 -0
  9. package/dist/AvatarPicker/index.js +2 -2
  10. package/dist/ChangeList/index.js +2 -2
  11. package/dist/ChoiceCards/ChoiceCards.d.ts +35 -6
  12. package/dist/ChoiceCards/index.d.ts +1 -1
  13. package/dist/ChoiceCards/index.js +1 -1
  14. package/dist/{ChoiceCards-TVMBO3HZ.css → ChoiceCards-KHJW2FKO.css} +49 -0
  15. package/dist/ChoiceList/ChoiceList.d.ts +2 -2
  16. package/dist/ChoiceList/index.js +1 -1
  17. package/dist/{ChoiceList-JN4PPNFW.css → ChoiceList-ZQMZTEZX.css} +33 -17
  18. package/dist/CodeBlock/index.js +2 -2
  19. package/dist/ColorSwatch/index.js +2 -2
  20. package/dist/ContrastBadge/index.js +2 -2
  21. package/dist/ContrastHelp/index.js +3 -3
  22. package/dist/Copyable/index.js +1 -1
  23. package/dist/{Copyable-IS3MHMPL.css → Copyable-P5AMRHFX.css} +18 -4
  24. package/dist/DataGrid/index.js +1 -1
  25. package/dist/{DataGrid-Q26F2V5Q.css → DataGrid-SAHEL4SN.css} +57 -0
  26. package/dist/DataView/index.js +2 -2
  27. package/dist/DeepWorkCard/index.js +3 -3
  28. package/dist/Disclosure/Disclosure.d.ts +10 -1
  29. package/dist/Disclosure/index.js +1 -1
  30. package/dist/{Disclosure-D727FN5X.css → Disclosure-RJSKKO7Z.css} +20 -0
  31. package/dist/KeyValueRows/KeyValueRows.d.ts +125 -0
  32. package/dist/KeyValueRows/index.d.ts +3 -0
  33. package/dist/KeyValueRows/index.js +12 -0
  34. package/dist/KeyValueRows-US5KW7JK.css +44 -0
  35. package/dist/LogoSlot/index.js +3 -3
  36. package/dist/MarkdownEditor/index.js +1 -1
  37. package/dist/MemberPicker/MemberPicker.d.ts +86 -0
  38. package/dist/MemberPicker/index.d.ts +3 -0
  39. package/dist/MemberPicker/index.js +11 -0
  40. package/dist/MemberPicker-ZD35VEK6.css +162 -0
  41. package/dist/MergeConflicts/index.js +1 -1
  42. package/dist/PresenterView/index.js +2 -2
  43. package/dist/ProposalCard/index.js +3 -3
  44. package/dist/RailList/RailList.d.ts +74 -0
  45. package/dist/RailList/index.d.ts +3 -0
  46. package/dist/RailList/index.js +17 -0
  47. package/dist/RailList-N2ZBPRM2.css +97 -0
  48. package/dist/RelatedRow/index.js +2 -2
  49. package/dist/RichEditor/index.js +1 -1
  50. package/dist/RunChip/index.js +3 -3
  51. package/dist/SegmentedControl/index.js +1 -1
  52. package/dist/{SegmentedControl-B7XCUOML.css → SegmentedControl-7GY2KM44.css} +11 -0
  53. package/dist/SetupWizard/index.js +3 -3
  54. package/dist/ShareDialog/index.js +3 -3
  55. package/dist/{StepList-A4YVU4JI.css → StepList-OAJ45IBX.css} +12 -1
  56. package/dist/Stepper/StepList.d.ts +7 -4
  57. package/dist/Stepper/index.js +1 -1
  58. package/dist/TableCells/TableCells.d.ts +60 -0
  59. package/dist/TableCells/index.d.ts +2 -2
  60. package/dist/TableCells/index.js +2 -1
  61. package/dist/{TableCells-TKSNLRK3.css → TableCells-ZALZLLEF.css} +28 -0
  62. package/dist/Text/Text.d.ts +25 -3
  63. package/dist/Text/index.js +1 -1
  64. package/dist/ThemeSwitcher/index.js +1 -1
  65. package/dist/TimeRangePicker/index.js +1 -1
  66. package/dist/VersionCompare/index.js +1 -1
  67. package/dist/{chunk-CV2LU2T2.js → chunk-35CKF77R.js} +2 -2
  68. package/dist/{chunk-AUSFKGKL.js → chunk-3AMWXJQX.js} +1 -1
  69. package/dist/{chunk-AFLS26AC.js → chunk-3CALM534.js} +36 -2
  70. package/dist/{chunk-AOJ6ZA77.js → chunk-3MFRTZH6.js} +1 -1
  71. package/dist/{chunk-QSWQJX27.js → chunk-4ME4J3YY.js} +1 -1
  72. package/dist/{chunk-6FBPFG3C.js → chunk-6EZX26BD.js} +1 -1
  73. package/dist/chunk-AELKT34H.js +121 -0
  74. package/dist/{chunk-X7VZQKIW.js → chunk-AQ7ZV3CH.js} +1 -1
  75. package/dist/{chunk-EAHEJNVJ.js → chunk-CL3FWLDO.js} +1 -1
  76. package/dist/{chunk-XNC3M4IN.js → chunk-E2QPZGLG.js} +1 -1
  77. package/dist/{chunk-T5GBTXNC.js → chunk-ETNQYT5O.js} +1 -1
  78. package/dist/{chunk-36WK24AI.js → chunk-EVM6GYZ2.js} +1 -1
  79. package/dist/{chunk-B7NX425Z.js → chunk-JDMJVVVQ.js} +12 -4
  80. package/dist/chunk-KA4RBKQV.js +148 -0
  81. package/dist/{chunk-ABRWL5FJ.js → chunk-L2QRKIL4.js} +3 -2
  82. package/dist/{chunk-P7HMY3BQ.js → chunk-M33DABTW.js} +2 -2
  83. package/dist/{chunk-LVJGN5II.js → chunk-NAHA62WD.js} +3 -1
  84. package/dist/{chunk-QP2P6GDQ.js → chunk-O5CEG7TQ.js} +14 -0
  85. package/dist/{chunk-6SFDL4QH.js → chunk-P3LNA6G4.js} +1 -1
  86. package/dist/chunk-REWKR3S4.js +73 -0
  87. package/dist/{chunk-WMO722J2.js → chunk-TBQFZV4H.js} +1 -1
  88. package/dist/{chunk-RJWO2PC5.js → chunk-TMML7BHT.js} +14 -5
  89. package/dist/chunk-TRZS7DLB.js +159 -0
  90. package/dist/{chunk-K6RWEQ6P.js → chunk-WRZPO4YL.js} +2 -2
  91. package/dist/{chunk-DD7RBNT4.js → chunk-XH55NRHO.js} +1 -1
  92. package/dist/{chunk-6RW2MUTY.js → chunk-XU7RQNT6.js} +1 -1
  93. package/dist/{chunk-AQNP3KQU.js → chunk-Y7PPKQFQ.js} +1 -1
  94. package/dist/generated/index.d.ts +4 -0
  95. package/dist/generated/index.js +92 -88
  96. package/dist/index.js +92 -88
  97. package/dist/styles.css +763 -30
  98. package/package.json +3 -3
  99. package/dist/{Editor-5D5Z3LBQ.js → Editor-VGNB35NJ.js} +1 -1
  100. package/dist/{chunk-22CU7V4J.js → chunk-K2HEYQJL.js} +1 -1
  101. package/dist/{chunk-REEZQCML.js → chunk-PAGITACP.js} +0 -0
  102. package/dist/{chunk-LMEMH6DO.js → chunk-WCJTOKTY.js} +1 -1
  103. package/dist/{chunk-2ZSCHQOA.js → chunk-WMSXPF7T.js} +1 -1
@@ -0,0 +1,162 @@
1
+ /*
2
+ * Who gets something, as one list: a group row with its box, its name and
3
+ * its count, opening to its members, each a row of face, name and one quiet
4
+ * line. Rows stand at the kit's compact list height; the only colour is the
5
+ * box's own accent and a left-out member's quieter ink.
6
+ *
7
+ * A LIST'S TYPE, NOT A FORM'S: names in the 13px every list and table row
8
+ * sets a name in, at the medium weight a group's name takes, and every box the
9
+ * compact Checkbox's (14px beside 13px words). At the body's 14px, with a
10
+ * 16px box over 14px ones, it read a step larger than every list around it.
11
+ */
12
+ .crewlet-member-picker {
13
+ display: grid;
14
+ gap: var(--spacing-2);
15
+ min-width: 0;
16
+ }
17
+
18
+ .crewlet-member-picker__summary {
19
+ margin: 0;
20
+ color: var(--color-text-secondary);
21
+ font-size: var(--font-size-compact);
22
+ font-variant-numeric: tabular-nums;
23
+ }
24
+
25
+ .crewlet-member-picker__list,
26
+ .crewlet-member-picker__members {
27
+ display: grid;
28
+ margin: 0;
29
+ padding: 0;
30
+ list-style: none;
31
+ }
32
+
33
+ .crewlet-member-picker__list {
34
+ border: 1px solid var(--color-border-default);
35
+ border-radius: var(--radius-md);
36
+ overflow: hidden;
37
+ }
38
+
39
+ .crewlet-member-picker__group + .crewlet-member-picker__group {
40
+ border-top: 1px solid var(--color-border-default);
41
+ }
42
+
43
+ .crewlet-member-picker__group-row {
44
+ display: grid;
45
+ grid-template-columns: auto minmax(0, 1fr) auto;
46
+ align-items: center;
47
+ gap: var(--spacing-2);
48
+ padding: var(--spacing-2) var(--spacing-3) var(--spacing-2) var(--spacing-1);
49
+ }
50
+
51
+ /* The open control is the kit's small ghost IconButton; only its chevron
52
+ turns here, a quarter turn once the group is open. */
53
+ .crewlet-member-picker__toggle svg {
54
+ transition: transform var(--motion-duration-fast) var(--motion-easing-default);
55
+ }
56
+
57
+ .crewlet-member-picker__group.is-open .crewlet-member-picker__toggle svg {
58
+ transform: rotate(90deg);
59
+ }
60
+
61
+ @media (prefers-reduced-motion: reduce) {
62
+ .crewlet-member-picker__toggle svg {
63
+ transition: none;
64
+ }
65
+ }
66
+
67
+ .crewlet-member-picker__count {
68
+ color: var(--color-text-tertiary);
69
+ font-size: var(--font-size-xs);
70
+ font-variant-numeric: tabular-nums;
71
+ white-space: nowrap;
72
+ }
73
+
74
+ .crewlet-member-picker__members {
75
+ border-top: 1px solid var(--color-border-default);
76
+ background: var(--color-surface-subtle);
77
+ }
78
+
79
+ .crewlet-member-picker__member {
80
+ display: grid;
81
+ grid-template-columns: auto auto minmax(0, 1fr) auto;
82
+ align-items: center;
83
+ gap: var(--spacing-2);
84
+ min-height: var(--size-control-lg);
85
+ /* Each member's box under its group's, past the open control and its gap. */
86
+ padding: var(--spacing-1) var(--spacing-3) var(--spacing-1) calc(var(--spacing-1) + var(--size-control-sm) + var(--spacing-2));
87
+ }
88
+
89
+ /* A MEMBER'S BOX STANDS UNDER ITS GROUP'S. The bare Checkbox centres its box
90
+ on the square the pointer floor allows, which set the box half the
91
+ difference in from the row's edge, a few pixels right of the group's box
92
+ above it. That inset is taken back, and the pointer square reaches into
93
+ the row's padding instead. */
94
+ .crewlet-member-picker__members:not(.is-ungrouped) .crewlet-checkbox--bare {
95
+ margin-inline-start: calc((var(--crewlet-checkbox-size) - var(--size-target-min)) / 2);
96
+ }
97
+
98
+ .crewlet-member-picker__members.is-ungrouped {
99
+ border-top: 0;
100
+ background: transparent;
101
+ }
102
+
103
+ .crewlet-member-picker__members.is-ungrouped .crewlet-member-picker__member {
104
+ padding-inline-start: var(--spacing-3);
105
+ }
106
+
107
+ .crewlet-member-picker__avatar {
108
+ display: inline-flex;
109
+ flex: none;
110
+ }
111
+
112
+ /* The name and its line label the member's box, so they take the pointer a
113
+ Checkbox's own words take. */
114
+ .crewlet-member-picker__text {
115
+ display: flex;
116
+ flex-direction: column;
117
+ min-width: 0;
118
+ cursor: pointer;
119
+ }
120
+
121
+ .crewlet-member-picker__name {
122
+ overflow: hidden;
123
+ color: var(--color-text-primary);
124
+ font-size: var(--font-size-compact);
125
+ text-overflow: ellipsis;
126
+ white-space: nowrap;
127
+ }
128
+
129
+ .crewlet-member-picker__detail {
130
+ overflow: hidden;
131
+ color: var(--color-text-tertiary);
132
+ font-size: var(--font-size-xs);
133
+ text-overflow: ellipsis;
134
+ white-space: nowrap;
135
+ }
136
+
137
+ .crewlet-member-picker__mark {
138
+ color: var(--color-text-secondary);
139
+ font-size: var(--font-size-xs);
140
+ white-space: nowrap;
141
+ }
142
+
143
+ .crewlet-member-picker__member.is-left-out .crewlet-member-picker__name,
144
+ .crewlet-member-picker__mark.is-left-out {
145
+ color: var(--color-text-tertiary);
146
+ }
147
+
148
+ @media (width < 480px) {
149
+ .crewlet-member-picker__member {
150
+ grid-template-columns: auto auto minmax(0, 1fr);
151
+ padding-inline-start: var(--spacing-3);
152
+ }
153
+
154
+ .crewlet-member-picker__mark {
155
+ grid-column: 3;
156
+ }
157
+ }
158
+
159
+ /* A group's name is the row's title: the medium weight, at the list's 13px. */
160
+ .crewlet-member-picker__group-row .crewlet-checkbox__label {
161
+ font-weight: var(--font-weight-medium);
162
+ }
@@ -1,5 +1,5 @@
1
1
  export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-C42XW5YP.js';
2
- import '../chunk-36WK24AI.js';
2
+ import '../chunk-EVM6GYZ2.js';
3
3
  import '../chunk-AZYE7NR4.js';
4
4
  import '../chunk-MVKUE4FI.js';
5
5
  import '../chunk-EGMQURBR.js';
@@ -1,6 +1,6 @@
1
- export { PresenterView, formatStopwatch } from '../chunk-LMEMH6DO.js';
2
- import '../chunk-5AJR6X75.js';
1
+ export { PresenterView, formatStopwatch } from '../chunk-WCJTOKTY.js';
3
2
  import '../chunk-O6EV6GKI.js';
3
+ import '../chunk-5AJR6X75.js';
4
4
  import '../chunk-RK4XPHVG.js';
5
5
  import '../chunk-DGXZ635L.js';
6
6
  import '../chunk-XSPCITPN.js';
@@ -1,6 +1,6 @@
1
- export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, PROPOSAL_TONES, ProposalCard } from '../chunk-P7HMY3BQ.js';
1
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, PROPOSAL_TONES, ProposalCard } from '../chunk-M33DABTW.js';
2
2
  import '../chunk-ZWCK4N4L.js';
3
- import '../chunk-AOJ6ZA77.js';
3
+ import '../chunk-3MFRTZH6.js';
4
4
  import '../chunk-LR4IWUWQ.js';
5
5
  import '../chunk-FLW5U7YS.js';
6
6
  import '../chunk-LBGKLYBY.js';
@@ -8,7 +8,7 @@ import '../chunk-U2IQNDDR.js';
8
8
  import '../chunk-AV2DXAEL.js';
9
9
  import '../chunk-YQ7Q52XU.js';
10
10
  import '../chunk-CYQBDZ6M.js';
11
- import '../chunk-LVJGN5II.js';
11
+ import '../chunk-NAHA62WD.js';
12
12
  import '../chunk-O7N6W52M.js';
13
13
  import '../chunk-PGCLHYVP.js';
14
14
  import '../chunk-DGXZ635L.js';
@@ -0,0 +1,74 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type NavItemProps } from '../SidebarNav/index.js';
3
+ /** One of the groups a directory files its items in, and the rail's row for it. */
4
+ export interface RailListItem {
5
+ /** Unique among the items, and what `value` names. An empty key is a fine "All". */
6
+ key: string;
7
+ label: string;
8
+ /** How many items the group holds: a quiet figure at the row's end, and after the label in the folded picker. */
9
+ count?: number | undefined;
10
+ /**
11
+ * The group's own address, where the chosen group is kept in the page's
12
+ * address: the row is then a link a reader can open in a new tab, and a
13
+ * plain click still chooses it in place.
14
+ */
15
+ href?: string | undefined;
16
+ /** One quiet line about the group, said over the list while it is chosen: what the group holds. */
17
+ description?: ReactNode;
18
+ }
19
+ /** Every word the rail and its picker say, beyond the items' own labels. */
20
+ export interface RailListLabels {
21
+ /** What a count counts, read after the figure as part of the row's name: "apps" makes "Chat, 6 apps". */
22
+ counted: string;
23
+ /** A group as the folded picker names it: "Chat (6)". */
24
+ option: (label: string, count: number | undefined) => string;
25
+ }
26
+ export declare const RAIL_LIST_LABELS: RailListLabels;
27
+ export interface RailListProps {
28
+ /** Names the rail's navigation and the picker it folds into: "Categories", "Template kinds". */
29
+ label: string;
30
+ /** The groups, in the order the rail lists them; an "All" group is one of them, usually the first. */
31
+ items: readonly RailListItem[];
32
+ /** The chosen group's key. */
33
+ value: string;
34
+ onChange: (key: string) => void;
35
+ /**
36
+ * The bar across the top of the card, over the rail and the list: a search
37
+ * and filter chips. Where the card is too narrow for the rail, the picker
38
+ * it folds into joins this bar. Given as a function, it is handed the
39
+ * picker to place among its own controls; given as content, the picker
40
+ * leads the bar. Left out, the bar is drawn only to hold the picker.
41
+ */
42
+ toolbar?: ReactNode | ((picker: ReactNode) => ReactNode);
43
+ /** One quiet fact about the whole directory, under the rail's rows: what every item in it has in common. */
44
+ note?: ReactNode;
45
+ /** The list the chosen group shows: a grid, a list of tiles. */
46
+ children: ReactNode;
47
+ /** Draws each rail row's link, for a router that owns navigation (`SidebarNav`'s `renderLink`). */
48
+ renderLink?: NavItemProps['renderLink'];
49
+ labels?: Partial<RailListLabels> | undefined;
50
+ className?: string | undefined;
51
+ }
52
+ /**
53
+ * A directory in a card: a rail of the groups its items are filed in, beside
54
+ * the list of the chosen group, so a long catalogue reads as a few short
55
+ * lists: apps in what they are for, templates in their kinds, reports in
56
+ * the teams that read them.
57
+ *
58
+ * THE RAIL IS THE APPLICATION'S RAIL, DENSER (`SidebarNav` `dense`), each
59
+ * group a row with its count, the chosen one raised and `aria-current`, on a
60
+ * hairline of its own beside the list, with an optional quiet note under its
61
+ * rows. The chosen group's description, where it has one, stands over the
62
+ * list on a hairline, so a reader knows what the short list is.
63
+ *
64
+ * IT FOLDS BY ITS OWN WIDTH, NOT THE WINDOW'S. Under 44rem of the card's
65
+ * width the rail does not leave the list a readable column, so the rail goes
66
+ * and a `Select` of the same groups, named the same, joins the bar across the
67
+ * top. The same directory in a page and in a 560px sheet is one component
68
+ * with nothing to set: the sheet is simply narrow.
69
+ *
70
+ * Controlled: the chosen group is the caller's, often kept in the page's
71
+ * address (`href` on each group), so a group opened in a new tab and Back
72
+ * both keep it.
73
+ */
74
+ export declare function RailList({ label, items, value, onChange, toolbar, note, children, renderLink, labels: overrides, className, }: RailListProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './RailList.css';
2
+ export { RAIL_LIST_LABELS, RailList } from './RailList.js';
3
+ export type { RailListItem, RailListLabels, RailListProps } from './RailList.js';
@@ -0,0 +1,17 @@
1
+ export { RAIL_LIST_LABELS, RailList } from '../chunk-REWKR3S4.js';
2
+ import '../chunk-BRK3HXGZ.js';
3
+ import '../chunk-3IWZVEXA.js';
4
+ import '../chunk-O5CEG7TQ.js';
5
+ import '../chunk-YGRTX67J.js';
6
+ import '../chunk-TEV5REGB.js';
7
+ import '../chunk-HBDA76EZ.js';
8
+ import '../chunk-U2IQNDDR.js';
9
+ import '../chunk-AV2DXAEL.js';
10
+ import '../chunk-OMV5W53A.js';
11
+ import '../chunk-2YTOOH3A.js';
12
+ import '../chunk-TUEM2XIW.js';
13
+ import '../chunk-4ITETIGZ.js';
14
+ import '../chunk-D2GT3CR4.js';
15
+ import '../chunk-PQADV6P6.js';
16
+ import '../chunk-UT6CW3C7.js';
17
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,97 @@
1
+ /*
2
+ * RailList: a directory in a card, a rail of groups beside the chosen
3
+ * group's list, folding into a picker where the card is narrow
4
+ * (RailList.tsx).
5
+ *
6
+ * SIZED BY ITS OWN WIDTH, NOT THE WINDOW'S, because the same directory stands
7
+ * in a page and in a sheet: the root is an inline-size container, and under
8
+ * the rail's room (44rem) the rail goes and the picker shows. Both are always
9
+ * rendered and the stylesheet decides, so the fold costs no measurement and
10
+ * never draws the wrong one first.
11
+ */
12
+ .crewlet-rail-list {
13
+ container: crewlet-rail-list / inline-size;
14
+ min-width: 0;
15
+ }
16
+
17
+ /* The bar across the card's top: the caller's search and chips, and the folded picker. */
18
+ .crewlet-rail-list__bar {
19
+ display: flex;
20
+ flex-wrap: wrap;
21
+ align-items: center;
22
+ gap: var(--spacing-2);
23
+ padding: var(--spacing-3);
24
+ border-block-end: 1px solid var(--color-border-default);
25
+ }
26
+
27
+ /* Wide, the rail is the choice: the picker and a bar that holds nothing else are not drawn. */
28
+ .crewlet-rail-list__picker,
29
+ .crewlet-rail-list__bar--picker-only {
30
+ display: none;
31
+ }
32
+
33
+ /* The rail at a fixed width (13rem by default), the list taking the rest. */
34
+ .crewlet-rail-list__body {
35
+ display: grid;
36
+ grid-template-columns: var(--crewlet-rail-list-rail, 13rem) minmax(0, 1fr);
37
+ min-width: 0;
38
+ }
39
+
40
+ /* The rail on a hairline of its own, its note a step under its rows. */
41
+ .crewlet-rail-list__rail {
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: var(--spacing-3);
45
+ min-width: 0;
46
+ padding: var(--spacing-2);
47
+ border-inline-end: 1px solid var(--color-border-default);
48
+ }
49
+
50
+ /* The note starts on the rows' words, inside the dense rail's own inset. */
51
+ .crewlet-rail-list__note {
52
+ margin: 0;
53
+ padding-inline: var(--spacing-2);
54
+ }
55
+
56
+ .crewlet-rail-list__list {
57
+ display: flex;
58
+ flex-direction: column;
59
+ min-width: 0;
60
+ }
61
+
62
+ /* What the chosen group holds, over its list on a hairline, at the list's own inset. */
63
+ .crewlet-rail-list__about {
64
+ margin: 0;
65
+ padding: var(--spacing-2) var(--spacing-4);
66
+ border-block-end: 1px solid var(--color-border-default);
67
+ }
68
+
69
+ /*
70
+ * A GRID AT THE LIST'S TOP TAKES NO RULE OF ITS OWN. A grid in a card draws
71
+ * one rule above its head to part it from the card's head (DataGrid.css);
72
+ * here the bar's hairline, the description's or the card's own edge is
73
+ * already that rule, and the grid's drew a second line under it.
74
+ */
75
+ .crewlet-rail-list__list > .crewlet-data-grid:first-child,
76
+ .crewlet-rail-list__about + .crewlet-data-grid {
77
+ border-top: 0;
78
+ }
79
+
80
+ /* Under the rail's room the list takes the card, and the picker takes the rail's place in the bar. */
81
+ @container crewlet-rail-list (width < 44rem) {
82
+ .crewlet-rail-list__body {
83
+ grid-template-columns: minmax(0, 1fr);
84
+ }
85
+
86
+ .crewlet-rail-list__rail {
87
+ display: none;
88
+ }
89
+
90
+ .crewlet-rail-list__picker {
91
+ display: inline-flex;
92
+ }
93
+
94
+ .crewlet-rail-list__bar--picker-only {
95
+ display: flex;
96
+ }
97
+ }
@@ -1,5 +1,5 @@
1
- export { RelatedRow } from '../chunk-EAHEJNVJ.js';
2
- import '../chunk-QP2P6GDQ.js';
1
+ export { RelatedRow } from '../chunk-CL3FWLDO.js';
2
+ import '../chunk-O5CEG7TQ.js';
3
3
  import '../chunk-ZAC7SKUN.js';
4
4
  import '../chunk-U2IQNDDR.js';
5
5
  import '../chunk-AV2DXAEL.js';
@@ -1,4 +1,4 @@
1
- export { RichEditor, preloadRichEditor } from '../chunk-AUSFKGKL.js';
1
+ export { RichEditor, preloadRichEditor } from '../chunk-3AMWXJQX.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,7 +1,7 @@
1
- export { RUN_STATES, RunChip } from '../chunk-X7VZQKIW.js';
2
- import '../chunk-RJWO2PC5.js';
1
+ export { RUN_STATES, RunChip } from '../chunk-AQ7ZV3CH.js';
2
+ import '../chunk-TMML7BHT.js';
3
3
  import '../chunk-CYQBDZ6M.js';
4
- import '../chunk-LVJGN5II.js';
4
+ import '../chunk-NAHA62WD.js';
5
5
  import '../chunk-XSPCITPN.js';
6
6
  import '../chunk-ULYHDP7U.js';
7
7
  import '../chunk-D2GT3CR4.js';
@@ -1,4 +1,4 @@
1
- import '../chunk-36WK24AI.js';
1
+ import '../chunk-EVM6GYZ2.js';
2
2
  export { SegmentedControl } from '../chunk-AZYE7NR4.js';
3
3
  import '../chunk-MVKUE4FI.js';
4
4
  import '../chunk-EGMQURBR.js';
@@ -136,6 +136,17 @@
136
136
  background: var(--color-brand-accent);
137
137
  }
138
138
 
139
+ /* A COUNT IN A CHIP IS A FIGURE IN THE CHIP'S OWN INK, as on a FilterChip and
140
+ a lens chip: no pill of its own, since a box inside a box beside its word
141
+ says nothing more. On the chosen chip the inset pill's tertiary figure lay
142
+ on the accent fill at 1.4:1; inheriting, it is the label's on-accent ink. */
143
+ .crewlet-segmented--chips .crewlet-count {
144
+ min-width: 0;
145
+ padding: 0;
146
+ background: none;
147
+ color: inherit;
148
+ }
149
+
139
150
  /* What completes the last choice sits in the row, at the chips' own height
140
151
  and in their face: a field at its own control step stood taller than every
141
152
  chip beside it. */
@@ -1,9 +1,9 @@
1
- export { SetupWizard } from '../chunk-K6RWEQ6P.js';
2
- import '../chunk-RJWO2PC5.js';
1
+ export { SetupWizard } from '../chunk-WRZPO4YL.js';
2
+ import '../chunk-TMML7BHT.js';
3
3
  import '../chunk-FPDIHEM4.js';
4
4
  import '../chunk-YJQXESOJ.js';
5
5
  import '../chunk-CYQBDZ6M.js';
6
- import '../chunk-LVJGN5II.js';
6
+ import '../chunk-NAHA62WD.js';
7
7
  import '../chunk-XSPCITPN.js';
8
8
  import '../chunk-ULYHDP7U.js';
9
9
  import '../chunk-D2GT3CR4.js';
@@ -1,10 +1,10 @@
1
- export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-AQNP3KQU.js';
1
+ export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-Y7PPKQFQ.js';
2
2
  import '../chunk-3IWZVEXA.js';
3
3
  import '../chunk-ZXXZESCD.js';
4
- import '../chunk-T5GBTXNC.js';
4
+ import '../chunk-YGRTX67J.js';
5
+ import '../chunk-ETNQYT5O.js';
5
6
  import '../chunk-STJ7QBC3.js';
6
7
  import '../chunk-DTIW4CHZ.js';
7
- import '../chunk-YGRTX67J.js';
8
8
  import '../chunk-BPCY7ZID.js';
9
9
  import '../chunk-HF5L56YQ.js';
10
10
  import '../chunk-YTLWOHOY.js';
@@ -35,7 +35,8 @@
35
35
  }
36
36
 
37
37
  .crewlet-step-mark--refused,
38
- .crewlet-step-mark--stopped {
38
+ .crewlet-step-mark--stopped,
39
+ .crewlet-step-mark--pending {
39
40
  color: var(--color-text-tertiary);
40
41
  }
41
42
 
@@ -88,6 +89,16 @@
88
89
  overflow-wrap: anywhere;
89
90
  }
90
91
 
92
+ /*
93
+ * A STEP THAT HAS NOT STARTED IS QUIET THROUGH: its words take the tertiary
94
+ * ink its mark and its detail already have, so the whole step reads as one
95
+ * thing still to come rather than as a label in full ink beside a dimmed
96
+ * mark.
97
+ */
98
+ .crewlet-step-list__step--pending .crewlet-step-list__label {
99
+ color: var(--color-text-tertiary);
100
+ }
101
+
91
102
  /*
92
103
  * WHAT THE STEP ASKED FOR, in the mono face. Each piece between separators is
93
104
  * one inline block, so a line breaks only between pieces (at a space, or
@@ -5,10 +5,12 @@ import { type HTMLAttributes, type ReactNode } from 'react';
5
5
  * request finish, fail or are refused on their own: `running` while it works,
6
6
  * `done`, `failed` (the system could not do it), `refused` (the person's own
7
7
  * access does not allow it), `stopped` (the person stopped the request before
8
- * it finished) and `waiting` (it waits on the person's approval).
8
+ * it finished), `waiting` (it waits on the person's approval) and `pending`
9
+ * (it has not started: the request has not reached it yet, or ended before
10
+ * it, as the steps after a failed check that the check never got to).
9
11
  */
10
- export type StepState = 'running' | 'done' | 'failed' | 'refused' | 'stopped' | 'waiting';
11
- export declare const STEP_STATES: readonly ["running", "done", "failed", "refused", "stopped", "waiting"];
12
+ export type StepState = 'running' | 'done' | 'failed' | 'refused' | 'stopped' | 'waiting' | 'pending';
13
+ export declare const STEP_STATES: readonly ["running", "done", "failed", "refused", "stopped", "waiting", "pending"];
12
14
  /** The words each state is said with, after the step's own words: "Read token spend by agent, Done". */
13
15
  export type StepStateLabels = Record<StepState, string>;
14
16
  export declare const STEP_STATE_LABELS: StepStateLabels;
@@ -20,7 +22,8 @@ export interface StepStateMarkProps {
20
22
  * A state's mark in its 16px box: the 14px glyph, or the spinner at the same
21
23
  * size while it runs, so nothing moves when the ring becomes a check. Running
22
24
  * takes the secondary ink, done the success ink, failed the danger ink,
23
- * waiting the warning ink, and refused and stopped the tertiary ink. One
25
+ * waiting the warning ink, and refused, stopped and pending the tertiary
26
+ * ink; pending is a dashed circle, the outline of a step still to come. One
24
27
  * mark for a request's steps and for the request's own state (`RunChip`),
25
28
  * which is what makes them one column.
26
29
  */
@@ -1,4 +1,4 @@
1
- export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from '../chunk-RJWO2PC5.js';
1
+ export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from '../chunk-TMML7BHT.js';
2
2
  import '../chunk-CYQBDZ6M.js';
3
3
  import '../chunk-XSPCITPN.js';
4
4
  import '../chunk-UT6CW3C7.js';
@@ -151,3 +151,63 @@ export type TableTextCellProps = {
151
151
  * would draw the column's answer over the row's.
152
152
  */
153
153
  export declare function TableTextCell({ children, icon, mark }: TableTextCellProps): import("react").JSX.Element;
154
+ /** Which of a two-line cell's lines is a literal, set in the mono face. */
155
+ export type TableTwoLineCellMono = 'value' | 'detail' | 'both';
156
+ export type TableTwoLineCellProps = {
157
+ /** The value, in the cell's own register: a name, a key, a short state. */
158
+ value: ReactNode;
159
+ /**
160
+ * The quieter line under it, a caption in the secondary ink: where it runs,
161
+ * the id it resolves to, when it last answered. Left out, the cell is the
162
+ * value's one line, at the same place a row of two-line cells puts it.
163
+ */
164
+ detail?: ReactNode;
165
+ /**
166
+ * Which line is a literal (a command, an id, a key), set in the mono face:
167
+ * in the sans face `--` and `=` read as prose.
168
+ */
169
+ mono?: TableTwoLineCellMono | undefined;
170
+ /**
171
+ * The whole cell's hover text, where the two lines are not the whole story
172
+ * (a model's CLI, key and id in one line). Given, neither line adds its own.
173
+ */
174
+ title?: string | undefined;
175
+ /**
176
+ * Whether a cut line carries its whole words as its title (`Text`'s
177
+ * `titleWhenCut`). On by default. Off where something else already shows
178
+ * them, a `Tooltip` around the cell.
179
+ */
180
+ titleWhenCut?: boolean | undefined;
181
+ } & ({
182
+ /**
183
+ * A mark every row of the column wears, centred against the two lines.
184
+ * The header carries the meaning, so it is drawn as decoration.
185
+ */
186
+ icon?: ReactNode;
187
+ mark?: never;
188
+ } | {
189
+ icon?: never;
190
+ /**
191
+ * A mark that varies per row and states a fact of its own (a vendor, the
192
+ * CLI a model runs on), centred against the two lines. It brings its own
193
+ * accessible name and is read.
194
+ */
195
+ mark: ReactNode;
196
+ });
197
+ /**
198
+ * A value over a quieter line, each cut on one line: a name over where it
199
+ * runs, a key over the id it resolves to, a short state over when it began.
200
+ *
201
+ * TWO LINES IN TWO REGISTERS, ALWAYS THE SAME TWO, so every two-line cell in a
202
+ * table reads alike: the value in the cell's own register (it inherits the
203
+ * grid's size and ink), the line under it a caption in the secondary ink. A
204
+ * row of them is as tall as two lines whatever they hold, because each line
205
+ * is cut with an ellipsis rather than wrapped, and its whole words are on its
206
+ * title while it is cut (`Text`'s `truncate`).
207
+ *
208
+ * A MARK STANDS CENTRED AGAINST BOTH LINES, the way a vendor's mark stands
209
+ * beside a service's name and host. In a grid's stacked rows the lines, not
210
+ * the mark, give the row its baseline, so a column's label stands on the
211
+ * value's line (DataGrid.css).
212
+ */
213
+ export declare function TableTwoLineCell({ value, detail, mono, title, titleWhenCut, icon, mark, }: TableTwoLineCellProps): import("react").JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import './TableCells.css';
2
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell, } from './TableCells.js';
3
- export type { TableDateCellProps, TableEntityCellProps, TableKeyCellProps, TableNumberCellProps, TableStatusCellProps, TableTagsCellLabels, TableTagsCellProps, TableTextCellProps, } from './TableCells.js';
2
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell, TableTwoLineCell, } from './TableCells.js';
3
+ export type { TableDateCellProps, TableEntityCellProps, TableKeyCellProps, TableNumberCellProps, TableStatusCellProps, TableTagsCellLabels, TableTagsCellProps, TableTextCellProps, TableTwoLineCellMono, TableTwoLineCellProps, } from './TableCells.js';
@@ -1,4 +1,5 @@
1
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-AFLS26AC.js';
1
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell, TableTwoLineCell } from '../chunk-3CALM534.js';
2
+ import '../chunk-O5CEG7TQ.js';
2
3
  import '../chunk-QF5UNP4T.js';
3
4
  import '../chunk-LBGKLYBY.js';
4
5
  import '../chunk-EJNJMHQG.js';
@@ -112,3 +112,31 @@
112
112
  font-size: var(--font-size-xs);
113
113
  font-variant-numeric: tabular-nums;
114
114
  }
115
+
116
+ /*
117
+ * A VALUE OVER A QUIETER LINE (TableTwoLineCell), each line its own block cut
118
+ * on one line. A column of boxes rather than two runs of text, so neither
119
+ * line takes the line box of the words around it, and the cell is exactly
120
+ * the two lines tall. `min-width: 0` lets the column shrink inside a grid's
121
+ * cell, which is what cuts the lines rather than pushing the column wider.
122
+ */
123
+ .crewlet-table-cell__lines {
124
+ display: flex;
125
+ flex-direction: column;
126
+ min-width: 0;
127
+ max-width: 100%;
128
+ }
129
+
130
+ /* The mark is centred against both lines, as an entity's badge is against its name. */
131
+ .crewlet-table-cell__two-line {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ gap: var(--spacing-2);
135
+ min-width: 0;
136
+ max-width: 100%;
137
+ }
138
+
139
+ /* The mark keeps its size: the lines give way to the column, never the mark. */
140
+ .crewlet-table-cell__two-line > :first-child {
141
+ flex: none;
142
+ }