@oscarpalmer/oui 0.36.0 → 0.37.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 (51) hide show
  1. package/dist/css/badge.css +18 -15
  2. package/dist/css/button.css +35 -31
  3. package/dist/css/color.css +20 -20
  4. package/dist/css/combobox.css +133 -34
  5. package/dist/css/content.css +29 -10
  6. package/dist/css/floatable.css +10 -10
  7. package/dist/css/form.css +393 -129
  8. package/dist/css/listbox.css +41 -17
  9. package/dist/css/message.css +13 -10
  10. package/dist/css/reset.css +29 -88
  11. package/dist/css/splitter.css +2 -2
  12. package/dist/css/tabs.css +103 -0
  13. package/dist/js/focus-trap/focus-trap.embedded.mjs +6 -10
  14. package/dist/js/index.d.mts +2 -1
  15. package/dist/js/index.mjs +2 -1
  16. package/dist/js/internal/draggable.mjs +16 -22
  17. package/dist/js/internal/listbox/listbox.form.mjs +1 -1
  18. package/dist/js/internal/listbox/listbox.state.mjs +1 -1
  19. package/dist/js/internal/navigable.d.mts +11 -5
  20. package/dist/js/internal/navigable.mjs +44 -18
  21. package/dist/js/movable/movable.embedded.mjs +3 -6
  22. package/dist/js/resizable/resizable.embedded.mjs +16 -26
  23. package/dist/js/splitter.mjs +15 -12
  24. package/dist/js/tabs.d.mts +25 -0
  25. package/dist/js/tabs.mjs +240 -0
  26. package/dist/js/tooltip.mjs +13 -12
  27. package/package.json +1 -1
  28. package/src/css/badge.scss +6 -18
  29. package/src/css/button.scss +6 -45
  30. package/src/css/color.scss +20 -20
  31. package/src/css/combobox.scss +20 -51
  32. package/src/css/content.scss +30 -3
  33. package/src/css/floatable.scss +17 -17
  34. package/src/css/form.scss +84 -72
  35. package/src/css/listbox.scss +2 -31
  36. package/src/css/message.scss +13 -28
  37. package/src/css/mixins.scss +253 -28
  38. package/src/css/reset.scss +37 -86
  39. package/src/css/splitter.scss +2 -2
  40. package/src/css/tabs.scss +85 -0
  41. package/src/js/focus-trap/focus-trap.embedded.ts +11 -19
  42. package/src/js/index.ts +1 -0
  43. package/src/js/internal/draggable.ts +29 -33
  44. package/src/js/internal/listbox/listbox.form.ts +1 -1
  45. package/src/js/internal/listbox/listbox.state.ts +1 -1
  46. package/src/js/internal/navigable.ts +80 -23
  47. package/src/js/movable/movable.embedded.ts +11 -13
  48. package/src/js/resizable/resizable.embedded.ts +25 -39
  49. package/src/js/splitter.ts +21 -18
  50. package/src/js/tabs.ts +447 -0
  51. package/src/js/tooltip.ts +20 -17
@@ -8,7 +8,7 @@
8
8
  }
9
9
 
10
10
  :where([oui-dialog], [oui-popover], [oui-tooltip-content]) {
11
- @include mixins.shadow-overlay;
11
+ @include mixins.shadow-5;
12
12
 
13
13
  background-color: var(--oui-absolute);
14
14
  scale: 0.9;
@@ -97,49 +97,49 @@
97
97
  position: absolute;
98
98
  }
99
99
 
