opui-css 5.0.1 → 5.1.1

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 (58) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/MIGRATING.md +11 -0
  3. package/README.md +1 -1
  4. package/components/Accordion/Accordion.astro +12 -2
  5. package/components/Anchor/Anchor.astro +5 -1
  6. package/components/ButtonGroup/ButtonGroup.astro +8 -1
  7. package/components/Card/Card.astro +3 -1
  8. package/components/Checkbox/Checkbox.astro +3 -3
  9. package/components/ClassicSelect/ClassicSelect.astro +3 -3
  10. package/components/Dialog/Dialog.astro +3 -1
  11. package/components/Radio/Radio.astro +3 -3
  12. package/components/Select/Select.astro +3 -3
  13. package/components/Switch/Switch.astro +3 -3
  14. package/components/TextField/TextField.astro +3 -3
  15. package/components/Textarea/Textarea.astro +3 -3
  16. package/core/normalize.css +16 -10
  17. package/core/palette.css +313 -58
  18. package/core/utils.css +2 -2
  19. package/css/components/accordion.css +7 -7
  20. package/css/components/anchor.css +23 -23
  21. package/css/components/badge.css +4 -4
  22. package/css/components/button-group.css +28 -14
  23. package/css/components/button.css +29 -17
  24. package/css/components/callout.css +95 -92
  25. package/css/components/card.css +6 -8
  26. package/css/components/checkbox.css +209 -203
  27. package/css/components/chip.css +11 -6
  28. package/css/components/description-list.css +2 -1
  29. package/css/components/dialog.css +2 -1
  30. package/css/components/drawer.css +167 -167
  31. package/css/components/form.css +8 -7
  32. package/css/components/icon-button.css +32 -13
  33. package/css/components/list.css +10 -12
  34. package/css/components/progress.css +4 -3
  35. package/css/components/radio.css +168 -170
  36. package/css/components/range.css +14 -9
  37. package/css/components/select.css +9 -6
  38. package/css/components/spinner.css +4 -3
  39. package/css/components/switch.css +8 -5
  40. package/css/components/table.css +4 -10
  41. package/css/components/tabs.css +17 -16
  42. package/css/components/text-field.css +9 -10
  43. package/css/components/text-input.css +8 -4
  44. package/css/components/textarea.css +3 -1
  45. package/css/components/toast.css +156 -157
  46. package/css/components/toggle-button.css +76 -72
  47. package/css/components/tooltip.css +59 -56
  48. package/css/components/typography.css +31 -31
  49. package/css/imports.css +5 -4
  50. package/css/theme.css +14 -20
  51. package/dist/op.css +0 -62
  52. package/dist/op.css.map +1 -1
  53. package/dist/opui.components.css +1259 -1184
  54. package/dist/opui.components.css.map +1 -1
  55. package/dist/opui.css +1719 -1393
  56. package/dist/opui.css.map +1 -1
  57. package/open-props.css +0 -1
  58. package/package.json +1 -1
