@oscarpalmer/oui 0.38.0 → 0.40.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/README.md +1 -1
- package/dist/css/badge.css +11 -8
- package/dist/css/button.css +106 -14
- package/dist/css/color-picker.css +555 -73
- package/dist/css/color.css +86 -86
- package/dist/css/combobox.css +98 -4
- package/dist/css/content.css +7 -6
- package/dist/css/floatable.css +1 -3
- package/dist/css/form.css +99 -6
- package/dist/css/icon.css +99 -0
- package/dist/css/listbox.css +3 -0
- package/dist/css/message.css +4 -3
- package/dist/css/mixins/button.mixins.css +1 -0
- package/dist/css/reset.css +1 -1
- package/dist/css/tabs.css +95 -3
- package/dist/css/typography.css +90 -0
- package/dist/js/color-picker/color-picker.constants.d.mts +2 -0
- package/dist/js/color-picker/color-picker.constants.mjs +60 -0
- package/dist/js/color-picker/color-picker.dom.d.mts +8 -0
- package/dist/js/color-picker/color-picker.dom.mjs +191 -0
- package/dist/js/color-picker/color-picker.event.d.mts +9 -0
- package/dist/js/color-picker/color-picker.event.mjs +2 -0
- package/dist/js/color-picker/color-picker.form.d.mts +5 -0
- package/dist/js/color-picker/color-picker.form.mjs +27 -0
- package/dist/js/color-picker/color-picker.misc.d.mts +2 -0
- package/dist/js/color-picker/color-picker.misc.mjs +2 -0
- package/dist/js/color-picker/color-picker.model.d.mts +2 -0
- package/dist/js/color-picker/color-picker.model.mjs +24 -0
- package/dist/js/color-picker/color-picker.output.d.mts +8 -0
- package/dist/js/color-picker/color-picker.output.mjs +235 -0
- package/dist/js/color-picker/color-picker.state.d.mts +8 -0
- package/dist/js/color-picker/color-picker.state.mjs +2 -0
- package/dist/js/{color-picker.d.mts → color-picker/index.d.mts} +10 -43
- package/dist/js/color-picker/index.mjs +305 -0
- package/dist/js/color-picker.constants-D1mxw_Le.d.mts +179 -0
- package/dist/js/color-picker.event-Cksj5TvS.mjs +500 -0
- package/dist/js/color-picker.misc-CtsXGrOe.d.mts +27 -0
- package/dist/js/combobox/combobox.constants.d.mts +2 -0
- package/dist/js/combobox/{constants.combobox.mjs → combobox.constants.mjs} +21 -21
- package/dist/js/combobox/combobox.dom.d.mts +26 -0
- package/dist/js/combobox/{dom.combobox.mjs → combobox.dom.mjs} +44 -37
- package/dist/js/combobox/combobox.event.d.mts +22 -0
- package/dist/js/combobox/{event.combobox.mjs → combobox.event.mjs} +1 -1
- package/dist/js/combobox/combobox.misc.d.mts +2 -0
- package/dist/js/combobox/{misc.combobox.mjs → combobox.misc.mjs} +1 -1
- package/dist/js/combobox/combobox.model.d.mts +2 -0
- package/dist/js/combobox/combobox.state.d.mts +10 -0
- package/dist/js/combobox/combobox.state.mjs +2 -0
- package/dist/js/combobox/index.d.mts +163 -2
- package/dist/js/combobox/index.mjs +53 -52
- package/dist/js/combobox.constants-DZVkMP5g.d.mts +19 -0
- package/dist/js/combobox.misc-C1tPZZDi.d.mts +22 -0
- package/dist/js/{combobox/models.combobox.d.mts → combobox.model-oDV06XCN.d.mts} +6 -6
- package/dist/js/{state.combobox-Qm3FWzYW.mjs → combobox.state-BfJ3Hxg8.mjs} +96 -82
- package/dist/js/constants.listbox-C5Ap6Ag_.d.mts +9 -0
- package/dist/js/dialog/dialog.model.d.mts +2 -0
- package/dist/js/dialog/dialog.model.mjs +11 -0
- package/dist/js/dialog/index.d.mts +12 -0
- package/dist/js/dialog/index.mjs +123 -0
- package/dist/js/dialog.model-DX2mndMh.d.mts +45 -0
- package/dist/js/floatable/floatable.embedded.d.mts +2 -2
- package/dist/js/floatable/floatable.embedded.mjs +64 -92
- package/dist/js/floatable/floatable.model.d.mts +2 -0
- package/dist/js/floatable/floatable.model.mjs +23 -0
- package/dist/js/floatable/floatable.standalone.d.mts +2 -1
- package/dist/js/floatable.embedded-MeTyXjFn.d.mts +17 -0
- package/dist/js/floatable.model-DXsQgoU7.d.mts +62 -0
- package/dist/js/focus-trap/focus-trap.embedded.d.mts +2 -2
- package/dist/js/focus-trap/focus-trap.embedded.mjs +112 -134
- package/dist/js/focus-trap/focus-trap.model.d.mts +2 -0
- package/dist/js/focus-trap/focus-trap.model.mjs +15 -0
- package/dist/js/focus-trap/focus-trap.standalone.d.mts +2 -1
- package/dist/js/focus-trap.embedded-DIU05m1z.d.mts +13 -0
- package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.model-BeX6UYlw.d.mts} +16 -18
- package/dist/js/index.d.mts +26 -14
- package/dist/js/index.mjs +18 -15
- package/dist/js/internal/attributable.d.mts +2 -3
- package/dist/js/internal/attributable.mjs +3 -2
- package/dist/js/internal/draggable/draggable.model.d.mts +2 -0
- package/dist/js/internal/draggable/draggable.model.mjs +37 -0
- package/dist/js/internal/draggable/index.d.mts +13 -0
- package/dist/js/internal/{draggable.mjs → draggable/index.mjs} +83 -114
- package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
- package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
- package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
- package/dist/js/internal/listbox/listbox.data.mjs +1 -1
- package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
- package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
- package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
- package/dist/js/internal/listbox/listbox.event.mjs +23 -20
- package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
- package/dist/js/internal/listbox/listbox.form.mjs +15 -12
- package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
- package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
- package/dist/js/internal/listbox/listbox.model.d.mts +2 -2
- package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
- package/dist/js/internal/listbox/listbox.state.mjs +19 -20
- package/dist/js/internal/misc.d.mts +5 -4
- package/dist/js/internal/misc.mjs +7 -1
- package/dist/js/internal/navigable/index.d.mts +6 -0
- package/dist/js/internal/navigable/index.mjs +125 -0
- package/dist/js/internal/navigable/navigable.model.d.mts +2 -0
- package/dist/js/internal/navigable/navigable.model.mjs +18 -0
- package/dist/js/l10n/index.d.mts +9 -0
- package/dist/js/{l10n.mjs → l10n/index.mjs} +50 -23
- package/dist/js/l10n/l10n.model.d.mts +2 -0
- package/dist/js/l10n/l10n.model.mjs +9 -0
- package/dist/js/l10n.model-D6a9frgl.d.mts +26 -0
- package/dist/js/listbox/constants.listbox.d.mts +2 -2
- package/dist/js/listbox/constants.listbox.mjs +10 -14
- package/dist/js/listbox/event.listbox.d.mts +6 -7
- package/dist/js/listbox/event.listbox.mjs +47 -1
- package/dist/js/listbox/index.d.mts +8 -6
- package/dist/js/listbox/index.mjs +47 -49
- package/dist/js/listbox/misc.listbox.d.mts +1 -1
- package/dist/js/listbox/misc.listbox.mjs +1 -1
- package/dist/js/listbox/state.listbox.d.mts +8 -10
- package/dist/js/listbox/state.listbox.mjs +2 -2
- package/dist/js/{listbox.data-C7CRa5Ya.mjs → listbox.data-BQyZGKgr.mjs} +83 -66
- package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-CuBOj4qe.d.mts} +15 -11
- package/dist/js/menu/index.mjs +167 -0
- package/dist/js/menu/menu.model.d.mts +33 -0
- package/dist/js/menu/menu.model.mjs +15 -0
- package/dist/js/{misc.listbox-Cyz2CRDy.mjs → misc.listbox-CjfBUbHD.mjs} +27 -69
- package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-CtoGvXQo.d.mts} +2 -2
- package/dist/js/movable/movable.embedded.d.mts +2 -2
- package/dist/js/movable/movable.embedded.mjs +60 -72
- package/dist/js/movable/movable.model.d.mts +2 -0
- package/dist/js/movable/movable.model.mjs +12 -0
- package/dist/js/movable/movable.standalone.d.mts +2 -1
- package/dist/js/movable.embedded-DoyXLegc.d.mts +11 -0
- package/dist/js/movable.model-BHaK_mKw.d.mts +186 -0
- package/dist/js/navigable.model-BPOM8DZk.d.mts +44 -0
- package/dist/js/popover/index.d.mts +12 -0
- package/dist/js/{popover.mjs → popover/index.mjs} +40 -50
- package/dist/js/popover/popover.model.d.mts +2 -0
- package/dist/js/popover/popover.model.mjs +12 -0
- package/dist/js/popover.model-ubKNG612.d.mts +38 -0
- package/dist/js/resizable/resizable.embedded.d.mts +2 -2
- package/dist/js/resizable/resizable.embedded.mjs +44 -59
- package/dist/js/resizable/resizable.model.d.mts +2 -0
- package/dist/js/resizable/resizable.model.mjs +21 -0
- package/dist/js/resizable/resizable.standalone.d.mts +2 -1
- package/dist/js/resizable.embedded-Bf1qBUdt.d.mts +11 -0
- package/dist/js/resizable.model-BwzJcTVJ.d.mts +46 -0
- package/dist/js/sortable/sortable.embedded.d.mts +2 -2
- package/dist/js/sortable/sortable.embedded.mjs +69 -82
- package/dist/js/sortable/sortable.model.d.mts +2 -0
- package/dist/js/sortable/sortable.model.mjs +24 -0
- package/dist/js/sortable/sortable.standalone.d.mts +2 -1
- package/dist/js/sortable.embedded-DzBKAwSG.d.mts +11 -0
- package/dist/js/{splitter.d.mts → splitter/index.d.mts} +8 -7
- package/dist/js/splitter/index.mjs +284 -0
- package/dist/js/splitter/splitter.model.d.mts +2 -0
- package/dist/js/splitter/splitter.model.mjs +37 -0
- package/dist/js/splitter.model-DOLNjLVS.d.mts +57 -0
- package/dist/js/{tabs.d.mts → tabs/index.d.mts} +7 -8
- package/dist/js/{tabs.mjs → tabs/index.mjs} +58 -58
- package/dist/js/tabs/tabs.model.d.mts +2 -0
- package/dist/js/tabs/tabs.model.mjs +18 -0
- package/dist/js/tabs.model-DRBX_JtI.d.mts +40 -0
- package/dist/js/toolbar/index.mjs +27 -0
- package/dist/js/toolbar/toolbar.model.d.mts +11 -0
- package/dist/js/toolbar/toolbar.model.mjs +7 -0
- package/dist/js/tooltip/index.d.mts +19 -0
- package/dist/js/{tooltip.mjs → tooltip/index.mjs} +60 -85
- package/dist/js/tooltip/tooltip.model.d.mts +2 -0
- package/dist/js/tooltip/tooltip.model.mjs +15 -0
- package/dist/js/tooltip.model-DRkY_BsL.d.mts +37 -0
- package/package.json +43 -37
- package/dist/js/color-picker.mjs +0 -924
- package/dist/js/combobox/constants.combobox.d.mts +0 -2
- package/dist/js/combobox/dom.combobox.d.mts +0 -27
- package/dist/js/combobox/event.combobox.d.mts +0 -23
- package/dist/js/combobox/misc.combobox.d.mts +0 -2
- package/dist/js/combobox/state.combobox.d.mts +0 -12
- package/dist/js/combobox/state.combobox.mjs +0 -2
- package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
- package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
- package/dist/js/dialog.d.mts +0 -47
- package/dist/js/dialog.mjs +0 -131
- package/dist/js/draggable-a6w0J1OD.d.mts +0 -154
- package/dist/js/floatable.embedded-Bct4U5Dm.d.mts +0 -69
- package/dist/js/index-DJdFlTLm.d.mts +0 -177
- package/dist/js/internal/draggable.d.mts +0 -2
- package/dist/js/internal/navigable.d.mts +0 -37
- package/dist/js/internal/navigable.mjs +0 -135
- package/dist/js/l10n-Bn-7RcwR.d.mts +0 -20
- package/dist/js/l10n.d.mts +0 -2
- package/dist/js/menu.mjs +0 -172
- package/dist/js/popover.d.mts +0 -38
- package/dist/js/resizable.embedded-3qoR0Bjm.d.mts +0 -34
- package/dist/js/splitter.mjs +0 -322
- package/dist/js/toolbar.mjs +0 -31
- package/dist/js/tooltip.d.mts +0 -45
- package/src/css/a11y.scss +0 -13
- package/src/css/badge.scss +0 -62
- package/src/css/button.scss +0 -50
- package/src/css/color-picker.scss +0 -344
- package/src/css/color.scss +0 -113
- package/src/css/combobox.scss +0 -255
- package/src/css/content.scss +0 -181
- package/src/css/flex.scss +0 -107
- package/src/css/floatable.scss +0 -155
- package/src/css/form.scss +0 -575
- package/src/css/listbox.scss +0 -121
- package/src/css/message.scss +0 -74
- package/src/css/mixins/badge.mixins.scss +0 -53
- package/src/css/mixins/button.mixins.scss +0 -112
- package/src/css/mixins/input.mixins.scss +0 -114
- package/src/css/mixins/message.mixins.scss +0 -41
- package/src/css/mixins/misc.mixins.scss +0 -48
- package/src/css/mixins/shadow.mixins.scss +0 -57
- package/src/css/reset.scss +0 -392
- package/src/css/splitter.scss +0 -89
- package/src/css/table.scss +0 -107
- package/src/css/tabs.scss +0 -74
- package/src/js/color-picker.ts +0 -1653
- package/src/js/combobox/constants.combobox.ts +0 -83
- package/src/js/combobox/dom.combobox.ts +0 -411
- package/src/js/combobox/event.combobox.ts +0 -365
- package/src/js/combobox/index.ts +0 -382
- package/src/js/combobox/misc.combobox.ts +0 -104
- package/src/js/combobox/models.combobox.ts +0 -54
- package/src/js/combobox/state.combobox.ts +0 -246
- package/src/js/dialog.ts +0 -255
- package/src/js/floatable/floatable.embedded.ts +0 -336
- package/src/js/floatable/floatable.standalone.ts +0 -6
- package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
- package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
- package/src/js/index.ts +0 -16
- package/src/js/internal/attributable.ts +0 -73
- package/src/js/internal/draggable.ts +0 -657
- package/src/js/internal/listbox/listbox.constants.ts +0 -25
- package/src/js/internal/listbox/listbox.data.ts +0 -287
- package/src/js/internal/listbox/listbox.dom.ts +0 -446
- package/src/js/internal/listbox/listbox.event.ts +0 -129
- package/src/js/internal/listbox/listbox.form.ts +0 -125
- package/src/js/internal/listbox/listbox.misc.ts +0 -135
- package/src/js/internal/listbox/listbox.model.ts +0 -169
- package/src/js/internal/listbox/listbox.state.ts +0 -82
- package/src/js/internal/misc.ts +0 -27
- package/src/js/internal/navigable.ts +0 -317
- package/src/js/l10n.ts +0 -192
- package/src/js/listbox/constants.listbox.ts +0 -61
- package/src/js/listbox/event.listbox.ts +0 -106
- package/src/js/listbox/index.ts +0 -364
- package/src/js/listbox/misc.listbox.ts +0 -70
- package/src/js/listbox/state.listbox.ts +0 -194
- package/src/js/menu.ts +0 -348
- package/src/js/movable/movable.embedded.ts +0 -318
- package/src/js/movable/movable.standalone.ts +0 -2
- package/src/js/popover.ts +0 -229
- package/src/js/resizable/resizable.embedded.ts +0 -413
- package/src/js/resizable/resizable.standalone.ts +0 -5
- package/src/js/sortable/sortable.embedded.ts +0 -527
- package/src/js/sortable/sortable.standalone.ts +0 -2
- package/src/js/splitter.ts +0 -583
- package/src/js/tabs.ts +0 -441
- package/src/js/toolbar.ts +0 -63
- package/src/js/tooltip.ts +0 -367
- /package/dist/js/combobox/{models.combobox.mjs → combobox.model.mjs} +0 -0
- /package/dist/js/{menu.d.mts → menu/index.d.mts} +0 -0
- /package/dist/js/{toolbar.d.mts → toolbar/index.d.mts} +0 -0
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { getLocalization, localize } from "./l10n.mjs";
|
|
1
|
+
import { getLocalization, localize } from "./l10n/index.mjs";
|
|
2
2
|
import { listboxScrollOptions } from "./internal/listbox/listbox.constants.mjs";
|
|
3
3
|
import { updateListboxForm, updateListboxValidity } from "./internal/listbox/listbox.form.mjs";
|
|
4
4
|
import { setAria } from "@oscarpalmer/toretto/aria";
|
|
5
5
|
import { setAttribute } from "@oscarpalmer/toretto/attribute";
|
|
6
6
|
import { dispatch } from "@oscarpalmer/toretto/event";
|
|
7
|
+
import { filter } from "@oscarpalmer/atoms/array/filter";
|
|
8
|
+
import { createElement } from "@oscarpalmer/toretto/create";
|
|
7
9
|
import { getString } from "@oscarpalmer/atoms/string";
|
|
8
10
|
import { getData } from "@oscarpalmer/toretto/data";
|
|
9
|
-
import { createElement, setAria as setAria$1, setAttribute as setAttribute$1 } from "@oscarpalmer/toretto";
|
|
10
11
|
//#region src/js/internal/listbox/listbox.misc.ts
|
|
11
12
|
function generateListboxIds(prefix, select) {
|
|
12
|
-
const elements = [...select.children].flatMap((child) => child instanceof HTMLOptGroupElement ? [child, ...[...child.children]
|
|
13
|
+
const elements = [...select.children].flatMap((child) => child instanceof HTMLOptGroupElement ? [child, ...filter([...child.children], (groupChild) => groupChild instanceof HTMLOptionElement)] : child instanceof HTMLOptionElement ? [child] : []);
|
|
13
14
|
const { length } = elements;
|
|
14
15
|
for (let index = 0; index < length; index += 1) {
|
|
15
16
|
const element = elements[index];
|
|
@@ -17,24 +18,26 @@ function generateListboxIds(prefix, select) {
|
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
function getListboxVisibleOptions(state) {
|
|
20
|
-
return state.options.all.filter((option) => !option.hidden);
|
|
21
|
+
return state.component.options.all.filter((option) => !option.hidden);
|
|
21
22
|
}
|
|
22
23
|
function setListboxDisabled(state, value) {
|
|
23
|
-
state.filter.element.readOnly = state.readonly || value;
|
|
24
|
+
state.component.filter.element.readOnly = state.component.readonly || value;
|
|
24
25
|
setProperties("disabled", state, value);
|
|
25
26
|
}
|
|
26
27
|
function setListboxFilter(state, value) {
|
|
27
28
|
if (typeof value !== "string") return;
|
|
28
|
-
const
|
|
29
|
-
|
|
29
|
+
const { filter } = state.component;
|
|
30
|
+
const type = value.length < filter.element.value.length ? "deleteContentBackward" : "insertText";
|
|
31
|
+
filter.element.value = value;
|
|
30
32
|
filterListbox(type, state);
|
|
31
33
|
}
|
|
32
34
|
function setListboxLimit(type, state, value) {
|
|
35
|
+
const { component } = state;
|
|
33
36
|
let actual = value;
|
|
34
37
|
if (typeof actual === "string") actual = Number.parseInt(actual, 10);
|
|
35
|
-
if (typeof actual === "number" && !Number.isNaN(actual) && actual >= 0 ? actual !==
|
|
36
|
-
|
|
37
|
-
setAttribute(
|
|
38
|
+
if (typeof actual === "number" && !Number.isNaN(actual) && actual >= 0 ? actual !== component[type] : actual == null) {
|
|
39
|
+
component[type] = actual;
|
|
40
|
+
setAttribute(component.host, type, actual);
|
|
38
41
|
updateListboxValidity(state);
|
|
39
42
|
}
|
|
40
43
|
}
|
|
@@ -43,16 +46,19 @@ function setListboxMultiple(element, value) {
|
|
|
43
46
|
else element.removeAttribute("multiple");
|
|
44
47
|
}
|
|
45
48
|
function setProperties(key, state, value) {
|
|
46
|
-
|
|
47
|
-
const {
|
|
49
|
+
const { component } = state;
|
|
50
|
+
const { elements } = component;
|
|
51
|
+
component[key] = value;
|
|
52
|
+
const { length } = elements;
|
|
48
53
|
for (let index = 0; index < length; index += 1) {
|
|
49
|
-
const element =
|
|
54
|
+
const element = elements[index];
|
|
50
55
|
if (element == null) continue;
|
|
51
56
|
setAria(element, key, key !== "readonly" || !(element instanceof HTMLButtonElement) ? value : void 0);
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
function setListboxReadonly(state, value) {
|
|
55
|
-
|
|
60
|
+
const { disabled, filter } = state.component;
|
|
61
|
+
filter.element.readOnly = disabled || value;
|
|
56
62
|
setProperties("readonly", state, value);
|
|
57
63
|
}
|
|
58
64
|
function setListboxRequired(state, value) {
|
|
@@ -81,7 +87,7 @@ function createListboxFilter(parameters) {
|
|
|
81
87
|
if (parameters.type === "autocomplete") return;
|
|
82
88
|
const container = createElement("div", { attribute: { [parameters.attributes.filter]: "" } });
|
|
83
89
|
const element = createListboxInput(parameters, "");
|
|
84
|
-
setAttribute
|
|
90
|
+
setAttribute(element, parameters.attributes.input, "");
|
|
85
91
|
container.append(element);
|
|
86
92
|
return {
|
|
87
93
|
container,
|
|
@@ -144,7 +150,7 @@ function createListboxInput(parameters, value) {
|
|
|
144
150
|
type: "text"
|
|
145
151
|
}
|
|
146
152
|
});
|
|
147
|
-
if (isAutocomplete || listbox) setAria
|
|
153
|
+
if (isAutocomplete || listbox) setAria(input, "expanded", listbox);
|
|
148
154
|
return input;
|
|
149
155
|
}
|
|
150
156
|
function createListboxList(parameters) {
|
|
@@ -255,9 +261,9 @@ function createListboxValueLabel(id) {
|
|
|
255
261
|
} });
|
|
256
262
|
}
|
|
257
263
|
function updateListboxMessage(state) {
|
|
258
|
-
const { attributes, host, localizations, message } = state;
|
|
264
|
+
const { attributes, host, localizations, message } = state.component;
|
|
259
265
|
const visible = getListboxVisibleOptions(state).length;
|
|
260
|
-
setAttribute
|
|
266
|
+
setAttribute(message, attributes.hidden, visible > 0 ? "" : void 0);
|
|
261
267
|
let data = {};
|
|
262
268
|
let parameters = [];
|
|
263
269
|
let key;
|
|
@@ -272,65 +278,71 @@ function updateListboxMessage(state) {
|
|
|
272
278
|
message.hidden = false;
|
|
273
279
|
}
|
|
274
280
|
function updateListboxPreview(preview, state, active, scroll) {
|
|
275
|
-
const {
|
|
281
|
+
const { attributes, callbacks, content, filter, options } = state.component;
|
|
282
|
+
const { length } = options.all;
|
|
276
283
|
for (let index = 0; index < length; index += 1) {
|
|
277
|
-
const option =
|
|
278
|
-
setAttribute
|
|
284
|
+
const option = options.all[index];
|
|
285
|
+
setAttribute(option, attributes.active, option === active ? "" : void 0);
|
|
279
286
|
}
|
|
280
|
-
state.active = active;
|
|
281
|
-
setAria
|
|
287
|
+
state.component.active = active;
|
|
288
|
+
setAria(filter.element, "activedescendant", content.checkVisibility() ? active?.id : void 0);
|
|
282
289
|
if (scroll ?? true) active?.scrollIntoView(listboxScrollOptions);
|
|
283
|
-
if (preview !== "none")
|
|
290
|
+
if (preview !== "none") callbacks.data.onPreview(preview, state, active);
|
|
284
291
|
}
|
|
285
292
|
function updateListboxValueLabel(state) {
|
|
293
|
+
const { autocomplete, filter, listbox, localizations, host, options, multiple, values } = state.component;
|
|
286
294
|
let label;
|
|
287
|
-
if (
|
|
288
|
-
const localization = getLocalization(
|
|
289
|
-
const { length } =
|
|
295
|
+
if (multiple) {
|
|
296
|
+
const localization = getLocalization(localizations.global, host, "selected", localizations.component);
|
|
297
|
+
const { length } = options.selected;
|
|
290
298
|
label = localize(localization, { amount: length }, [length]);
|
|
291
|
-
} else label =
|
|
292
|
-
|
|
299
|
+
} else label = autocomplete.none && !listbox ? filter.element.value : options.selected[0]?.textContent ?? "";
|
|
300
|
+
values.label.textContent = label;
|
|
293
301
|
}
|
|
294
302
|
//#endregion
|
|
295
303
|
//#region src/js/internal/listbox/listbox.data.ts
|
|
296
304
|
function applyListboxSelection(parameters) {
|
|
297
305
|
const { added, emit, option, scroll, selected, state } = parameters;
|
|
298
|
-
const {
|
|
306
|
+
const { component } = state;
|
|
307
|
+
const { autocomplete, callbacks, filter, listbox, options, type } = component;
|
|
308
|
+
const { length } = options.all;
|
|
299
309
|
for (let index = 0; index < length; index += 1) {
|
|
300
|
-
const option =
|
|
301
|
-
setAria(option, "selected", (
|
|
310
|
+
const option = options.all[index];
|
|
311
|
+
setAria(option, "selected", (type === "select" || !autocomplete.none) && (selected ?? options.selected).includes(option));
|
|
302
312
|
}
|
|
303
|
-
const values = parameters.values ?? (
|
|
313
|
+
const values = parameters.values ?? (autocomplete.none && !listbox ? [filter.element.value] : (selected ?? options.selected).map((option) => getData(option, "value", false) ?? ""));
|
|
304
314
|
if (values.length === 0) values.push("");
|
|
305
|
-
if (selected != null)
|
|
306
|
-
if (!(values.length ===
|
|
315
|
+
if (selected != null) options.selected = selected;
|
|
316
|
+
if (!(values.length === component.values.current.length ? values.some((value) => !component.values.current.includes(value)) : true)) return;
|
|
307
317
|
updateListboxForm(state, values, emit);
|
|
308
318
|
updateListboxMessage(state);
|
|
309
319
|
updateListboxPreview("set", state, option, scroll);
|
|
310
320
|
updateListboxValueLabel(state);
|
|
311
|
-
|
|
321
|
+
callbacks.data.onApply(state, option, values, added, selected, emit);
|
|
312
322
|
}
|
|
313
323
|
function filterListbox(type, state) {
|
|
314
|
-
|
|
315
|
-
|
|
324
|
+
const { callbacks, disabled, filter, host, readonly } = state.component;
|
|
325
|
+
if (disabled || readonly) return;
|
|
326
|
+
const update = filter.element.value !== filter.value;
|
|
316
327
|
const option = filterListboxOptions(state);
|
|
317
328
|
let preview;
|
|
318
329
|
if (type.includes("delete")) preview = "none";
|
|
319
330
|
else if (type.includes("insert")) preview = "typed";
|
|
320
|
-
if (preview != null)
|
|
331
|
+
if (preview != null) callbacks.data.onFilter(preview, state, update, option);
|
|
321
332
|
if (update) {
|
|
322
|
-
|
|
323
|
-
dispatch(
|
|
333
|
+
filter.value = filter.element.value;
|
|
334
|
+
dispatch(host, "input");
|
|
324
335
|
}
|
|
325
336
|
}
|
|
326
337
|
function filterListboxOption(state, value, textContent) {
|
|
338
|
+
const { options } = state.component;
|
|
327
339
|
const filterTextContent = textContent ?? false;
|
|
328
340
|
const filter = getString(value).toLocaleLowerCase();
|
|
329
341
|
filterListboxOptions(state);
|
|
330
|
-
const { length } =
|
|
342
|
+
const { length } = options.all;
|
|
331
343
|
let match;
|
|
332
344
|
for (let index = 0; index < length; index += 1) {
|
|
333
|
-
const option =
|
|
345
|
+
const option = options.all[index];
|
|
334
346
|
if ((filterTextContent ? option.textContent : getData(option, "value", false) ?? "").toLocaleLowerCase() === filter) {
|
|
335
347
|
match = option;
|
|
336
348
|
break;
|
|
@@ -339,12 +351,12 @@ function filterListboxOption(state, value, textContent) {
|
|
|
339
351
|
return match;
|
|
340
352
|
}
|
|
341
353
|
function filterListboxOptions(state) {
|
|
342
|
-
function
|
|
354
|
+
function filterOptions(options) {
|
|
343
355
|
const { length } = options;
|
|
344
356
|
let count = 0;
|
|
345
357
|
for (let index = 0; index < length; index += 1) {
|
|
346
358
|
const option = options[index];
|
|
347
|
-
option.hidden = (
|
|
359
|
+
option.hidden = (type === "select" || !autocomplete.none) && !option.textContent.toLocaleLowerCase().includes(value);
|
|
348
360
|
if (!option.hidden) {
|
|
349
361
|
count += 1;
|
|
350
362
|
visible.push(option);
|
|
@@ -352,22 +364,24 @@ function filterListboxOptions(state) {
|
|
|
352
364
|
}
|
|
353
365
|
return count === 0;
|
|
354
366
|
}
|
|
355
|
-
const
|
|
367
|
+
const { active, attributes, autocomplete, filter, groups, list, options, type } = state.component;
|
|
368
|
+
const value = filter.element.value.toLocaleLowerCase();
|
|
356
369
|
const visible = [];
|
|
357
|
-
if (
|
|
370
|
+
if (groups == null) filterOptions(options.all);
|
|
358
371
|
else {
|
|
359
|
-
const groupsLength =
|
|
372
|
+
const groupsLength = groups.length;
|
|
360
373
|
for (let groupIndex = 0; groupIndex < groupsLength; groupIndex += 1) {
|
|
361
|
-
const { element, options } =
|
|
362
|
-
element.hidden =
|
|
374
|
+
const { element, options } = groups[groupIndex];
|
|
375
|
+
element.hidden = filterOptions(options);
|
|
363
376
|
}
|
|
364
377
|
}
|
|
365
|
-
setAttribute(
|
|
378
|
+
setAttribute(list, attributes.empty, visible.length === 0 ? "" : void 0);
|
|
366
379
|
updateListboxMessage(state);
|
|
367
|
-
return
|
|
380
|
+
return active != null && visible.includes(active) ? active : visible[0];
|
|
368
381
|
}
|
|
369
382
|
function setListboxValue(state, value, emit) {
|
|
370
|
-
|
|
383
|
+
const { autocomplete, listbox } = state.component;
|
|
384
|
+
if (autocomplete.none && !listbox) {
|
|
371
385
|
setListboxFilter(state, getString(value));
|
|
372
386
|
return;
|
|
373
387
|
}
|
|
@@ -375,16 +389,17 @@ function setListboxValue(state, value, emit) {
|
|
|
375
389
|
}
|
|
376
390
|
function setListboxValues(state, value, emit) {
|
|
377
391
|
if (!Array.isArray(value)) return;
|
|
378
|
-
const
|
|
392
|
+
const { autocomplete, listbox, multiple, options } = state.component;
|
|
393
|
+
const values = (multiple ? value : value.slice(0, 1)).map((value) => getString(value).toLocaleLowerCase());
|
|
379
394
|
if (values.length === 0) values.push("");
|
|
380
|
-
if (
|
|
395
|
+
if (autocomplete.none && !listbox) {
|
|
381
396
|
setListboxValue(state, values[0], emit);
|
|
382
397
|
return;
|
|
383
398
|
}
|
|
384
|
-
const { length } =
|
|
399
|
+
const { length } = options.all;
|
|
385
400
|
const selected = [];
|
|
386
401
|
for (let index = 0; index < length; index += 1) {
|
|
387
|
-
const option =
|
|
402
|
+
const option = options.all[index];
|
|
388
403
|
if (values.includes(getData(option, "value", false)?.toLocaleLowerCase() ?? "")) selected.push(option);
|
|
389
404
|
}
|
|
390
405
|
applyListboxSelection({
|
|
@@ -392,18 +407,19 @@ function setListboxValues(state, value, emit) {
|
|
|
392
407
|
selected,
|
|
393
408
|
state,
|
|
394
409
|
added: true,
|
|
395
|
-
option: selected[0] ??
|
|
396
|
-
values:
|
|
410
|
+
option: selected[0] ?? options.all[0],
|
|
411
|
+
values: autocomplete.none && !listbox ? values : void 0
|
|
397
412
|
});
|
|
398
413
|
}
|
|
399
414
|
function toggleListboxOption(state, option) {
|
|
400
|
-
|
|
401
|
-
|
|
415
|
+
const { autocomplete, callbacks, listbox, multiple, options } = state.component;
|
|
416
|
+
if (option == null || !multiple && options.selected.includes(option)) {
|
|
417
|
+
callbacks.data.onToggle(state);
|
|
402
418
|
return;
|
|
403
419
|
}
|
|
404
|
-
const selected =
|
|
420
|
+
const selected = options.selected.slice();
|
|
405
421
|
let added = true;
|
|
406
|
-
if (
|
|
422
|
+
if (multiple) {
|
|
407
423
|
const index = selected.indexOf(option);
|
|
408
424
|
if (index === -1) selected.push(option);
|
|
409
425
|
else {
|
|
@@ -411,15 +427,16 @@ function toggleListboxOption(state, option) {
|
|
|
411
427
|
selected.splice(index, 1);
|
|
412
428
|
}
|
|
413
429
|
} else selected.splice(0, selected.length, option);
|
|
430
|
+
const values = autocomplete.none && !listbox && option != null ? [option.textContent] : void 0;
|
|
414
431
|
applyListboxSelection({
|
|
415
432
|
added,
|
|
416
433
|
option,
|
|
417
434
|
selected,
|
|
418
435
|
state,
|
|
419
|
-
|
|
420
|
-
|
|
436
|
+
values,
|
|
437
|
+
scroll: false
|
|
421
438
|
});
|
|
422
|
-
|
|
439
|
+
callbacks.data.onToggle(state);
|
|
423
440
|
}
|
|
424
441
|
//#endregion
|
|
425
442
|
export { setListboxDisabled as C, setListboxReadonly as D, setListboxMultiple as E, setListboxRequired as O, getListboxVisibleOptions as S, setListboxLimit as T, createListboxValueLabel as _, setListboxValue as a, updateListboxValueLabel as b, createListboxContent as c, createListboxHeader as d, createListboxInput as f, createListboxOptions as g, createListboxOption as h, filterListboxOptions as i, createListboxFilter as l, createListboxMessage as m, filterListbox as n, setListboxValues as o, createListboxList as p, filterListboxOption as r, toggleListboxOption as s, applyListboxSelection as t, createListboxGroup as u, updateListboxMessage as v, setListboxFilter as w, generateListboxIds as x, updateListboxPreview as y };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as OuiLocalizations, u as OuiLocalizationsValues } from "./l10n.model-D6a9frgl.mjs";
|
|
2
|
+
import { PlainObject } from "@oscarpalmer/atoms/models";
|
|
2
3
|
import { RemovableEventListener } from "@oscarpalmer/toretto/models";
|
|
3
4
|
//#region src/js/internal/listbox/listbox.model.d.ts
|
|
4
5
|
type OuiListboxAttributes = {
|
|
@@ -17,7 +18,7 @@ type OuiListboxAttributes = {
|
|
|
17
18
|
type OuiListboxAutoComplete = Record<OuiListboxAutoCompleteType, boolean> & {
|
|
18
19
|
value?: OuiListboxAutoCompleteType;
|
|
19
20
|
};
|
|
20
|
-
type OuiListboxAutoCompleteType =
|
|
21
|
+
type OuiListboxAutoCompleteType = "both" | "inline" | "list" | "none";
|
|
21
22
|
type OuiListboxCallbacks<State extends OuiListboxState = OuiListboxState> = {
|
|
22
23
|
data: OuiListboxCallbacksData<State>;
|
|
23
24
|
keydown: OuiListboxCallbacksKeydown<State>;
|
|
@@ -79,8 +80,12 @@ type OuiListboxOptions = {
|
|
|
79
80
|
all: HTMLElement[];
|
|
80
81
|
selected: HTMLElement[];
|
|
81
82
|
};
|
|
82
|
-
type OuiListboxPreview =
|
|
83
|
-
type OuiListboxState = {
|
|
83
|
+
type OuiListboxPreview = "none" | "set" | "typed";
|
|
84
|
+
type OuiListboxState<State extends PlainObject = PlainObject> = {
|
|
85
|
+
component: OuiListboxStateComponent<State>;
|
|
86
|
+
form: OuiListboxStateForm;
|
|
87
|
+
};
|
|
88
|
+
type OuiListboxStateComponent<State extends PlainObject> = {
|
|
84
89
|
active?: HTMLElement;
|
|
85
90
|
attributes: OuiListboxAttributes;
|
|
86
91
|
autocomplete: OuiListboxAutoComplete;
|
|
@@ -93,7 +98,6 @@ type OuiListboxState = {
|
|
|
93
98
|
groups?: OuiListboxGroup[];
|
|
94
99
|
host: HTMLElement;
|
|
95
100
|
id: string;
|
|
96
|
-
internals: ElementInternals;
|
|
97
101
|
label: OuiListboxLabel;
|
|
98
102
|
list: HTMLUListElement;
|
|
99
103
|
listbox: boolean;
|
|
@@ -110,16 +114,16 @@ type OuiListboxState = {
|
|
|
110
114
|
select: HTMLSelectElement;
|
|
111
115
|
type: OuiListboxType;
|
|
112
116
|
values: OuiListboxValues;
|
|
117
|
+
} & State;
|
|
118
|
+
type OuiListboxStateForm = {
|
|
119
|
+
internals: ElementInternals;
|
|
120
|
+
restored?: unknown[];
|
|
113
121
|
};
|
|
114
|
-
type
|
|
115
|
-
map: WeakMap<HTMLElement, State>;
|
|
116
|
-
set: Set<State>;
|
|
117
|
-
};
|
|
118
|
-
type OuiListboxType = 'autocomplete' | 'select';
|
|
122
|
+
type OuiListboxType = "autocomplete" | "select";
|
|
119
123
|
type OuiListboxValues = {
|
|
120
124
|
current: string[];
|
|
121
125
|
initial: string[];
|
|
122
126
|
label: HTMLElement;
|
|
123
127
|
};
|
|
124
128
|
//#endregion
|
|
125
|
-
export { OuiListboxGroup as a, OuiListboxPreview as c,
|
|
129
|
+
export { OuiListboxGroup as a, OuiListboxPreview as c, OuiListboxStateForm as d, OuiListboxType as f, OuiListboxCallbacks as i, OuiListboxState as l, OuiListboxAutoComplete as n, OuiListboxLocalizations as o, OuiListboxAutoCompleteType as r, OuiListboxOptions as s, OuiListboxAttributes as t, OuiListboxStateComponent as u };
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { createEmbeddedFloatable, getOnBeforeToggleListener } from "../floatable/floatable.embedded.mjs";
|
|
2
|
+
import { attributable } from "../internal/attributable.mjs";
|
|
3
|
+
import { NAVIGABLE_KEYS_HORIZONTAL, NAVIGABLE_KEYS_VERTICAL, NAVIGABLE_SYMBOL } from "../internal/navigable/navigable.model.mjs";
|
|
4
|
+
import { getNavigable, updateNavigableFocus } from "../internal/navigable/index.mjs";
|
|
5
|
+
import { MENUBAR_ATTRIBUTE, MENUBAR_SELECTOR_ITEM, MENU_ATTRIBUTE, MENU_ATTRIBUTE_POSITION, MENU_MENUBAR_SELECTORS, MENU_SELECTOR_CONTENT, MENU_SELECTOR_ITEM, MENU_SELECTOR_TOGGLE, menubars, menus } from "./menu.model.mjs";
|
|
6
|
+
import { setAria, setRole } from "@oscarpalmer/toretto/aria";
|
|
7
|
+
import { setAttribute, setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
8
|
+
import { on } from "@oscarpalmer/toretto/event";
|
|
9
|
+
import { findAncestor } from "@oscarpalmer/toretto/find";
|
|
10
|
+
//#region src/js/menu/index.ts
|
|
11
|
+
function OuiMenu(element, navigable) {
|
|
12
|
+
const state = navigable[NAVIGABLE_SYMBOL];
|
|
13
|
+
this.content = state.element;
|
|
14
|
+
this.element = element;
|
|
15
|
+
this.navigable = navigable;
|
|
16
|
+
this.toggle = element.querySelector(MENU_SELECTOR_TOGGLE);
|
|
17
|
+
this.floatable = createEmbeddedFloatable(this.toggle, this.content, {
|
|
18
|
+
attribute: MENU_ATTRIBUTE_POSITION,
|
|
19
|
+
position: findAncestor(element.parentElement, MENU_SELECTOR_CONTENT) == null ? "below-start" : "end-top",
|
|
20
|
+
reusable: false
|
|
21
|
+
});
|
|
22
|
+
state.listeners.push(getOnBeforeToggleListener(this.content), on(this.content, "click", (event) => {
|
|
23
|
+
event.stopPropagation();
|
|
24
|
+
if (findAncestor(event, MENU_SELECTOR_TOGGLE) != null) return;
|
|
25
|
+
const elements = document.querySelectorAll(MENU_SELECTOR_CONTENT);
|
|
26
|
+
for (const element of elements) menus.get(element)?.floatable.hide();
|
|
27
|
+
const menu = menus.get(elements[0]);
|
|
28
|
+
if (menu != null && event.pointerId === -1) updateNavigableFocus(menu.navigable, true);
|
|
29
|
+
}), on(this.content, "toggle", (event) => {
|
|
30
|
+
const expanded = event.newState === "open";
|
|
31
|
+
if (expanded) {
|
|
32
|
+
this.floatable?.update();
|
|
33
|
+
updateNavigableFocus(this.navigable, true);
|
|
34
|
+
}
|
|
35
|
+
setAria(this.toggle, "expanded", expanded);
|
|
36
|
+
}));
|
|
37
|
+
this.floatable.update();
|
|
38
|
+
initializeMenu(this);
|
|
39
|
+
updateNavigableFocus(this.navigable, false);
|
|
40
|
+
}
|
|
41
|
+
OuiMenu.prototype.destroy = destroyMenu;
|
|
42
|
+
Object.defineProperties(OuiMenu.prototype, { open: {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: getMenuOpen
|
|
45
|
+
} });
|
|
46
|
+
function OuiMenubar(element, navigable) {
|
|
47
|
+
this.element = element;
|
|
48
|
+
this.navigable = navigable;
|
|
49
|
+
updateNavigableFocus(this.navigable, false);
|
|
50
|
+
}
|
|
51
|
+
OuiMenubar.prototype.destroy = destroyMenubar;
|
|
52
|
+
function addInstance(instances, ctor, element, content, options) {
|
|
53
|
+
if (!instances.has(content)) instances.set(content, new ctor(element, getNavigable(content, {
|
|
54
|
+
...options,
|
|
55
|
+
onDeactivate,
|
|
56
|
+
onPreventNavigation,
|
|
57
|
+
onShouldActivate,
|
|
58
|
+
onShouldDeactivate
|
|
59
|
+
})));
|
|
60
|
+
}
|
|
61
|
+
function addMenu(element) {
|
|
62
|
+
const content = element.querySelector(MENU_SELECTOR_CONTENT);
|
|
63
|
+
const toggle = element.querySelector(MENU_SELECTOR_TOGGLE);
|
|
64
|
+
if (content != null && toggle != null) addInstance(menus, OuiMenu, element, content, {
|
|
65
|
+
selector: MENU_SELECTOR_ITEM,
|
|
66
|
+
vertical: true
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function addMenubar(element) {
|
|
70
|
+
addInstance(menubars, OuiMenubar, element, element, {
|
|
71
|
+
role: "menubar",
|
|
72
|
+
selector: MENUBAR_SELECTOR_ITEM,
|
|
73
|
+
vertical: false
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function destroyMenu() {
|
|
77
|
+
this.floatable.destroy();
|
|
78
|
+
this.navigable.destroy();
|
|
79
|
+
this.content = void 0;
|
|
80
|
+
this.element = void 0;
|
|
81
|
+
this.floatable = void 0;
|
|
82
|
+
this.navigable = void 0;
|
|
83
|
+
this.toggle = void 0;
|
|
84
|
+
}
|
|
85
|
+
function destroyMenubar() {
|
|
86
|
+
this.navigable.destroy();
|
|
87
|
+
this.element = void 0;
|
|
88
|
+
this.navigable = void 0;
|
|
89
|
+
}
|
|
90
|
+
function getId(element, value) {
|
|
91
|
+
let { id } = element;
|
|
92
|
+
if (id == null || id.trim().length === 0) {
|
|
93
|
+
id = value == null ? `oui_menu_${++index}` : `${value}_toggle`;
|
|
94
|
+
element.id = id;
|
|
95
|
+
}
|
|
96
|
+
return id;
|
|
97
|
+
}
|
|
98
|
+
function getMenuOpen() {
|
|
99
|
+
return this.floatable.open;
|
|
100
|
+
}
|
|
101
|
+
function initializeMenu(menu) {
|
|
102
|
+
const id = getId(menu.content);
|
|
103
|
+
setAttribute(menu.toggle, "popovertarget", id);
|
|
104
|
+
setAria(menu.toggle, {
|
|
105
|
+
controls: id,
|
|
106
|
+
expanded: "false",
|
|
107
|
+
haspopup: "menu"
|
|
108
|
+
});
|
|
109
|
+
setAttributes(menu.content, {
|
|
110
|
+
popover: "",
|
|
111
|
+
tabindex: "-1"
|
|
112
|
+
});
|
|
113
|
+
setRole(menu.content, "menu");
|
|
114
|
+
}
|
|
115
|
+
function onDeactivate(_, navigable) {
|
|
116
|
+
const menu = menus.get(navigable[NAVIGABLE_SYMBOL].element);
|
|
117
|
+
if (menu == null) return;
|
|
118
|
+
menu.floatable.hide();
|
|
119
|
+
const element = findAncestor(menu.element.parentElement, MENU_MENUBAR_SELECTORS);
|
|
120
|
+
if (element == null) return;
|
|
121
|
+
const instance = menubars.get(element) ?? menus.get(element);
|
|
122
|
+
if (instance != null) updateNavigableFocus(instance.navigable, true);
|
|
123
|
+
}
|
|
124
|
+
function onPreventNavigation(_, navigable) {
|
|
125
|
+
const { element } = navigable[NAVIGABLE_SYMBOL];
|
|
126
|
+
const instance = menubars.get(element) ?? menus.get(element);
|
|
127
|
+
return instance == null ? false : findAncestor(instance.element.parentElement, MENU_MENUBAR_SELECTORS) != null;
|
|
128
|
+
}
|
|
129
|
+
function onShouldActivate(event, navigable) {
|
|
130
|
+
const state = navigable[NAVIGABLE_SYMBOL];
|
|
131
|
+
const { element } = state;
|
|
132
|
+
let activate = false;
|
|
133
|
+
if (menubars.has(element)) activate = state.orientation === "horizontal" ? NAVIGABLE_KEYS_VERTICAL.has(event.key) : NAVIGABLE_KEYS_HORIZONTAL.has(event.key);
|
|
134
|
+
else if (menus.has(element)) activate = state.orientation === "horizontal" ? NAVIGABLE_KEYS_VERTICAL.has(event.key) : event.key === "ArrowRight";
|
|
135
|
+
if (activate) {
|
|
136
|
+
const target = event.target instanceof HTMLElement && event.target.matches(MENU_SELECTOR_TOGGLE) ? event.target : void 0;
|
|
137
|
+
if (target == null) activate = false;
|
|
138
|
+
else target.click();
|
|
139
|
+
}
|
|
140
|
+
return activate;
|
|
141
|
+
}
|
|
142
|
+
function onShouldDeactivate(event, navigable) {
|
|
143
|
+
const { element, orientation } = navigable[NAVIGABLE_SYMBOL];
|
|
144
|
+
if (menubars.has(element)) return;
|
|
145
|
+
const menu = menus.get(element);
|
|
146
|
+
if (menu == null) return;
|
|
147
|
+
const horizontal = orientation === "horizontal";
|
|
148
|
+
const altKey = horizontal ? "ArrowDown" : "ArrowRight";
|
|
149
|
+
const baseKey = horizontal ? "ArrowUp" : "ArrowLeft";
|
|
150
|
+
if (event.key === baseKey) return findAncestor(menu.element.parentElement, MENU_SELECTOR_CONTENT) != null;
|
|
151
|
+
if (event.key === altKey && event.target instanceof HTMLElement && !event.target.hasAttribute("popovertarget")) return false;
|
|
152
|
+
}
|
|
153
|
+
function removeInstance(instances, element) {
|
|
154
|
+
instances.get(element)?.destroy();
|
|
155
|
+
instances.delete(element);
|
|
156
|
+
}
|
|
157
|
+
function removeMenu(element) {
|
|
158
|
+
removeInstance(menus, element);
|
|
159
|
+
}
|
|
160
|
+
function removeMenubar(element) {
|
|
161
|
+
removeInstance(menubars, element);
|
|
162
|
+
}
|
|
163
|
+
let index = 0;
|
|
164
|
+
attributable(MENU_ATTRIBUTE, addMenu, removeMenu);
|
|
165
|
+
attributable(MENUBAR_ATTRIBUTE, addMenubar, removeMenubar);
|
|
166
|
+
//#endregion
|
|
167
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { c as OuiFloatable } from "../floatable.model-DXsQgoU7.mjs";
|
|
2
|
+
import { d as OuiNavigable, m as OuiNavigableOptions } from "../navigable.model-BPOM8DZk.mjs";
|
|
3
|
+
//#region src/js/menu/menu.model.d.ts
|
|
4
|
+
export type OuiBasicMenu = {
|
|
5
|
+
destroy(): void;
|
|
6
|
+
};
|
|
7
|
+
export type OuiBasicMenuOptions = Pick<OuiNavigableOptions, "role" | "selector" | "vertical">;
|
|
8
|
+
export type OuiMenu = {
|
|
9
|
+
content: HTMLElement;
|
|
10
|
+
element: HTMLElement;
|
|
11
|
+
floatable: OuiFloatable;
|
|
12
|
+
navigable: OuiNavigable;
|
|
13
|
+
toggle: HTMLElement;
|
|
14
|
+
get open(): boolean;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
};
|
|
17
|
+
export type OuiMenubar = {
|
|
18
|
+
element: HTMLElement;
|
|
19
|
+
navigable: OuiNavigable;
|
|
20
|
+
destroy(): void;
|
|
21
|
+
};
|
|
22
|
+
export declare const MENU_ATTRIBUTE = "oui-menu";
|
|
23
|
+
export declare const MENU_ATTRIBUTE_POSITION: string;
|
|
24
|
+
export declare const MENUBAR_ATTRIBUTE = "oui-menubar";
|
|
25
|
+
export declare const MENU_SELECTOR_CONTENT: string;
|
|
26
|
+
export declare const MENU_SELECTOR_ITEM: string;
|
|
27
|
+
export declare const MENU_SELECTOR_TOGGLE: string;
|
|
28
|
+
export declare const MENUBAR_SELECTOR: string;
|
|
29
|
+
export declare const MENUBAR_SELECTOR_ITEM: string;
|
|
30
|
+
export declare const MENU_MENUBAR_SELECTORS: string;
|
|
31
|
+
export declare const menubars: WeakMap<HTMLElement, OuiMenubar>;
|
|
32
|
+
export declare const menus: WeakMap<HTMLElement, OuiMenu>;
|
|
33
|
+
//#endregion
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import "../internal/navigable/navigable.model.mjs";
|
|
2
|
+
//#region src/js/menu/menu.model.ts
|
|
3
|
+
const MENU_ATTRIBUTE = "oui-menu";
|
|
4
|
+
const MENU_ATTRIBUTE_POSITION = `${MENU_ATTRIBUTE}-position`;
|
|
5
|
+
const MENUBAR_ATTRIBUTE = "oui-menubar";
|
|
6
|
+
const MENU_SELECTOR_CONTENT = `[${MENU_ATTRIBUTE}-content]`;
|
|
7
|
+
const MENU_SELECTOR_ITEM = `:scope > [${MENU_ATTRIBUTE}-item], :scope > * > [${MENU_ATTRIBUTE}-item]`;
|
|
8
|
+
const MENU_SELECTOR_TOGGLE = `[${MENU_ATTRIBUTE}-toggle]`;
|
|
9
|
+
const MENUBAR_SELECTOR = `[${MENUBAR_ATTRIBUTE}]`;
|
|
10
|
+
const MENUBAR_SELECTOR_ITEM = `:scope > [${MENUBAR_ATTRIBUTE}-item], :scope > * > [${MENUBAR_ATTRIBUTE}-item]`;
|
|
11
|
+
const MENU_MENUBAR_SELECTORS = `${MENUBAR_SELECTOR}, ${MENU_SELECTOR_CONTENT}`;
|
|
12
|
+
const menubars = /* @__PURE__ */ new WeakMap();
|
|
13
|
+
const menus = /* @__PURE__ */ new WeakMap();
|
|
14
|
+
//#endregion
|
|
15
|
+
export { MENUBAR_ATTRIBUTE, MENUBAR_SELECTOR, MENUBAR_SELECTOR_ITEM, MENU_ATTRIBUTE, MENU_ATTRIBUTE_POSITION, MENU_MENUBAR_SELECTORS, MENU_SELECTOR_CONTENT, MENU_SELECTOR_ITEM, MENU_SELECTOR_TOGGLE, menubars, menus };
|