opui-css 4.1.0 → 5.0.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 (90) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/MIGRATING.md +23 -1
  3. package/README.md +1 -1
  4. package/components/AGENTS.md +20 -19
  5. package/components/Accordion/Accordion.astro +3 -3
  6. package/components/Anchor/Anchor.astro +2 -2
  7. package/components/Avatar/Avatar.astro +2 -8
  8. package/components/Badge/Badge.astro +12 -7
  9. package/components/Button/Button.astro +1 -1
  10. package/components/ButtonGroup/ButtonGroup.astro +1 -1
  11. package/components/Callout/Callout.astro +3 -3
  12. package/components/Card/Card.astro +3 -3
  13. package/components/Checkbox/Checkbox.astro +6 -6
  14. package/components/Chip/Chip.astro +5 -5
  15. package/components/ClassicSelect/ClassicSelect.astro +6 -6
  16. package/components/DescriptionList/Description.astro +1 -1
  17. package/components/DescriptionList/DescriptionList.astro +2 -2
  18. package/components/DescriptionList/Item.astro +1 -1
  19. package/components/DescriptionList/Term.astro +1 -1
  20. package/components/Dialog/Dialog.astro +3 -3
  21. package/components/Divider/Divider.astro +4 -1
  22. package/components/Drawer/Drawer.astro +5 -5
  23. package/components/Drawer/DrawerFooter.astro +1 -1
  24. package/components/Drawer/DrawerHeader.astro +1 -1
  25. package/components/FieldDescription/FieldDescription.astro +1 -1
  26. package/components/FieldGroup/FieldGroup.astro +1 -1
  27. package/components/FieldLegend/FieldLegend.astro +1 -1
  28. package/components/FieldSet/FieldSet.astro +1 -1
  29. package/components/Form/Form.astro +1 -1
  30. package/components/IconButton/IconButton.astro +1 -1
  31. package/components/List/List.astro +5 -5
  32. package/components/ListItem/ListItem.astro +12 -12
  33. package/components/Progress/Progress.astro +1 -1
  34. package/components/Radio/Radio.astro +5 -5
  35. package/components/Range/Range.astro +8 -8
  36. package/components/Select/Select.astro +13 -13
  37. package/components/Switch/Switch.astro +8 -8
  38. package/components/Table/Table.astro +4 -1
  39. package/components/Tabs/Tabs.astro +1 -1
  40. package/components/Tabs/TabsItem.astro +1 -1
  41. package/components/Tabs/TabsPanel.astro +1 -1
  42. package/components/Tabs/TabsTab.astro +1 -1
  43. package/components/TextField/TextField.astro +13 -13
  44. package/components/Textarea/Textarea.astro +13 -13
  45. package/components/Toast/Toast.astro +6 -6
  46. package/components/ToggleButton/ToggleButton.astro +3 -3
  47. package/components/ToggleGroup/ToggleGroup.astro +3 -3
  48. package/components/Tooltip/Tooltip.astro +1 -1
  49. package/core/utils.css +4 -4
  50. package/css/components/accordion.css +11 -11
  51. package/css/components/anchor.css +3 -3
  52. package/css/components/avatar.css +5 -5
  53. package/css/components/badge.css +14 -14
  54. package/css/components/button-group.css +16 -16
  55. package/css/components/button.css +12 -12
  56. package/css/components/callout.css +9 -9
  57. package/css/components/card.css +12 -12
  58. package/css/components/checkbox.css +13 -13
  59. package/css/components/chip.css +5 -5
  60. package/css/components/description-list.css +11 -8
  61. package/css/components/dialog.css +3 -3
  62. package/css/components/divider.css +4 -4
  63. package/css/components/drawer.css +21 -21
  64. package/css/components/form.css +18 -18
  65. package/css/components/icon-button.css +9 -9
  66. package/css/components/link.css +1 -1
  67. package/css/components/list.css +29 -29
  68. package/css/components/progress.css +4 -4
  69. package/css/components/radio.css +10 -10
  70. package/css/components/range.css +31 -31
  71. package/css/components/select.css +4 -4
  72. package/css/components/spinner.css +1 -1
  73. package/css/components/switch.css +23 -23
  74. package/css/components/table.css +3 -3
  75. package/css/components/tabs.css +14 -8
  76. package/css/components/text-field.css +47 -47
  77. package/css/components/text-input.css +7 -7
  78. package/css/components/textarea.css +3 -3
  79. package/css/components/toast.css +12 -12
  80. package/css/components/toggle-button.css +6 -6
  81. package/css/components/toggle-group.css +10 -10
  82. package/css/components/tooltip.css +6 -6
  83. package/css/components/typography.css +30 -30
  84. package/css/js/toast.js +7 -7
  85. package/css/theme.css +8 -8
  86. package/dist/opui.components.css +407 -398
  87. package/dist/opui.components.css.map +1 -1
  88. package/dist/opui.css +419 -410
  89. package/dist/opui.css.map +1 -1
  90. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  @layer components.root {
2
- :where(.range) {
2
+ :where(.ui-range) {
3
3
  display: grid;
4
4
  gap: var(--size-1) 0;
5
5
  /* Two-column base so the optional .value cell can sit next to the
@@ -8,7 +8,7 @@
8
8
  grid-template-columns: 1fr auto;
9
9
  position: relative;
10
10
 
11
- .label {
11
+ .ui-label {
12
12
  color: var(--text-primary);
13
13
  font-size: var(--font-size-05);
14
14
  font-weight: 600;
@@ -18,7 +18,7 @@
18
18
 
19
19
  /* Live current-value readout. Pairs with the <output> element
20
20
  rendered by the Range component (or hand-written .value markup). */
21
- :where(.value) {
21
+ :where(.ui-value) {
22
22
  color: var(--text-muted);
23
23
  font-size: var(--font-size-0);
24
24
  font-variant-numeric: tabular-nums;
@@ -29,7 +29,7 @@
29
29
  text-align: end;
30
30
  }
31
31
 
32
- .start-text {
32
+ .ui-start-text {
33
33
  color: var(--text-muted);
34
34
  font-size: var(--font-size-0);
35
35
  grid-column: 1/-1;
@@ -37,7 +37,7 @@
37
37
  line-height: 1.5;
38
38
  }
39
39
 
40
- :where(.end-text) {
40
+ :where(.ui-end-text) {
41
41
  color: var(--text-muted);
42
42
  font-size: var(--font-size-0);
43
43
  grid-column: 1/-1;
@@ -71,40 +71,40 @@
71
71
  opacity: 0.64;
72
72
  user-select: none;
73
73
 
74
- .label,
75
- .value,
76
- .start-text,
77
- .end-text {
74
+ .ui-label,
75
+ .ui-value,
76
+ .ui-start-text,
77
+ .ui-end-text {
78
78
  cursor: not-allowed;
79
79
  }
80
80
  }
81
81
 
82
82
  /* Color */
83
- &.filled input[type="range"] {
83
+ &.ui-filled input[type="range"] {
84
84
  --_track-color: var(--surface-filled);
85
85
  }
86
86
 
87
- &.default input[type="range"] {
87
+ &.ui-default input[type="range"] {
88
88
  --_track-color: var(--surface-default);
89
89
  }
90
90
 
91
- &.tonal input[type="range"] {
91
+ &.ui-tonal input[type="range"] {
92
92
  --_track-color: var(--surface-tonal);
93
93
  }
94
94
 
95
95
  /* Orientation */
96
- &.spread {
96
+ &.ui-spread {
97
97
  align-items: center;
98
98
  column-gap: var(--size-4);
99
99
  container-type: inline-size;
100
100
  grid-template-columns: 1fr auto;
101
101
 
102
- .label {
102
+ .ui-label {
103
103
  grid-column: 1;
104
104
  grid-row: 1;
105
105
  }
106
106
 
107
- .start-text {
107
+ .ui-start-text {
108
108
  color: var(--text-muted);
109
109
  display: block;
110
110
  font-size: var(--font-size-0);
@@ -123,12 +123,12 @@
123
123
  /* In spread mode, the value sits below the slider in col 2
124
124
  (where end-text would normally land). When end-text is also
125
125
  present it shifts down a row to avoid collision. */
126
- :where(.value) {
126
+ :where(.ui-value) {
127
127
  grid-column: 2;
128
128
  grid-row: 2;
129
129
  }
130
130
 
131
- :where(.end-text) {
131
+ :where(.ui-end-text) {
132
132
  grid-column: 2;
133
133
  grid-row: 2;
134
134
  text-align: end;
@@ -141,15 +141,15 @@
141
141
 
142
142
  /* When both datalist and end-text exist, push end-text below the datalist
143
143
  so they don't collide on the same grid cell. */
144
- &:has(datalist) :where(.end-text) {
144
+ &:has(datalist) :where(.ui-end-text) {
145
145
  grid-row: 3;
146
146
  }
147
147
 
148
- &:has(.value) :where(.end-text) {
148
+ &:has(.ui-value) :where(.ui-end-text) {
149
149
  grid-row: 3;
150
150
  }
151
151
 
152
- &:has(.value):has(datalist) :where(.end-text) {
152
+ &:has(.ui-value):has(datalist) :where(.ui-end-text) {
153
153
  grid-row: 4;
154
154
  }
155
155
 
@@ -160,20 +160,20 @@
160
160
  grid-column: 1/-1;
161
161
  }
162
162
 
163
- .label {
163
+ .ui-label {
164
164
  grid-row: 1;
165
165
  }
166
166
 
167
167
  /* Share row 1 with the label: the label's text stays left-aligned
168
168
  in its full-width cell, while the value shrinks to fit and
169
169
  right-aligns. Visually reads as a "[name ........ value]" row. */
170
- :where(.value) {
170
+ :where(.ui-value) {
171
171
  grid-row: 1;
172
172
  justify-self: end;
173
173
  text-align: end;
174
174
  }
175
175
 
176
- .start-text {
176
+ .ui-start-text {
177
177
  grid-row: 2;
178
178
  }
179
179
 
@@ -187,7 +187,7 @@
187
187
  grid-row: 4;
188
188
  }
189
189
 
190
- :where(.end-text) {
190
+ :where(.ui-end-text) {
191
191
  grid-row: 5;
192
192
  text-align: start;
193
193
  }
@@ -200,9 +200,9 @@
200
200
  --_thumb-bg: var(--color-9);
201
201
  --_thumb-highlight-color: oklch(from var(--color-9) 70% 100% h / 20%);
202
202
 
203
- .start-text,
204
- .end-text,
205
- .value {
203
+ .ui-start-text,
204
+ .ui-end-text,
205
+ .ui-value {
206
206
  color: var(--color-9);
207
207
  }
208
208
  }
@@ -274,7 +274,7 @@
274
274
  transition: box-shadow 0.1s ease;
275
275
  }
276
276
 
277
- .fieldset-item:focus-within & {
277
+ .ui-fieldset-item:focus-within & {
278
278
  border-color: var(--gray-14);
279
279
  }
280
280
  }
@@ -294,14 +294,14 @@
294
294
  transition: box-shadow 0.1s ease;
295
295
  }
296
296
 
297
- .fieldset-item:focus-within & {
297
+ .ui-fieldset-item:focus-within & {
298
298
  border-color: var(--gray-14);
299
299
  }
300
300
  }
301
301
 
302
302
  /* Element state */
303
- .range:has(:user-invalid) &,
304
- .range[data-invalid] & {
303
+ .ui-range:has(:user-invalid) &,
304
+ .ui-range[data-invalid] & {
305
305
  --_track-fill-color: var(--color-9);
306
306
  }
307
307
 
@@ -1,5 +1,5 @@
1
1
  @layer components.extended {
2
- :where(.select select) {
2
+ :where(.ui-select select) {
3
3
  position: relative;
4
4
 
5
5
  /* Default arrow */
@@ -64,7 +64,7 @@
64
64
  }
65
65
  }
66
66
 
67
- .list {
67
+ .ui-list {
68
68
  --_bg-color: var(--surface-filled);
69
69
  border: var(--field-border-width) solid var(--field-border-color);
70
70
  border-radius: var(--field-border-radius);
@@ -119,10 +119,10 @@
119
119
  }
120
120
  }
121
121
 
122
- :where(.select:has(select)) {
122
+ :where(.ui-select:has(select)) {
123
123
 
124
124
  /* Size */
125
- &.small {
125
+ &.ui-small {
126
126
  button {
127
127
  padding-inline: var(--size-2) var(--size-7);
128
128
 
@@ -22,7 +22,7 @@
22
22
  vertical-align: -0.14em;
23
23
  }
24
24
 
25
- &:not(button.button):not(:empty) {
25
+ &:not(button.ui-button):not(:empty) {
26
26
  &::before {
27
27
  margin-inline-end: 0.5em;
28
28
  }
@@ -1,5 +1,5 @@
1
1
  @layer components.root {
2
- :where(.switch) {
2
+ :where(.ui-switch) {
3
3
  --_accent-color: var(--primary);
4
4
  --_accent-contrast: var(--primary-contrast);
5
5
 
@@ -108,28 +108,28 @@
108
108
  }
109
109
 
110
110
  /* Icons */
111
- &:has(.icon-checked, .icon-unchecked) {
111
+ &:has(.ui-icon-checked, .ui-icon-unchecked) {
112
112
  [role="switch"] {
113
113
  grid-column: 1 / -1;
114
114
  grid-row: 1;
115
115
  }
116
116
 
117
117
  &:has([role="switch"]:checked) {
118
- .icon-unchecked {
118
+ .ui-icon-unchecked {
119
119
  display: none;
120
120
  }
121
121
 
122
- .icon-checked {
122
+ .ui-icon-checked {
123
123
  display: block;
124
124
  }
125
125
  }
126
126
 
127
- .icon-checked {
127
+ .ui-icon-checked {
128
128
  display: none;
129
129
  }
130
130
 
131
- .icon-unchecked,
132
- .icon-checked {
131
+ .ui-icon-unchecked,
132
+ .ui-icon-checked {
133
133
  grid-column: 1;
134
134
  grid-row: 1;
135
135
  pointer-events: none;
@@ -141,18 +141,18 @@
141
141
  }
142
142
  }
143
143
 
144
- .icon-unchecked {
144
+ .ui-icon-unchecked {
145
145
  margin-inline-start: calc(var(--_track-width) - var(--_dot-size) - var(--size-1));
146
146
  }
147
147
 
148
- .icon-checked {
148
+ .ui-icon-checked {
149
149
  margin-inline-start: var(--size-1);
150
150
  }
151
151
  }
152
152
 
153
153
  /* Required dot */
154
154
  &:has(:invalid) {
155
- .label:after {
155
+ .ui-label:after {
156
156
  color: var(--red);
157
157
  content: "*";
158
158
  inset: 0 -0.25ex auto auto;
@@ -172,7 +172,7 @@
172
172
  }
173
173
 
174
174
  /* Label */
175
- .label {
175
+ .ui-label {
176
176
  color: var(--text-primary);
177
177
  font-size: var(--font-size-05);
178
178
  grid-column: 2;
@@ -184,7 +184,7 @@
184
184
  }
185
185
 
186
186
  /* End text */
187
- :where(.end-text) {
187
+ :where(.ui-end-text) {
188
188
  color: var(--text-muted);
189
189
  font-size: var(--font-size-0);
190
190
  grid-column: 2;
@@ -194,21 +194,21 @@
194
194
  }
195
195
 
196
196
  /* Size */
197
- &.small {
197
+ &.ui-small {
198
198
  --_dot-size: 0.75rem;
199
199
  --_track-height: var(--size-4);
200
200
  --_track-width: 2.5rem;
201
201
  }
202
202
 
203
203
  /* Spread layout */
204
- &.spread {
204
+ &.ui-spread {
205
205
  align-items: center;
206
206
  column-gap: var(--size-4);
207
207
  grid-auto-flow: unset;
208
208
  grid-template-columns: 1fr auto;
209
209
  inline-size: 100%;
210
210
 
211
- .label {
211
+ .ui-label {
212
212
  font-weight: 600;
213
213
  grid-column: 1;
214
214
  grid-row: 1;
@@ -220,34 +220,34 @@
220
220
  grid-row: 1;
221
221
  }
222
222
 
223
- &:has(.icon-checked, .icon-unchecked) {
223
+ &:has(.ui-icon-checked, .ui-icon-unchecked) {
224
224
 
225
225
  input[role="switch"],
226
- .icon-checked,
227
- .icon-unchecked {
226
+ .ui-icon-checked,
227
+ .ui-icon-unchecked {
228
228
  grid-column: 2;
229
229
  }
230
230
  }
231
231
 
232
- :where(.end-text) {
232
+ :where(.ui-end-text) {
233
233
  grid-column: 1;
234
234
  grid-row: 2;
235
235
  }
236
236
  }
237
237
 
238
238
  /* Stacked layout */
239
- &.stack {
239
+ &.ui-stack {
240
240
  grid-auto-columns: unset;
241
241
  justify-items: center;
242
242
 
243
- .label {
243
+ .ui-label {
244
244
  grid-column: 1/-1;
245
245
  grid-row: 2;
246
246
  margin-block-start: var(--size-1);
247
247
  padding-inline: 1ex;
248
248
  }
249
249
 
250
- .end-text {
250
+ .ui-end-text {
251
251
  grid-column: 1/-1;
252
252
  grid-row: 3;
253
253
  }
@@ -260,7 +260,7 @@
260
260
  outline: 2px solid var(--color-9);
261
261
  }
262
262
 
263
- .end-text {
263
+ .ui-end-text {
264
264
  color: var(--color-9);
265
265
  }
266
266
  }
@@ -1,5 +1,5 @@
1
1
  @layer components.root {
2
- :where(table) {
2
+ :where(.ui-table) {
3
3
  --_table-border-radius: var(--border-radius);
4
4
 
5
5
  border-collapse: separate;
@@ -133,7 +133,7 @@
133
133
  }
134
134
 
135
135
  /* Spacious */
136
- &.spacious {
136
+ &.ui-spacious {
137
137
 
138
138
  th,
139
139
  td {
@@ -155,7 +155,7 @@
155
155
  }
156
156
 
157
157
  /* Dense */
158
- &.dense {
158
+ &.ui-dense {
159
159
 
160
160
  th,
161
161
  td {
@@ -1,5 +1,5 @@
1
1
  @layer components.root {
2
- :where(.tabs) {
2
+ :where(.ui-tabs) {
3
3
  --_accent-color: var(--primary);
4
4
  --_bg-color: transparent;
5
5
 
@@ -9,8 +9,8 @@
9
9
  gap: 0 var(--size-1);
10
10
  position: relative;
11
11
 
12
- &>.tab-input[type="radio"] {
13
- /* utils > .sr-only */
12
+ &>.ui-tab-input[type="radio"] {
13
+ /* utils > .ui-sr-only */
14
14
  /* TODO: use mixin for this when available */
15
15
  block-size: 1px;
16
16
  clip-path: inset(50%);
@@ -22,19 +22,23 @@
22
22
  &:checked {
23
23
 
24
24
  /* Checked Tab */
25
- &+[role="tab"] {
25
+ &+[role="tab"],
26
+ &+.ui-tab-label {
26
27
  border-block-end-color: var(--_accent-color);
27
28
  color: var(--_accent-color);
28
29
 
29
30
  /* Checked Panel */
30
- &+[role="tabpanel"] {
31
+ &+[role="tabpanel"],
32
+ &+.ui-tab-panel {
31
33
  display: block;
32
34
  }
33
35
  }
34
36
  }
35
37
 
36
38
  &:focus-visible {
37
- &+[role="tab"] {
39
+
40
+ &+[role="tab"],
41
+ &+.ui-tab-label {
38
42
  --focus-ring-color: var(--text-muted);
39
43
  --focus-ring-offset: calc(-1 * var(--size-2));
40
44
  outline: var(--focus-ring-width) var(--focus-ring-style) var(--focus-ring-color);
@@ -44,7 +48,8 @@
44
48
  }
45
49
 
46
50
  /* Tab */
47
- &>[role="tab"] {
51
+ &>[role="tab"],
52
+ &>.ui-tab-label {
48
53
  align-items: center;
49
54
  background-color: transparent;
50
55
  border-bottom: 2px solid transparent;
@@ -68,7 +73,8 @@
68
73
  }
69
74
 
70
75
  /* Tab Panel */
71
- &>[role="tabpanel"] {
76
+ &>[role="tabpanel"],
77
+ &>.ui-tab-panel {
72
78
  display: none;
73
79
  inline-size: 100%;
74
80
  order: 2;