@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/dist/styles.css CHANGED
@@ -7857,11 +7857,12 @@ body.crewlet-data-table-resizing {
7857
7857
  }
7858
7858
 
7859
7859
 
7860
- /* DateTimePicker-4AZBTODT.css */
7860
+ /* DateTimePicker-NJ6XH2TE.css */
7861
7861
  /*
7862
7862
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
7863
7863
  *
7864
- * The trigger borrows the Select's geometry so a date box and a picker line
7864
+ * The trigger borrows the Select's geometry and its button boundary
7865
+ * (--color-border-strong; see Select.css) so a date box and a picker line
7865
7866
  * up in the same toolbar; the panel holds the shared CalendarGrid, so the
7866
7867
  * month looks and behaves the same here as in every other picker.
7867
7868
  */
@@ -7877,7 +7878,7 @@ body.crewlet-data-table-resizing {
7877
7878
  height. */
7878
7879
  padding: 0 var(--spacing-2) 0 var(--spacing-3);
7879
7880
  background: var(--color-surface-subtle);
7880
- border: 1px solid var(--color-border-control);
7881
+ border: 1px solid var(--color-border-strong);
7881
7882
  border-radius: var(--radius-md);
7882
7883
  color: var(--color-text-primary);
7883
7884
  font-family: inherit;
@@ -7894,7 +7895,7 @@ body.crewlet-data-table-resizing {
7894
7895
  }
7895
7896
 
7896
7897
  .crewlet-datetime:hover:not(:disabled) {
7897
- border-color: var(--color-border-hover);
7898
+ border-color: var(--color-border-strong-hover);
7898
7899
  }
7899
7900
 
7900
7901
  /*
@@ -12004,7 +12005,7 @@ svg.crewlet-datetime__chevron {
12004
12005
  }
12005
12006
 
12006
12007
 
12007
- /* Modal-3YJ2GG2T.css */
12008
+ /* Modal-RQAYGG4L.css */
12008
12009
  /*
12009
12010
  * The modal surface: the veil, the frame, and the three bands inside it.
12010
12011
  *
@@ -12296,7 +12297,7 @@ svg.crewlet-datetime__chevron {
12296
12297
  * padding is only the least it keeps when a title wraps. It was the 16px step
12297
12298
  * while the bar was 64px, which a full control step filled exactly; at 52px
12298
12299
  * 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
12300
+ * the head is the bar's height with the control step at every density, 37.12px
12300
12301
  * at comfortable included, and with a subtitle under the title.
12301
12302
  *
12302
12303
  * It used to be the tighter band, 49px with a close control alone, and the
@@ -15083,7 +15084,7 @@ svg.crewlet-datetime__chevron {
15083
15084
  }
15084
15085
 
15085
15086
 
15086
- /* Select-XMZ44RWY.css */
15087
+ /* Select-2P7AWUE4.css */
15087
15088
  /*
15088
15089
  * Select: one chrome over two controls, and the product's only dropdown.
15089
15090
  *
@@ -15093,9 +15094,12 @@ svg.crewlet-datetime__chevron {
15093
15094
  * into the nearest layer host and drawn with the shared listbox register, so
15094
15095
  * a list of options looks the same wherever it is offered from.
15095
15096
  *
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.
15097
+ * THE BOUNDARY IS A BUTTON'S, --color-border-strong, the secondary button's
15098
+ * and the date and time-window pickers'. A picker shows its value and its
15099
+ * chevron, and those are what a reader knows it by. --color-border-control,
15100
+ * at 3:1, is for the controls whose outline IS the control (a text box, a
15101
+ * checkbox, a switch; see Input.css): on a picker it drew the one bright box
15102
+ * in a row of buttons and switchers, brighter at rest than under the pointer.
15099
15103
  */
15100
15104
 
15101
15105
  .crewlet-select {
@@ -15113,7 +15117,7 @@ svg.crewlet-datetime__chevron {
15113
15117
  width: 100%;
15114
15118
  min-height: var(--size-control-md);
15115
15119
  background-color: var(--color-surface-subtle);
15116
- border: 1px solid var(--color-border-control);
15120
+ border: 1px solid var(--color-border-strong);
15117
15121
  border-radius: var(--radius-md);
15118
15122
  color: var(--color-text-primary);
15119
15123
  /* The boundary is the only thing that moves. The ring is an outline, which
@@ -15134,7 +15138,7 @@ svg.crewlet-datetime__chevron {
15134
15138
  }
15135
15139
 
15136
15140
  .crewlet-select:hover {
15137
- border-color: var(--color-border-hover);
15141
+ border-color: var(--color-border-strong-hover);
15138
15142
  }
15139
15143
 
15140
15144
  /*
@@ -15283,7 +15287,7 @@ svg.crewlet-select__chevron {
15283
15287
  display: flex;
15284
15288
  flex-direction: column;
15285
15289
  min-width: 0;
15286
- max-height: var(--crewlet-select-menu-max-height);
15290
+ max-height: min(var(--crewlet-select-menu-max-height), 60vh);
15287
15291
  /*
15288
15292
  * THE PANEL IS THE PRODUCT'S SURFACE, on the panel hairline, at the panel
15289
15293
  * corner. A list offered from a field is another panel over the one the
@@ -15310,11 +15314,25 @@ svg.crewlet-select__chevron {
15310
15314
  position: absolute;
15311
15315
  }
15312
15316
 
15317
+ /*
15318
+ * THE PANEL'S HEIGHT IS THE LIST'S. The shared listbox register caps a list
15319
+ * at min(360px, 60vh) on its own, which inside this panel made
15320
+ * `--crewlet-select-menu-max-height` a promise it could not keep past 360px:
15321
+ * a taller panel drew the same short list and scrolled it. Here the list
15322
+ * fills what the panel allows, and the panel keeps the register's cap on the
15323
+ * window (see `.crewlet-select__menu`).
15324
+ */
15313
15325
  .crewlet-select__list {
15314
15326
  flex: 1;
15315
15327
  min-height: 0;
15316
15328
  }
15317
15329
 
15330
+ /* Scoped to the panel for the weight, as the option rules below are: the
15331
+ register's cap is one class, and the bundle orders equal weights by hash. */
15332
+ .crewlet-select__menu .crewlet-select__list {
15333
+ max-height: none;
15334
+ }
15335
+
15318
15336
  .crewlet-select__group {
15319
15337
  display: flex;
15320
15338
  flex-direction: column;
@@ -15376,6 +15394,15 @@ svg.crewlet-select__chevron {
15376
15394
  color: var(--color-brand-accent-ink);
15377
15395
  }
15378
15396
 
15397
+ /*
15398
+ * AT THE ROW'S END in a list whose rows lead with a mark (see `tickAtEnd`),
15399
+ * so the mark starts at the panel's edge. After a hint it follows the hint,
15400
+ * which already takes the free space; without one it takes it itself.
15401
+ */
15402
+ .crewlet-select__option-body + .crewlet-select__option-tick--end {
15403
+ margin-left: auto;
15404
+ }
15405
+
15379
15406
  .crewlet-select__option-body {
15380
15407
  display: flex;
15381
15408
  flex-direction: column;
@@ -19305,12 +19332,13 @@ b.crewlet-switcher__match {
19305
19332
  }
19306
19333
 
19307
19334
 
19308
- /* TimeWindowPicker-GBF4JDFI.css */
19335
+ /* TimeWindowPicker-BZ5HHATU.css */
19309
19336
  /*
19310
19337
  * TimeWindowPicker: one trigger over one panel.
19311
19338
  *
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
19339
+ * The trigger takes the same geometry and button boundary as a Select and a
19340
+ * DateTimePicker (--color-border-strong; see Select.css), so the three line
19341
+ * up in a filter bar. The panel is a RAIL of named windows beside
19314
19342
  * the calendars, rather than two tabs with one of them hidden: the windows a
19315
19343
  * reader picks by name are the road, and the absolute range is the turning off
19316
19344
  * it, so both are on screen at once and each shows what the other chose.
@@ -19325,7 +19353,7 @@ b.crewlet-switcher__match {
19325
19353
  /* The side inset only: see DateTimePicker's own trigger. */
19326
19354
  padding: 0 var(--spacing-2) 0 var(--spacing-3);
19327
19355
  background: var(--color-surface-subtle);
19328
- border: 1px solid var(--color-border-control);
19356
+ border: 1px solid var(--color-border-strong);
19329
19357
  border-radius: var(--radius-md);
19330
19358
  color: var(--color-text-primary);
19331
19359
  font-family: inherit;
@@ -19342,7 +19370,7 @@ b.crewlet-switcher__match {
19342
19370
  }
19343
19371
 
19344
19372
  .crewlet-time-window:hover:not(:disabled) {
19345
- border-color: var(--color-border-hover);
19373
+ border-color: var(--color-border-strong-hover);
19346
19374
  }
19347
19375
 
19348
19376
  /*
@@ -19871,102 +19899,102 @@ svg.crewlet-time-window__tick {
19871
19899
  }
19872
19900
 
19873
19901
 
19874
- /* Toaster-KZ7YE2HA.css */
19902
+ /* Toaster-VZKISP2S.css */
19875
19903
  /*
19876
- * The toast stack.
19904
+ * The toast stack, drawn as the first release drew it (24a60c3): a dark strip
19905
+ * on the page's deepest ground with the large shadow and the rim light, a
19906
+ * 12px corner, the variant said by its mark alone, never a flood of its hue,
19907
+ * and the countdown as a wash behind the words that drains from the right.
19877
19908
  *
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.
19909
+ * IN TOKENS RATHER THAN ITS LITERALS, so it follows every theme. The strip is
19910
+ * --color-surface-background: the first release mixed the panel with black,
19911
+ * which read as a dark bar on a light page, where its words measured 1.56:1.
19912
+ * The marks are the feedback INK steps, the soft moss, amber and rose it drew,
19913
+ * measured as text on every theme. The washes are the feedback SOFT steps.
19881
19914
  *
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.
19915
+ * The wash is decoration: the dismissal is a timer, so a reader who asks for
19916
+ * reduced motion gets no wash and still gets the toast taken away.
19888
19917
  */
19889
-
19890
19918
  .crewlet-toaster {
19891
19919
  position: fixed;
19892
19920
  z-index: var(--z-index-toast);
19893
19921
  display: flex;
19894
19922
  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)));
19923
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
19924
+ width: min(380px, calc(100vw - 2 * var(--spacing-6)));
19900
19925
  /* The stack itself takes no presses, so the screen under it stays live
19901
19926
  while nothing is up; each toast takes them back for its own strip. */
19902
19927
  pointer-events: none;
19903
19928
  }
19904
19929
 
19905
19930
  .crewlet-toaster--bottom-right {
19906
- bottom: var(--spacing-4);
19907
- right: var(--spacing-4);
19931
+ bottom: var(--spacing-6);
19932
+ right: var(--spacing-6);
19908
19933
  }
19909
19934
 
19910
19935
  .crewlet-toaster--top-right {
19911
- top: var(--spacing-4);
19912
- right: var(--spacing-4);
19936
+ top: var(--spacing-6);
19937
+ right: var(--spacing-6);
19913
19938
  }
19914
19939
 
19915
19940
  .crewlet-toaster--bottom-left {
19916
- bottom: var(--spacing-4);
19917
- left: var(--spacing-4);
19941
+ bottom: var(--spacing-6);
19942
+ left: var(--spacing-6);
19918
19943
  }
19919
19944
 
19920
19945
  .crewlet-toaster--top-left {
19921
- top: var(--spacing-4);
19922
- left: var(--spacing-4);
19946
+ top: var(--spacing-6);
19947
+ left: var(--spacing-6);
19923
19948
  }
19924
19949
 
19925
19950
  .crewlet-toast {
19951
+ /* The mark and the wash are the two places a variant spends its hue. */
19926
19952
  --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);
19953
+ --crewlet-toast-wash: var(--color-surface-pressed);
19954
+ /* 14px at the normal density, and the corner the dismiss sits in beside it. */
19955
+ --crewlet-toast-inset: calc(var(--spacing-3) + var(--spacing-1) / 2);
19934
19956
 
19935
19957
  pointer-events: auto;
19936
19958
  position: relative;
19937
19959
  display: flex;
19938
19960
  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);
19961
+ gap: var(--spacing-3);
19962
+ padding: var(--crewlet-toast-inset) calc(var(--spacing-7) + var(--spacing-1) * 1.5) var(--crewlet-toast-inset)
19963
+ var(--crewlet-toast-inset);
19964
+ background: var(--color-surface-background);
19965
+ border: 1px solid var(--color-border-default);
19966
+ border-radius: var(--radius-lg);
19967
+ /* The large shadow and the rim light, both from tokens that are a shadow in
19968
+ every palette: --shadow-hairline is `none` in light, and a `none` inside a
19969
+ list drops the whole declaration. */
19970
+ box-shadow: var(--shadow-xl), var(--shadow-rim-lit);
19971
+ color: var(--color-text-primary);
19950
19972
  font-family: var(--font-family-sans);
19951
19973
  font-size: var(--font-size-compact);
19952
- line-height: var(--font-line-height-normal);
19974
+ line-height: var(--font-line-height-body);
19953
19975
  letter-spacing: var(--font-letter-spacing-snug);
19954
19976
  overflow: hidden;
19955
- animation: crewlet-toast-in var(--motion-duration-base) var(--motion-easing-emphasized);
19977
+ animation: crewlet-toast-in var(--motion-duration-slow) var(--motion-easing-emphasized);
19956
19978
  }