@@ -1,172 +1,170 @@
1
1
  @layer components.root {
2
- label.ui-radio {
3
- --_input-size: 1.125rem;
4
- --_indicator-size: 50%;
5
-
6
- align-items: center;
7
- color: var(--text-primary);
8
- cursor: pointer;
9
- display: inline-grid;
10
- gap: 0 var(--size-2);
11
- grid-auto-columns: auto;
12
- grid-auto-flow: column;
13
- inline-size: fit-content;
14
- line-height: 1.5;
15
- transform: translateZ(0);
16
- user-select: none;
17
-
18
- /* Disabled */
19
- &:has([disabled]) {
20
- cursor: not-allowed;
21
- opacity: 0.64;
22
- user-select: none;
23
-
24
- input {
25
- cursor: not-allowed;
26
- }
27
- }
28
-
29
- /* Required dot */
30
- &:has(:invalid) {
31
- .ui-label:after {
32
- color: var(--red);
33
- content: "*";
34
- inset: 0 -0.25ex auto auto;
35
- position: absolute;
36
- }
37
- }
38
-
39
- /* Label */
40
- .ui-label {
41
- color: var(--text-primary);
42
- font-size: var(--font-size-05);
43
- grid-column: 2;
44
- grid-row: 1;
45
- padding-inline: 0 1ex;
46
- position: relative;
47
- }
48
-
49
- /* End text */
50
- :where(.ui-end-text) {
51
- color: var(--text-muted);
52
- font-size: var(--font-size-0);
53
- grid-column: 2;
54
- grid-row: 2;
55
- line-height: 1.5;
56
- z-index: 1;
57
- }
58
-
59
- /* Stacked layout */
60
- &.ui-stack {
61
- grid-auto-columns: unset;
62
- justify-items: center;
63
-
64
- .ui-label {
65
- grid-column: 1/-1;
66
- grid-row: 2;
67
- margin-block-start: var(--size-1);
68
- padding-inline: 1ex;
69
-
70
- /* Required dot */
71
- &::after {
72
- inset: 0 -0.25ex auto auto;
73
- }
74
- }
75
-
76
- .ui-end-text {
77
- grid-column: 1/-1;
78
- grid-row: 3;
79
- }
80
- }
81
-
82
- /* Input */
83
- input[type="radio"] {
84
- appearance: none;
85
- aspect-ratio: 1;
86
- background-color: var(--surface-default);
87
- block-size: var(--_input-size);
88
- border: 1px solid var(--field-border-color);
89
- border-radius: var(--radius-round);
90
- box-sizing: border-box;
91
- cursor: pointer;
92
- display: grid;
93
- inline-size: var(--_input-size);
94
- margin: 0;
95
- padding: 0;
96
- place-items: center;
97
- position: relative;
98
-
99
- &:checked {
100
- background-color: var(--primary);
101
- border-color: var(--primary);
102
- }
103
-
104
- /* Dot */
105
- &::after {
106
- background-color: var(--primary-contrast);
107
- block-size: var(--_indicator-size);
108
- border-radius: var(--radius-round);
109
- content: "";
110
- inline-size: var(--_indicator-size);
111
- margin: auto;
112
- opacity: 0;
113
- }
114
-
115
- &:checked::after {
116
- opacity: 1;
117
- }
118
-
119
- &::before {
120
- --highlight-size: 175%;
121
- }
122
- }
123
-
124
- /* Sizes */
125
- &.ui-small {
126
- input[type="radio"] {
127
- --_input-size: var(--size-3);
128
-
129
- }
130
- }
131
-
132
- &.ui-large {
133
- input[type="radio"] {
134
- --_input-size: var(--size-4);
135
-
136
- }
137
- }
138
-
139
- /* Validation */
140
- &[data-invalid],
141
- &:has(:user-invalid) {
142
- --palette-source: oklch(0.58 0.21 var(--hue-red));
143
-
144
- :where(.ui-end-text) {
145
- color: var(--primary);
146
- }
147
- }
148
-
149
- /* Touch devices */
150
- @media (pointer: coarse) {
151
- input[type="radio"] {
152
- block-size: var(--size-4);
153
- inline-size: var(--size-4);
154
- }
155
- }
156
-
157
- @media (forced-colors: active) {
158
- input[type="radio"] {
159
- border: 1px solid CanvasText;
160
-
161
- &:checked {
162
- background-color: SelectedItem;
163
- border-color: SelectedItem;
164
-
165
- &::after {
166
- background-color: SelectedItemText;
167
- }
168
- }
169
- }
170
- }
171
- }
2
+ label.ui-radio {
3
+ --_input-size: 1.125rem;
4
+ --_indicator-size: 50%;
5
+
6
+ align-items: center;
7
+ color: var(--text-primary);
8
+ cursor: pointer;
9
+ display: inline-grid;
10
+ gap: 0 var(--size-2);
11
+ grid-auto-columns: auto;
12
+ grid-auto-flow: column;
13
+ inline-size: fit-content;
14
+ line-height: 1.5;
15
+ transform: translateZ(0);
16
+ user-select: none;
17
+
18
+ /* Disabled */
19
+ &:has([disabled]) {
20
+ cursor: not-allowed;
21
+ opacity: 0.64;
22
+ user-select: none;
23
+
24
+ input {
25
+ cursor: not-allowed;
26
+ }
27
+ }
28
+
29
+ /* Required dot */
30
+ &:has(:invalid) {
31
+ .ui-label:after {
32
+ color: var(--red);
33
+ content: "*";
34
+ inset: 0 -0.25ex auto auto;
35
+ position: absolute;
36
+ }
37
+ }
38
+
39
+ /* Label */
40
+ .ui-label {
41
+ color: var(--text-primary);
42
+ font-size: var(--font-size-05);
43
+ grid-column: 2;
44
+ grid-row: 1;
45
+ padding-inline: 0 1ex;
46
+ position: relative;
47
+ }
48
+
49
+ /* End text */
50
+ :where(.ui-end-text) {
51
+ color: var(--text-muted);
52
+ font-size: var(--font-size-0);
53
+ grid-column: 2;
54
+ grid-row: 2;
55
+ line-height: 1.5;
56
+ z-index: 1;
57
+ }
58
+
59
+ /* Stacked layout */
60
+ &.ui-stack {
61
+ grid-auto-columns: unset;
62
+ justify-items: center;
63
+
64
+ .ui-label {
65
+ grid-column: 1/-1;
66
+ grid-row: 2;
67
+ margin-block-start: var(--size-1);
68
+ padding-inline: 1ex;
69
+
70
+ /* Required dot */
71
+ &::after {
72
+ inset: 0 -0.25ex auto auto;
73
+ }
74
+ }
75
+
76
+ .ui-end-text {
77
+ grid-column: 1/-1;
78
+ grid-row: 3;
79
+ }
80
+ }
81
+
82
+ /* Input */
83
+ input[type="radio"] {
84
+ appearance: none;
85
+ aspect-ratio: 1;
86
+ background-color: var(--surface-default);
87
+ block-size: var(--_input-size);
88
+ border: 1px solid var(--field-border-color);
89
+ border-radius: var(--radius-round);
90
+ box-sizing: border-box;
91
+ cursor: pointer;
92
+ display: grid;
93
+ inline-size: var(--_input-size);
94
+ margin: 0;
95
+ padding: 0;
96
+ place-items: center;
97
+ position: relative;
98
+
99
+ &:checked {
100
+ background-color: var(--primary);
101
+ border-color: var(--primary);
102
+ }
103
+
104
+ /* Dot */
105
+ &::after {
106
+ background-color: var(--primary-contrast);
107
+ block-size: var(--_indicator-size);
108
+ border-radius: var(--radius-round);
109
+ content: "";
110
+ inline-size: var(--_indicator-size);
111
+ margin: auto;
112
+ opacity: 0;
113
+ }
114
+
115
+ &:checked::after {
116
+ opacity: 1;
117
+ }
118
+
119
+ &::before {
120
+ --highlight-size: 175%;
121
+ }
122
+ }
123
+
124
+ /* Sizes */
125
+ &.ui-small {
126
+ input[type="radio"] {
127
+ --_input-size: var(--size-3);
128
+ }
129
+ }
130
+
131
+ &.ui-large {
132
+ input[type="radio"] {
133
+ --_input-size: var(--size-4);
134
+ }
135
+ }
136
+
137
+ /* Validation */
138
+ &[data-invalid],
139
+ &:has(:user-invalid) {
140
+ --primary: var(--critical);
141
+
142
+ :where(.ui-end-text) {
143
+ color: var(--critical);
144
+ }
145
+ }
146
+
147
+ /* Touch devices */
148
+ @media (pointer: coarse) {
149
+ input[type="radio"] {
150
+ block-size: var(--size-4);
151
+ inline-size: var(--size-4);
152
+ }
153
+ }
154
+
155
+ @media (forced-colors: active) {
156
+ input[type="radio"] {
157
+ border: 1px solid CanvasText;
158
+
159
+ &:checked {
160
+ background-color: SelectedItem;
161
+ border-color: SelectedItem;
162
+
163
+ &::after {
164
+ background-color: SelectedItemText;
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
172
170
  }
@@ -56,7 +56,7 @@
56
56
  margin-top: calc(var(--size-1) * -1);
57
57
  padding-inline: calc(3ex / 2);
58
58
 
59
- &>option {
59
+ & > option {
60
60
  display: flex;
61
61
  inline-size: 0;
62
62
  justify-content: center;
@@ -237,9 +237,11 @@
237
237
  /* Track */
238
238
  &::-webkit-slider-runnable-track {
239
239
  appearance: none;
240
- background: linear-gradient(to right,
241
- var(--_track-fill-color) var(--_track-fill, 0%),
242
- var(--_track-color) 0%);
240
+ background: linear-gradient(
241
+ to right,
242
+ var(--_track-fill-color) var(--_track-fill, 0%),
243
+ var(--_track-color) 0%
244
+ );
243
245
  block-size: var(--_track-height);
244
246
  border-radius: var(--_track-radius);
245
247
  }
@@ -265,7 +267,8 @@
265
267
  block-size: var(--_thumb-size);
266
268
  border: 3px solid var(--surface-default);
267
269
  border-radius: 50%;
268
- box-shadow: 0 0 0 var(--_thumb-highlight-size) var(--_thumb-highlight-color);
270
+ box-shadow: 0 0 0 var(--_thumb-highlight-size)
271
+ var(--_thumb-highlight-color);
269
272
  cursor: ew-resize;
270
273
  inline-size: var(--_thumb-size);
271
274
  margin-block-start: var(--_thumb-offset);
@@ -285,7 +288,8 @@
285
288
  block-size: var(--_thumb-size);
286
289
  border: 3px solid var(--surface-default);
287
290
  border-radius: 50%;
288
- box-shadow: 0 0 0 var(--_thumb-highlight-size) var(--_thumb-highlight-color);
291
+ box-shadow: 0 0 0 var(--_thumb-highlight-size)
292
+ var(--_thumb-highlight-color);
289
293
  cursor: ew-resize;
290
294
  inline-size: var(--_thumb-size);
291
295
  margin-block-start: var(--_thumb-offset);
@@ -312,8 +316,10 @@
312
316
 
313
317
  &:active {
314
318
  --_thumb-highlight-size: var(--size-2);
315
- --_track-color: light-dark(oklch(from var(--field-border-color) calc(l * 0.9) c h),
316
- oklch(from var(--field-border-color) calc(l * 1.1) c h));
319
+ --_track-color: light-dark(
320
+ oklch(from var(--field-border-color) calc(l * 0.9) c h),
321
+ oklch(from var(--field-border-color) calc(l * 1.1) c h)
322
+ );
317
323
  }
318
324
  }
319
325
 
@@ -333,5 +339,4 @@
333
339
  }
334
340
  }
335
341
  }
336
-
337
342
  }
@@ -38,8 +38,11 @@
38
38
  }
39
39
 
40
40
  @media (prefers-reduced-motion: no-preference) {
41
- transition: display 0.2s allow-discrete, opacity 0.2s var(--ease-3),
42
- overlay 0.2s allow-discrete, scale 0.2s var(--ease-3);
41
+ transition:
42
+ display 0.2s allow-discrete,
43
+ opacity 0.2s var(--ease-3),
44
+ overlay 0.2s allow-discrete,
45
+ scale 0.2s var(--ease-3);
43
46
  }
44
47
  }
