@crewlethq/ui 0.13.0 → 0.15.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 (76) hide show
  1. package/README.md +42 -0
  2. package/dist/AppShell/AppShell.d.ts +76 -11
  3. package/dist/AppShell/index.d.ts +1 -1
  4. package/dist/AppShell/index.js +2 -2
  5. package/dist/{AppShell-CEVLW4QG.css → AppShell-6QUD7NWM.css} +74 -1
  6. package/dist/AvatarPicker/index.js +4 -4
  7. package/dist/Canvas/index.js +3 -3
  8. package/dist/Charts/StackedColumns.d.ts +30 -7
  9. package/dist/Charts/index.d.ts +1 -1
  10. package/dist/Charts/index.js +1 -1
  11. package/dist/{Charts-JUERFLAR.css → Charts-JYW4X5ZL.css} +18 -1
  12. package/dist/CommandPalette/index.js +3 -3
  13. package/dist/DataTable/index.js +5 -5
  14. package/dist/DataView/index.js +9 -9
  15. package/dist/DateTimePicker/index.js +3 -3
  16. package/dist/{DateTimePicker-4AZBTODT.css → DateTimePicker-NJ6XH2TE.css} +4 -3
  17. package/dist/DescriptionList/DescriptionList.d.ts +9 -1
  18. package/dist/DescriptionList/index.js +1 -1
  19. package/dist/{DescriptionList-YYY3V3O6.css → DescriptionList-IXMRCSMK.css} +24 -0
  20. package/dist/FactList/index.js +3 -3
  21. package/dist/Layer/index.js +1 -1
  22. package/dist/Layer-J222IFNX.css +33 -0
  23. package/dist/Layout/index.js +1 -1
  24. package/dist/{Layout-2ZCV3IGF.css → Layout-ZBEGLXAE.css} +18 -0
  25. package/dist/ListInput/index.js +3 -3
  26. package/dist/MarkdownEditor/index.js +1 -1
  27. package/dist/Menu/index.js +2 -2
  28. package/dist/Modal/index.js +2 -2
  29. package/dist/{Modal-3YJ2GG2T.css → Modal-RQAYGG4L.css} +1 -1
  30. package/dist/OrgTable/index.js +5 -5
  31. package/dist/Popover/index.js +2 -2
  32. package/dist/Select/index.js +2 -2
  33. package/dist/{Select-XMZ44RWY.css → Select-2P7AWUE4.css} +32 -6
  34. package/dist/Shortcut/index.js +1 -1
  35. package/dist/Switcher/index.js +5 -5
  36. package/dist/TagsInput/index.js +3 -3
  37. package/dist/TimeWindowPicker/index.js +4 -4
  38. package/dist/{TimeWindowPicker-GBF4JDFI.css → TimeWindowPicker-BZ5HHATU.css} +5 -4
  39. package/dist/Toaster/Toaster.d.ts +6 -1
  40. package/dist/Toaster/index.js +2 -2
  41. package/dist/{Toaster-KZ7YE2HA.css → Toaster-EOOOTSJT.css} +82 -87
  42. package/dist/Toolbar/index.js +1 -1
  43. package/dist/Tooltip/index.js +2 -2
  44. package/dist/TreeCanvas/index.js +4 -4
  45. package/dist/TreeGrid/index.js +3 -3
  46. package/dist/{chunk-UZPHPW3Z.js → chunk-2GXTIK37.js} +4 -4
  47. package/dist/{chunk-RZ7RGECB.js → chunk-2OLCUNG7.js} +1 -1
  48. package/dist/{chunk-JDPAA2JU.js → chunk-2UU5IGZI.js} +2 -2
  49. package/dist/{chunk-B2CITO6R.js → chunk-7BZPYA5P.js} +3 -3
  50. package/dist/{chunk-2PZBIHRV.js → chunk-AMH67MLM.js} +2 -2
  51. package/dist/{chunk-6LXMLQUM.js → chunk-B2Z2CDM5.js} +2 -2
  52. package/dist/{chunk-O2ZDZZS7.js → chunk-BWRGFKJP.js} +3 -2
  53. package/dist/{chunk-75WOCYGC.js → chunk-DYHSQHAZ.js} +1 -1
  54. package/dist/{chunk-4FFHJBEN.js → chunk-EFNHOVC2.js} +1 -1
  55. package/dist/{chunk-XN4JBAN3.js → chunk-F2XSYBKH.js} +8 -2
  56. package/dist/{chunk-XFE5W2I4.js → chunk-FC4YTTFJ.js} +14 -4
  57. package/dist/{chunk-L3CTFFLZ.js → chunk-H3XOMT7W.js} +53 -9
  58. package/dist/{chunk-7RPGY3JE.js → chunk-HMPFGIWM.js} +1 -1
  59. package/dist/{chunk-HKGS67VG.js → chunk-IYZZL3MZ.js} +1 -1
  60. package/dist/{chunk-URYDN2KA.js → chunk-JI5AVQLA.js} +1 -1
  61. package/dist/{chunk-CF6DTETT.js → chunk-K4VORB64.js} +2 -2
  62. package/dist/{chunk-S3IENQ3E.js → chunk-LCF4WPYS.js} +3 -3
  63. package/dist/{chunk-4WNNEDKO.js → chunk-MLT2HBPN.js} +87 -74
  64. package/dist/{chunk-TFH6SYWB.js → chunk-NS7BVLL3.js} +1 -1
  65. package/dist/{chunk-LELD5KPA.js → chunk-QH3AKP2N.js} +22 -9
  66. package/dist/{chunk-WY2NLRZN.js → chunk-QV266R6G.js} +3 -3
  67. package/dist/{chunk-CQY5NTRS.js → chunk-QWOPX2MN.js} +1 -1
  68. package/dist/{chunk-53DVJCVW.js → chunk-VYOKRN2I.js} +1 -1
  69. package/dist/{chunk-W4ENKCXJ.js → chunk-ZAC7SKUN.js} +1 -1
  70. package/dist/generated/index.js +33 -33
  71. package/dist/index.js +33 -33
  72. package/dist/styles.css +279 -114
  73. package/package.json +3 -3
  74. package/dist/Layer-NAFSGCFA.css +0 -23
  75. package/dist/{chunk-LZP7FGT7.js → chunk-GARACZAH.js} +1 -1
  76. package/dist/{chunk-GG2QEZO2.js → chunk-JCO3SIST.js} +1 -1
