@crewlethq/ui 0.13.0 → 0.14.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 (34) hide show
  1. package/README.md +16 -0
  2. package/dist/AvatarPicker/index.js +1 -1
  3. package/dist/CommandPalette/index.js +2 -2
  4. package/dist/DataTable/index.js +2 -2
  5. package/dist/DataView/index.js +5 -5
  6. package/dist/DateTimePicker/index.js +1 -1
  7. package/dist/{DateTimePicker-4AZBTODT.css → DateTimePicker-NJ6XH2TE.css} +4 -3
  8. package/dist/ListInput/index.js +2 -2
  9. package/dist/Modal/index.js +1 -1
  10. package/dist/{Modal-3YJ2GG2T.css → Modal-RQAYGG4L.css} +1 -1
  11. package/dist/OrgTable/index.js +1 -1
  12. package/dist/Select/index.js +1 -1
  13. package/dist/{Select-XMZ44RWY.css → Select-2P7AWUE4.css} +32 -6
  14. package/dist/Switcher/index.js +3 -3
  15. package/dist/TagsInput/index.js +2 -2
  16. package/dist/TimeWindowPicker/index.js +2 -2
  17. package/dist/{TimeWindowPicker-GBF4JDFI.css → TimeWindowPicker-BZ5HHATU.css} +5 -4
  18. package/dist/Toaster/index.js +1 -1
  19. package/dist/{Toaster-KZ7YE2HA.css → Toaster-VZKISP2S.css} +80 -87
  20. package/dist/{chunk-WY2NLRZN.js → chunk-3VVKJ7AZ.js} +1 -1
  21. package/dist/{chunk-UZPHPW3Z.js → chunk-5IXMLWGW.js} +2 -2
  22. package/dist/{chunk-JDPAA2JU.js → chunk-AXNQCAFC.js} +1 -1
  23. package/dist/{chunk-LELD5KPA.js → chunk-CBZSSKH3.js} +5 -5
  24. package/dist/{chunk-B2CITO6R.js → chunk-IFM63LAG.js} +2 -2
  25. package/dist/{chunk-XFE5W2I4.js → chunk-IXUU5DLZ.js} +13 -3
  26. package/dist/{chunk-CF6DTETT.js → chunk-TFMJH2E6.js} +1 -1
  27. package/dist/{chunk-HKGS67VG.js → chunk-WYQOHFML.js} +1 -1
  28. package/dist/{chunk-S3IENQ3E.js → chunk-Y6NR7QJ3.js} +2 -2
  29. package/dist/generated/index.js +27 -27
  30. package/dist/index.js +27 -27
  31. package/dist/styles.css +127 -106
  32. package/package.json +3 -3
  33. package/dist/{chunk-LZP7FGT7.js → chunk-GARACZAH.js} +1 -1
  34. package/dist/{chunk-GG2QEZO2.js → chunk-JCO3SIST.js} +1 -1
package/README.md CHANGED
@@ -198,6 +198,22 @@ places:
198
198
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
199
199
  when the content beneath it moves, and every panel anchored inside follows.
200
200
 
201
+ ## Changes in 0.14.0
202
+
203
+ 0.14.0 draws toasts as the first release did and quiets the pickers.
204
+
205
+ **Toasts are the first release's strip again**: a dark strip on `--color-surface-background` with the large shadow and the rim light, a 12px corner, a 20px mark, a slide in from the right, and the countdown as a wash behind the words that drains from the right. A variant spends its hue on its mark (the feedback ink step) and its wash (the feedback soft step) only, so a failure is a rose mark on a faint rose wash with a rose action, never red words on a red edge. Reduced motion keeps the strip still and draws no wash.
206
+
207
+ **A picker's boundary is a button's.** `Select`, `DateTimePicker` and `TimeWindowPicker` draw their trigger on `--color-border-strong`, as the secondary button does, and step to `--color-border-strong-hover` under the pointer. Text boxes, checkboxes and switches keep `--color-border-control` at 3:1, as do the typed boxes inside the pickers' panels.
208
+
209
+ **A `Select` list that leads with marks ends its rows with the tick**, so a swatch, an avatar or a glyph starts at the panel's edge. A list of words keeps the tick's column first.
210
+
211
+ **`--crewlet-select-menu-max-height` is the list's height.** The shared listbox cap of min(360px, 60vh) no longer overrides a taller panel; the panel keeps the 60vh cap on the window.
212
+
213
+ `@crewlethq/tokens`: Origin's dark `--color-border-default` is #2e2e30, and the comfortable density is 1.16 (it was 1.14), a shade larger at every gap, pad, row and control.
214
+
215
+ What to change: a test that reads a failure toast's red edge or red words, or a picker's control boundary, reads the new ones. Everything else is unchanged.
216
+
201
217
  ## Changes in 0.13.0
