@crewlethq/ui 0.84.2 → 0.85.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 (77) hide show
  1. package/README.md +36 -2
  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/DeepWorkCard/index.js +3 -3
  27. package/dist/Disclosure/Disclosure.d.ts +10 -1
  28. package/dist/Disclosure/index.js +1 -1
  29. package/dist/{Disclosure-D727FN5X.css → Disclosure-RJSKKO7Z.css} +20 -0
  30. package/dist/LogoSlot/index.js +3 -3
  31. package/dist/MarkdownEditor/index.js +1 -1
  32. package/dist/MemberPicker/MemberPicker.d.ts +86 -0
  33. package/dist/MemberPicker/index.d.ts +3 -0
  34. package/dist/MemberPicker/index.js +11 -0
  35. package/dist/MemberPicker-ZD35VEK6.css +162 -0
  36. package/dist/MergeConflicts/index.js +1 -1
  37. package/dist/ProposalCard/index.js +3 -3
  38. package/dist/RunChip/index.js +3 -3
  39. package/dist/SegmentedControl/index.js +1 -1
  40. package/dist/{SegmentedControl-B7XCUOML.css → SegmentedControl-7GY2KM44.css} +11 -0
  41. package/dist/SetupWizard/index.js +3 -3
  42. package/dist/ShareDialog/index.js +2 -2
  43. package/dist/{StepList-A4YVU4JI.css → StepList-OAJ45IBX.css} +12 -1
  44. package/dist/Stepper/StepList.d.ts +7 -4
  45. package/dist/Stepper/index.js +1 -1
  46. package/dist/ThemeSwitcher/index.js +1 -1
  47. package/dist/TimeRangePicker/index.js +1 -1
  48. package/dist/VersionCompare/index.js +1 -1
  49. package/dist/{chunk-CV2LU2T2.js → chunk-35CKF77R.js} +2 -2
  50. package/dist/{chunk-K6RWEQ6P.js → chunk-3BVNNQZY.js} +2 -2
  51. package/dist/{chunk-AOJ6ZA77.js → chunk-3MFRTZH6.js} +1 -1
  52. package/dist/{chunk-QSWQJX27.js → chunk-4ME4J3YY.js} +1 -1
  53. package/dist/{chunk-6FBPFG3C.js → chunk-6EZX26BD.js} +1 -1
  54. package/dist/chunk-AELKT34H.js +121 -0
  55. package/dist/{chunk-X7VZQKIW.js → chunk-AQ7ZV3CH.js} +1 -1
  56. package/dist/{chunk-XNC3M4IN.js → chunk-E2QPZGLG.js} +1 -1
  57. package/dist/{chunk-T5GBTXNC.js → chunk-ETNQYT5O.js} +1 -1
  58. package/dist/{chunk-36WK24AI.js → chunk-EVM6GYZ2.js} +1 -1
  59. package/dist/{chunk-B7NX425Z.js → chunk-JDMJVVVQ.js} +12 -4
  60. package/dist/chunk-KA4RBKQV.js +148 -0
  61. package/dist/{chunk-ABRWL5FJ.js → chunk-L2QRKIL4.js} +3 -2
  62. package/dist/{chunk-P7HMY3BQ.js → chunk-M33DABTW.js} +2 -2
  63. package/dist/{chunk-LVJGN5II.js → chunk-NAHA62WD.js} +3 -1
  64. package/dist/{chunk-6SFDL4QH.js → chunk-P3LNA6G4.js} +1 -1
  65. package/dist/{chunk-WMO722J2.js → chunk-TBQFZV4H.js} +1 -1
  66. package/dist/{chunk-RJWO2PC5.js → chunk-TMML7BHT.js} +14 -5
  67. package/dist/{chunk-DD7RBNT4.js → chunk-XH55NRHO.js} +1 -1
  68. package/dist/{chunk-6RW2MUTY.js → chunk-XU7RQNT6.js} +1 -1
  69. package/dist/{chunk-AQNP3KQU.js → chunk-Y7PPKQFQ.js} +1 -1
  70. package/dist/generated/index.d.ts +2 -0
  71. package/dist/generated/index.js +72 -70
  72. package/dist/index.js +72 -70
  73. package/dist/styles.css +587 -29
  74. package/package.json +3 -3
  75. package/dist/{chunk-22CU7V4J.js → chunk-K2HEYQJL.js} +1 -1
  76. package/dist/{chunk-REEZQCML.js → chunk-VIX3GZCD.js} +0 -0
  77. package/dist/{chunk-2ZSCHQOA.js → chunk-WMSXPF7T.js} +1 -1