19957
19979
 
19958
19980
  @keyframes crewlet-toast-in {
19959
19981
  from {
19960
19982
  opacity: 0;
19961
- transform: translateY(6px);
19983
+ transform: translateX(var(--spacing-4));
19962
19984
  }
19963
-
19964
19985
  to {
19965
19986
  opacity: 1;
19966
- transform: translateY(0);
19987
+ transform: translateX(0);
19967
19988
  }
19968
19989
  }
19969
19990
 
19991
+ /* The words sit over the wash: every child is raised, and the dismiss and the
19992
+ wash below take their own places back. */
19993
+ .crewlet-toast > * {
19994
+ position: relative;
19995
+ z-index: var(--z-index-raised);
19996
+ }
19997
+
19970
19998
  .crewlet-toast__icon {
19971
19999
  display: inline-flex;
19972
20000
  flex: none;
@@ -19974,34 +20002,26 @@ svg.crewlet-time-window__tick {
19974
20002
  color: var(--crewlet-toast-mark);
19975
20003
  }
19976
20004
 
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. */
20005
+ /*
20006
+ * A VARIANT IS ITS MARK AND ITS WASH. The words stay in the strip's own inks
20007
+ * and the edge stays the hairline, so a failure is a rose mark on a faint rose
20008
+ * wash rather than a red strip: the outcome is said by the glyph and the title,
20009
+ * and the sentence beside them is read in the ink every sentence is read in.
20010
+ * Information is the neutral mark on the neutral wash.
20011
+ */
19980
20012
  .crewlet-toast--success {
19981
- --crewlet-toast-mark: var(--color-feedback-success);
20013
+ --crewlet-toast-mark: var(--color-feedback-success-ink);
20014
+ --crewlet-toast-wash: var(--color-feedback-success-soft);
19982
20015
  }
19983
20016
 
19984
20017
  .crewlet-toast--warning {
19985
- --crewlet-toast-mark: var(--color-feedback-warning);
20018
+ --crewlet-toast-mark: var(--color-feedback-warning-ink);
20019
+ --crewlet-toast-wash: var(--color-feedback-warning-soft);
19986
20020
  }
19987
20021
 
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
20022
  .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);