202
218
 
203
219
  0.13.0 adds the parts the engine console's themes, project switcher, inbox and knowledge base are built with, and calls the light and dark choice Mode.
@@ -9,6 +9,6 @@ import '../chunk-CBOICT64.js';
9
9
  import '../chunk-BHHIIK3M.js';
10
10
  import '../chunk-7RPGY3JE.js';
11
11
  import '../chunk-R25RGPUB.js';
12
- import '../chunk-HI6Q2UXQ.js';
13
12
  import '../chunk-BZFWDIV6.js';
13
+ import '../chunk-HI6Q2UXQ.js';
14
14
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,5 @@
1
- export { CommandPalette } from '../chunk-HKGS67VG.js';
2
- import '../chunk-CF6DTETT.js';
1
+ export { CommandPalette } from '../chunk-WYQOHFML.js';
2
+ import '../chunk-TFMJH2E6.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
4
  import '../chunk-SMBKXWML.js';
5
5
  import '../chunk-FTEJPHBI.js';
@@ -1,9 +1,9 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-WY2NLRZN.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-3VVKJ7AZ.js';
2
2
  import '../chunk-TFH6SYWB.js';
3
3
  import '../chunk-EUCC37WY.js';
4
4
  import '../chunk-YCTMKKRA.js';
5
+ import '../chunk-TFMJH2E6.js';
5
6
  import '../chunk-5VNUYO76.js';
6
- import '../chunk-CF6DTETT.js';
7
7
  import '../chunk-OG6CL3EB.js';
8
8
  import '../chunk-AV2DXAEL.js';
9
9
  import '../chunk-PQADV6P6.js';
@@ -1,17 +1,17 @@
1
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-UZPHPW3Z.js';
1
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-5IXMLWGW.js';
2
2
  import '../chunk-HOXGBLEY.js';
3
3
  import '../chunk-3CZ7XAVY.js';
4
4
  import '../chunk-PGRPNDWM.js';
5
- import '../chunk-WY2NLRZN.js';
5
+ import '../chunk-3VVKJ7AZ.js';
6
6
  import '../chunk-TFH6SYWB.js';
7
7
  import '../chunk-EUCC37WY.js';
8
- import '../chunk-JDPAA2JU.js';
8
+ import '../chunk-AXNQCAFC.js';
9
9
  import '../chunk-YCTMKKRA.js';
10
- import '../chunk-5VNUYO76.js';
11
- import '../chunk-CF6DTETT.js';
10
+ import '../chunk-TFMJH2E6.js';
12
11
  import '../chunk-F73MC7EZ.js';
13
12
  import '../chunk-SMBKXWML.js';
14
13
  import '../chunk-FTEJPHBI.js';
14
+ import '../chunk-5VNUYO76.js';
15
15
  import '../chunk-GXQ3B46I.js';
16
16
  import '../chunk-OG6CL3EB.js';
17
17
  import '../chunk-AV2DXAEL.js';
@@ -1,4 +1,4 @@
1
- export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-JDPAA2JU.js';
1
+ export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-AXNQCAFC.js';
2
2
  import '../chunk-GXQ3B46I.js';
3
3
  import '../chunk-OG6CL3EB.js';
4
4
  import '../chunk-4FQT6ZAY.js';
@@ -1,7 +1,8 @@
1
1
  /*
2
2
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
3
3
  *
4
- * The trigger borrows the Select's geometry so a date box and a picker line
4
+ * The trigger borrows the Select's geometry and its button boundary
5
+ * (--color-border-strong; see Select.css) so a date box and a picker line
5
6
  * up in the same toolbar; the panel holds the shared CalendarGrid, so the
6
7
  * month looks and behaves the same here as in every other picker.
7
8
  */
@@ -17,7 +18,7 @@
17
18
  height. */
18
19
  padding: 0 var(--spacing-2) 0 var(--spacing-3);
19
20
  background: var(--color-surface-subtle);
