@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
@@ -0,0 +1,240 @@
1
+ import { OuiNavigable, getNavigableOrientation } from "./internal/navigable.mjs";
2
+ import { getAria, setAria } from "@oscarpalmer/toretto/aria";
3
+ import { getAttribute, setAttribute } from "@oscarpalmer/toretto/attribute";
4
+ import { createElement } from "@oscarpalmer/toretto/create";
5
+ //#region src/js/tabs.ts
6
+ var OuiTabsEvent = class extends Event {
7
+ oldIndex;
8
+ newIndex;
9
+ constructor(name, oldIndex, newIndex, cancelable) {
10
+ super(name, {
11
+ cancelable,
12
+ bubbles: true,
13
+ composed: true
14
+ });
15
+ this.oldIndex = oldIndex;
16
+ this.newIndex = newIndex;
17
+ }
18
+ };
19
+ var OuiTabsElement = class extends HTMLElement {
20
+ static observedAttributes = ["active"];
21
+ #state;
22
+ get active() {
23
+ return this.#state?.active ?? 0;
24
+ }
25
+ set active(value) {
26
+ setActive(this.#state, value);
27
+ }
28
+ get panel() {
29
+ return this.#state?.panels.elements[this.active];
30
+ }
31
+ get tab() {
32
+ return this.#state?.tabList.tabs[this.active];
33
+ }
34
+ attributeChangedCallback(name, _, value) {
35
+ switch (name) {
36
+ case "active": setActive(this.#state, value);
37
+ }
38
+ }
39
+ connectedCallback() {
40
+ if (this.#state == null) this.#state = initializeTabs(this);
41
+ else attachTabs(this.#state);
42
+ }
43
+ disconnectedCallback() {
44
+ if (this.#state != null) detachTabs(this.#state);
45
+ }
46
+ };
47
+ function attachTabs(state) {
48
+ state.navigable = new OuiNavigable(state.tabList.element, {
49
+ orientation: state.orientation,
50
+ selector: SELECTOR_TAB,
51
+ vertical: false,
52
+ onActivate: (navigable) => {
53
+ const index = state.tabList.tabs.indexOf(navigable.active.element);
54
+ if (index > -1 && index !== state.active) onActivate(state, index);
55
+ }
56
+ });
57
+ const { length } = state.panels.elements;
58
+ for (let index = 0; index < length; index += 1) {
59
+ const panel = state.panels.elements[index];
60
+ panel.hidden = index !== state.active;
61
+ panel.role = "tabpanel";
62
+ if (index === 0) {
63
+ panel.insertAdjacentElement("beforebegin", state.tabList.element);
64
+ panel.insertAdjacentElement("beforebegin", state.content);
65
+ }
66
+ state.content.append(panel);
67
+ }
68
+ }
69
+ function createContent(prefix, panels, active) {
70
+ const content = createElement("div", { attribute: { [ATTRIBUTE_CONTENT]: "" } });
71
+ const { length } = panels;
72
+ const hidden = [];
73
+ const roles = [];
74
+ for (let index = 0; index < length; index += 1) {
75
+ const panel = panels[index];
76
+ hidden.push(panel.hidden);
77
+ roles.push(panel.role);
78
+ panel.hidden = index !== active;
79
+ if (panel.id === "") panel.id = `${prefix}_panel_${index}`;
80
+ }
81
+ return {
82
+ element: content,
83
+ panels: {
84
+ hidden,
85
+ roles,
86
+ elements: panels
87
+ }
88
+ };
89
+ }
90
+ function createTab(prefix, index, panel, label, selected) {
91
+ return createElement("button", {
92
+ aria: {
93
+ selected,
94
+ controls: panel.id
95
+ },
96
+ attribute: { [ATTRIBUTE_TAB]: "" },
97
+ property: {
98
+ id: `${prefix}_tab_${index}`,
99
+ role: "tab",
100
+ tabIndex: selected ? 0 : -1,
101
+ textContent: label,
102
+ type: "button"
103
+ }
104
+ });
105
+ }
106
+ function createTabList(prefix, panels, labels, active) {
107
+ const element = createElement("div", {
108
+ attribute: { [ATTRIBUTE_TABLIST]: "" },
109
+ property: { role: "tablist" }
110
+ });
111
+ const { length } = panels;
112
+ const tabs = [];
113
+ for (let index = 0; index < length; index += 1) {
114
+ const tab = createTab(prefix, index, panels[index], labels[index], index === active);
115
+ element.append(tab);
116
+ tabs.push(tab);
117
+ }
118
+ return {
119
+ element,
120
+ tabs
121
+ };
122
+ }
123
+ function detachTabs(state) {
124
+ state.navigable?.destroy();
125
+ const { length } = state.panels.elements;
126
+ for (let index = 0; index < length; index += 1) {
127
+ const panel = state.panels.elements[index];
128
+ panel.hidden = state.panels.hidden[index];
129
+ panel.role = state.panels.roles[index];
130
+ state.content.before(panel);
131
+ }
132
+ state.tabList.element.remove();
133
+ state.content.remove();
134
+ }
135
+ function getActive(element, max) {
136
+ const attribute = getAttribute(element, "active");
137
+ let index = 0;
138
+ if (attribute != null) {
139
+ const value = Number.parseInt(attribute, 10);
140
+ if (!Number.isNaN(value) && value >= 0) index = value > max ? max : value;
141
+ }
142
+ return index;
143
+ }
144
+ function getId() {
145
+ index += 1;
146
+ return `oui_tabs_${index}`;
147
+ }
148
+ function getLabels(panels) {
149
+ const labels = [];
150
+ const { length } = panels;
151
+ for (let index = 0; index < length; index += 1) {
152
+ const panel = panels[index];
153
+ const labelledBy = getAria(panel, "labelledby");
154
+ if (typeof labelledBy === "string" && labelledBy.trim().length > 0) {
155
+ const label = [];
156
+ const selectors = labelledBy.split(/\s+/);
157
+ for (const selector of selectors) {
158
+ const element = document.getElementById(selector);
159
+ if (element == null) return;
160
+ label.push(element.textContent);
161
+ }
162
+ labels.push(label.join(" "));
163
+ continue;
164
+ }
165
+ const label = getAria(panel, "label");
166
+ if (typeof label === "string" && label.trim().length > 0) {
167
+ labels.push(label);
168
+ continue;
169
+ }
170
+ return;
171
+ }
172
+ return labels;
173
+ }
174
+ function initializeTabs(element) {
175
+ const panels = [...element.querySelectorAll(SELECTOR_PANEL)];
176
+ if (panels.length === 0) throw new Error(MESSAGE_EMPTY);
177
+ const labels = getLabels(panels);
178
+ if (labels == null) throw new Error(MESSAGE_INVALID);
179
+ let id;
180
+ if (element.id === "") id = getId();
181
+ else id = element.id;
182
+ const active = getActive(element, panels.length - 1);
183
+ const orientation = getNavigableOrientation(element, false, false);
184
+ const content = createContent(id, panels, active);
185
+ const tabList = createTabList(id, panels, labels, active);
186
+ const state = {
187
+ active,
188
+ id,
189
+ orientation,
190
+ tabList,
191
+ content: content.element,
192
+ host: element,
193
+ panels: content.panels
194
+ };
195
+ attachTabs(state);
196
+ return state;
197
+ }
198
+ function onActivate(state, next) {
199
+ const current = state.active;
200
+ const event = new OuiTabsEvent("oui:beforechange", current, next, true);
201
+ state.host.dispatchEvent(event);
202
+ if (event.defaultPrevented) return;
203
+ state.active = next;
204
+ const { length } = state.panels.elements;
205
+ for (let index = 0; index < length; index += 1) {
206
+ const panel = state.panels.elements[index];
207
+ panel.hidden = index !== next;
208
+ setAria(state.tabList.tabs[index], "selected", index === next);
209
+ }
210
+ setAttribute(state.host, "active", next);
211
+ state.host.dispatchEvent(new OuiTabsEvent("oui:change", current, next, false));
212
+ }
213
+ function setActive(state, value) {
214
+ if (state == null) return;
215
+ const max = state.panels.elements.length - 1;
216
+ let index;
217
+ if (typeof value === "number" && !Number.isNaN(value) && value >= 0) index = value > max ? max : value;
218
+ else if (typeof value === "string") {
219
+ const parsed = Number.parseInt(value, 10);
220
+ if (!Number.isNaN(parsed) && parsed >= 0) index = parsed > max ? max : parsed;
221
+ }
222
+ if (index == null) setAttribute(state.host, "active", state.active);
223
+ else if (index !== state.active) {
224
+ state.navigable?.navigate(index, false);
225
+ onActivate(state, index);
226
+ }
227
+ }
228
+ const TAGNAME = "oui-tabs";
229
+ const ATTRIBUTE_CONTENT = `${TAGNAME}-content`;
230
+ const ATTRIBUTE_PANEL = `${TAGNAME}-panel`;
231
+ const ATTRIBUTE_TAB = `${TAGNAME}-tab`;
232
+ const ATTRIBUTE_TABLIST = `${TAGNAME}-tablist`;
233
+ const MESSAGE_EMPTY = `<${TAGNAME}> must contain at least one [${ATTRIBUTE_PANEL}] child element`;
234
+ const MESSAGE_INVALID = `A [${ATTRIBUTE_PANEL}] child element of <${TAGNAME}> must have a valid 'aria-label' or 'aria-labelledby' attribute`;
235
+ const SELECTOR_PANEL = `:scope > [${ATTRIBUTE_PANEL}]`;
236
+ const SELECTOR_TAB = `[${ATTRIBUTE_TAB}]`;
237
+ let index = 0;
238
+ customElements.define(TAGNAME, OuiTabsElement);
239
+ //#endregion
240
+ export { OuiTabsElement, OuiTabsEvent };
@@ -103,24 +103,25 @@ function findElements(attribute) {
103
103
  return elements;
104
104
  }
105
105
  function getContent() {
106
- const content = createElement("div", {
107
- popover: "hint",
108
- role: "tooltip",
109
- tabIndex: -1
106
+ return createElement("div", {
107
+ attribute: {
108
+ [ATTRIBUTE_CONTENT]: "",
109
+ popover: "hint"
110
+ },
111
+ property: {
112
+ role: "tooltip",
113
+ tabIndex: -1
114
+ }
110
115
  });
111
- setAttribute(content, ATTRIBUTE_CONTENT, "");
112
- return content;
113
116
  }
114
117
  function getElements(anchor) {
115
118
  let elements = findElements(getAria(anchor, "labelledby"));
116
119
  if (elements == null || elements.length === 0) elements = findElements(getAria(anchor, "describedby"));
117
120
  if (elements != null && elements.length > 0) return elements;
118
- let text = getAria(anchor, "label");
119
- if (isNullableOrWhitespace(text)) text = getAria(anchor, "description");
120
- if (isNullableOrWhitespace(text)) return;
121
- const paragraph = document.createElement("p");
122
- paragraph.textContent = text;
123
- return [paragraph];
121
+ let textContent = getAria(anchor, "label");
122
+ if (isNullableOrWhitespace(textContent)) textContent = getAria(anchor, "description");
123
+ if (isNullableOrWhitespace(textContent)) return;
124
+ return [createElement("p", { property: { textContent } })];
124
125
  }
125
126
  function getState(anchor, elements) {
126
127
  const state = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oscarpalmer/oui",
3
- "version": "0.36.0",
3
+ "version": "0.37.0",
4
4
  "description": "Styles, components, and utilities for building websites and applications.",
5
5
  "keywords": [
6
6
  "css",
@@ -37,38 +37,26 @@
37
37
  // Colors
38
38
 
39
39
  :where(&-pill--blue, &-tag--blue) {
40
- --oui-background: var(--oui-blue-0);
41
- --oui-foreground: var(--oui-blue-8);
42
- --oui-shadow: var(--oui-blue-6);
40
+ @include mixins.badge-blue;
43
41
  }
44
42
 
45
43
  :where(&-pill--green, &-tag--green) {
46
- --oui-background: var(--oui-green-0);
47
- --oui-foreground: var(--oui-green-8);
48
- --oui-shadow: var(--oui-green-6);
44
+ @include mixins.badge-green;
49
45
  }
50
46
 
51
47
  :where(&-pill--orange, &-tag--orange) {
52
- --oui-background: var(--oui-orange-0);
53
- --oui-foreground: var(--oui-orange-8);
54
- --oui-shadow: var(--oui-orange-6);
48
+ @include mixins.badge-orange;
55
49
  }
56
50
 
57
51
  :where(&-pill--purple, &-tag--purple) {
58
- --oui-background: var(--oui-purple-0);
59
- --oui-foreground: var(--oui-purple-8);
60
- --oui-shadow: var(--oui-purple-6);
52
+ @include mixins.badge-purple;
61
53
  }
62
54
 
63
55
  :where(&-pill--red, &-tag--red) {
64
- --oui-background: var(--oui-red-0);
65
- --oui-foreground: var(--oui-red-8);
66
- --oui-shadow: var(--oui-red-6);
56
+ @include mixins.badge-red;
67
57
  }
68
58
 
69
59
  :where(&-pill--yellow, &-tag--yellow) {
70
- --oui-background: var(--oui-yellow-0);
71
- --oui-foreground: var(--oui-yellow-8);
72
- --oui-shadow: var(--oui-yellow-6);
60
+ @include mixins.badge-yellow;
73
61
  }
74
62
  }
@@ -8,39 +8,27 @@
8
8
  }
9
9
 
10
10
  :where(&--blue) {
11
- --oui-background-value: var(--oui-blue-2);
12
- --oui-foreground-value: var(--oui-blue-8);
13
- --oui-outline-value: var(--oui-blue-6);
11
+ @include mixins.button-blue;
14
12
  }
15
13
 
16
14
  :where(&--green) {
17
- --oui-background-value: var(--oui-green-2);
18
- --oui-foreground-value: var(--oui-green-8);
19
- --oui-outline-value: var(--oui-green-6);
15
+ @include mixins.button-green;
20
16
  }
21
17
 
22
18
  :where(&--orange) {
23
- --oui-background-value: var(--oui-orange-2);
24
- --oui-foreground-value: var(--oui-orange-8);
25
- --oui-outline-value: var(--oui-orange-6);
19
+ @include mixins.button-orange;
26
20
  }
27
21
 
28
22
  :where(&--purple) {
29
- --oui-background-value: var(--oui-purple-2);
30
- --oui-foreground-value: var(--oui-purple-8);
31
- --oui-outline-value: var(--oui-purple-6);
23
+ @include mixins.button-purple;
32
24
  }
33
25
 
34
26
  :where(&--red) {
35
- --oui-background-value: var(--oui-red-2);
36
- --oui-foreground-value: var(--oui-red-8);
37
- --oui-outline-value: var(--oui-red-6);
27
+ @include mixins.button-red;
38
28
  }
39
29
 
40
30
  :where(&--yellow) {
41
- --oui-background-value: var(--oui-yellow-2);
42
- --oui-foreground-value: var(--oui-yellow-8);
43
- --oui-outline-value: var(--oui-yellow-6);
31
+ @include mixins.button-yellow;
44
32
  }
45
33
 
46
34
  :where(&--rounded) {
@@ -59,31 +47,4 @@
59
47
 
60
48
  font-size: 0.75em;
61
49
  }
62
-
63
- :where(&:focus-visible) {
64
- --oui-outline-percentage: 75%;
65
- }
66
-
67
- @media (hover: hover) {
68
- :where(&:not([disabled], [aria-disabled='true' i]):hover) {
69
- --oui-background-percentage: 50%;
70
- --oui-foreground-percentage: 25%;
71
- --oui-shadow-percentage: 90%;
72
- }
73
- }
74
-
75
- :where(&:not([disabled], [aria-disabled='true' i]):active) {
76
- box-shadow:
77
- 0 0 0 1px var(--oui-shadow-value),
78
- inset 0 1px 2px 0 var(--oui-shadow-value),
79
- inset 0 2px 4px 0 var(--oui-shadow-value);
80
- }
81
-
82
- :where(&[disabled], &[aria-disabled='true' i]) {
83
- --oui-background-percentage: 80%;
84
- --oui-foreground-percentage: 20%;
85
- --oui-shadow-percentage: 95%;
86
-
87
- font-style: italic;
88
- }
89
50
  }
@@ -17,8 +17,8 @@
17
17
  --oui-blue-9: light-dark(oklch(35% 0.1 251deg), oklch(90% 0.03 259deg));
18
18
  --oui-blue-10: light-dark(oklch(30% 0.09 250deg), oklch(95% 0.02 260deg));
19
19
 
20
- --oui-green-0: light-dark(oklch(99% 0.01 150deg), oklch(20% 0.08 140deg));
21
- --oui-green-1: light-dark(oklch(98% 0.02 149deg), oklch(25% 0.09 141deg));
20
+ --oui-green-0: light-dark(oklch(99.5% 0.01 150deg), oklch(20% 0.08 140deg));
21
+ --oui-green-1: light-dark(oklch(98.25% 0.02 149deg), oklch(25% 0.09 141deg));
22
22
  --oui-green-2: light-dark(oklch(95% 0.03 148deg), oklch(32% 0.1 142deg));
23
23
  --oui-green-3: light-dark(oklch(90% 0.04 147deg), oklch(40% 0.09 143deg));
24
24
  --oui-green-4: light-dark(oklch(80% 0.06 146deg), oklch(50% 0.08 144deg));
@@ -29,11 +29,11 @@
29
29
  --oui-green-9: light-dark(oklch(35% 0.1 141deg), oklch(90% 0.03 149deg));
30
30
  --oui-green-10: light-dark(oklch(30% 0.09 140deg), oklch(95% 0.02 150deg));
31
31
 
32
- --oui-orange-0: light-dark(oklch(99% 0.02 60deg), oklch(20% 0.08 50deg));
33
- --oui-orange-1: light-dark(oklch(98.5% 0.035 59deg), oklch(25% 0.09 51deg));
34
- --oui-orange-2: light-dark(oklch(97% 0.05 58deg), oklch(32% 0.1 52deg));
35
- --oui-orange-3: light-dark(oklch(93% 0.07 57deg), oklch(40% 0.09 53deg));
36
- --oui-orange-4: light-dark(oklch(87% 0.1 56deg), oklch(50% 0.08 54deg));
32
+ --oui-orange-0: light-dark(oklch(99.5% 0.02 60deg), oklch(20% 0.08 50deg));
33
+ --oui-orange-1: light-dark(oklch(98.75% 0.035 59deg), oklch(25% 0.09 51deg));
34
+ --oui-orange-2: light-dark(oklch(97.5% 0.05 58deg), oklch(32% 0.1 52deg));
35
+ --oui-orange-3: light-dark(oklch(93.25% 0.07 57deg), oklch(40% 0.09 53deg));
36
+ --oui-orange-4: light-dark(oklch(87.125% 0.1 56deg), oklch(50% 0.08 54deg));
37
37
  --oui-orange-5: light-dark(oklch(76% 0.11 55deg), oklch(60% 0.07 55deg));
38
38
  --oui-orange-6: light-dark(oklch(65% 0.12 54deg), oklch(70% 0.06 56deg));
39
39
  --oui-orange-7: light-dark(oklch(55% 0.14 53deg), oklch(80% 0.05 57deg));
@@ -41,8 +41,8 @@
41
41
  --oui-orange-9: light-dark(oklch(37.5% 0.11 51deg), oklch(90% 0.03 59deg));
42
42
  --oui-orange-10: light-dark(oklch(30% 0.09 50deg), oklch(95% 0.02 60deg));
43
43
 
44
- --oui-purple-0: light-dark(oklch(99% 0.02 300deg), oklch(20% 0.08 290deg));
45
- --oui-purple-1: light-dark(oklch(98% 0.035 299deg), oklch(25% 0.09 291deg));
44
+ --oui-purple-0: light-dark(oklch(99.5% 0.02 300deg), oklch(20% 0.08 290deg));
45
+ --oui-purple-1: light-dark(oklch(98.25% 0.035 299deg), oklch(25% 0.09 291deg));
46
46
  --oui-purple-2: light-dark(oklch(95% 0.05 298deg), oklch(32% 0.1 292deg));
47
47
  --oui-purple-3: light-dark(oklch(90% 0.07 297deg), oklch(40% 0.09 293deg));
48
48
  --oui-purple-4: light-dark(oklch(80% 0.1 296deg), oklch(50% 0.08 294deg));
@@ -53,11 +53,11 @@
53
53
  --oui-purple-9: light-dark(oklch(35% 0.11 291deg), oklch(90% 0.03 299deg));
54
54
  --oui-purple-10: light-dark(oklch(30% 0.09 290deg), oklch(95% 0.02 300deg));
55
55
 
56
- --oui-red-0: light-dark(oklch(99% 0.024 25deg), oklch(20% 0.08 25deg));
57
- --oui-red-1: light-dark(oklch(98.5% 0.032 24deg), oklch(25% 0.09 24deg));
58
- --oui-red-2: light-dark(oklch(97% 0.05 23deg), oklch(32% 0.1 23deg));
59
- --oui-red-3: light-dark(oklch(93% 0.07 22deg), oklch(40% 0.09 22deg));
60
- --oui-red-4: light-dark(oklch(87% 0.1 21deg), oklch(50% 0.08 21deg));
56
+ --oui-red-0: light-dark(oklch(99.5% 0.024 25deg), oklch(20% 0.08 25deg));
57
+ --oui-red-1: light-dark(oklch(98.75% 0.032 24deg), oklch(25% 0.09 24deg));
58
+ --oui-red-2: light-dark(oklch(97.5% 0.05 23deg), oklch(32% 0.1 23deg));
59
+ --oui-red-3: light-dark(oklch(93.25% 0.07 22deg), oklch(40% 0.09 22deg));
60
+ --oui-red-4: light-dark(oklch(87.125% 0.1 21deg), oklch(50% 0.08 21deg));
61
61
  --oui-red-5: light-dark(oklch(76% 0.11 20deg), oklch(60% 0.07 20deg));
62
62
  --oui-red-6: light-dark(oklch(65% 0.12 19deg), oklch(70% 0.06 19deg));
63
63
  --oui-red-7: light-dark(oklch(55% 0.14 18deg), oklch(80% 0.05 18deg));
@@ -65,10 +65,10 @@
65
65
  --oui-red-9: light-dark(oklch(37.5% 0.11 16deg), oklch(90% 0.03 16deg));
66
66
  --oui-red-10: light-dark(oklch(30% 0.09 15deg), oklch(95% 0.02 15deg));
67
67
 
68
- --oui-yellow-0: light-dark(oklch(99% 0.02 100deg), oklch(20% 0.08 90deg));
68
+ --oui-yellow-0: light-dark(oklch(99.5% 0.02 100deg), oklch(20% 0.08 90deg));
69
69
  --oui-yellow-1: light-dark(oklch(98.5% 0.035 99deg), oklch(25% 0.09 91deg));
70
- --oui-yellow-2: light-dark(oklch(97% 0.05 98deg), oklch(32% 0.1 92deg));
71
- --oui-yellow-3: light-dark(oklch(93% 0.07 97deg), oklch(40% 0.09 93deg));
70
+ --oui-yellow-2: light-dark(oklch(97.25% 0.05 98deg), oklch(32% 0.1 92deg));
71
+ --oui-yellow-3: light-dark(oklch(93.125% 0.07 97deg), oklch(40% 0.09 93deg));
72
72
  --oui-yellow-4: light-dark(oklch(87% 0.1 96deg), oklch(50% 0.08 94deg));
73
73
  --oui-yellow-5: light-dark(oklch(78% 0.11 95deg), oklch(60% 0.07 95deg));
74
74
  --oui-yellow-6: light-dark(oklch(65% 0.12 94deg), oklch(70% 0.06 96deg));
@@ -78,7 +78,7 @@
78
78
  --oui-yellow-10: light-dark(oklch(30% 0.09 90deg), oklch(95% 0.02 100deg));
79
79
 
80
80
  --oui-gray-0: light-dark(oklch(98% 0 0deg), oklch(22% 0 0deg));
81
- --oui-gray-1: light-dark(oklch(98% 0 0deg), oklch(26% 0 0deg));
81
+ --oui-gray-1: light-dark(oklch(97% 0 0deg), oklch(26% 0 0deg));
82
82
  --oui-gray-2: light-dark(oklch(95% 0 0deg), oklch(32% 0 0deg));
83
83
  --oui-gray-3: light-dark(oklch(90% 0 0deg), oklch(40% 0 0deg));
84
84
  --oui-gray-4: light-dark(oklch(80% 0 0deg), oklch(50% 0 0deg));
@@ -101,8 +101,8 @@
101
101
  --oui-slate-9: light-dark(oklch(35% 0.0075 255deg), oklch(90% 0.0075 255deg));
102
102
  --oui-slate-10: light-dark(oklch(30% 0.005 255deg), oklch(95% 0.005 255deg));
103
103
 
104
- --oui-stone-0: light-dark(oklch(99% 0.0033 95deg), oklch(22% 0.005 95deg));
105
- --oui-stone-1: light-dark(oklch(98% 0.0067 95deg), oklch(26% 0.0075 95deg));
104
+ --oui-stone-0: light-dark(oklch(99.5% 0.0033 95deg), oklch(22% 0.005 95deg));
105
+ --oui-stone-1: light-dark(oklch(98.25% 0.0067 95deg), oklch(26% 0.0075 95deg));
106
106
  --oui-stone-2: light-dark(oklch(95% 0.01 95deg), oklch(32% 0.01 95deg));
107
107
  --oui-stone-3: light-dark(oklch(90% 0.0125 95deg), oklch(40% 0.0125 95deg));
108
108
  --oui-stone-4: light-dark(oklch(80% 0.015 95deg), oklch(50% 0.015 95deg));
@@ -17,32 +17,28 @@
17
17
  position: relative;
18
18
  }
19
19
 
20
- :where(&:not([disabled], [readonly], [aria-disabled='true' i]):focus),
21
- :where(&:not([disabled], [readonly], [aria-disabled='true' i]):focus-within),
22
- :where(
23
- &:not([disabled], [readonly], [aria-disabled='true' i]):has(
24
- + [oui-combobox-content]:focus-within
25
- )
26
- ) {
27
- @include mixins.input-focus;
28
- }
20
+ &:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) {
21
+ :where(&:focus-visible, &:focus-within, &:has(+ [oui-combobox-content]:focus-within)) {
22
+ @include mixins.input-focus;
23
+ }
29
24
 
30
- @media (hover: hover) {
31
- :where(
32
- &:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]):hover
33
- ) {
34
- @include mixins.input-hover;
25
+ @media (hover: hover) {
26
+ :where(&:hover) {
27
+ @include mixins.input-hover;
28
+ }
35
29
  }
36
30
  }
37
31
 
38
- :where(&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i])) {
39
- --oui-foreground-percentage: 25%;
32
+ &:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) {
33
+ :where(&) {
34
+ --oui-foreground-percentage: 25%;
40
35
 
41
- font-style: italic;
42
- }
36
+ font-style: italic;
37
+ }
43
38
 
44
- :where(&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]):focus) {
45
- --oui-outline-percentage: 75%;
39
+ :where(&:focus-visible, &:focus-within, &:has(+ [oui-combobox-content]:focus-within)) {
40
+ --oui-outline-percentage: 75%;
41
+ }
46
42
  }