@@ -6,8 +6,14 @@
6
6
  * which is the focus ring's colour.
7
7
  */
8
8
  .crewlet-choice-list {
9
- /* The platform's radio, sized here so a panel can line up with the text beside it. */
10
- --crewlet-choice-list-radio-size: 13px;
9
+ /*
10
+ * THE COMPACT CONTROL STEP, the box a compact Checkbox draws beside the same
11
+ * 13px words: a control takes the step of the text it sits beside (16px
12
+ * beside 14px, 14px beside 13px), and at 13px this radio matched no other
13
+ * control in the kit, so a list nested under a card's 16px radio, or beside
14
+ * a compact checkbox, drew a third size.
15
+ */
16
+ --crewlet-choice-list-radio-size: 14px;
11
17
  /* The step between two answers. Every row's pointer target reaches half of it. */
12
18
  --crewlet-choice-list-gap: var(--spacing-1);
13
19
  /*
@@ -133,7 +139,8 @@
133
139
  box-sizing: border-box;
134
140
  width: var(--crewlet-choice-list-radio-size);
135
141
  height: var(--crewlet-choice-list-radio-size);
136
- margin: 3px 0 0;
142
+ /* Centred on the label's first line: its 13px in the body's leading. */
143
+ margin: calc((var(--font-size-compact) * var(--font-line-height-body) - var(--crewlet-choice-list-radio-size)) / 2) 0 0;
137
144
  border: 1px solid var(--color-border-control);
138
145
  border-radius: 50%;
139
146
  background: transparent;
@@ -175,28 +182,37 @@
175
182
  overflow-wrap: anywhere;
176
183
  }
177
184
 
178
- /* Why a disabled choice cannot be made, after its detail on the same line, in the warning ink. */
185
+ /*
186
+ * WHY A DISABLED CHOICE CANNOT BE MADE, on a line of its own under the
187
+ * detail, in the warning ink, as a ChoiceCards card puts it on its own row.
188
+ * Run on after the detail, it read as the detail's next clause, and in a
189
+ * narrow column it wrapped wherever the detail happened to end.
190
+ */
179
191
  .crewlet-choice-list__reason {
192
+ display: block;
180
193
  color: var(--color-feedback-warning-ink);
181
194
  }
182
195
 
183
- .crewlet-choice-list__detail > .crewlet-choice-list__reason:not(:first-child) {
184
- margin-inline-start: var(--spacing-2);
185
- }
186
-
187
- /* A tag says something ABOUT an answer ("Suggested"), so it is set in the
188
- tertiary ink: in the accent ink it was a second accent mark on the chosen
189
- row, beside the radio and the fill that already say which one is chosen. */
196
+ /* A tag says something ABOUT an answer ("Recommended"), so it is set in a
197
+ quiet ink: in the accent ink it was a second accent mark on the chosen row,
198
+ beside the radio and the fill that already say which one is chosen. It is
199
+ the pill a ChoiceCards card draws its tag in, so one word beside a choice's
200
+ name reads the same in a list as on a card in the same step, where it was an
201
+ 11px capital label here and a pill there. It stands on the label's line. */
190
202
  .crewlet-choice-list__tag {
191
- padding-top: 2px;
192
- font-size: var(--font-size-2xs);
193
- font-weight: 500;
194
- letter-spacing: 0.05em;
195
- text-transform: uppercase;
196
- color: var(--color-text-tertiary);
203
+ padding: 0 var(--spacing-2);
204
+ border: 1px solid var(--color-border-default);
205
+ border-radius: var(--radius-pill);
206
+ color: var(--color-text-secondary);
207
+ font-size: var(--font-size-xs);
197
208
  white-space: nowrap;
198
209
  }