20023
+ --crewlet-toast-mark: var(--color-feedback-danger-ink);
20024
+ --crewlet-toast-wash: var(--color-feedback-danger-soft);
20005
20025
  }
20006
20026
 
20007
20027
  /* A usage limit notice is the application's own variant: it paints the glyph
@@ -20023,12 +20043,12 @@ svg.crewlet-time-window__tick {
20023
20043
  }
20024
20044
 
20025
20045
  .crewlet-toast__message {
20026
- color: var(--crewlet-toast-ink-quiet);
20046
+ color: var(--color-text-secondary);
20027
20047
  overflow-wrap: anywhere;
20028
20048
  }
20029
20049
 
20030
20050
  .crewlet-toast__actions {
20031
- margin-top: var(--spacing-2);
20051
+ margin-top: calc(var(--spacing-2) + var(--spacing-1) / 2);
20032
20052
  display: flex;
20033
20053
  gap: var(--spacing-2);
20034
20054
  }
@@ -20060,6 +20080,7 @@ svg.crewlet-time-window__tick {
20060
20080
  border-color: var(--color-brand-accent-hover);
20061
20081
  }
20062
20082
 
20083
+ /* A failure's one filled thing is the way out of it. */
20063
20084
  .crewlet-toast--danger .crewlet-toast__action-btn,