package/dist/styles.css CHANGED
@@ -535,7 +535,7 @@
535
535
  }
536
536
 
537
537
 
538
- /* AppShell-CEVLW4QG.css */
538
+ /* AppShell-6QUD7NWM.css */
539
539
  /*
540
540
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
541
541
  * floats beside it.
@@ -753,7 +753,44 @@
753
753
  color var(--motion-duration-fast) var(--motion-easing-default);
754
754
  }
755
755
 
756
- .crewlet-app-shell__rail-row--action:hover {
756
+ /*
757
+ * A CONTROL IN THE FOOT IS A ROW OF THE RAIL'S OWN GRAMMAR: the nav row's 30px
758
+ * step, its glyph-to-word gap, its word size and weight, and its secondary ink
759
+ * lifting to the primary under the pointer, as Settings above it is drawn. So
760
+ * the engine's row under Settings reads as one more row of the rail rather
761
+ * than as a caption, its words start on the line the nav's words start on, and
762
+ * it keeps one height in every state it says: one line of the compact step.
763
+ * A status line the rail only states keeps the quieter caption above, and the
764
+ * status block keeps its card.
765
+ *
766
+ * Its mark takes a nav glyph's width, `sm` (14px), whatever the mark is, so a
767
+ * 7px status dot is centred where the glyph above it is centred and the words
768
+ * beside it start where "Settings" starts.
769
+ */
770
+ .crewlet-app-shell__rail-row--action:not(.crewlet-app-shell__rail-row--block),
771
+ .crewlet-app-shell__rail-foot > .crewlet-btn {
772
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
773
+ min-height: var(--size-nav-row);
774
+ padding-block: 0;
775
+ color: var(--color-text-secondary);
776
+ font-size: var(--font-size-compact);
777
+ font-weight: var(--font-weight-medium);
778
+ letter-spacing: var(--font-letter-spacing-snug);
779
+ line-height: var(--font-line-height-tight);
780
+ }
781
+
782
+ .crewlet-app-shell__rail-row--action:not(.crewlet-app-shell__rail-row--block) > .crewlet-app-shell__rail-row-icon {
783
+ min-width: 14px;
784
+ }
785
+
786
+ /*
787
+ * OPEN IS POINTED AT. The row a panel is open from keeps the hover's lift for
788
+ * as long as the panel is open, drawn from `aria-expanded` so the picture and
789
+ * what a screen reader is told cannot come apart, as the switcher's trigger
790
+ * draws it.
791
+ */
792
+ .crewlet-app-shell__rail-row--action:hover,
793
+ .crewlet-app-shell__rail-row--action[aria-expanded='true'] {
757
794
  background: var(--color-surface-hover);
758
795
  color: var(--color-text-primary);
759
796
  }
@@ -831,6 +868,42 @@
831
868
  flex: none;
832
869
  }
833
870
 
