@thalassic/themes 22.16.0 → 22.17.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 (37) hide show
  1. package/package.json +1 -1
  2. package/themes/thalassic/components/_confirm.scss +28 -3
  3. package/themes/thalassic/components/_odometer.scss +1 -14
  4. package/themes/thalassic/components/_password.scss +1 -1
  5. package/themes/thalassic/components/_table.scss +29 -2
  6. package/themes/thalassic/components/_virtual-scroll.scss +11 -0
  7. package/themes/thalassic/components/autocomplete/_autocomplete-panel.scss +21 -0
  8. package/themes/thalassic/components/calendar/_agenda.scss +3 -2
  9. package/themes/thalassic/components/calendar/_calendar.scss +27 -0
  10. package/themes/thalassic/components/calendar/_compact.scss +21 -0
  11. package/themes/thalassic/components/calendar/_lines.scss +23 -0
  12. package/themes/thalassic/components/calendar/_month-view.scss +132 -6
  13. package/themes/thalassic/components/calendar/_time-grid.scss +6 -5
  14. package/themes/thalassic/components/dialog/_dialog.scss +43 -0
  15. package/themes/thalassic/components/drawer/_drawer-side.scss +65 -0
  16. package/themes/thalassic/components/drawer/_drawer.scss +16 -0
  17. package/themes/thalassic/components/index.scss +3 -0
  18. package/themes/thalassic/components/multi-select/_multi-select-panel.scss +21 -0
  19. package/themes/thalassic/components/pagination/_pagination.scss +1 -1
  20. package/themes/thalassic/components/progress/_index.scss +3 -0
  21. package/themes/thalassic/components/progress/_progress-color.scss +5 -0
  22. package/themes/thalassic/components/progress/_progress-size.scss +13 -0
  23. package/themes/thalassic/components/progress/_progress.scss +38 -0
  24. package/themes/thalassic/components/rating/_index.scss +3 -0
  25. package/themes/thalassic/components/rating/_rating-color.scss +43 -0
  26. package/themes/thalassic/components/rating/_rating-size.scss +13 -0
  27. package/themes/thalassic/components/rating/_rating.scss +144 -0
  28. package/themes/thalassic/components/select/_select-panel.scss +21 -0
  29. package/themes/thalassic/components/stepper/_index.scss +1 -0
  30. package/themes/thalassic/components/stepper/_stepper-color.scss +34 -152
  31. package/themes/thalassic/components/stepper/_stepper-label-position.scss +41 -0
  32. package/themes/thalassic/components/stepper/_stepper-orientation.scss +13 -1
  33. package/themes/thalassic/components/stepper/_stepper.scss +37 -11
  34. package/themes/thalassic/components/toast/_toast.scss +4 -3
  35. package/themes/thalassic/mixins/_index.scss +2 -0
  36. package/themes/thalassic/mixins/_pop.scss +26 -0
  37. package/themes/thalassic/mixins/_visually-hidden.scss +19 -0
@@ -0,0 +1,41 @@
1
+ .tls-stepper {
2
+ // Bottom labels — a horizontal-only layout: every step takes an equal
3
+ // column with its index centered and text underneath, and each connector
4
+ // runs from a step's index to the next column's, so the rail reads
5
+ // symmetrically edge to edge. A vertical stepper keeps the end placement.
6
+ &.tls-stepper--horizontal.tls-stepper--label-bottom {
7
+ .tls-stepper-header {
8
+ &__item {
9
+ width: auto;
10
+
11
+ flex: 1 1 0;
12
+
13
+ &:last-child {
14
+ width: auto;
15
+
16
+ flex: 1 1 0;
17
+ }
18
+
19
+ .tls-stepper-header-button {
20
+ width: 100%;
21
+
22
+ align-items: center;
23
+
24
+ text-align: center;
25
+ }
26
+ }
27
+
28
+ &__divider {
29
+ // Runs from this column's index to the next one's: the inline insets
30
+ // resolve against the item's width, and the columns are equal, so
31
+ // half a width beyond the box lands exactly on the neighbouring
32
+ // column's center. The index radius plus a small gap keeps the run
33
+ // clear of both circles.
34
+ inset-inline-start: calc(50% + var(--tls-stepper-index-size) / 2 + var(--spacing-1));
35
+ inset-inline-end: calc(-50% + var(--tls-stepper-index-size) / 2 + var(--spacing-1));
36
+
37
+ width: auto;
38
+ }
39
+ }
40
+ }
41
+ }
@@ -5,8 +5,13 @@
5
5
  &__item {
6
6
  width: 100%;
7
7
 
8
+ // The last step needs no room for a trailing divider: it keeps its
9
+ // natural width, and never shrinks below it — otherwise the flexbox
10
+ // would squeeze it to min-content and wrap its label.
8
11
  &:last-child {
9
12
  width: auto;
13
+
14
+ flex-shrink: 0;
10
15
  }
11
16
  }
