@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.
- package/dist/css/badge.css +18 -15
- package/dist/css/button.css +35 -31
- package/dist/css/color.css +20 -20
- package/dist/css/combobox.css +133 -34
- package/dist/css/content.css +29 -10
- package/dist/css/floatable.css +10 -10
- package/dist/css/form.css +393 -129
- package/dist/css/listbox.css +41 -17
- package/dist/css/message.css +13 -10
- package/dist/css/reset.css +29 -88
- package/dist/css/splitter.css +2 -2
- package/dist/css/tabs.css +103 -0
- package/dist/js/focus-trap/focus-trap.embedded.mjs +6 -10
- package/dist/js/index.d.mts +2 -1
- package/dist/js/index.mjs +2 -1
- package/dist/js/internal/draggable.mjs +16 -22
- package/dist/js/internal/listbox/listbox.form.mjs +1 -1
- package/dist/js/internal/listbox/listbox.state.mjs +1 -1
- package/dist/js/internal/navigable.d.mts +11 -5
- package/dist/js/internal/navigable.mjs +44 -18
- package/dist/js/movable/movable.embedded.mjs +3 -6
- package/dist/js/resizable/resizable.embedded.mjs +16 -26
- package/dist/js/splitter.mjs +15 -12
- package/dist/js/tabs.d.mts +25 -0
- package/dist/js/tabs.mjs +240 -0
- package/dist/js/tooltip.mjs +13 -12
- package/package.json +1 -1
- package/src/css/badge.scss +6 -18
- package/src/css/button.scss +6 -45
- package/src/css/color.scss +20 -20
- package/src/css/combobox.scss +20 -51
- package/src/css/content.scss +30 -3
- package/src/css/floatable.scss +17 -17
- package/src/css/form.scss +84 -72
- package/src/css/listbox.scss +2 -31
- package/src/css/message.scss +13 -28
- package/src/css/mixins.scss +253 -28
- package/src/css/reset.scss +37 -86
- package/src/css/splitter.scss +2 -2
- package/src/css/tabs.scss +85 -0
- package/src/js/focus-trap/focus-trap.embedded.ts +11 -19
- package/src/js/index.ts +1 -0
- package/src/js/internal/draggable.ts +29 -33
- package/src/js/internal/listbox/listbox.form.ts +1 -1
- package/src/js/internal/listbox/listbox.state.ts +1 -1
- package/src/js/internal/navigable.ts +80 -23
- package/src/js/movable/movable.embedded.ts +11 -13
- package/src/js/resizable/resizable.embedded.ts +25 -39
- package/src/js/splitter.ts +21 -18
- package/src/js/tabs.ts +447 -0
- package/src/js/tooltip.ts +20 -17
package/dist/js/tabs.mjs
ADDED
|
@@ -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 };
|
package/dist/js/tooltip.mjs
CHANGED
|
@@ -103,24 +103,25 @@ function findElements(attribute) {
|
|
|
103
103
|
return elements;
|
|
104
104
|
}
|
|
105
105
|
function getContent() {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
119
|
-
if (isNullableOrWhitespace(
|
|
120
|
-
if (isNullableOrWhitespace(
|
|
121
|
-
|
|
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
package/src/css/badge.scss
CHANGED
|
@@ -37,38 +37,26 @@
|
|
|
37
37
|
// Colors
|
|
38
38
|
|
|
39
39
|
:where(&-pill--blue, &-tag--blue) {
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
71
|
-
--oui-foreground: var(--oui-yellow-8);
|
|
72
|
-
--oui-shadow: var(--oui-yellow-6);
|
|
60
|
+
@include mixins.badge-yellow;
|
|
73
61
|
}
|
|
74
62
|
}
|
package/src/css/button.scss
CHANGED
|
@@ -8,39 +8,27 @@
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
:where(&--blue) {
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/css/color.scss
CHANGED
|
@@ -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.
|
|
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.
|
|
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(
|
|
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));
|
package/src/css/combobox.scss
CHANGED
|
@@ -17,32 +17,28 @@
|
|
|
17
17
|
position: relative;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
39
|
-
|
|
32
|
+
&:is([disabled], [readonly], [aria-disabled='true' i], [aria-readonly='true' i]) {
|
|
33
|
+
:where(&) {
|
|
34
|
+
--oui-foreground-percentage: 25%;
|
|
40
35
|
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
font-style: italic;
|
|
37
|
+
}
|
|
43
38
|
|
|
44
|
-
|
|
45
|
-
|
|
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-
|
|
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
|
-
:
|
|
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-
|
|
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;
|
package/src/css/content.scss
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
@use './mixins' as mixins;
|
|
4
4
|
|
|
5
5
|
@mixin thumb($background, $shadow) {
|
|
6
|
-
@include mixins.shadow-
|
|
6
|
+
@include mixins.shadow-0(
|
|
7
7
|
color-mix(in oklab, $shadow, transparent 33%),
|
|
8
|
-
color-mix(in oklab,
|
|
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
|
+
}
|