20
- border: 1px solid var(--color-border-control);
21
+ border: 1px solid var(--color-border-strong);
21
22
  border-radius: var(--radius-md);
22
23
  color: var(--color-text-primary);
23
24
  font-family: inherit;
@@ -34,7 +35,7 @@
34
35
  }
35
36
 
36
37
  .crewlet-datetime:hover:not(:disabled) {
37
- border-color: var(--color-border-hover);
38
+ border-color: var(--color-border-strong-hover);
38
39
  }
39
40
 
40
41
  /*
@@ -1,9 +1,9 @@
1
- export { ListInput } from '../chunk-LZP7FGT7.js';
1
+ export { ListInput } from '../chunk-GARACZAH.js';
2
2
  import '../chunk-SMBKXWML.js';
3
3
  import '../chunk-FTEJPHBI.js';
4
4
  import '../chunk-PQADV6P6.js';
5
- import '../chunk-4FQT6ZAY.js';
6
5
  import '../chunk-RSAQOKH3.js';
6
+ import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-7RPGY3JE.js';
8
8
  import '../chunk-R25RGPUB.js';
9
9
  import '../chunk-BZFWDIV6.js';
@@ -1,4 +1,4 @@
1
- export { ConfirmModal, Modal } from '../chunk-CF6DTETT.js';
1
+ export { ConfirmModal, Modal } from '../chunk-TFMJH2E6.js';
2
2
  import '../chunk-OG6CL3EB.js';
3
3
  import '../chunk-PQADV6P6.js';
4
4
  import '../chunk-4FQT6ZAY.js';
@@ -289,7 +289,7 @@
289
289
  * padding is only the least it keeps when a title wraps. It was the 16px step
290
290
  * while the bar was 64px, which a full control step filled exactly; at 52px
291
291
  * the same padding stood the head 12px past the bar behind it. At the 4px step
292
- * the head is the bar's height with the control step at every density, 36.48px
292
+ * the head is the bar's height with the control step at every density, 37.12px
293
293
  * at comfortable included, and with a subtitle under the title.
294
294
  *
295
295
  * It used to be the tighter band, 49px with a close control alone, and the
@@ -8,6 +8,6 @@ import '../chunk-4FQT6ZAY.js';
8
8
  import '../chunk-6NIZCQUM.js';
9
9
  import '../chunk-7RPGY3JE.js';
10
10
  import '../chunk-R25RGPUB.js';
11
- import '../chunk-HI6Q2UXQ.js';
12
11
  import '../chunk-BZFWDIV6.js';
12
+ import '../chunk-HI6Q2UXQ.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { Select } from '../chunk-XFE5W2I4.js';
1
+ export { Select } from '../chunk-IXUU5DLZ.js';
2
2
  import '../chunk-F73MC7EZ.js';
3
3
  import '../chunk-7RPGY3JE.js';
4
4
  import '../chunk-R25RGPUB.js';
@@ -7,9 +7,12 @@
7
7
  * into the nearest layer host and drawn with the shared listbox register, so
8
8
  * a list of options looks the same wherever it is offered from.
9
9
  *
10
- * The boundary is --color-border-control, like every other control: the
11
- * hairline measured 1.27:1 in light, which is a box a reader has to know is
12
- * there already.
10
+ * THE BOUNDARY IS A BUTTON'S, --color-border-strong, the secondary button's
11
+ * and the date and time-window pickers'. A picker shows its value and its
12
+ * chevron, and those are what a reader knows it by. --color-border-control,
13
+ * at 3:1, is for the controls whose outline IS the control (a text box, a
14
+ * checkbox, a switch; see Input.css): on a picker it drew the one bright box
15
+ * in a row of buttons and switchers, brighter at rest than under the pointer.
13
16
  */
14
17
 