871
+ /*
872
+ * THE COUNT: how many of something the row reports, after its words, drawn as
873
+ * a count in the nav is: the caption step, tabular figures so a count that
874
+ * ticks up does not move the words beside it, and a mark half a step off the
875
+ * figure. It is the tertiary step, as the nav's is, unless what it counts is
876
+ * wrong: a warning count is the warning ink, figure and mark together, which
877
+ * @crewlethq/tokens holds to 4.5:1 on the rail and under the hover overlay
878
+ * (RAIL_PAINTS), so on the row a panel is open from too.
879
+ */
880
+ .crewlet-app-shell__rail-row-count {
881
+ display: inline-flex;
882
+ align-items: center;
883
+ flex: none;
884
+ gap: calc(var(--spacing-1) + 1px);
885
+ color: var(--color-text-tertiary);
886
+ font-size: var(--font-size-2xs);
887
+ font-variant-numeric: tabular-nums;
888
+ }
889
+
890
+ .crewlet-app-shell__rail-row-count-mark {
891
+ display: inline-flex;
892
+ }
893
+
894
+ .crewlet-app-shell__rail-row-count--warning {
895
+ color: var(--color-feedback-warning-ink);
896
+ }
897
+
898
+ /* The chevron that says the row opens a panel, in the quiet step: a mark, not
899
+ a word, and it stays quiet while the row lifts, as the panel's own name is
900
+ what a reader is told. */
901
+ .crewlet-app-shell__rail-row-opens {
902
+ display: inline-flex;
903
+ flex: none;
904
+ color: var(--color-text-tertiary);
905
+ }
906
+
834
907
  /*
835
908
  * THE STATUS BLOCK: a row given a `detail` is the approved design's engine
836
909
  * status, its words over a second line, on the card rung inside the plain
@@ -3297,7 +3370,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
3297
3370
  }
3298
3371
 
3299
3372
 
3300
- /* Charts-JUERFLAR.css */
3373
+ /* Charts-JYW4X5ZL.css */
3301
3374
  /* The chart kit: a legend, a ranked bar list, a stacked bar, stacked
3302
3375
  columns, an activity strip, a time series and the reading layer they share. Hand-drawn rather than a charting library, for one reason that
3303
3376
  decides it: every mark here reads tokens, in two themes, at the contrast
@@ -3705,6 +3778,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
3705
3778
  min-width: 0;
3706
3779
  }
3707
3780
 
3781
+ /*
3782
+ * A FILL CHART GROWS INTO THE HEIGHT IT IS GIVEN (`height="fill"`). The figure
3783
+ * flexes, so in a card a taller neighbour stretches it takes the spare height,
3784
+ * and its rows (a style property) spend all of it on the plot's row. Nowhere to
3785
+ * grow, it is as tall as its content, the plot at its least.
3786
+ */
3787
+ .crewlet-stacked-columns--fill {
3788
+ flex: 1 1 auto;
3789
+ }
3790
+
3708
3791
  /*
3709
3792
  * EACH WORD IS A BOX OF NO HEIGHT, spread from the top of the plot to its
3710
3793
  * baseline, with the word centred on it: so every word stands exactly on the
@@ -3819,12 +3902,19 @@ a.crewlet-breadcrumb__crumb:focus-visible {
3819
3902
  * legend at its END, top right, where the design's Spend card draws it; the
3820
3903
  * legend is flushed to the end of that row and wraps from there. Below, the
3821
3904
  * legend starts under the axis, a step clear of the dates.
3905
+ *
3906
+ * ON A CARD TOO NARROW FOR BOTH, THE LEGEND TAKES A ROW OF ITS OWN, under the
3907
+ * heading and still flushed to the end. Held on one line, the two shrank
3908
+ * together and the legend stood beside the title as a column of one series a
3909
+ * line. The rows stand a step apart, closer than the head stands to the plot,
3910
+ * so the legend still reads as the head's.
3822
3911
  */
3823
3912
  .crewlet-stacked-columns__head {
3824
3913
  grid-column: 1 / -1;
3825
3914
  display: flex;
3915
+ flex-wrap: wrap;
3826
3916
  align-items: flex-start;
3827
- gap: var(--spacing-4);
3917
+ gap: var(--spacing-2) var(--spacing-4);
3828
3918
  margin-bottom: var(--spacing-3);
3829
3919
  min-width: 0;
3830
3920
  }
@@ -7857,11 +7947,12 @@ body.crewlet-data-table-resizing {
7857
7947
  }
7858
7948
 
7859
7949
 
7860
- /* DateTimePicker-4AZBTODT.css */
7950
+ /* DateTimePicker-NJ6XH2TE.css */
7861
7951
  /*
7862
7952
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
7863
7953
  *
7864
- * The trigger borrows the Select's geometry so a date box and a picker line
7954
+ * The trigger borrows the Select's geometry and its button boundary
7955
+ * (--color-border-strong; see Select.css) so a date box and a picker line
7865
7956
  * up in the same toolbar; the panel holds the shared CalendarGrid, so the
7866
7957
  * month looks and behaves the same here as in every other picker.
7867
7958
  */