199
210
 
211
+ /* On the selected fill the default edge all but vanishes in light, so the tag takes the strong one, as a chosen card's does. */
212
+ .crewlet-choice-list__row.is-checked .crewlet-choice-list__tag {
213
+ border-color: var(--color-border-strong);
214
+ }
215
+
200
216
  /* A SELECTED CHOICE'S PANEL is part of the choice: it continues the row's
201
217
  fill under it, and its content starts where the label does, not under the
202
218
  radio. */
@@ -1,5 +1,5 @@
1
- export { CodeBlock } from '../chunk-QSWQJX27.js';
2
- import '../chunk-T5GBTXNC.js';
1
+ export { CodeBlock } from '../chunk-4ME4J3YY.js';
2
+ import '../chunk-ETNQYT5O.js';
3
3
  import '../chunk-STJ7QBC3.js';
4
4
  import '../chunk-DTIW4CHZ.js';
5
5
  import '../chunk-DGXZ635L.js';
@@ -1,5 +1,5 @@
1
- export { ColorSwatch } from '../chunk-6FBPFG3C.js';
2
- import '../chunk-T5GBTXNC.js';
1
+ export { ColorSwatch } from '../chunk-6EZX26BD.js';
2
+ import '../chunk-ETNQYT5O.js';
3
3
  import '../chunk-STJ7QBC3.js';
4
4
  import '../chunk-DTIW4CHZ.js';
5
5
  import '../chunk-7W3LYIOC.js';
@@ -1,6 +1,6 @@
1
- export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from '../chunk-2ZSCHQOA.js';
2
- import '../chunk-LBGKLYBY.js';
1
+ export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from '../chunk-WMSXPF7T.js';
3
2
  import '../chunk-7W3LYIOC.js';
3
+ import '../chunk-LBGKLYBY.js';
4
4
  import '../chunk-CYQBDZ6M.js';
5
5
  import '../chunk-UT6CW3C7.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { ContrastHelp } from '../chunk-WMO722J2.js';
2
- import '../chunk-2ZSCHQOA.js';
1
+ export { ContrastHelp } from '../chunk-TBQFZV4H.js';
2
+ import '../chunk-WMSXPF7T.js';
3
+ import '../chunk-7W3LYIOC.js';
3
4
  import '../chunk-LBGKLYBY.js';
4
5
  import '../chunk-EC6EUIAD.js';
5
- import '../chunk-7W3LYIOC.js';
6
6
  import '../chunk-CYQBDZ6M.js';
7
7
  import '../chunk-L72URIHR.js';
8
8
  import '../chunk-OMV5W53A.js';
@@ -1,4 +1,4 @@
1
- export { CopyButton, Copyable } from '../chunk-T5GBTXNC.js';
1
+ export { CopyButton, Copyable } from '../chunk-ETNQYT5O.js';
2
2
  import '../chunk-STJ7QBC3.js';
3
3
  import '../chunk-DTIW4CHZ.js';
4
4
  import '../chunk-DGXZ635L.js';
@@ -78,11 +78,15 @@
78
78
 
79
79
  /* ---- inline ------------------------------------------------------------ */
80
80
 
81
+ /* INLINE TAKES THE ROW'S OWN REGISTER: in a detail row it is one of the
82
+ row's values, so it is their size and ink, in the mono face. At a fixed
83
+ 12px in the secondary ink, an address was the one value in its list a step
84
+ smaller and quieter than the values around it. */
81
85
  .crewlet-copyable--inline .crewlet-copyable__value {
82
- font-size: var(--font-size-xs);
86
+ font-size: inherit;
83
87
  background: transparent;
84
88
  padding: 0;
85
- color: var(--color-text-secondary);
89
+ color: inherit;
86
90
  }
87
91
 
88
92
  /* ---- block ------------------------------------------------------------- */
@@ -103,13 +107,23 @@
103
107
  padding: var(--spacing-2) var(--spacing-3);
104
108
  }
105
109
 