47
43
 
48
44
  :where(&:is([disabled], [aria-disabled='true' i])) {
@@ -63,7 +59,7 @@
63
59
 
64
60
  :where([oui-combobox-content]) {
65
61
  @include mixins.floatable;
66
- @include mixins.shadow-overlay;
62
+ @include mixins.shadow-5;
67
63
 
68
64
  width: fit-content;
69
65
  height: fit-content;
@@ -109,30 +105,6 @@
109
105
  outline-width: 0;
110
106
  border-radius: 0.25em;
111
107
  font-size: 0.875rem;
112
-
113
- :where(&:focus) {
114
- @include mixins.input-focus;
115
- }
116
-
117
- @media (hover: hover) {
118
- :where(&:hover) {
119
- @include mixins.input-hover;
120
- }
121
- }
122
-
123
- :where(&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i])) {
124
- --oui-foreground-percentage: 25%;
125
-
126
- font-style: italic;
127
- }
128
-
129
- :where(&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]):focus) {
130
- --oui-outline-percentage: 75%;
131
- }
132
-
133
- :where(&:is([disabled], [aria-disabled='true' i])) {
134
- --oui-background-percentage: 50%;
135
- }
136
108
  }
137
109
 
138
110
  :where([oui-combobox-header]) {
@@ -169,7 +141,6 @@
169
141
  outline-offset: -4px;
170
142
  line-height: 1.25;
171
143
  cursor: pointer;
172
- transition: 0.125s ease-in-out;
173
144
  }