@@ -7877,7 +7968,7 @@ body.crewlet-data-table-resizing {
7877
7968
  height. */
7878
7969
  padding: 0 var(--spacing-2) 0 var(--spacing-3);
7879
7970
  background: var(--color-surface-subtle);
7880
- border: 1px solid var(--color-border-control);
7971
+ border: 1px solid var(--color-border-strong);
7881
7972
  border-radius: var(--radius-md);
7882
7973
  color: var(--color-text-primary);
7883
7974
  font-family: inherit;
@@ -7894,7 +7985,7 @@ body.crewlet-data-table-resizing {
7894
7985
  }
7895
7986
 
7896
7987
  .crewlet-datetime:hover:not(:disabled) {
7897
- border-color: var(--color-border-hover);
7988
+ border-color: var(--color-border-strong-hover);
7898
7989
  }
7899
7990
 
7900
7991
  /*
@@ -8064,7 +8155,7 @@ svg.crewlet-datetime__chevron {
8064
8155
  }
8065
8156
 
8066
8157
 
8067
- /* DescriptionList-YYY3V3O6.css */
8158
+ /* DescriptionList-IXMRCSMK.css */
8068
8159
  /*
8069
8160
  * Metadata pairs on one grid.
8070
8161
  *
@@ -8125,6 +8216,30 @@ svg.crewlet-datetime__chevron {
8125
8216
  }
8126
8217
  }
8127
8218
 
8219
+ /*
8220
+ * FIT: the term column is as wide as its longest term, and the pairs stay side
8221
+ * by side at every width. It is for a panel of its own width, such as a
8222
+ * popover, where the window's width says nothing about the room the list has:
8223
+ * the narrow rule above is a question about the window, and a 260px panel is
8224
+ * 260px on a phone and on a desktop alike. Its terms are a word each, so the
8225
+ * column they take is a word wide and the details keep the rest.
8226
+ *
8227
+ * Written AFTER the narrow rule, which it overrides at the same weight, so
8228
+ * nothing here has to outrank a media query.
8229
+ */
8230
+ .crewlet-description-list--fit {
8231
+ grid-template-columns: max-content minmax(0, 1fr);
8232
+ gap: var(--spacing-2) var(--spacing-4);
8233
+ }
8234
+
8235
+ .crewlet-description-list--fit.crewlet-description-list--dense {
8236
+ gap: var(--spacing-1) var(--spacing-3);
8237
+ }
8238
+
8239
+ .crewlet-description-list--fit .crewlet-description-list__detail {
8240
+ margin-bottom: 0;
8241
+ }
8242
+
8128
8243
 
8129
8244
  /* DiffList-3EX64AAE.css */
8130
8245
  /* DiffList: one path per row, with its mark, its word and its tint.
@@ -10678,7 +10793,7 @@ svg.crewlet-datetime__chevron {
10678
10793
  }
10679
10794
 
10680
10795
 
10681
- /* Layer-NAFSGCFA.css */
10796
+ /* Layer-J222IFNX.css */
10682
10797
  /*
10683
10798
  * The portal target a LayerHost provides.
10684
10799
  *
@@ -10690,13 +10805,23 @@ svg.crewlet-datetime__chevron {
10690
10805
  * Its container establishes the positioning context. A host whose parent is
10691
10806
  * static covers the nearest positioned ancestor instead, which is the
10692
10807
  * viewport in the common case and is still a usable bound.
10808
+ *
10809
+ * IT TAKES NO PLACE IN THE STACKING ORDER OF ITS OWN. Every surface drawn in
10810
+ * it carries its own step in the layer band, its depth in the stack, and that
10811
+ * is what decides what paints on top. A z-index here made the host a stacking
10812
+ * context at the bottom of the band, which held everything inside it under
10813
+ * whatever the page stacked above that step: the shell's open drawer takes
10814
+ * the band's own steps beside the host rather than inside it, so a panel
10815
+ * opened from the drawer was drawn under the drawer it came from. A surface
10816
+ * at the same step as the drawer's rail, which is the next one opened above
10817
+ * it, paints over the rail because the host follows the shell in the
10818
+ * document.
10693
10819
  */
10694
10820
 
10695
10821
  .crewlet-layer-host {
10696
10822
  position: absolute;
10697
10823
  inset: 0;
10698
10824
  pointer-events: none;
10699
- z-index: var(--z-index-layer-base);
10700
10825
  }
10701
10826
 
10702
10827
  .crewlet-layer-host > * {
@@ -10704,7 +10829,7 @@ svg.crewlet-datetime__chevron {
10704
10829
  }
10705
10830
 
10706
10831
 
10707
- /* Layout-2ZCV3IGF.css */
10832
+ /* Layout-ZBEGLXAE.css */
10708
10833
  /*
10709
10834
  * Stack, Inline, Spacer and AutoGrid.
10710
10835
  *
@@ -10732,6 +10857,24 @@ svg.crewlet-datetime__chevron {
10732
10857
  flex-direction: row;
10733
10858
  }
10734
10859
 
10860
+ /*
10861
+ * DRAWN AS A LIST, IT IS STILL A RUN OF ITEMS. A Stack or an Inline spends no
10862
+ * pixel of its own, and a `ul` or an `ol` arrives with the browser's: a margin
10863
+ * above and below, a 40px indent and a marker on every item, so a list of five
10864
+ * names laid out as a Stack was pushed in and bulleted. They are taken back,
10865
+ * and the element stays a list to a screen reader. A list that wants its
10866
+ * markers is `List variant="bulleted"`.
10867
+ *
10868
+ * Inside :where(), so the rule weighs one class like every other here and a
10869
+ * caller's own class still decides what it sets.
10870
+ */
10871
+ :where(ul, ol).crewlet-stack,
10872
+ :where(ul, ol).crewlet-inline {
10873
+ margin: 0;
10874
+ padding: 0;
10875
+ list-style: none;
10876
+ }
10877
+
10735
10878
  /*
10736
10879
  * A GRID OF CARDS KEEPS ITS TRACKS. `auto-fill` lays down every track the row
10737
10880
  * has room for and leaves the empty ones empty; `auto-fit`, which this was,
@@ -12004,7 +12147,7 @@ svg.crewlet-datetime__chevron {
12004
12147
  }
12005
12148
 
12006
12149
 
12007
- /* Modal-3YJ2GG2T.css */
12150
+ /* Modal-RQAYGG4L.css */
12008
12151
  /*
12009
12152
  * The modal surface: the veil, the frame, and the three bands inside it.
12010
12153
  *
@@ -12296,7 +12439,7 @@ svg.crewlet-datetime__chevron {
12296
12439
  * padding is only the least it keeps when a title wraps. It was the 16px step
12297
12440
  * while the bar was 64px, which a full control step filled exactly; at 52px
12298
12441
  * the same padding stood the head 12px past the bar behind it. At the 4px step
12299
- * the head is the bar's height with the control step at every density, 36.48px
12442
+ * the head is the bar's height with the control step at every density, 37.12px
12300
12443
  * at comfortable included, and with a subtitle under the title.
12301
12444
  *
12302
12445
  * It used to be the tighter band, 49px with a close control alone, and the
@@ -15083,7 +15226,7 @@ svg.crewlet-datetime__chevron {
15083
15226
  }
15084
15227
 
15085
15228
 
15086
- /* Select-XMZ44RWY.css */
15229
+ /* Select-2P7AWUE4.css */
15087
15230
  /*
15088
15231
  * Select: one chrome over two controls, and the product's only dropdown.
15089
15232
  *
@@ -15093,9 +15236,12 @@ svg.crewlet-datetime__chevron {
15093
15236
  * into the nearest layer host and drawn with the shared listbox register, so
15094
15237
  * a list of options looks the same wherever it is offered from.
15095
15238
  *
15096
- * The boundary is --color-border-control, like every other control: the
15097
- * hairline measured 1.27:1 in light, which is a box a reader has to know is
15098
- * there already.
15239
+ * THE BOUNDARY IS A BUTTON'S, --color-border-strong, the secondary button's
15240
+ * and the date and time-window pickers'. A picker shows its value and its
15241
+ * chevron, and those are what a reader knows it by. --color-border-control,
15242
+ * at 3:1, is for the controls whose outline IS the control (a text box, a
15243
+ * checkbox, a switch; see Input.css): on a picker it drew the one bright box
15244
+ * in a row of buttons and switchers, brighter at rest than under the pointer.
15099
15245
  */
15100
15246
 
15101
15247
  .crewlet-select {
@@ -15113,7 +15259,7 @@ svg.crewlet-datetime__chevron {
15113
15259
  width: 100%;
15114
15260
  min-height: var(--size-control-md);
15115
15261
  background-color: var(--color-surface-subtle);
15116
- border: 1px solid var(--color-border-control);
15262
+ border: 1px solid var(--color-border-strong);
15117
15263
  border-radius: var(--radius-md);
15118
15264
  color: var(--color-text-primary);
15119
15265
  /* The boundary is the only thing that moves. The ring is an outline, which
@@ -15134,7 +15280,7 @@ svg.crewlet-datetime__chevron {
15134
15280
  }
15135
15281
 
15136
15282
  .crewlet-select:hover {
15137
- border-color: var(--color-border-hover);
15283
+ border-color: var(--color-border-strong-hover);
15138
15284
  }
15139
15285
 
15140
15286
  /*
@@ -15283,7 +15429,7 @@ svg.crewlet-select__chevron {
15283
15429
  display: flex;
15284
15430
  flex-direction: column;
15285
15431
  min-width: 0;
15286
- max-height: var(--crewlet-select-menu-max-height);
15432
+ max-height: min(var(--crewlet-select-menu-max-height), 60vh);
15287
15433
  /*
15288
15434
  * THE PANEL IS THE PRODUCT'S SURFACE, on the panel hairline, at the panel
15289
15435
  * corner. A list offered from a field is another panel over the one the
@@ -15310,11 +15456,25 @@ svg.crewlet-select__chevron {
15310
15456
  position: absolute;
15311
15457
  }
15312
15458
 
15459
+ /*
15460
+ * THE PANEL'S HEIGHT IS THE LIST'S. The shared listbox register caps a list
15461
+ * at min(360px, 60vh) on its own, which inside this panel made
15462
+ * `--crewlet-select-menu-max-height` a promise it could not keep past 360px:
15463
+ * a taller panel drew the same short list and scrolled it. Here the list
15464
+ * fills what the panel allows, and the panel keeps the register's cap on the
15465
+ * window (see `.crewlet-select__menu`).
15466
+ */
15313
15467
  .crewlet-select__list {
15314
15468
  flex: 1;
15315
15469
  min-height: 0;
15316
15470
  }
15317
15471
 
15472
+ /* Scoped to the panel for the weight, as the option rules below are: the
15473
+ register's cap is one class, and the bundle orders equal weights by hash. */
15474
+ .crewlet-select__menu .crewlet-select__list {
15475
+ max-height: none;
15476
+ }
15477
+
15318
15478
  .crewlet-select__group {
15319
15479
  display: flex;
15320
15480
  flex-direction: column;
@@ -15376,6 +15536,15 @@ svg.crewlet-select__chevron {
15376
15536
  color: var(--color-brand-accent-ink);
15377
15537
  }
15378
15538
 
15539
+ /*
15540
+ * AT THE ROW'S END in a list whose rows lead with a mark (see `tickAtEnd`),
15541
+ * so the mark starts at the panel's edge. After a hint it follows the hint,
15542
+ * which already takes the free space; without one it takes it itself.
15543
+ */
15544
+ .crewlet-select__option-body + .crewlet-select__option-tick--end {
15545
+ margin-left: auto;
15546
+ }
15547
+
15379
15548
  .crewlet-select__option-body {
15380
15549
  display: flex;
15381
15550
  flex-direction: column;
@@ -19305,12 +19474,13 @@ b.crewlet-switcher__match {
19305
19474
  }
19306
19475
 
19307
19476
 
19308
- /* TimeWindowPicker-GBF4JDFI.css */
19477
+ /* TimeWindowPicker-BZ5HHATU.css */
19309
19478
  /*
19310
19479
  * TimeWindowPicker: one trigger over one panel.
19311
19480
  *
19312
- * The trigger takes the same geometry as a Select and a DateTimePicker, so the
19313
- * three line up in a filter bar. The panel is a RAIL of named windows beside
19481
+ * The trigger takes the same geometry and button boundary as a Select and a
19482
+ * DateTimePicker (--color-border-strong; see Select.css), so the three line
19483
+ * up in a filter bar. The panel is a RAIL of named windows beside
19314
19484
  * the calendars, rather than two tabs with one of them hidden: the windows a
19315
19485
  * reader picks by name are the road, and the absolute range is the turning off
19316
19486
  * it, so both are on screen at once and each shows what the other chose.
@@ -19325,7 +19495,7 @@ b.crewlet-switcher__match {
19325
19495
  /* The side inset only: see DateTimePicker's own trigger. */
19326
19496
  padding: 0 var(--spacing-2) 0 var(--spacing-3);
19327
19497
  background: var(--color-surface-subtle);
19328
- border: 1px solid var(--color-border-control);
19498
+ border: 1px solid var(--color-border-strong);
19329
19499
  border-radius: var(--radius-md);
19330
19500
  color: var(--color-text-primary);
19331
19501
  font-family: inherit;
@@ -19342,7 +19512,7 @@ b.crewlet-switcher__match {
19342
19512
  }
19343
19513
 
19344
19514
  .crewlet-time-window:hover:not(:disabled) {
19345
- border-color: var(--color-border-hover);
19515
+ border-color: var(--color-border-strong-hover);
19346
19516
  }
19347
19517
 
19348
19518
  /*
@@ -19871,102 +20041,102 @@ svg.crewlet-time-window__tick {
19871
20041
  }
19872
20042
 
19873
20043
 
19874
- /* Toaster-KZ7YE2HA.css */
20044
+ /* Toaster-EOOOTSJT.css */
19875
20045
  /*
19876
- * The toast stack.
20046
+ * The toast stack, drawn as the first release drew it (24a60c3): a dark strip
20047
+ * on the page's deepest ground with the large shadow and the rim light, a
20048
+ * 12px corner, the variant said by its mark alone, never a flood of its hue,
20049
+ * and the countdown as a wash behind the words that drains from the right.
19877
20050
  *
19878
- * ITS SURFACE IS A THEME TOKEN. 0.2.0 mixed the subtle surface 60 percent with
19879
- * black, which is a dark strip whatever palette is painting: on a light page
19880
- * the toast's own text measured 1.56:1 against it.
20051
+ * IN TOKENS RATHER THAN ITS LITERALS, so it follows every theme. The strip is
20052
+ * --color-surface-background: the first release mixed the panel with black,
20053
+ * which read as a dark bar on a light page, where its words measured 1.56:1.
20054
+ * The marks are the feedback INK steps, the soft moss, amber and rose it drew,
20055
+ * measured as text on every theme. The washes are the feedback SOFT steps.
19881
20056
  *
19882
- * THE DRAIN IS A RULE ALONG THE FOOT, not a wash behind the words. A tinted
19883
- * layer under the message is a composite nothing measured, and it moves while
19884
- * the message is being read; a 2px bar at the edge says the same thing and
19885
- * touches no text at all. It is decoration either way: the dismissal is a
19886
- * timer now, so a reader who asks for reduced motion still gets the toast
19887
- * taken away.
20057
+ * The wash is decoration: the dismissal is a timer, so a reader who asks for
20058
+ * reduced motion gets no wash and still gets the toast taken away.
19888
20059
  */
19889
-
19890
20060
  .crewlet-toaster {
19891
20061
  position: fixed;
19892
20062
  z-index: var(--z-index-toast);
19893
20063
  display: flex;
19894
20064
  flex-direction: column;
19895
- gap: var(--spacing-2);
19896
- /* The engine's 420px, held under the viewport at the width a phone has.
19897
- The strip is one or two lines of 13px text and an action; at 380 the
19898
- commonest failure message wrapped onto a third. */
19899
- width: min(420px, calc(100vw - var(--spacing-9)));
20065
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
20066
+ width: min(380px, calc(100vw - 2 * var(--spacing-6)));
19900
20067
  /* The stack itself takes no presses, so the screen under it stays live
19901
20068
  while nothing is up; each toast takes them back for its own strip. */
19902
20069
  pointer-events: none;
19903
20070
  }
19904
20071
 
19905
20072
  .crewlet-toaster--bottom-right {
19906
- bottom: var(--spacing-4);
19907
- right: var(--spacing-4);
20073
+ bottom: var(--spacing-6);
20074
+ right: var(--spacing-6);
19908
20075
  }
19909
20076
 
19910
20077
  .crewlet-toaster--top-right {
19911
- top: var(--spacing-4);
19912
- right: var(--spacing-4);
20078
+ top: var(--spacing-6);
20079
+ right: var(--spacing-6);
19913
20080
  }
19914
20081
 
19915
20082
  .crewlet-toaster--bottom-left {
19916
- bottom: var(--spacing-4);
19917
- left: var(--spacing-4);
20083
+ bottom: var(--spacing-6);
20084
+ left: var(--spacing-6);
19918
20085
  }
19919
20086
 
19920
20087
  .crewlet-toaster--top-left {
19921
- top: var(--spacing-4);
19922
- left: var(--spacing-4);
20088
+ top: var(--spacing-6);
20089
+ left: var(--spacing-6);
19923
20090
  }
19924
20091
 
19925
20092
  .crewlet-toast {
20093
+ /* The mark and the wash are the two places a variant spends its hue. */
19926
20094
  --crewlet-toast-mark: var(--color-text-secondary);
19927
- /*
19928
- * The boundary and the two inks are variables so a tone can spend them. Only
19929
- * one does: a failure, which is the engine's one toned strip.
19930
- */
19931
- --crewlet-toast-line: var(--color-border-default);
19932
- --crewlet-toast-ink: var(--color-text-primary);
19933
- --crewlet-toast-ink-quiet: var(--color-text-secondary);
20095
+ --crewlet-toast-wash: var(--color-surface-pressed);
20096
+ /* 14px at the normal density, and the corner the dismiss sits in beside it. */
20097
+ --crewlet-toast-inset: calc(var(--spacing-3) + var(--spacing-1) / 2);
19934
20098
 
19935
20099
  pointer-events: auto;
19936
20100
  position: relative;
19937
20101
  display: flex;
19938
20102
  align-items: flex-start;
19939
- /* The panel's own gap and padding, and the panel's own surface: the engine
19940
- draws a toast as a small panel that happens to float, so it sits on the
19941
- same ground, the same hairline and the same corner as everything the
19942
- screen behind it is made of. */
19943
- gap: var(--spacing-2);
19944
- padding: var(--spacing-2) var(--spacing-8) var(--spacing-2) var(--spacing-3);
19945
- background: var(--color-surface-subtle);
19946
- border: 1px solid var(--crewlet-toast-line);
19947
- border-radius: var(--radius-md);
19948
- box-shadow: var(--shadow-md);
19949
- color: var(--crewlet-toast-ink);
20103
+ gap: var(--spacing-3);
20104
+ padding: var(--crewlet-toast-inset) calc(var(--spacing-7) + var(--spacing-1) * 1.5) var(--crewlet-toast-inset)
20105
+ var(--crewlet-toast-inset);
20106
+ background: var(--color-surface-background);
20107
+ border: 1px solid var(--color-border-default);
20108
+ border-radius: var(--radius-lg);
20109
+ /* The large shadow and the rim light, both from tokens that are a shadow in
20110
+ every palette: --shadow-hairline is `none` in light, and a `none` inside a
20111
+ list drops the whole declaration. */
20112
+ box-shadow: var(--shadow-xl), var(--shadow-rim-lit);
20113
+ color: var(--color-text-primary);
19950
20114
  font-family: var(--font-family-sans);
19951
20115
  font-size: var(--font-size-compact);
19952
- line-height: var(--font-line-height-normal);
20116
+ line-height: var(--font-line-height-body);
19953
20117
  letter-spacing: var(--font-letter-spacing-snug);
19954
20118
  overflow: hidden;
19955
- animation: crewlet-toast-in var(--motion-duration-base) var(--motion-easing-emphasized);
20119
+ animation: crewlet-toast-in var(--motion-duration-slow) var(--motion-easing-emphasized);
19956
20120
  }
19957
20121
 
19958
20122
  @keyframes crewlet-toast-in {
19959
20123
  from {
19960
20124
  opacity: 0;
19961
- transform: translateY(6px);
20125
+ transform: translateX(var(--spacing-4));
19962
20126
  }
19963
-
19964
20127
  to {
19965
20128
  opacity: 1;
19966
- transform: translateY(0);
20129
+ transform: translateX(0);
19967
20130
  }
19968
20131
  }
19969
20132
 
20133
+ /* The words sit over the wash: every child is raised, and the dismiss and the
20134
+ wash below take their own places back. */
20135
+ .crewlet-toast > * {
20136
+ position: relative;
20137
+ z-index: var(--z-index-raised);
20138
+ }
20139
+
19970
20140
  .crewlet-toast__icon {
19971
20141
  display: inline-flex;
19972
20142
  flex: none;
@@ -19974,34 +20144,28 @@ svg.crewlet-time-window__tick {
19974
20144
  color: var(--crewlet-toast-mark);
19975
20145
  }
19976
20146
 
19977
- /* The mark is the tone's FILL step, which is measured at 3:1 as a mark. The
19978
- words beside it stay in the primary ink: a coloured sentence on a coloured
19979
- strip is the pair that has to be measured, and this one does not exist. */
20147
+ /*
20148
+ * A VARIANT IS ITS MARK AND ITS WASH. The words stay in the strip's own inks
20149
+ * and the edge stays the hairline, so a failure is a rose mark rather than a
20150
+ * red strip: the outcome is said by the glyph and the title, and the sentence
20151
+ * beside them is read in the ink every sentence is read in. The wash is the
20152
+ * countdown, so only a toast that counts down draws one: a success is a moss
20153
+ * mark on a faint moss wash, and a failure, sticky unless it is given a
20154
+ * duration, draws none. Information is the neutral mark on the neutral wash.
20155
+ */
19980
20156
  .crewlet-toast--success {
19981
- --crewlet-toast-mark: var(--color-feedback-success);
20157
+ --crewlet-toast-mark: var(--color-feedback-success-ink);
20158
+ --crewlet-toast-wash: var(--color-feedback-success-soft);
19982
20159
  }
19983
20160
 
19984
20161
  .crewlet-toast--warning {
19985
- --crewlet-toast-mark: var(--color-feedback-warning);
20162
+ --crewlet-toast-mark: var(--color-feedback-warning-ink);
20163
+ --crewlet-toast-wash: var(--color-feedback-warning-soft);
19986
20164
  }
19987
20165
 
19988
- /*
19989
- * A FAILURE IS THE ONE TONED STRIP. It is the outcome that is news rather than
19990
- * confirmation and the one that does not take itself away, so the engine gives
19991
- * it the hue twice: the fill step on the edge, where 3:1 is the floor a
19992
- * boundary has to clear, and the INK step on every word, which is the measured
19993
- * text pair on this surface. Never the fill behind a word: that is the swap
19994
- * the whole soft-and-ink split exists to stop.
19995
- */
19996
20166
  .crewlet-toast--danger {
19997
- --crewlet-toast-mark: var(--color-feedback-danger);
19998
- --crewlet-toast-line: var(--color-feedback-danger);
19999
- --crewlet-toast-ink: var(--color-feedback-danger-ink);
20000
- --crewlet-toast-ink-quiet: var(--color-feedback-danger-ink);
20001
- }
20002
-
20003
- .crewlet-toast--info {
20004
- --crewlet-toast-mark: var(--color-feedback-info);
20167
+ --crewlet-toast-mark: var(--color-feedback-danger-ink);
20168
+ --crewlet-toast-wash: var(--color-feedback-danger-soft);
20005
20169
  }
20006
20170
 
20007
20171
  /* A usage limit notice is the application's own variant: it paints the glyph
@@ -20023,12 +20187,12 @@ svg.crewlet-time-window__tick {
20023
20187
  }
20024
20188
 
20025
20189
  .crewlet-toast__message {
20026
- color: var(--crewlet-toast-ink-quiet);
20190
+ color: var(--color-text-secondary);
20027
20191
  overflow-wrap: anywhere;
20028
20192
  }
20029
20193
 
20030
20194
  .crewlet-toast__actions {
20031
- margin-top: var(--spacing-2);
20195
+ margin-top: calc(var(--spacing-2) + var(--spacing-1) / 2);
20032
20196
  display: flex;
20033
20197
  gap: var(--spacing-2);
20034
20198
  }
@@ -20060,6 +20224,7 @@ svg.crewlet-time-window__tick {
20060
20224
  border-color: var(--color-brand-accent-hover);
20061
20225
  }
20062
20226
 
20227
+ /* A failure's one filled thing is the way out of it. */
20063
20228
  .crewlet-toast--danger .crewlet-toast__action-btn,
20064
20229
  .crewlet-toast--danger .crewlet-toast__action-link {
20065
20230
  background: var(--color-feedback-danger);
@@ -20081,8 +20246,9 @@ svg.crewlet-time-window__tick {
20081
20246
  }
20082
20247
 
20083
20248
  /* The dismiss sits absolute in the corner so a multi-line message flows
20084
- under it rather than around it. 24px square: the smallest target
20085
- WCAG 2.2 accepts. */
20249
+ under it rather than around it, and after the body in the document, so it
20250
+ is drawn over the words at the same raised step. 24px square: the smallest
20251
+ target WCAG 2.2 accepts. */
20086
20252
  .crewlet-toast__dismiss {
20087
20253
  position: absolute;
20088
20254
  top: var(--spacing-2);
@@ -20096,10 +20262,7 @@ svg.crewlet-time-window__tick {
20096
20262
  border: 0;
20097
20263
  border-radius: var(--radius-sm);
20098
20264
  background: transparent;
20099
- /* The strip's own quiet ink rather than the neutral tertiary step, so the
20100
- close on a failure is part of the failure rather than the one grey thing
20101
- inside it. */
20102
- color: var(--crewlet-toast-ink-quiet);
20265
+ color: var(--color-text-tertiary);
20103
20266
  cursor: pointer;
20104
20267
  transition:
20105
20268
  background var(--motion-duration-fast) var(--motion-easing-default),
@@ -20107,25 +20270,28 @@ svg.crewlet-time-window__tick {
20107
20270
  }
20108
20271
 
20109
20272
  .crewlet-toast__dismiss:hover {
20110
- background: var(--color-surface-hover);
20111
- color: var(--crewlet-toast-ink);
20273
+ background: var(--color-surface-elevated);
20274
+ color: var(--color-text-primary);
20112
20275
  }
20113
20276
 
20277
+ /*
20278
+ * THE COUNTDOWN IS A WASH BEHIND THE WORDS, the variant's soft step over the
20279
+ * whole strip, draining from the right as the time runs out. It sits under
20280
+ * every raised child, and it is the timer's picture, not the timer.
20281
+ */
20114
20282
  .crewlet-toast__progress {
20115
20283
  position: absolute;
20116
- left: 0;
20117
- right: 0;
20118
- bottom: 0;
20119
- height: 2px;
20284
+ inset: 0;
20285
+ z-index: var(--z-index-base);
20120
20286
  transform-origin: left center;
20121
- background: var(--crewlet-toast-mark);
20287
+ background: var(--crewlet-toast-wash);
20122
20288
  pointer-events: none;
20123
20289
  animation-name: crewlet-toast-drain;
20124
20290
  animation-timing-function: linear;
20125
20291
  animation-fill-mode: forwards;
20126
20292
  }
20127
20293
 
20128
- /* Paused by the class rather than by :hover, so the bar and the timer that
20294
+ /* Paused by the class rather than by :hover, so the wash and the timer that
20129
20295
  actually dismisses are stopped by the same event. */
20130
20296
  .crewlet-toast__progress.is-paused {
20131
20297
  animation-play-state: paused;
@@ -20135,7 +20301,6 @@ svg.crewlet-time-window__tick {
20135
20301
  from {
20136
20302
  transform: scaleX(1);
20137
20303
  }
20138
-
20139
20304
  to {
20140
20305
  transform: scaleX(0);
20141
20306
  }
@@ -20161,8 +20326,8 @@ svg.crewlet-time-window__tick {
20161
20326
 
20162
20327
  /*
20163
20328
  * The strip still arrives and still goes; it just does not slide, and the
20164
- * countdown bar holds still. The timer is untouched: a reader who asked for
20165
- * less motion did not ask to be left with a toast that never leaves.
20329
+ * wash is not drawn. The timer is untouched: a reader who asked for less
20330
+ * motion did not ask to be left with a toast that never leaves.
20166
20331
  */
20167
20332
  @media (prefers-reduced-motion: reduce) {
20168
20333
  .crewlet-toast {