110
+ /*
111
+ * A BLOCK SHOWS ITS VALUE WHOLE, wrapped at any character and with every
112
+ * space kept: it is the variant for an address a reader must allowlist or a
113
+ * command they must check before running it. Held to one line, it scrolled
114
+ * past a phone's width behind an ellipsis, with no scrollbar to say there was
115
+ * more, and the reader saw "https://example.com/webho…" of the address they
116
+ * were asked to copy into a vendor's form.
117
+ */
106
118
  .crewlet-copyable--block .crewlet-copyable__value {
107
119
  font-size: var(--font-size-compact);
108
120
  color: var(--color-text-primary);
109
121
  background: transparent;
110
122
  padding: 0;
111
- white-space: nowrap;
112
- overflow-x: auto;
123
+ white-space: pre-wrap;
124
+ overflow: visible;
125
+ overflow-wrap: anywhere;
126
+ text-overflow: clip;
113
127
  flex: 1;
114
128
  }
115
129
 
@@ -1,4 +1,4 @@
1
- export { ChooserList, ColumnChooser, DATA_GRID_ICON_TRACK, DataGrid, columnChoicesOf, countDataGridRows, fitGridColumns, nextGridSort, parseGridSort, useAnyDataGridDriving, useDataGridDriving } from '../chunk-ABRWL5FJ.js';
1
+ export { ChooserList, ColumnChooser, DATA_GRID_ICON_TRACK, DataGrid, columnChoicesOf, countDataGridRows, fitGridColumns, nextGridSort, parseGridSort, useAnyDataGridDriving, useDataGridDriving } from '../chunk-L2QRKIL4.js';
2
2
  import '../chunk-YQ7Q52XU.js';
3
3
  import '../chunk-YJQXESOJ.js';
4
4
  import '../chunk-PPUR46MK.js';
@@ -665,6 +665,63 @@ button.crewlet-data-grid__row-link {
665
665
  overflow-wrap: anywhere;
666
666
  }
667
667
 