15
18
  .crewlet-select {
@@ -27,7 +30,7 @@
27
30
  width: 100%;
28
31
  min-height: var(--size-control-md);
29
32
  background-color: var(--color-surface-subtle);
30
- border: 1px solid var(--color-border-control);
33
+ border: 1px solid var(--color-border-strong);
31
34
  border-radius: var(--radius-md);
32
35
  color: var(--color-text-primary);
33
36
  /* The boundary is the only thing that moves. The ring is an outline, which
@@ -48,7 +51,7 @@
48
51
  }
49
52
 
50
53
  .crewlet-select:hover {
51
- border-color: var(--color-border-hover);
54
+ border-color: var(--color-border-strong-hover);
52
55
  }
53
56
 
54
57
  /*
@@ -197,7 +200,7 @@ svg.crewlet-select__chevron {
197
200
  display: flex;
198
201
  flex-direction: column;
199
202
  min-width: 0;
200
- max-height: var(--crewlet-select-menu-max-height);
203
+ max-height: min(var(--crewlet-select-menu-max-height), 60vh);
201
204
  /*
202
205
  * THE PANEL IS THE PRODUCT'S SURFACE, on the panel hairline, at the panel
203
206
  * corner. A list offered from a field is another panel over the one the
@@ -224,11 +227,25 @@ svg.crewlet-select__chevron {
224
227
  position: absolute;
225
228
  }
226
229
 
230
+ /*
231
+ * THE PANEL'S HEIGHT IS THE LIST'S. The shared listbox register caps a list
232
+ * at min(360px, 60vh) on its own, which inside this panel made
233
+ * `--crewlet-select-menu-max-height` a promise it could not keep past 360px:
234
+ * a taller panel drew the same short list and scrolled it. Here the list
235
+ * fills what the panel allows, and the panel keeps the register's cap on the
236
+ * window (see `.crewlet-select__menu`).
237
+ */
227
238
  .crewlet-select__list {
228
239
  flex: 1;
229
240
  min-height: 0;
230
241
  }
231
242
 
243
+ /* Scoped to the panel for the weight, as the option rules below are: the
244
+ register's cap is one class, and the bundle orders equal weights by hash. */
245
+ .crewlet-select__menu .crewlet-select__list {
246
+ max-height: none;
247
+ }
248
+
232
249
  .crewlet-select__group {
233
250
  display: flex;
234
251
  flex-direction: column;
@@ -290,6 +307,15 @@ svg.crewlet-select__chevron {
290
307
  color: var(--color-brand-accent-ink);
291
308
  }
292
309
 
310
+ /*
311
+ * AT THE ROW'S END in a list whose rows lead with a mark (see `tickAtEnd`),
312
+ * so the mark starts at the panel's edge. After a hint it follows the hint,
313
+ * which already takes the free space; without one it takes it itself.
314
+ */
315
+ .crewlet-select__option-body + .crewlet-select__option-tick--end {
316
+ margin-left: auto;
317
+ }
318
+
293
319
  .crewlet-select__option-body {
294
320
  display: flex;
295
321
  flex-direction: column;
@@ -1,14 +1,14 @@
1
- export { Switcher } from '../chunk-S3IENQ3E.js';
1
+ export { Switcher } from '../chunk-Y6NR7QJ3.js';
2
2
  import '../chunk-W5J7R5EB.js';
3
- import '../chunk-CF6DTETT.js';
3
+ import '../chunk-TFMJH2E6.js';
4
4
  import '../chunk-F73MC7EZ.js';
5
5
  import '../chunk-FTEJPHBI.js';
6
6
  import '../chunk-FYTIJM2T.js';
7
7
  import '../chunk-OG6CL3EB.js';
8
8
  import '../chunk-PQADV6P6.js';
9
+ import '../chunk-RSAQOKH3.js';
9
10
  import '../chunk-IG75YMUN.js';
10
11
  import '../chunk-4FQT6ZAY.js';
11
- import '../chunk-RSAQOKH3.js';
12
12
  import '../chunk-O2ZDZZS7.js';
13
13
  import '../chunk-7RPGY3JE.js';
14
14
  import '../chunk-R25RGPUB.js';
@@ -1,9 +1,9 @@
1
- export { TagsInput } from '../chunk-GG2QEZO2.js';
1
+ export { TagsInput } from '../chunk-JCO3SIST.js';
2
2
  import '../chunk-LOECRMHA.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-F73MC7EZ.js';
5
- import '../chunk-4FQT6ZAY.js';
6
5
  import '../chunk-RSAQOKH3.js';
6
+ import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-7RPGY3JE.js';
8
8
  import '../chunk-R25RGPUB.js';
9
9
  import '../chunk-BZFWDIV6.js';
@@ -1,5 +1,5 @@
1
- export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-B2CITO6R.js';
2
- import '../chunk-XFE5W2I4.js';
1
+ export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-IFM63LAG.js';
2
+ import '../chunk-IXUU5DLZ.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
4
  import '../chunk-FTEJPHBI.js';
5
5
  import '../chunk-GXQ3B46I.js';
@@ -1,8 +1,9 @@
1
1
  /*
2
2
  * TimeWindowPicker: one trigger over one panel.
3
3
  *
4
- * The trigger takes the same geometry as a Select and a DateTimePicker, so the
5
- * three line up in a filter bar. The panel is a RAIL of named windows beside
4
+ * The trigger takes the same geometry and button boundary as a Select and a
5
+ * DateTimePicker (--color-border-strong; see Select.css), so the three line
6
+ * up in a filter bar. The panel is a RAIL of named windows beside
6
7
  * the calendars, rather than two tabs with one of them hidden: the windows a
7
8
  * reader picks by name are the road, and the absolute range is the turning off
8
9
  * it, so both are on screen at once and each shows what the other chose.
@@ -17,7 +18,7 @@
17
18
  /* The side inset only: see DateTimePicker's own trigger. */
18
19
  padding: 0 var(--spacing-2) 0 var(--spacing-3);
19
20
  background: var(--color-surface-subtle);
20
- border: 1px solid var(--color-border-control);
21
+ border: 1px solid var(--color-border-strong);
21
22
  border-radius: var(--radius-md);
22
23
  color: var(--color-text-primary);
23
24
  font-family: inherit;
@@ -34,7 +35,7 @@
34
35
  }
35
36
 
36
37
  .crewlet-time-window:hover:not(:disabled) {
37
- border-color: var(--color-border-hover);
38
+ border-color: var(--color-border-strong-hover);
38
39
  }
39
40
 
40
41
  /*
@@ -1,4 +1,4 @@
1
- export { ToastProvider, Toaster, useToast } from '../chunk-LELD5KPA.js';
1
+ export { ToastProvider, Toaster, useToast } from '../chunk-CBZSSKH3.js';
2
2
  import '../chunk-7RPGY3JE.js';
3
3
  import '../chunk-R25RGPUB.js';
4
4
  import '../chunk-BZFWDIV6.js';
@@ -1,98 +1,98 @@
1
1
  /*
2
- * The toast stack.
2
+ * The toast stack, drawn as the first release drew it (24a60c3): a dark strip
3
+ * on the page's deepest ground with the large shadow and the rim light, a
4
+ * 12px corner, the variant said by its mark alone, never a flood of its hue,
5
+ * and the countdown as a wash behind the words that drains from the right.
3
6
  *
4
- * ITS SURFACE IS A THEME TOKEN. 0.2.0 mixed the subtle surface 60 percent with
5
- * black, which is a dark strip whatever palette is painting: on a light page
6
- * the toast's own text measured 1.56:1 against it.
7
+ * IN TOKENS RATHER THAN ITS LITERALS, so it follows every theme. The strip is
8
+ * --color-surface-background: the first release mixed the panel with black,
9
+ * which read as a dark bar on a light page, where its words measured 1.56:1.
10
+ * The marks are the feedback INK steps, the soft moss, amber and rose it drew,
11
+ * measured as text on every theme. The washes are the feedback SOFT steps.
7
12
  *
8
- * THE DRAIN IS A RULE ALONG THE FOOT, not a wash behind the words. A tinted
9
- * layer under the message is a composite nothing measured, and it moves while
10
- * the message is being read; a 2px bar at the edge says the same thing and
11
- * touches no text at all. It is decoration either way: the dismissal is a
12
- * timer now, so a reader who asks for reduced motion still gets the toast
13
- * taken away.
13
+ * The wash is decoration: the dismissal is a timer, so a reader who asks for
14
+ * reduced motion gets no wash and still gets the toast taken away.
14
15
  */
15
-
16
16
  .crewlet-toaster {
17
17
  position: fixed;
18
18
  z-index: var(--z-index-toast);
19
19
  display: flex;
20
20
  flex-direction: column;
21
- gap: var(--spacing-2);
22
- /* The engine's 420px, held under the viewport at the width a phone has.
23
- The strip is one or two lines of 13px text and an action; at 380 the
24
- commonest failure message wrapped onto a third. */
25
- width: min(420px, calc(100vw - var(--spacing-9)));
21
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
22
+ width: min(380px, calc(100vw - 2 * var(--spacing-6)));
26
23
  /* The stack itself takes no presses, so the screen under it stays live
27
24
  while nothing is up; each toast takes them back for its own strip. */
28
25
  pointer-events: none;
29
26
  }
30
27
 
31
28
  .crewlet-toaster--bottom-right {
32
- bottom: var(--spacing-4);
33
- right: var(--spacing-4);
29
+ bottom: var(--spacing-6);
30
+ right: var(--spacing-6);
34
31
  }
35
32
 
36
33
  .crewlet-toaster--top-right {
37
- top: var(--spacing-4);
38
- right: var(--spacing-4);
34
+ top: var(--spacing-6);
35
+ right: var(--spacing-6);
39
36
  }
40
37
 
41
38
  .crewlet-toaster--bottom-left {
42
- bottom: var(--spacing-4);
43
- left: var(--spacing-4);
39
+ bottom: var(--spacing-6);
40
+ left: var(--spacing-6);
44
41
  }
45
42
 
46
43
  .crewlet-toaster--top-left {
47
- top: var(--spacing-4);
48
- left: var(--spacing-4);
44
+ top: var(--spacing-6);
45
+ left: var(--spacing-6);
49
46
  }
50
47
 
51
48
  .crewlet-toast {
49
+ /* The mark and the wash are the two places a variant spends its hue. */
52
50
  --crewlet-toast-mark: var(--color-text-secondary);
53
- /*
54
- * The boundary and the two inks are variables so a tone can spend them. Only
55
- * one does: a failure, which is the engine's one toned strip.
56
- */
57
- --crewlet-toast-line: var(--color-border-default);
58
- --crewlet-toast-ink: var(--color-text-primary);
59
- --crewlet-toast-ink-quiet: var(--color-text-secondary);
51
+ --crewlet-toast-wash: var(--color-surface-pressed);
52
+ /* 14px at the normal density, and the corner the dismiss sits in beside it. */
53
+ --crewlet-toast-inset: calc(var(--spacing-3) + var(--spacing-1) / 2);
60
54
 
61
55
  pointer-events: auto;
62
56
  position: relative;
63
57
  display: flex;
64
58
  align-items: flex-start;
65
- /* The panel's own gap and padding, and the panel's own surface: the engine
66
- draws a toast as a small panel that happens to float, so it sits on the
67
- same ground, the same hairline and the same corner as everything the
68
- screen behind it is made of. */
69
- gap: var(--spacing-2);
70
- padding: var(--spacing-2) var(--spacing-8) var(--spacing-2) var(--spacing-3);
71
- background: var(--color-surface-subtle);
72
- border: 1px solid var(--crewlet-toast-line);
73
- border-radius: var(--radius-md);
74
- box-shadow: var(--shadow-md);
75
- color: var(--crewlet-toast-ink);
59
+ gap: var(--spacing-3);
60
+ padding: var(--crewlet-toast-inset) calc(var(--spacing-7) + var(--spacing-1) * 1.5) var(--crewlet-toast-inset)
61
+ var(--crewlet-toast-inset);
62
+ background: var(--color-surface-background);
63
+ border: 1px solid var(--color-border-default);
64
+ border-radius: var(--radius-lg);
65
+ /* The large shadow and the rim light, both from tokens that are a shadow in
66
+ every palette: --shadow-hairline is `none` in light, and a `none` inside a
67
+ list drops the whole declaration. */
68
+ box-shadow: var(--shadow-xl), var(--shadow-rim-lit);
69
+ color: var(--color-text-primary);
76
70
  font-family: var(--font-family-sans);
77
71
  font-size: var(--font-size-compact);
78
- line-height: var(--font-line-height-normal);
72
+ line-height: var(--font-line-height-body);
79
73
  letter-spacing: var(--font-letter-spacing-snug);
80
74
  overflow: hidden;
81
- animation: crewlet-toast-in var(--motion-duration-base) var(--motion-easing-emphasized);
75
+ animation: crewlet-toast-in var(--motion-duration-slow) var(--motion-easing-emphasized);
82
76
  }
83
77
 
84
78
  @keyframes crewlet-toast-in {
85
79
  from {
86
80
  opacity: 0;
87
- transform: translateY(6px);
81
+ transform: translateX(var(--spacing-4));
88
82
  }
89
-
90
83
  to {
91
84
  opacity: 1;
92
- transform: translateY(0);
85
+ transform: translateX(0);
93
86
  }
94
87
  }
95
88
 
89
+ /* The words sit over the wash: every child is raised, and the dismiss and the
90
+ wash below take their own places back. */
91
+ .crewlet-toast > * {
92
+ position: relative;
93
+ z-index: var(--z-index-raised);
94
+ }
95
+
96
96
  .crewlet-toast__icon {
97
97
  display: inline-flex;
98
98
  flex: none;
@@ -100,34 +100,26 @@
100
100
  color: var(--crewlet-toast-mark);
101
101
  }
102
102
 
103
- /* The mark is the tone's FILL step, which is measured at 3:1 as a mark. The
104
- words beside it stay in the primary ink: a coloured sentence on a coloured
105
- strip is the pair that has to be measured, and this one does not exist. */
103
+ /*
104
+ * A VARIANT IS ITS MARK AND ITS WASH. The words stay in the strip's own inks
105
+ * and the edge stays the hairline, so a failure is a rose mark on a faint rose
106
+ * wash rather than a red strip: the outcome is said by the glyph and the title,
107
+ * and the sentence beside them is read in the ink every sentence is read in.
108
+ * Information is the neutral mark on the neutral wash.
109
+ */
106
110
  .crewlet-toast--success {
107
- --crewlet-toast-mark: var(--color-feedback-success);
111
+ --crewlet-toast-mark: var(--color-feedback-success-ink);
112
+ --crewlet-toast-wash: var(--color-feedback-success-soft);
108
113
  }
109
114
 
110
115
  .crewlet-toast--warning {
111
- --crewlet-toast-mark: var(--color-feedback-warning);
116
+ --crewlet-toast-mark: var(--color-feedback-warning-ink);
117
+ --crewlet-toast-wash: var(--color-feedback-warning-soft);
112
118
  }
113
119
 
114
- /*
115
- * A FAILURE IS THE ONE TONED STRIP. It is the outcome that is news rather than
116
- * confirmation and the one that does not take itself away, so the engine gives
117
- * it the hue twice: the fill step on the edge, where 3:1 is the floor a
118
- * boundary has to clear, and the INK step on every word, which is the measured
119
- * text pair on this surface. Never the fill behind a word: that is the swap
120
- * the whole soft-and-ink split exists to stop.
121
- */
122
120
  .crewlet-toast--danger {
123
- --crewlet-toast-mark: var(--color-feedback-danger);
124
- --crewlet-toast-line: var(--color-feedback-danger);
125
- --crewlet-toast-ink: var(--color-feedback-danger-ink);
126
- --crewlet-toast-ink-quiet: var(--color-feedback-danger-ink);
127
- }
128
-
129
- .crewlet-toast--info {
130
- --crewlet-toast-mark: var(--color-feedback-info);
121
+ --crewlet-toast-mark: var(--color-feedback-danger-ink);
122
+ --crewlet-toast-wash: var(--color-feedback-danger-soft);
131
123
  }
132
124
 
133
125
  /* A usage limit notice is the application's own variant: it paints the glyph
@@ -149,12 +141,12 @@
149
141
  }
150
142
 
151
143
  .crewlet-toast__message {
152
- color: var(--crewlet-toast-ink-quiet);
144
+ color: var(--color-text-secondary);
153
145
  overflow-wrap: anywhere;
154
146
  }
155
147
 
156
148
  .crewlet-toast__actions {
157
- margin-top: var(--spacing-2);
149
+ margin-top: calc(var(--spacing-2) + var(--spacing-1) / 2);
158
150
  display: flex;
159
151
  gap: var(--spacing-2);
160
152
  }
@@ -186,6 +178,7 @@
186
178
  border-color: var(--color-brand-accent-hover);
187
179
  }
188
180
 
181
+ /* A failure's one filled thing is the way out of it. */
189
182
  .crewlet-toast--danger .crewlet-toast__action-btn,
190
183
  .crewlet-toast--danger .crewlet-toast__action-link {
191
184
  background: var(--color-feedback-danger);
@@ -207,8 +200,9 @@
207
200
  }
208
201
 
209
202
  /* The dismiss sits absolute in the corner so a multi-line message flows
210
- under it rather than around it. 24px square: the smallest target
211
- WCAG 2.2 accepts. */
203
+ under it rather than around it, and after the body in the document, so it
204
+ is drawn over the words at the same raised step. 24px square: the smallest
205
+ target WCAG 2.2 accepts. */
212
206
  .crewlet-toast__dismiss {
213
207
  position: absolute;
214
208
  top: var(--spacing-2);
@@ -222,10 +216,7 @@
222
216
  border: 0;
223
217
  border-radius: var(--radius-sm);
224
218
  background: transparent;
225
- /* The strip's own quiet ink rather than the neutral tertiary step, so the
226
- close on a failure is part of the failure rather than the one grey thing
227
- inside it. */
228
- color: var(--crewlet-toast-ink-quiet);
219
+ color: var(--color-text-tertiary);
229
220
  cursor: pointer;
230
221
  transition:
231
222
  background var(--motion-duration-fast) var(--motion-easing-default),
@@ -233,25 +224,28 @@
233
224
  }
234
225
 
235
226
  .crewlet-toast__dismiss:hover {
236
- background: var(--color-surface-hover);
237
- color: var(--crewlet-toast-ink);
227
+ background: var(--color-surface-elevated);
228
+ color: var(--color-text-primary);
238
229
  }
239
230
 
231
+ /*
232
+ * THE COUNTDOWN IS A WASH BEHIND THE WORDS, the variant's soft step over the
233
+ * whole strip, draining from the right as the time runs out. It sits under
234
+ * every raised child, and it is the timer's picture, not the timer.
235
+ */
240
236
  .crewlet-toast__progress {
241
237
  position: absolute;
242
- left: 0;
243
- right: 0;
244
- bottom: 0;
245
- height: 2px;
238
+ inset: 0;
239
+ z-index: var(--z-index-base);
246
240
  transform-origin: left center;
247
- background: var(--crewlet-toast-mark);
241
+ background: var(--crewlet-toast-wash);
248
242
  pointer-events: none;
249
243
  animation-name: crewlet-toast-drain;
250
244
  animation-timing-function: linear;
251
245
  animation-fill-mode: forwards;
252
246
  }
253
247
 
254
- /* Paused by the class rather than by :hover, so the bar and the timer that
248
+ /* Paused by the class rather than by :hover, so the wash and the timer that
255
249
  actually dismisses are stopped by the same event. */
256
250
  .crewlet-toast__progress.is-paused {
257
251
  animation-play-state: paused;
@@ -261,7 +255,6 @@
261
255
  from {
262
256
  transform: scaleX(1);
263
257
  }
264
-
265
258
  to {
266
259
  transform: scaleX(0);
267
260
  }
@@ -287,8 +280,8 @@
287
280
 
288
281
  /*
289
282
  * The strip still arrives and still goes; it just does not slide, and the
290
- * countdown bar holds still. The timer is untouched: a reader who asked for
291
- * less motion did not ask to be left with a toast that never leaves.
283
+ * wash is not drawn. The timer is untouched: a reader who asked for less
284
+ * motion did not ask to be left with a toast that never leaves.
292
285
  */
293
286
  @media (prefers-reduced-motion: reduce) {
294
287
  .crewlet-toast {
@@ -1,8 +1,8 @@
1
1
  import { Menu } from './chunk-TFH6SYWB.js';
2
2
  import { EmptyValue } from './chunk-EUCC37WY.js';
3
3
  import { Checkbox } from './chunk-YCTMKKRA.js';
4
+ import { Modal } from './chunk-TFMJH2E6.js';
4
5
  import { useClipboard } from './chunk-5VNUYO76.js';
5
- import { Modal } from './chunk-CF6DTETT.js';
6
6
  import { Button } from './chunk-OG6CL3EB.js';
7
7
  import { useCardHeaderSlot } from './chunk-AV2DXAEL.js';
8
8
  import { IconButton } from './chunk-4FQT6ZAY.js';
@@ -1,9 +1,9 @@
1
1
  import { PageHeader } from './chunk-HOXGBLEY.js';
2
2
  import { RelativeTime } from './chunk-3CZ7XAVY.js';
3
3
  import { Toolbar } from './chunk-PGRPNDWM.js';
4
- import { DataTable } from './chunk-WY2NLRZN.js';
4
+ import { DataTable } from './chunk-3VVKJ7AZ.js';
5
5
  import { Menu } from './chunk-TFH6SYWB.js';
6
- import { DateTimePicker } from './chunk-JDPAA2JU.js';
6
+ import { DateTimePicker } from './chunk-AXNQCAFC.js';
7
7
  import { useListbox, useOptionKeys } from './chunk-F73MC7EZ.js';
8
8
  import { Kbd } from './chunk-SMBKXWML.js';
9
9
  import { Input } from './chunk-FTEJPHBI.js';