12
17
 
@@ -19,11 +24,13 @@
19
24
  }
20
25
  }
21
26
 
22
- // Vertical
27
+ // Vertical — header and content sit side by side, overriding the base
28
+ // column layout that stacks a horizontal header above the content.
23
29
  &.tls-stepper--vertical {
24
30
  height: 100%;
25
31
 
26
32
  display: flex;
33
+ flex-direction: row;
27
34
 
28
35
  .tls-stepper-header {
29
36
  flex-direction: column;
@@ -31,8 +38,13 @@
31
38
  &__item {
32
39
  height: 100%;
33
40
 
41
+ // Keeps a visible run of divider between step buttons when the
42
+ // container does not stretch the header.
43
+ min-height: 64px;
44
+
34
45
  &:last-child {
35
46
  height: auto;
47
+ min-height: 0;
36
48
  }
37
49
 
38
50
  .tls-stepper-header-button {
@@ -1,6 +1,7 @@
1
+ @use '../../mixins' as mixins;
2
+
1
3
  .tls-stepper {
2
4
  --tls-stepper-label-color: var(--color-outline);
3
- --tls-stepper-background-color: var(--color-surface);
4
5
 
5
6
  --tls-stepper-content-gap: var(--spacing-4);
6
7
 
@@ -8,6 +9,8 @@
8
9
  --tls-stepper-index-size: calc(32px - var(--tls-stepper-index-border-width) * 2);
9
10
 
10
11
  --tls-stepper-index-on-color: var(--color-on-surface);
12
+ // The index circle is opaque so the divider running behind it stays masked;
13
+ // it matches the surface the stepper sits on, which itself stays transparent.
11
14
  --tls-stepper-index-background-color: var(--color-surface);
12
15
  --tls-stepper-index-border-color: var(--color-outline-variant);
13
16
 
@@ -17,15 +20,10 @@
17
20
  --tls-stepper-divider-color: var(--color-outline-variant);
18
21
  --tls-stepper-divider-width: 2px;
19
22
 
20
- background: var(--tls-stepper-background-color);
21
-
22
23
  display: flex;
23
24
  flex-direction: column;
24
25
  gap: var(--tls-stepper-content-gap);
25
26
 
26
- transition: border-color var(--motion-theme),
27
- background-color var(--motion-theme);
28
-
29
27
  &.tls-stepper--completed {
30
28
  .tls-stepper-content {
31
29
  .tls-step {
@@ -69,14 +67,33 @@
69
67
  position: relative;
70
68
  z-index: 1;
71
69
 
70
+ padding: 0;
71
+
72
72
  display: flex;
73
73
  flex-direction: column;
74
74
  gap: var(--spacing-2);
75
75
 
76
+ border: none;
77
+
78
+ background: none;
79
+
80
+ font: inherit;
81
+ text-align: start;
76
82
  color: var(--tls-stepper-label-color);
77
83
 
78
- transition: color var(--motion-fast),
79
- background-color var(--motion-fast);
84
+ cursor: pointer;
85
+
86
+ @include mixins.motion {
87
+ transition: color var(--motion-fast);
88
+ }
89
+
90
+ @include mixins.touch-target(var(--tls-stepper-index-size));
91
+
92
+ &:focus-visible {
93
+ @include mixins.focus-ring;
94
+
95
+ border-radius: var(--radius-sm);
96
+ }
80
97
 
81
98
  // The header is a tablist: it resolves the clicked step from
82
99
  // `event.target` and ignores any target that is not an `HTMLElement`,
@@ -101,13 +118,15 @@
101
118
  color: var(--tls-stepper-index-on-color);
102
119
  background-color: var(--tls-stepper-index-background-color);
103
120
 
104
- transition: background-color var(--motion-fast);
121
+ @include mixins.motion {
122
+ transition: background-color var(--motion-fast), border-color var(--motion-fast);
123
+ }
105
124
  }
106
125
 
107
126
  &__text {
108
127
  display: flex;
109
128
  flex-direction: column;
110
- gap: 0.25rem;
129
+ gap: var(--spacing-1);
111
130
 
112
131
  .tls-stepper-header-button__label {
113
132
  font-size: var(--font-label-large-size);
@@ -123,6 +142,11 @@
123
142
  letter-spacing: var(--font-label-medium-letter-spacing);
124
143
  }
125
144
  }
145
+
146
+ // State text (completed / invalid) for assistive technology only.
147
+ &__state {
148
+ @include mixins.visually-hidden;
149
+ }
126
150
  }
127
151
 
128
152
  .tls-stepper-header__divider {
@@ -130,7 +154,9 @@
130
154
 
131
155
  background-color: var(--tls-stepper-divider-color);
132
156
 
133
- transition: background-color var(--motion-fast);
157
+ @include mixins.motion {
158
+ transition: background-color var(--motion-fast);
159
+ }
134
160
  }
135
161
  }
136
162
  }
@@ -138,15 +138,16 @@
138
138
  &__title {
139
139
  margin: 0;
140
140
 
141
- font-size: var(--font-size-sm);
141
+ font-size: var(--font-body-small-size);
142
142
  font-weight: var(--font-weight-semibold);
143
+ line-height: var(--font-body-small-line-height);
143
144
  }
144
145
 
145
146
  &__message {
146
147
  margin: 0;
147
148
 
148
- font-size: var(--font-size-sm);
149
- line-height: 1.4;
149
+ font-size: var(--font-body-small-size);
150
+ line-height: var(--font-body-small-line-height);
150
151
  overflow-wrap: anywhere;
151
152
  }
152
153
 
@@ -2,5 +2,7 @@
2
2
  @forward 'focus-ring';
3
3
  @forward 'motion';
4
4
  @forward 'panel-open';
5
+ @forward 'pop';
5
6
  @forward 'touch-target';
6
7
  @forward 'variant-treatment';
8
+ @forward 'visually-hidden';
@@ -0,0 +1,26 @@
1
+ @use 'motion';
2
+
3
+ // A quick grow-and-settle acknowledging a just-committed selection: the element
4
+ // scales up to `--tls-pop-scale` and springs back. Only the peak is keyframed —
5
+ // the edges fill in from the element's underlying transform, so the pop rides
6
+ // on top of whatever scale the element already has (e.g. a hover grow) instead
7
+ // of snapping it back to 1 first.
8
+ @keyframes tls-pop {
9
+ 50% {
10
+ transform: scale(var(--tls-pop-scale, 1.3));
11
+ }
12
+ }
13
+
14
+ @mixin pop(
15
+ $scale: 1.3,
16
+ $duration: var(--motion-default),
17
+ $easing: var(--motion-ease-spring)
18
+ ) {
19
+ // Selection feedback is expressive — the committed state already reads
20
+ // without it — so the pop belongs to the `full` tier only.
21
+ @include motion.motion(full) {
22
+ --tls-pop-scale: #{$scale};
23
+
24
+ animation: tls-pop $duration $easing;
25
+ }
26
+ }
@@ -0,0 +1,19 @@
1
+ // Removes an element from the visual layout while leaving it in the accessibility tree, so the
2
+ // text keeps naming its control for assistive technology. Use it instead of `display: none`
3
+ // whenever hiding content would otherwise strip a control's accessible name.
4
+ @mixin visually-hidden {
5
+ position: absolute;
6
+
7
+ width: 1px;
8
+ height: 1px;
9
+
10
+ margin: -1px;
11
+ padding: 0;
12
+
13
+ border: 0;
14
+
15
+ white-space: nowrap;
16
+ overflow: hidden;
17
+
18
+ clip-path: inset(50%);
19
+ }