668
+ /* A VALUE THAT LEADS WITH A PICTURE IS NAMED ON ITS WORDS' LINE. The name
669
+ stands on the value's first baseline, and a row of a mark beside two lines
670
+ (a vendor's mark beside a name and its host) reads its baseline off its
671
+ first item, the picture, whose baseline is its bottom edge: the name stood
672
+ on the second line. The words after the picture take part in baseline
673
+ alignment instead, so the row's baseline is theirs; beside a picture no
674
+ taller than they are, they keep the place they had.
675
+ ONLY A PICTURE WITH NO WORDS OF ITS OWN: an svg or an img, or a box that
676
+ holds nothing but one. A monogram avatar or an avatar stack has its
677
+ initials' baseline already, and its name stood on its line; matched by its
678
+ role, the shorter words beside it rose to the top of the row, off the
679
+ picture's centre. */
680
+ :where(.crewlet-data-grid[data-stacked])
681
+ .crewlet-data-grid__cell
682
+ > *
683
+ > :is(svg, img, :has(> :is(svg, img)):not(:has(> :not(svg, img)))):first-child
684
+ + * {
685
+ align-self: baseline;
686
+ }
687
+
688
+ /* THE ROW'S ACTIONS STAND ON ITS FIRST LINE, at its end, as a card's head
689
+ carries its menu. On a line of their own after every value they sat alone
690
+ under the names, with nothing beside them to say whose they were. */
691
+ :where(.crewlet-data-grid[data-stacked]:not([data-phone-rows='compact']))
692
+ .crewlet-data-grid__row:has(> .crewlet-data-grid__cell--action) {
693
+ display: grid;
694
+ grid-template-columns: minmax(0, 1fr) auto;
695
+ align-items: start;
696
+ column-gap: var(--spacing-2);
697
+ }
698
+
699
+ :where(.crewlet-data-grid[data-stacked]:not([data-phone-rows='compact']))
700
+ .crewlet-data-grid__row:has(> .crewlet-data-grid__cell--action)
701
+ > .crewlet-data-grid__cell:not(.crewlet-data-grid__cell--action) {
702
+ grid-column: 1;
703
+ }
704
+
705
+ /* ONLY THE FIRST LINE SHARES ITS WIDTH WITH THE ACTIONS. Their track is sized
706
+ to them, and a line held to the other track gave that width up with nothing
707
+ beside it: every line of a card ended a third of a phone's row short of its
708
+ edge, and its value wrapped. Every line after the first (a value with
709
+ nothing in it draws none) spans the row. */
710
+ :where(.crewlet-data-grid[data-stacked]:not([data-phone-rows='compact']))
711
+ .crewlet-data-grid__row:has(> .crewlet-data-grid__cell--action)
712
+ > .crewlet-data-grid__cell:not(.crewlet-data-grid__cell--action):not(:empty)
713
+ ~ .crewlet-data-grid__cell:not(.crewlet-data-grid__cell--action) {
714
+ grid-column: 1 / -1;
715
+ }
716
+
717
+ :where(.crewlet-data-grid[data-stacked]:not([data-phone-rows='compact']))
718
+ .crewlet-data-grid__row
719
+ > .crewlet-data-grid__cell--action {
720
+ grid-column: 2;
721
+ grid-row: 1;
722
+ align-self: center;
723
+ }
724
+
668
725
  /* ---- THE COMPACT ROW (`phoneRows="compact"`) ---------------------------
669
726
  TWO LINES, NO LABELS: what the row is, then its marks. One flex run that
670
727
  breaks once: the lead cells first, a zero-height full-width `::after`
@@ -1,5 +1,5 @@
1
- export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-CV2LU2T2.js';
2
- import '../chunk-RJWO2PC5.js';
1
+ export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-35CKF77R.js';
2
+ import '../chunk-TMML7BHT.js';
3
3
  import '../chunk-ZWCK4N4L.js';
4
4
  import '../chunk-RQFRRPV6.js';
5
5
  import '../chunk-FLW5U7YS.js';
@@ -7,7 +7,7 @@ import '../chunk-LBGKLYBY.js';
7
7
  import '../chunk-U2IQNDDR.js';
8
8
  import '../chunk-AV2DXAEL.js';
9
9
  import '../chunk-CYQBDZ6M.js';
10
- import '../chunk-LVJGN5II.js';
10
+ import '../chunk-NAHA62WD.js';
11
11
  import '../chunk-DGXZ635L.js';
12
12
  import '../chunk-XSPCITPN.js';
13
13
  import '../chunk-ULYHDP7U.js';
@@ -35,6 +35,15 @@ export interface DisclosureProps extends Omit<HTMLAttributes<HTMLDivElement>, 't
35
35
  lazy?: boolean | undefined;
36
36
  variant?: DisclosureVariant | undefined;
37
37
  size?: DisclosureSize | undefined;
38
+ /**
39
+ * Its chevron and its panel start on the line its box starts on: the
40
+ * trigger's inset is taken back at the start, so only its hover ground and
41
+ * ring reach past the line, and the panel takes no inset of its own. For a
42
+ * section opened under a line of text (a request's arguments under the
43
+ * sentence that asks for it), whose chevron and content then stand on the
44
+ * words' own edge, as a flush Button does.
45
+ */
46
+ flush?: boolean | undefined;
38
47
  /**
39
48
  * The heading the trigger is wrapped in. Defaults to the level the
40
49
  * surrounding surface declares, so the same section is an `h3` on a page
@@ -53,4 +62,4 @@ export interface DisclosureProps extends Omit<HTMLAttributes<HTMLDivElement>, 't
53
62
  * controls outside its summary. Two expanders that behave the same and look
54
63
  * different is the specific thing a component library exists to stop.
55
64
  */
56
- export declare function Disclosure({ title, meta, count, mono, actions, open: controlledOpen, defaultOpen, onOpenChange, lazy, variant, size, headingLevel, className, children, ...rest }: DisclosureProps): import("react").JSX.Element;
65
+ export declare function Disclosure({ title, meta, count, mono, actions, open: controlledOpen, defaultOpen, onOpenChange, lazy, variant, size, flush, headingLevel, className, children, ...rest }: DisclosureProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { Disclosure } from '../chunk-LVJGN5II.js';
1
+ export { Disclosure } from '../chunk-NAHA62WD.js';
2
2
  export { DisclosureAnatomy } from '../chunk-ULYHDP7U.js';
3
3
  import '../chunk-D2GT3CR4.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -217,6 +217,26 @@
217
217
  padding: var(--spacing-1) var(--spacing-2);
218
218
  }
