@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
@@ -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`
@@ -4,11 +4,11 @@ import '../chunk-K4LZXSKZ.js';
4
4
  import '../chunk-7K6LVM5I.js';
5
5
  import '../chunk-WANKINXG.js';
6
6
  import '../chunk-ZXXZESCD.js';
7
+ import '../chunk-YGRTX67J.js';
7
8
  import '../chunk-STJ7QBC3.js';
8
9
  import '../chunk-DTIW4CHZ.js';
9
- import '../chunk-YGRTX67J.js';
10
- import '../chunk-EE3DJMSQ.js';
11
10
  import '../chunk-NXFTCPF6.js';
11
+ import '../chunk-EE3DJMSQ.js';
12
12
  import '../chunk-EC6EUIAD.js';
13
13
  import '../chunk-EJNJMHQG.js';
14
14
  import '../chunk-RE3FBGQQ.js';
@@ -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.
@@ -0,0 +1,125 @@
1
+ import { type ReactNode } from 'react';
2
+ /** One key and its value: a header and what it carries, a variable and what it is set to. */
3
+ export interface KeyValueRow {
4
+ /**
5
+ * Stable across edits, and unique in the list: the row's identity while its
6
+ * key is typed, emptied or repeated. Two rows may share a key; never an id.
7
+ */
8
+ id: string;
9
+ key: string;
10
+ value: string;
11
+ }
12
+ /** Every word the rows say, beyond the names of their two columns. */
13
+ export interface KeyValueRowsLabels {
14
+ /** Names a row's key field: "Header 2". */
15
+ key: (position: number) => string;
16
+ /** Names a row's value field by its key: "Value for Authorization", or "Value for header 2" before one is typed. */
17
+ value: (key: string, position: number) => string;
18
+ /** Names a row's remove button: "Remove Authorization". */
19
+ remove: (key: string, position: number) => string;
20
+ /** The add action's words: "Add header". */
21
+ add: string;
22
+ /** Said once a row is removed, since the row's going is otherwise silent: "Removed Authorization". */
23
+ removed: (key: string, position: number) => string;
24
+ }
25
+ /**
26
+ * The rows' words in English, made from the two column names: `Header` and
27
+ * `Value` give "Header 2", "Value for Authorization", "Remove Authorization"
28
+ * and "Add header". A caller whose key column is an acronym (`URL`) or not in
29
+ * English passes its own `labels`.
30
+ */
31
+ export declare function keyValueRowsLabels(keyLabel: string, valueLabel?: string): KeyValueRowsLabels;
32
+ interface KeyValueRowsBaseProps<T extends KeyValueRow> {
33
+ /**
34
+ * What the list is: "Headers", "Environment variables". The group's legend,
35
+ * read on entering it.
36
+ */
37
+ label: string;
38
+ /**
39
+ * The legend is kept for assistive technology and drawn for nobody, where
40
+ * the column head or a heading right above already names the list.
41
+ */
42
+ hideLabel?: boolean | undefined;
43
+ /** The key column's head, and the name each key field is called by: "Header", "Variable". */
44
+ keyLabel: string;
45
+ /** The value column's head. "Value" by default. */
46
+ valueLabel?: string | undefined;
47
+ value: readonly T[];
48
+ onChange: (next: T[]) => void;
49
+ keyPlaceholder?: string | undefined;
50
+ /** The value field's placeholder, the same for every row or per row (a stored secret says so). */
51
+ valuePlaceholder?: string | ((row: T) => string | undefined) | undefined;
52
+ /**
53
+ * The values are secrets (a token, a password): each value field hides what
54
+ * is typed, and no browser offers a saved password for it.
55
+ */
56
+ secret?: boolean | undefined;
57
+ /**
58
+ * A row whose key may not change, such as one already saved: its key field
59
+ * is read only, and its value and its remove button still work.
60
+ */
61
+ keyReadOnly?: ((row: T) => boolean) | undefined;
62
+ /** Why a row's key was refused, said under that key and linked to it. */
63
+ keyError?: ((row: T, index: number) => ReactNode) | undefined;
64
+ /** Why a row's value was refused, said under that value and linked to it. */
65
+ valueError?: ((row: T, index: number) => ReactNode) | undefined;
66
+ /**
67
+ * What the list says while it holds no row, in place of the rows. Left out,
68
+ * an empty list is its legend and its add action.
69
+ */
70
+ empty?: ReactNode;
71
+ /** Where the keys come from, or what shape they take, under the add action. */
72
+ helper?: ReactNode;
73
+ /** Why the list as a whole was refused. */
74
+ error?: ReactNode;
75
+ disabled?: boolean | undefined;
76
+ /** Words in place of the ones `keyValueRowsLabels` makes from `keyLabel` and `valueLabel`. */
77
+ labels?: Partial<KeyValueRowsLabels> | undefined;
78
+ className?: string | undefined;
79
+ }
80
+ /**
81
+ * A blank row for the add action. Optional while a row is nothing but its id,
82
+ * key and value, when the list makes `{ id, key: '', value: '' }` itself;
83
+ * required once the caller's rows carry a field of their own that a blank row
84
+ * must set.
85
+ *
86
+ * AN EMPTY LIST NAMES NO ROW TYPE. `value={[]}` infers `never`, which no row
87
+ * is assignable to, so a test of assignability alone asked an empty list for
88
+ * a `createRow` it has no use for. A list whose row type was never inferred
89
+ * makes its own blank rows too.
90
+ */
91
+ type RowMaker<T extends KeyValueRow> = [T] extends [never] ? {
92
+ createRow?: (() => T) | undefined;
93
+ } : KeyValueRow extends T ? {
94
+ createRow?: (() => T) | undefined;
95
+ } : {
96
+ createRow: () => T;
97
+ };
98
+ export type KeyValueRowsProps<T extends KeyValueRow = KeyValueRow> = KeyValueRowsBaseProps<T> & RowMaker<T>;
99
+ /**
100
+ * Keys and their values, edited as rows under one column head: request
101
+ * headers, environment variables, any list of names and what each is set to.
102
+ *
103
+ * ONE HEAD OVER THE COLUMNS, SO EVERY ROW IS THE SAME ROW. The key and value
104
+ * columns are named once, above the first row, and each field's own name is
105
+ * read rather than drawn ("Header 2", "Value for Authorization"). A label
106
+ * drawn on the first row only stood that row taller than the rest, and the
107
+ * value and the remove button beside it lost the line they shared.
108
+ *
109
+ * AN ERROR MOVES NOTHING BESIDE IT. Every row stands on its fields' top edge,
110
+ * so a refused key grows its own cell downward and the value and the remove
111
+ * button stay level with the key's field.
112
+ *
113
+ * THE REMOVE BUTTON IS THE FIELDS' HEIGHT, a square at the control step, so a
114
+ * row is one line of three controls. Add is a flush quiet action under the
115
+ * rows, its words on the fields' own edge.
116
+ *
117
+ * FOCUS NEVER FALLS TO THE PAGE. Add puts it in the new row's key; Remove
118
+ * moves it to the row that took that row's place, else the one before, else
119
+ * Add, and says what went.
120
+ *
121
+ * Controlled: the rows are the caller's, and every edit hands back a new
122
+ * list with each untouched row as it was.
123
+ */
124
+ export declare function KeyValueRows<T extends KeyValueRow = KeyValueRow>(props: KeyValueRowsProps<T>): import("react").JSX.Element;
125
+ export {};
@@ -0,0 +1,3 @@
1
+ import './KeyValueRows.css';
2
+ export { KeyValueRows, keyValueRowsLabels } from './KeyValueRows.js';
3
+ export type { KeyValueRow, KeyValueRowsLabels, KeyValueRowsProps } from './KeyValueRows.js';
@@ -0,0 +1,12 @@
1
+ export { KeyValueRows, keyValueRowsLabels } from '../chunk-TRZS7DLB.js';
2
+ import '../chunk-O7N6W52M.js';
3
+ import '../chunk-PGCLHYVP.js';
4
+ import '../chunk-DGXZ635L.js';
5
+ import '../chunk-XSPCITPN.js';
6
+ import '../chunk-TUEM2XIW.js';
7
+ import '../chunk-4ITETIGZ.js';
8
+ import '../chunk-UAUP6XGK.js';
9
+ import '../chunk-PQADV6P6.js';
10
+ import '../chunk-2G355KDJ.js';
11
+ import '../chunk-UT6CW3C7.js';
12
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,44 @@
1
+ /*
2
+ * KeyValueRows: keys and their values as rows under one column head
3
+ * (KeyValueRows.tsx).
4
+ */
5
+
6
+ /* The rows, then Add under them, a row's gap apart. */
7
+ .crewlet-key-value-rows__body,
8
+ .crewlet-key-value-rows__table {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: var(--spacing-2);
12
+ min-width: 0;
13
+ }
14
+
15
+ /*
16
+ * EVERY ROW STANDS ON ITS FIELDS' TOP EDGE, so a key's error grows its own
17
+ * cell downward and nothing beside it moves. The last track is the remove
18
+ * button's, a square the fields' height, and the head keeps it empty so the
19
+ * value's name stands over the value column.
20
+ */
21
+ .crewlet-key-value-rows__head,
22
+ .crewlet-key-value-rows__row {
23
+ display: grid;
24
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) var(--size-control-md);
25
+ align-items: start;
26
+ gap: var(--spacing-2);
27
+ }
28
+
29
+ /* The head stands over the first row at a field label's distance from its field. */
30
+ .crewlet-key-value-rows__head {
31
+ margin-block-end: calc(var(--spacing-1) - var(--spacing-2));
32
+ }
33
+
34
+ .crewlet-key-value-rows__empty {
35
+ margin: 0;
36
+ font-size: var(--font-size-compact);
37
+ line-height: var(--font-line-height-normal);
38
+ color: var(--color-text-secondary);
39
+ }
40
+
41
+ /* Add hugs its words, on the fields' start edge, rather than spanning the list. */
42
+ .crewlet-key-value-rows__add {
43
+ display: flex;
44
+ }
@@ -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';