100
- &[oui-position^='above'],
101
- &[oui-position^='below'],
102
- &[oui-position^='bottom'],
103
- &[oui-position^='top'] {
100
+ &[oui-position^='above' i],
101
+ &[oui-position^='below' i],
102
+ &[oui-position^='bottom' i],
103
+ &[oui-position^='top' i] {
104
104
  &::after {
105
105
  width: 100%;
106
106
  height: 1em;
107
107
  }
108
108
  }
109
109
 
110
- &[oui-position^='above'],
111
- &[oui-position^='top'] {
110
+ &[oui-position^='above' i],
111
+ &[oui-position^='top' i] {
112
112
  &::after {
113
113
  inset: calc(100% - 0.5em) 0 0;
114
114
  }
115
115
  }
116
116
 
117
- &[oui-position^='below'],
118
- &[oui-position^='bottom'] {
117
+ &[oui-position^='below' i],
118
+ &[oui-position^='bottom' i] {
119
119
  &::after {
120
120
  inset: -0.5em 0 0;
121
121
  }
122
122
  }
123
123
 
124
- &[oui-position^='end'],
125
- &[oui-position^='left'],
126
- &[oui-position^='right'],
127
- &[oui-position^='start'] {
124
+ &[oui-position^='end' i],
125
+ &[oui-position^='left' i],
126
+ &[oui-position^='right' i],
127
+ &[oui-position^='start' i] {
128
128
  &::after {
129
129
  width: 1em;
130
130
  height: 100%;
131
131
  }
132
132
  }
133
133
 
134
- &[oui-position^='end'],
135
- &[oui-position^='right'] {
134
+ &[oui-position^='end' i],
135
+ &[oui-position^='right' i] {
136
136
  &::after {
137
137
  inset: 0 0 0 -0.5em;
138
138
  }
139
139
  }
140
140
 
141
- &[oui-position^='left'],
142
- &[oui-position^='start'] {
141
+ &[oui-position^='left' i],
142
+ &[oui-position^='start' i] {
143
143
  &::after {
144
144
  inset: 0 0 0 calc(100% - 0.5em);
145
145
  }
package/src/css/form.scss CHANGED
@@ -51,6 +51,30 @@
51
51
  font-variant-numeric: tabular-nums;
52
52
  }
53
53
 
54
+ :where(&:is([type='date' i], [type='datetime-local' i], [type='month' i], [type='week' i])) {
55
+ &::-webkit-calendar-picker-indicator {
56
+ --oui-outline-percentage: 100%;
57
+ --oui-outline-value: var(--oui-blue-6);
58
+
59
+ outline: 4px solid
60
+ color-mix(in oklab, var(--oui-outline-value), transparent var(--oui-outline-percentage));
61
+ outline-offset: 2px;
62
+ border-radius: 1em;
63
+ transition: outline 0.125s ease-in-out;
64
+ cursor: pointer;
65
+
66
+ &:focus-within {
67
+ --oui-outline-percentage: 62.5%;
68
+ }
69
+
70
+ @media (hover: hover) {
71
+ &:hover {
72
+ --oui-outline-percentage: 85%;
73
+ }
74
+ }
75
+ }
76
+ }
77
+
54
78
  :where(&:is([type='file' i])) {
55
79
  padding-left: 0.5em;
56
80
 
@@ -61,6 +85,7 @@
61
85
  --oui-outline-value: var(--oui-grey-6);
62
86
 
63
87
  margin: 0 0.75em 0 0;
88
+ outline: none;
64
89
  font-size: 0.75em;
65
90
  cursor: pointer;
66
91
  }
@@ -108,13 +133,15 @@
108
133
  }
109
134
 
110
135
  :where(
111
- &.oui-validate:not([disabled], [readonly], [aria-disabled='true' i]):is(
112
- :user-invalid:not([aria-invalid='false' i]),
113
- [aria-invalid='true' i]
114
- )
136
+ &.oui-validate:not(
137
+ [disabled],
138
+ [readonly],
139
+ [aria-disabled='true' i],
140
+ [aria-readonly='true' i],
141
+ :focus-visible,
142
+ :focus-within
143
+ ):is(:user-invalid:not([aria-invalid='false' i]), [aria-invalid='true' i])
115
144
  ) {
116
- @include mixins.input-invalid;
117
-
118
145
  &::file-selector-button {
119
146
  --oui-background-value: var(--oui-red-2);
120
147
  --oui-foreground-value: var(--oui-red-8);
@@ -136,13 +163,15 @@
136
163
  }
137
164
 
138
165
  :where(
139
- &.oui-validate:not([disabled], [readonly], [aria-disabled='true' i]):is(
140
- :user-valid:not([aria-invalid='true' i]),
141
- [aria-invalid='false' i]
142
- )
166
+ &.oui-validate:not(
167
+ [disabled],
168
+ [readonly],
169
+ [aria-disabled='true' i],
170
+ [aria-readonly='true' i],
171
+ :focus-visible,
172
+ :focus-within
173
+ ):is(:user-valid:not([aria-invalid='true' i]), [aria-invalid='false' i])
143
174
  ) {
144
- @include mixins.input-valid;
145
-
146
175
  &::file-selector-button {
147
176
  --oui-background-value: var(--oui-green-2);
148
177
  --oui-foreground-value: var(--oui-green-8);
@@ -163,72 +192,59 @@
163
192
  }
164
193
  }
165
194
 
166
- :where(&:not([disabled], [readonly], [aria-disabled='true' i])) {
167
- &::-webkit-calendar-picker-indicator {
168
- outline: 4px solid transparent;
169
- outline-offset: 2px;
170
- border-radius: 2em;
171
- transition: 0.125s ease-in-out;
172
- cursor: pointer;
173
-
174
- @media (hover: hover) {
175
- &:hover {
176
- outline-color: color-mix(in oklab, var(--oui-blue-6), transparent 75%);
177
- }
195
+ &:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) {
196
+ :where(&:focus-visible, &:focus-within) {
197
+ &::file-selector-button {
198
+ --oui-background-value: var(--oui-blue-2);
199
+ --oui-foreground-value: var(--oui-blue-8);
200
+ --oui-outline-value: var(--oui-blue-6);
178
201
  }
179
202
 
180
- &:focus {
181
- outline-color: color-mix(in oklab, var(--oui-blue-6), transparent 75%);
203
+ &::range-thumb,
204
+ &::range-track {
205
+ @include mixins.input-focus;
182
206
  }
183
- }
184
- }
185
207
 
186
- :where(&:not([disabled], [readonly], [aria-disabled='true' i]):focus),
187
- :where(&:not([disabled], [readonly], [aria-disabled='true' i]):focus-within) {
188
- @include mixins.input-focus;
208
+ &::range-thumb {
209
+ --oui-background-value: var(--oui-blue-6);
189
210
 
190
- &::file-selector-button {
191
- --oui-background-value: var(--oui-blue-2);
192
- --oui-foreground-value: var(--oui-blue-8);
193
- --oui-outline-value: var(--oui-blue-6);
211
+ box-shadow: 0 1px 2px 2px rgb(0 0 0 / 25%);
212
+ }
194
213
  }
195
214
 
196
- &::range-thumb,
197
- &::range-track {
198
- @include mixins.input-focus;
199
- }
215
+ @media (hover: hover) {
216
+ :where(&:hover) {
217
+ &::file-selector-button {
218
+ --oui-background-value: var(--oui-blue-2);
219
+ --oui-foreground-value: var(--oui-blue-8);
220
+ --oui-outline-value: var(--oui-blue-6);
221
+ }
200
222
 
201
- &::range-thumb {
202
- --oui-background-value: var(--oui-blue-6);
223
+ &::range-thumb {
224
+ --oui-background-value: var(--oui-blue-5);
225
+ }
203
226
 
204
- box-shadow: 0 1px 2px 2px rgb(0 0 0 / 25%);
227
+ &::range-track {
228
+ @include mixins.input-hover;
229
+ }
230
+ }
205
231
  }
206
232
  }
207
233
 
208
- @media (hover: hover) {
209
- :where(&:not([disabled], [readonly], [aria-disabled='true' i]):hover) {
210
- @include mixins.input-hover;
211
-
212
- &::file-selector-button {
213
- --oui-background-value: var(--oui-blue-2);
214
- --oui-foreground-value: var(--oui-blue-8);
215
- --oui-outline-value: var(--oui-blue-6);
216
- }
217
-
218
- &::range-thumb {
219
- --oui-background-value: var(--oui-blue-5);
234
+ :where(&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i])) {
235
+ &::-webkit-calendar-picker-indicator {
236
+ &:focus-within {
237
+ --oui-outline-percentage: 0%;
238
+ --oui-outline-value: var(--oui-gray-3);
220
239
  }
221
240
 
222
- &::range-track {
223
- @include mixins.input-hover;
241
+ @media (hover: hover) {
242
+ &:hover {
243
+ --oui-outline-percentage: 0%;
244
+ --oui-outline-value: var(--oui-gray-3);
245
+ }
224
246
  }
225
247
  }
226
- }
227
-
228
- :where(&:is([disabled], [readonly], [aria-disabled='true' i])) {
229
- --oui-foreground-percentage: 25%;
230
-
231
- font-style: italic;
232
248
 
233
249
  &::file-selector-button {
234
250
  --oui-background-value: var(--oui-gray-1);
@@ -243,12 +259,10 @@
243
259
  }
244
260
  }
245
261
 
246
- :where(&:is([disabled], [readonly], [aria-disabled='true' i]):focus) {
247
- --oui-outline-percentage: 75%;
248
- }
249
-
250
262
  :where(&:is([disabled], [aria-disabled='true' i])) {
251
- --oui-background-percentage: 50%;
263
+ &::-webkit-calendar-picker-indicator {
264
+ opacity: 0.5;
265
+ }
252
266
 
253
267
  &::range-thumb {
254
268
  --oui-background-value: var(--oui-gray-1);
@@ -260,10 +274,6 @@
260
274
  --oui-background-percentage: 50%;
261
275
  --oui-background-value: var(--oui-gray-0);
262
276
  }
263
-
264
- &::-webkit-calendar-picker-indicator {
265
- opacity: 0.5;
266
- }
267
277
  }
268
278
  }
269
279
 
@@ -317,12 +327,13 @@ select.oui-input:is([multiple]) {
317
327
  :where(.oui-label, .oui-legend) {
318
328
  font-size: 0.875rem;
319
329
  font-weight: bold;
330
+ align-self: flex-start;
320
331
  }
321
332
 
322
333
  .oui-label {
323
334
  :where(&) {
324
335
  cursor: pointer;
325
- transition: 0.125s ease-in-out;
336
+ transition: color 0.125s ease-in-out;
326
337
  }
327
338
 
328
339
  @media (hover: hover) {
@@ -358,6 +369,7 @@ select.oui-input:is([multiple]) {
358
369
  font-family: system-ui, sans-serif;
359
370
  position: absolute;
360
371
  transition: 0.125s ease-in-out;
372
+ transition-property: background, outline, border, box-shadow, color;
361
373
  pointer-events: none;
362
374
  }
363
375
 
@@ -45,32 +45,6 @@
45
45
  border-radius: 0.25em;
46
46
  position: relative;
47
47
  }
48
-
49
- :where(&:not([disabled], [readonly], [aria-disabled='true' i]):focus) {
50
- @include mixins.input-focus;
51
- }
52
-
53
- @media (hover: hover) {
54
- :where(
55
- &:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]):hover
56
- ) {
57
- @include mixins.input-hover;
58
- }
59
- }
60
-
61
- :where(&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i])) {
62
- --oui-foreground-percentage: 25%;
63
-
64
- font-style: italic;
65
- }
66
-
67
- :where(&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]):focus) {
68
- --oui-outline-percentage: 75%;
69
- }
70
-
71
- :where(&:is([disabled], [aria-disabled='true' i])) {
72
- --oui-background-percentage: 50%;
73
- }
74
48
  }
75
49
 
76
50
  :where([oui-listbox-header]) {
@@ -117,11 +91,10 @@
117
91
  outline-offset: -4px;
118
92
  line-height: 1.25;
119
93
  cursor: pointer;
120
- transition: 0.125s ease-in-out;
121
94
  }
122
95
 
123
96
  :where(&[aria-selected='true' i]) {
124
- background-color: var(--oui-blue-3);
97
+ background-color: var(--oui-blue-2);
125
98
  color: var(--oui-blue-9);
126
99
  }
127
100
 
@@ -130,9 +103,7 @@
130
103
  margin: 0 0.75em 0 0;
131
104
  }
132
105
 
133
- :where(
134
- oui-listbox:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) &
135
- ) {
106
+ oui-listbox:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) & {
136
107
  @media (hover: hover) {
137
108
  :where(&:hover) {
138
109
  background-color: var(--oui-blue-1);
@@ -4,6 +4,9 @@
4
4
 
5
5
  .oui-message {
6
6
  :where(&) {
7
+ --oui-background: var(--oui-gray-1);
8
+ --oui-border: var(--oui-gray-2);
9
+ --oui-foreground: var(--oui-gray-8);
7
10
  --oui-shadow-mixed: color-mix(
8
11
  in oklab,
9
12
  var(--oui-shadow-value, var(--oui-gray-6)),
@@ -11,7 +14,7 @@
11
14
  );
12
15
 
13
16
  @include mixins.card(
14
- color-mix(in oklab, var(--oui-background, var(--oui-gray-0)), transparent 25%),
17
+ color-mix(in oklab, var(--oui-background), transparent 25%),
15
18
  var(--oui-shadow-mixed)
16
19
  );
17
20
 
@@ -19,12 +22,12 @@
19
22
  display: inline-flex;
20
23
  flex-flow: column nowrap;
21
24
  gap: 1em;
22
- color: var(--oui-foreground, var(--oui-gray-8));
25
+ color: var(--oui-foreground);
23
26
  line-height: 1.25;
24
27
  }
25
28
 
26
29
  :where(& h2, & h3, & h4, & h5, & h6) {
27
- color: var(--oui-foreground, var(--oui-gray-10));
30
+ color: var(--oui-foreground);
28
31
  font-size: 1em;
29
32
  font-weight: bold;
30
33
  }
@@ -32,7 +35,7 @@
32
35
  :where(& hr) {
33
36
  height: 1px;
34
37
  margin: 0 -1.25em;
35
- background-color: var(--oui-border, var(--oui-gray-2));
38
+ background-color: var(--oui-border);
36
39
  border: none;
37
40
  }
38
41
 
@@ -45,44 +48,26 @@
45
48
  }
46
49
 
47
50
  :where(&--blue, &--info) {
48
- --oui-background: var(--oui-blue-0);
49
- --oui-border: var(--oui-blue-2);
50
- --oui-foreground: var(--oui-blue-8);
51
- --oui-shadow-value: var(--oui-blue-6);
51
+ @include mixins.message-blue;
52
52
  }
53
53
 
54
54
  :where(&--green, &--success) {
55
- --oui-background: var(--oui-green-0);
56
- --oui-border: var(--oui-green-2);
57
- --oui-foreground: var(--oui-green-8);
58
- --oui-shadow-value: var(--oui-green-6);
55
+ @include mixins.message-green;
59
56
  }
60
57
 
61
58
  :where(&--orange, &--warning) {
62
- --oui-background: var(--oui-orange-0);
63
- --oui-border: var(--oui-orange-2);
64
- --oui-foreground: var(--oui-orange-8);
65
- --oui-shadow-value: var(--oui-orange-6);
59
+ @include mixins.message-orange;
66
60
  }
67
61
 
68
62
  :where(&--purple, &--special) {
69
- --oui-background: var(--oui-purple-0);
70
- --oui-border: var(--oui-purple-2);
71
- --oui-foreground: var(--oui-purple-8);
72
- --oui-shadow-value: var(--oui-purple-6);
63
+ @include mixins.message-purple;
73
64
  }
74
65
 
75
66
  :where(&--red, &--error) {
76
- --oui-background: var(--oui-red-0);
77
- --oui-border: var(--oui-red-2);
78
- --oui-foreground: var(--oui-red-8);
79
- --oui-shadow-value: var(--oui-red-6);
67
+ @include mixins.message-red;
80
68
  }
81
69
 
82
70
  :where(&--yellow, &--notice) {
83
- --oui-background: var(--oui-yellow-0);
84
- --oui-border: var(--oui-yellow-2);
85
- --oui-foreground: var(--oui-yellow-8);
86
- --oui-shadow-value: var(--oui-yellow-6);
71
+ @include mixins.message-yellow;
87
72
  }
88
73
  }