20064
20085
  .crewlet-toast--danger .crewlet-toast__action-link {
20065
20086
  background: var(--color-feedback-danger);
@@ -20081,8 +20102,9 @@ svg.crewlet-time-window__tick {
20081
20102
  }
20082
20103
 
20083
20104
  /* 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. */
20105
+ under it rather than around it, and after the body in the document, so it
20106
+ is drawn over the words at the same raised step. 24px square: the smallest
20107
+ target WCAG 2.2 accepts. */
20086
20108
  .crewlet-toast__dismiss {
20087
20109
  position: absolute;
20088
20110
  top: var(--spacing-2);
@@ -20096,10 +20118,7 @@ svg.crewlet-time-window__tick {
20096
20118
  border: 0;
20097
20119
  border-radius: var(--radius-sm);
20098
20120
  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);
20121
+ color: var(--color-text-tertiary);
20103
20122
  cursor: pointer;
20104
20123
  transition:
20105
20124
  background var(--motion-duration-fast) var(--motion-easing-default),
@@ -20107,25 +20126,28 @@ svg.crewlet-time-window__tick {
20107
20126
  }
20108
20127
 
20109
20128
  .crewlet-toast__dismiss:hover {
20110
- background: var(--color-surface-hover);
20111
- color: var(--crewlet-toast-ink);
20129
+ background: var(--color-surface-elevated);
20130
+ color: var(--color-text-primary);
20112
20131
  }
20113
20132
 
20133
+ /*
20134
+ * THE COUNTDOWN IS A WASH BEHIND THE WORDS, the variant's soft step over the
20135
+ * whole strip, draining from the right as the time runs out. It sits under
20136
+ * every raised child, and it is the timer's picture, not the timer.
20137
+ */
20114
20138
  .crewlet-toast__progress {
20115
20139
  position: absolute;
20116
- left: 0;
20117
- right: 0;
20118
- bottom: 0;
20119
- height: 2px;
20140
+ inset: 0;
20141
+ z-index: var(--z-index-base);
20120
20142
  transform-origin: left center;
20121
- background: var(--crewlet-toast-mark);
20143
+ background: var(--crewlet-toast-wash);
20122
20144
  pointer-events: none;
20123
20145
  animation-name: crewlet-toast-drain;
20124
20146
  animation-timing-function: linear;
20125
20147
  animation-fill-mode: forwards;
20126
20148
  }
20127
20149
 
20128
- /* Paused by the class rather than by :hover, so the bar and the timer that
20150
+ /* Paused by the class rather than by :hover, so the wash and the timer that
20129
20151
  actually dismisses are stopped by the same event. */
20130
20152
  .crewlet-toast__progress.is-paused {
20131
20153
  animation-play-state: paused;
@@ -20135,7 +20157,6 @@ svg.crewlet-time-window__tick {
20135
20157
  from {
20136
20158
  transform: scaleX(1);
20137
20159
  }
20138
-
20139
20160
  to {
20140
20161
  transform: scaleX(0);
20141
20162
  }
@@ -20161,8 +20182,8 @@ svg.crewlet-time-window__tick {
20161
20182
 
20162
20183
  /*
20163
20184
  * 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.
20185
+ * wash is not drawn. The timer is untouched: a reader who asked for less
20186
+ * motion did not ask to be left with a toast that never leaves.
20166
20187
  */
20167
20188
  @media (prefers-reduced-motion: reduce) {
20168
20189
  .crewlet-toast {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,8 +42,8 @@
42
42
  "clean": "rm -rf dist src/generated"
43
43
  },
44
44
  "dependencies": {
45
- "@crewlethq/icons": "0.13.0",
46
- "@crewlethq/tokens": "0.13.0"
45
+ "@crewlethq/icons": "0.14.0",
46
+ "@crewlethq/tokens": "0.14.0"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "react": ">=18",
@@ -1,7 +1,7 @@
1
1
  import { Kbd } from './chunk-SMBKXWML.js';
2
2
  import { FormField, Textarea, Input } from './chunk-FTEJPHBI.js';
3
- import { IconButton } from './chunk-4FQT6ZAY.js';
4
3
  import { announce } from './chunk-RSAQOKH3.js';
4
+ import { IconButton } from './chunk-4FQT6ZAY.js';
5
5
  import { isComposing } from './chunk-R25RGPUB.js';
6
6
  import './ListInput-O7LJKOIG.css';
7
7
  import { useState, useRef, useLayoutEffect } from 'react';
@@ -1,7 +1,7 @@
1
1
  import { Tag } from './chunk-LOECRMHA.js';
2
2
  import { useListbox } from './chunk-F73MC7EZ.js';
3
- import { IconButton } from './chunk-4FQT6ZAY.js';
4
3
  import { announce } from './chunk-RSAQOKH3.js';
4
+ import { IconButton } from './chunk-4FQT6ZAY.js';
5
5
  import { isComposing } from './chunk-R25RGPUB.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
7
  import './TagsInput-P2HS5QL4.css';