174
145
 
175
146
  :where(&[aria-selected='true' i]) {
@@ -182,9 +153,7 @@
182
153
  margin: 0 0.75em 0 0;
183
154
  }
184
155
 
185
- :where(
186
- oui-combobox:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) &
187
- ) {
156
+ oui-combobox:not([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) & {
188
157
  @media (hover: hover) {
189
158
  :where(&:hover) {
190
159
  background-color: var(--oui-blue-1);
@@ -217,9 +186,9 @@
217
186
  :where(&) {
218
187
  @include mixins.button;
219
188
 
220
- --oui-background-value: var(--oui-blue-1);
221
- --oui-foreground-percentage: 12.5%;
189
+ --oui-background-value: var(--oui-blue-2);
222
190
  --oui-foreground-value: var(--oui-blue-8);
191
+ --oui-outline-value: var(--oui-blue-6);
223
192
  --oui-shadow-percentage: 90%;
224
193
 
225
194
  padding: 0.5em 1em;
@@ -3,9 +3,9 @@
3
3
  @use './mixins' as mixins;
4
4
 
5
5
  @mixin thumb($background, $shadow) {
6
- @include mixins.shadow-small(
6
+ @include mixins.shadow-0(
7
7
  color-mix(in oklab, $shadow, transparent 33%),
8
- color-mix(in oklab, white, transparent 82.5%)
8
+ color-mix(in oklab, var(--oui-absolute), transparent 82.5%)
9
9
  );
10
10
 
11
11
  appearance: none;
@@ -56,7 +56,7 @@
56
56
  mask-size: contain;
57
57
  mask-position: center;
58
58
  mask-repeat: no-repeat;
59
- transition: 0.125s ease-in-out;
59
+ transition: transform 0.125s ease-in-out;
60
60
  transform: rotate(-90deg);
61
61
  }
62
62
 
@@ -151,3 +151,30 @@
151
151
  }
152
152
  }
153
153
  }
154
+
155
+ .oui-shadow {
156
+ :where(&),
157
+ :where(&-0) {
158
+ @include mixins.shadow-0;
159
+ }
160
+
161
+ :where(&-1) {
162
+ @include mixins.shadow-1;
163
+ }
164
+
165
+ :where(&-2) {
166
+ @include mixins.shadow-2;
167
+ }
168
+
169
+ :where(&-3) {
170
+ @include mixins.shadow-3;
171
+ }
172
+
173
+ :where(&-4) {
174
+ @include mixins.shadow-4;
175
+ }
176
+
177
+ :where(&-5) {
178
+ @include mixins.shadow-5;
179
+ }
180
+ }