45
48
 
@@ -73,8 +76,10 @@
73
76
  [role="group"] {
74
77
  label {
75
78
  background-color: light-dark(var(--gray-3), var(--gray-13));
76
- color: light-dark(oklch(from var(--text-primary) calc(l * 0.75) c h),
77
- oklch(from var(--text-primary) calc(l * 1.25) c h));
79
+ color: light-dark(
80
+ oklch(from var(--text-primary) calc(l * 0.75) c h),
81
+ oklch(from var(--text-primary) calc(l * 1.25) c h)
82
+ );
78
83
  font-weight: 500;
79
84
  overflow: hidden;
80
85
  padding-inline: var(--size-2);
@@ -97,7 +102,6 @@
97
102
 
98
103
  /* Option */
99
104
  option {
100
-
101
105
  /* Checkmark */
102
106
  /* TODO - checkmark should be the final version of the checkmark API. Follow the development of this and remove redundant psuedo stuff. */
103
107
  &::check {
@@ -120,7 +124,6 @@
120
124
  }
121
125
 
122
126
  :where(.ui-select:has(select)) {
123
-
124
127
  /* Size */
125
128
  &.ui-small {
126
129
  button {
@@ -1,11 +1,12 @@
1
1
  @layer components.root {
2
-
3
- [aria-busy="true"]:not(input,
2
+ [aria-busy="true"]:not(
3
+ input,
4
4
  select,
5
5
  textarea,
6
6
  html,
7
7
  progress,
8
- [aria-describedby]) {
8
+ [aria-describedby]
9
+ ) {
9
10
  position: relative;
10
11
 
11
12
  &::before {
@@ -44,7 +44,8 @@
44
44
 
45
45
  &:focus-visible {
46
46
  --focus-ring-color: currentColor;
47
- outline: var(--focus-ring-width) var(--focus-ring-style) var(--focus-ring-color);
47
+ outline: var(--focus-ring-width) var(--focus-ring-style)
48
+ var(--focus-ring-color);
48
49
  outline-offset: var(--focus-ring-offset);
49
50
  }
50
51
 
@@ -76,13 +77,14 @@
76
77
  --_dot-bg-color: var(--_accent-contrast);
77
78
  --_dot-outline-size: calc(var(--size-1) - 1px);
78
79
 
79
- inset-inline-start: calc(var(--_track-width) - var(--_dot-size) - var(--size-1));
80
+ inset-inline-start: calc(
81
+ var(--_track-width) - var(--_dot-size) - var(--size-1)
82
+ );
80
83
  }
81
84
  }
82
85
 
83
86
  /* Animation */
84
87
  @media (prefers-reduced-motion: no-preference) {
85
-
86
88
  /* Track */
87
89
  &::before {
88
90
  transition:
@@ -142,7 +144,9 @@
142
144
  }
143
145
 
144
146
  .ui-icon-unchecked {
145
- margin-inline-start: calc(var(--_track-width) - var(--_dot-size) - var(--size-1));
147
+ margin-inline-start: calc(
148
+ var(--_track-width) - var(--_dot-size) - var(--size-1)
149
+ );
146
150
  }
147
151
 
148
152
  .ui-icon-checked {
@@ -221,7 +225,6 @@
221
225
  }
222
226
 
223
227
  &:has(.ui-icon-checked, .ui-icon-unchecked) {
224
-
225
228
  input[role="switch"],
226
229
  .ui-icon-checked,
227
230
  .ui-icon-unchecked {
@@ -32,8 +32,7 @@
32
32
  }
33
33
 
34
34
  /* Remove bottom border only on the last row of the table */
35
- &>*:last-child tr:last-child {
36
-
35
+ & > *:last-child tr:last-child {
37
36
  th,
38
37
  td {
39
38
  border-block-end: none;
@@ -53,7 +52,7 @@
53
52
  }
54
53
 
55
54
  /* Round corner cells */
56
- &>thead:first-of-type tr:first-child {
55
+ & > thead:first-of-type tr:first-child {
57
56
  th:first-child {
58
57
  border-start-start-radius: var(--_table-border-radius);
59
58
  }
@@ -64,7 +63,7 @@
64
63
  }
65
64
 
66
65
  /* Logic for tables without thead */
67
- &>tbody:first-of-type:not(thead ~ tbody) tr:first-child {
66
+ & > tbody:first-of-type:not(thead ~ tbody) tr:first-child {
68
67
  td:first-child {
69
68
  border-start-start-radius: var(--_table-border-radius);
70
69
  }
@@ -75,7 +74,7 @@
75
74
  }
76
75
 
77
76
  /* Logic for bottom corners (whether in tbody or tfoot) */
78
- &>*:last-child tr:last-child {
77
+ & > *:last-child tr:last-child {
79
78
  :where(th, td):first-child {
80
79
  border-end-start-radius: var(--_table-border-radius);
81
80
  }
@@ -125,7 +124,6 @@
125
124
  }
126
125
 
127
126
  @container (width < 60ch) {
128
-
129
127
  th,
130
128
  td {
131
129
  padding: var(--size-1) 0.875rem;
@@ -134,7 +132,6 @@
134
132
 
135
133
  /* Spacious */
136
134
  &.ui-spacious {
137
-
138
135
  th,
139
136
  td {
140
137
  padding: var(--size-3);
@@ -146,7 +143,6 @@
146
143
  }
147
144
 
148
145
  @container (width < 60ch) {
149
-
150
146
  th,
151
147
  td {
152
148
  padding: var(--size-3);
@@ -156,7 +152,6 @@
156
152
 
157
153
  /* Dense */
158
154
  &.ui-dense {
159
-
160
155
  th,
161
156
  td {
162
157
  padding: var(--size-1);
@@ -168,7 +163,6 @@
168
163
  }
169
164
 
170
165
  @container (width < 60ch) {
171
-
172
166
  th,
173
167
  td {
174
168
  padding: var(--size-1);
@@ -9,7 +9,7 @@
9
9
  gap: 0 var(--size-1);
10
10
  position: relative;
11
11
 
12
- &>.ui-tab-input[type="radio"] {
12
+ & > .ui-tab-input[type="radio"] {
13
13
  /* utils > .ui-sr-only */
14
14
  /* TODO: use mixin for this when available */
15
15
  block-size: 1px;
@@ -20,36 +20,35 @@
20
20
  white-space: nowrap;
21
21
 
22
22
  &:checked {
23
-
24
23
  /* Checked Tab */
25
- &+[role="tab"],
26
- &+.ui-tab-label {
24
+ & + [role="tab"],
25
+ & + .ui-tab-label {
27
26
  border-block-end-color: var(--_accent-color);
28
27
  color: var(--_accent-color);
29
28
 
30
29
  /* Checked Panel */
31
- &+[role="tabpanel"],
32
- &+.ui-tab-panel {
30
+ & + [role="tabpanel"],
31
+ & + .ui-tab-panel {
33
32
  display: block;
34
33
  }
35
34
  }
36
35
  }
37
36
 
38
37
  &:focus-visible {
39
-
40
- &+[role="tab"],
41
- &+.ui-tab-label {
38
+ & + [role="tab"],
39
+ & + .ui-tab-label {
42
40
  --focus-ring-color: var(--text-muted);
43
41
  --focus-ring-offset: calc(-1 * var(--size-2));
44
- outline: var(--focus-ring-width) var(--focus-ring-style) var(--focus-ring-color);
42
+ outline: var(--focus-ring-width) var(--focus-ring-style)
43
+ var(--focus-ring-color);
45
44
  outline-offset: var(--focus-ring-offset);
46
45
  }
47
46
  }
48
47
  }
49
48
 
50
49
  /* Tab */
51
- &>[role="tab"],
52
- &>.ui-tab-label {
50
+ & > [role="tab"],
51
+ & > .ui-tab-label {
53
52
  align-items: center;
54
53
  background-color: transparent;
55
54
  border-bottom: 2px solid transparent;
@@ -67,14 +66,16 @@
67
66
  user-select: none;
68
67
 
69
68
  &:hover {
70
- background-color: light-dark(oklch(from var(--_accent-color) calc(l * 0.75) none h / 5%),
71
- oklch(from var(--_accent-color) calc(l * 1.25) none h / 5%));
69
+ background-color: light-dark(
70
+ oklch(from var(--_accent-color) calc(l * 0.75) none h / 5%),
71
+ oklch(from var(--_accent-color) calc(l * 1.25) none h / 5%)
72
+ );
72
73
  }
73
74
  }
74
75
 
75
76
  /* Tab Panel */
76
- &>[role="tabpanel"],
77
- &>.ui-tab-panel {
77
+ & > [role="tabpanel"],
78
+ & > .ui-tab-panel {
78
79
  display: none;
79
80
  inline-size: 100%;
80
81
  order: 2;