219
219
 
220
+ /*
221
+ * FLUSH: the chevron and the panel start on the line the words around the
222
+ * section start on. The trigger's start inset is taken back (its hover ground
223
+ * and its inset ring reach into the gutter instead, as a flush Button's do),
224
+ * and the panel keeps no inset of either side. Inset, a section opened under
225
+ * a sentence put its chevron and its content a step in from that sentence.
226
+ */
227
+ .crewlet-disclosure--flush .crewlet-disclosure__trigger {
228
+ margin-inline-start: calc(-1 * var(--spacing-2));
229
+ width: calc(100% + var(--spacing-2));
230
+ }
231
+
232
+ .crewlet-disclosure--flush .crewlet-disclosure__bar > .crewlet-disclosure__trigger {
233
+ width: auto;
234
+ }
235
+
236
+ .crewlet-disclosure--flush .crewlet-disclosure__panel {
237
+ padding-inline: 0;
238
+ }
239
+
220
240
  /*
221
241
  * An aside: what was considered, not what was decided. The rule down its edge
222
242
  * is what lets a reader skip the block by its shape.
@@ -1,8 +1,8 @@
1
- export { LogoSlot, LogoSlotGroup } from '../chunk-6SFDL4QH.js';
1
+ export { LogoSlot, LogoSlotGroup } from '../chunk-P3LNA6G4.js';
2
2
  import '../chunk-KQWJWTED.js';
3
- import '../chunk-2ZSCHQOA.js';
4
- import '../chunk-LBGKLYBY.js';
3
+ import '../chunk-WMSXPF7T.js';
5
4
  import '../chunk-7W3LYIOC.js';
5
+ import '../chunk-LBGKLYBY.js';
6
6
  import '../chunk-CYQBDZ6M.js';
7
7
  import '../chunk-DGXZ635L.js';
8
8
  import '../chunk-XSPCITPN.js';
@@ -1,6 +1,6 @@
1
1
  export { MARKDOWN_FORMATS, MARKDOWN_TEXT_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-TQKQRS2J.js';
2
2
  import '../chunk-NXFTCPF6.js';
3
- import '../chunk-36WK24AI.js';
3
+ import '../chunk-EVM6GYZ2.js';
4
4
  import '../chunk-AZYE7NR4.js';
5
5
  import '../chunk-MVKUE4FI.js';
6
6
  import '../chunk-EGMQURBR.js';
@@ -0,0 +1,86 @@
1
+ import { type ReactNode } from 'react';
2
+ /** One member a group holds: an agent, a person. */
3
+ export interface MemberPickerMember {
4
+ /** Stable identity, and what the value names. */
5
+ key: string;
6
+ /** The member's name: its checkbox's name. */
7
+ name: string;
8
+ /** One quiet line under the name: what it does, its role. */
9
+ detail?: ReactNode;
10
+ /** Its face, decorative beside the name: an avatar. */
11
+ avatar?: ReactNode;
12
+ }
13
+ /** A group of members granted as one: a team, whose grant reaches members who join it later. */
14
+ export interface MemberPickerGroup {
15
+ key: string;
16
+ /** The group's name: its checkbox's name. */
17
+ label: string;
18
+ members: readonly MemberPickerMember[];
19
+ }
20
+ /**
21
+ * What is chosen: whole groups, members on their own, and members left out of
22
+ * a chosen group. A member is in when its group is chosen and it is not left
23
+ * out, or when it is chosen on its own.
24
+ */
25
+ export interface MemberPickerValue {
26
+ groups: readonly string[];
27
+ members: readonly string[];
28
+ except: readonly string[];
29
+ }
30
+ export interface MemberPickerLabels {
31
+ /** Under a chosen group's name. */
32
+ later: string;
33
+ /** A member's mark while its group reaches it: "Through Product". */
34
+ through: (group: string) => string;
35
+ /** A member's mark once left out of its chosen group. */
36
+ leftOut: string;
37
+ /** The live count: "4 of 6 agents". */
38
+ summary: (chosen: number, total: number) => string;
39
+ /** A group's member count: "6 agents". */
40
+ count: (n: number) => string;
41
+ /** The expand control's name: "Show the agents in Product". */
42
+ expand: (group: string) => string;
43
+ }
44
+ export declare const MEMBER_PICKER_LABELS: MemberPickerLabels;
45
+ export interface MemberPickerProps {
46
+ /** Names the picker for a screen reader: "Who gets Sentry". */
47
+ label: string;
48
+ groups: readonly MemberPickerGroup[];
49
+ /** Members in no group, listed after the groups. */
50
+ ungrouped?: readonly MemberPickerMember[] | undefined;
51
+ value: MemberPickerValue;
52
+ onChange: (value: MemberPickerValue) => void;
53
+ /** Groups open at first; every group with a member chosen on its own or left out opens too. */
54
+ defaultOpen?: readonly string[] | undefined;
55
+ labels?: Partial<MemberPickerLabels> | undefined;
56
+ className?: string | undefined;
57
+ }
58
+ /** Every member the value reaches, each once. */
59
+ export declare function chosenMembers(groups: readonly MemberPickerGroup[], ungrouped: readonly MemberPickerMember[], value: MemberPickerValue): Set<string>;
60
+ /**
61
+ * Who gets something, as one list: each group a row with a three-state box,
62
+ * its member count and, once chosen, that it reaches members who join later;
63
+ * each group opens to its members, every member a row with its face, its name
64
+ * and one quiet line. A member a chosen group reaches says so ("Through
65
+ * Product"), and unticking it leaves it out of that group's grant rather than
66
+ * dropping the group; a member of an unchosen group is chosen on its own. The
67
+ * count of everyone reached stays at the top as the choice moves.
68
+ *
69
+ * GROUP FIRST, MEMBERS AS OVERRIDES, because a group's grant is the one that
70
+ * survives the organization changing: it reaches whoever joins, where a list
71
+ * of names reaches only the names. So choosing a group clears the overrides
72
+ * inside it, and unchoosing it drops them too, leaving no stale exception.
73
+ *
74
+ * A GROUP'S BOX SAYS WHETHER THE GROUP ITSELF IS CHOSEN: ticked when it is
75
+ * and it reaches every member, mixed when it is chosen with members left out,
76
+ * or when only some of its members are chosen on their own (even all of them,
77
+ * since a member who joins later would not be), and empty when nobody in it
78
+ * is reached. Ticking a mixed group chooses it whole.
79
+ *
80
+ * NATIVE CHECKBOXES, a group's partly chosen state set as the DOM's own
81
+ * `indeterminate`, so a screen reader says "mixed" and Space toggles as the
82
+ * platform does. The open control is the kit's IconButton with
83
+ * `aria-expanded`. Ids come from positions, never keys, since a key may hold
84
+ * a space and an id reference list splits on whitespace.
85
+ */
86
+ export declare function MemberPicker({ label, groups, ungrouped, value, onChange, defaultOpen, labels: overrides, className, }: MemberPickerProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './MemberPicker.css';
2
+ export { MemberPicker, MEMBER_PICKER_LABELS, chosenMembers } from './MemberPicker.js';
3
+ export type { MemberPickerGroup, MemberPickerLabels, MemberPickerMember, MemberPickerProps, MemberPickerValue, } from './MemberPicker.js';
@@ -0,0 +1,11 @@
1
+ export { MEMBER_PICKER_LABELS, MemberPicker, chosenMembers } from '../chunk-KA4RBKQV.js';
2
+ import '../chunk-YQ7Q52XU.js';
3
+ import '../chunk-O7N6W52M.js';
4
+ import '../chunk-PGCLHYVP.js';
5
+ import '../chunk-TUEM2XIW.js';
6
+ import '../chunk-4ITETIGZ.js';
7
+ import '../chunk-UAUP6XGK.js';
8
+ import '../chunk-PQADV6P6.js';
9
+ import '../chunk-2G355KDJ.js';
10
+ import '../chunk-UT6CW3C7.js';
11
+ import '../chunk-ODEQTPFM.js';
@@ -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 { 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';
@@ -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';