@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,38 +1,43 @@
|
|
|
1
1
|
import { attributable } from "../internal/attributable.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { DRAGGABLE_SYMBOL } from "../internal/draggable/draggable.model.mjs";
|
|
3
|
+
import { addDraggable, destroyDraggable, getDraggableElement, getDraggableStates, initializeDraggable, removeDraggable } from "../internal/draggable/index.mjs";
|
|
4
|
+
import { SORTABLE_ATTRIBUTE, SORTABLE_ATTRIBUTE_ACTIVE, SORTABLE_ATTRIBUTE_CONNECTIONS, SORTABLE_ATTRIBUTE_CONTAINER, SORTABLE_ATTRIBUTE_DIRECTION, SORTABLE_ATTRIBUTE_HORIZONTAL, SORTABLE_ATTRIBUTE_ORIGIN, SORTABLE_ATTRIBUTE_PLACEHOLDER_DRAG, SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION, SORTABLE_ATTRIBUTE_VERTICAL, SORTABLE_CONTAINERS, SORTABLE_MESSAGE, SORTABLE_SELECTOR_ITEM, sortablePlaceholder } from "./sortable.model.mjs";
|
|
3
5
|
import { getAttribute, setAttribute, setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
4
|
-
import { createElement } from "@oscarpalmer/toretto/create";
|
|
5
6
|
import { dispatch, getEventPosition } from "@oscarpalmer/toretto/event";
|
|
6
7
|
import { findAncestor, getElementFromPosition } from "@oscarpalmer/toretto/find";
|
|
7
|
-
import { setStyle } from "@oscarpalmer/toretto/style";
|
|
8
8
|
import { isHTMLOrSVGElement } from "@oscarpalmer/toretto/is";
|
|
9
|
+
import { setStyle } from "@oscarpalmer/toretto/style";
|
|
10
|
+
import { createElement } from "@oscarpalmer/toretto/create";
|
|
9
11
|
//#region src/js/sortable/sortable.embedded.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
12
|
+
function OuiSortable(element, options) {
|
|
13
|
+
this[DRAGGABLE_SYMBOL] = initializeDraggable(this, "sortable", "sort", SORTABLE_ATTRIBUTE, element, {
|
|
14
|
+
container: {
|
|
15
|
+
attribute: SORTABLE_ATTRIBUTE_CONTAINER,
|
|
16
|
+
map: SORTABLE_CONTAINERS
|
|
17
|
+
},
|
|
18
|
+
direction: { attribute: SORTABLE_ATTRIBUTE_DIRECTION },
|
|
19
|
+
drag: {
|
|
20
|
+
onBegin,
|
|
21
|
+
onCancel,
|
|
22
|
+
onEnd,
|
|
23
|
+
onMove
|
|
24
|
+
},
|
|
25
|
+
input: options,
|
|
26
|
+
position: {
|
|
27
|
+
getOffset: getOffsetPosition,
|
|
28
|
+
getOriginal: getOriginalPosition
|
|
29
|
+
},
|
|
30
|
+
getDragged: getDragPlaceholder,
|
|
31
|
+
getOrigin: () => (getDraggableStates(element)?.sortable)?.origin
|
|
32
|
+
}, { connections: getAttribute(element, SORTABLE_ATTRIBUTE_CONNECTIONS) });
|
|
33
|
+
}
|
|
34
|
+
OuiSortable.prototype.destroy = destroySortable;
|
|
35
|
+
Object.defineProperties(OuiSortable.prototype, { element: {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: getDraggableElement
|
|
38
|
+
} });
|
|
34
39
|
function afterEnd(insert, from, events, elements, position, valid) {
|
|
35
|
-
elements.origin?.removeAttribute(
|
|
40
|
+
elements.origin?.removeAttribute(SORTABLE_ATTRIBUTE_ORIGIN);
|
|
36
41
|
from.state.origin = void 0;
|
|
37
42
|
resetPlaceholders();
|
|
38
43
|
if (!valid || events.some((event) => event?.defaultPrevented)) return;
|
|
@@ -46,7 +51,7 @@ function afterEnd(insert, from, events, elements, position, valid) {
|
|
|
46
51
|
if (position.y < top + height / 2) insertion = "beforebegin";
|
|
47
52
|
else insertion = "afterend";
|
|
48
53
|
elements.target?.insertAdjacentElement(insertion, elements.origin);
|
|
49
|
-
document.body.removeAttribute(
|
|
54
|
+
document.body.removeAttribute(SORTABLE_ATTRIBUTE_ACTIVE);
|
|
50
55
|
}
|
|
51
56
|
/**
|
|
52
57
|
* Creates _(or retrieves)_ a _OuiSortable_ instance for an element
|
|
@@ -55,12 +60,15 @@ function afterEnd(insert, from, events, elements, position, valid) {
|
|
|
55
60
|
* @returns _OuiSortable_ instance
|
|
56
61
|
*/
|
|
57
62
|
function createSortable(element, options) {
|
|
58
|
-
if (!isHTMLOrSVGElement(element)) throw new TypeError(
|
|
63
|
+
if (!isHTMLOrSVGElement(element)) throw new TypeError(SORTABLE_MESSAGE);
|
|
59
64
|
return addSortable(element, options);
|
|
60
65
|
}
|
|
66
|
+
function destroySortable() {
|
|
67
|
+
destroyDraggable(this);
|
|
68
|
+
}
|
|
61
69
|
function getDragPlaceholder() {
|
|
62
|
-
|
|
63
|
-
return
|
|
70
|
+
sortablePlaceholder.drag.default ??= createElement("div");
|
|
71
|
+
return sortablePlaceholder.drag.custom ?? sortablePlaceholder.drag.default;
|
|
64
72
|
}
|
|
65
73
|
function getOffsetPosition(_, item, element, position) {
|
|
66
74
|
const rectangle = element.getBoundingClientRect();
|
|
@@ -73,20 +81,20 @@ function getOriginalPosition(_, __, position) {
|
|
|
73
81
|
return position;
|
|
74
82
|
}
|
|
75
83
|
function getPositionPlaceholder(item) {
|
|
76
|
-
|
|
77
|
-
setAttribute(
|
|
78
|
-
if (item.state.origin != null) setStyle(
|
|
79
|
-
return
|
|
84
|
+
sortablePlaceholder.position ??= createElement("div");
|
|
85
|
+
setAttribute(sortablePlaceholder.position, SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION, "");
|
|
86
|
+
if (item.state.origin != null) setStyle(sortablePlaceholder.position, "--placeholder-height", `${item.state.origin.getBoundingClientRect().height}px`);
|
|
87
|
+
return sortablePlaceholder.position;
|
|
80
88
|
}
|
|
81
89
|
function onBegin(_, globals, item, element) {
|
|
82
90
|
item.state.origin = element;
|
|
83
91
|
setPlaceholder(globals, item, element);
|
|
84
|
-
setAttribute(element,
|
|
85
|
-
setAttribute(document.body,
|
|
92
|
+
setAttribute(element, SORTABLE_ATTRIBUTE_ORIGIN, "");
|
|
93
|
+
setAttribute(document.body, SORTABLE_ATTRIBUTE_ACTIVE, "");
|
|
86
94
|
}
|
|
87
95
|
function onCancel(_, item) {
|
|
88
|
-
item.state.origin?.removeAttribute(
|
|
89
|
-
document.body.removeAttribute(
|
|
96
|
+
item.state.origin?.removeAttribute(SORTABLE_ATTRIBUTE_ORIGIN);
|
|
97
|
+
document.body.removeAttribute(SORTABLE_ATTRIBUTE_ACTIVE);
|
|
90
98
|
resetPlaceholders();
|
|
91
99
|
item.state.origin = void 0;
|
|
92
100
|
}
|
|
@@ -97,16 +105,16 @@ function onEnd(event, globals, item, reset) {
|
|
|
97
105
|
y: 0
|
|
98
106
|
};
|
|
99
107
|
const target = getElementFromPosition(position)[0];
|
|
100
|
-
let element = findAncestor(target,
|
|
101
|
-
if (element?.hasAttribute(
|
|
102
|
-
if (getAttribute(element,
|
|
108
|
+
let element = findAncestor(target, SORTABLE_SELECTOR_ITEM);
|
|
109
|
+
if (element?.hasAttribute(SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION)) {
|
|
110
|
+
if (getAttribute(element, SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION) === "after") element = element.previousElementSibling;
|
|
103
111
|
else element = element.nextElementSibling;
|
|
104
112
|
}
|
|
105
113
|
let insert = "insert";
|
|
106
114
|
let toInstance;
|
|
107
115
|
let toState;
|
|
108
116
|
if (element == null) {
|
|
109
|
-
element = findAncestor(target,
|
|
117
|
+
element = findAncestor(target, SORTABLE_SELECTOR_ITEM);
|
|
110
118
|
toInstance = globals.instances.get(element)?.sortable;
|
|
111
119
|
toState = globals.states.get(element)?.sortable;
|
|
112
120
|
insert = element == null ? void 0 : element.children.length === 0 ? "append" : "prepend";
|
|
@@ -145,11 +153,11 @@ function onEnd(event, globals, item, reset) {
|
|
|
145
153
|
}
|
|
146
154
|
function onMove(event, globals, item, position) {
|
|
147
155
|
const fromElement = item.state.origin;
|
|
148
|
-
const toElement = findAncestor(event,
|
|
156
|
+
const toElement = findAncestor(event, SORTABLE_SELECTOR_ITEM);
|
|
149
157
|
let toInstance;
|
|
150
158
|
let toState;
|
|
151
159
|
if (toElement == null) {
|
|
152
|
-
const element = findAncestor(event,
|
|
160
|
+
const element = findAncestor(event, SORTABLE_SELECTOR_ITEM);
|
|
153
161
|
toInstance = globals.instances.get(element)?.sortable;
|
|
154
162
|
toState = globals.states.get(element)?.sortable;
|
|
155
163
|
} else {
|
|
@@ -171,7 +179,7 @@ function onMove(event, globals, item, position) {
|
|
|
171
179
|
place = "after";
|
|
172
180
|
toElement.insertAdjacentElement("afterend", placeholder);
|
|
173
181
|
}
|
|
174
|
-
setAttribute(placeholder,
|
|
182
|
+
setAttribute(placeholder, SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION, place);
|
|
175
183
|
} else placeholder.remove();
|
|
176
184
|
return {
|
|
177
185
|
from: {
|
|
@@ -185,23 +193,23 @@ function onMove(event, globals, item, position) {
|
|
|
185
193
|
};
|
|
186
194
|
}
|
|
187
195
|
function resetPlaceholders() {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
196
|
+
sortablePlaceholder.drag.custom?.remove();
|
|
197
|
+
sortablePlaceholder.drag.default?.remove();
|
|
198
|
+
sortablePlaceholder.position?.remove();
|
|
199
|
+
sortablePlaceholder.drag.custom = void 0;
|
|
192
200
|
}
|
|
193
201
|
function setPlaceholder(state, item, origin) {
|
|
194
202
|
const element = getDragPlaceholder();
|
|
195
|
-
|
|
203
|
+
if (sortablePlaceholder.drag.default != null) sortablePlaceholder.drag.default.innerHTML = "";
|
|
196
204
|
updatePlaceholder(item, element);
|
|
197
205
|
const dispatched = dispatch(item.instance.element, "sortable:placeholder", { detail: {
|
|
198
206
|
origin,
|
|
199
|
-
parent: item.
|
|
207
|
+
parent: item.instance.element,
|
|
200
208
|
placeholder: element,
|
|
201
209
|
create: (value) => {
|
|
202
210
|
if (!isHTMLOrSVGElement(value)) return;
|
|
203
211
|
const element = value;
|
|
204
|
-
|
|
212
|
+
sortablePlaceholder.drag.custom = element;
|
|
205
213
|
updatePlaceholder(item, element);
|
|
206
214
|
state.element = {
|
|
207
215
|
rectangle: element.getBoundingClientRect(),
|
|
@@ -210,18 +218,18 @@ function setPlaceholder(state, item, origin) {
|
|
|
210
218
|
}
|
|
211
219
|
} });
|
|
212
220
|
setTimeout(() => {
|
|
213
|
-
if (!dispatched.defaultPrevented &&
|
|
214
|
-
document.body.append(
|
|
221
|
+
if (!dispatched.defaultPrevented && sortablePlaceholder.drag.custom == null) sortablePlaceholder.drag.default?.append(element.cloneNode(true));
|
|
222
|
+
document.body.append(sortablePlaceholder.drag.custom ?? sortablePlaceholder.drag.default ?? "");
|
|
215
223
|
});
|
|
216
224
|
}
|
|
217
225
|
function updatePlaceholder(item, element) {
|
|
218
|
-
setAttribute(element,
|
|
226
|
+
setAttribute(element, SORTABLE_ATTRIBUTE_PLACEHOLDER_DRAG, "");
|
|
219
227
|
setStyle(element, "position", "fixed");
|
|
220
228
|
const state = getDraggableStates(item.state.element)?.sortable;
|
|
221
229
|
if (state == null) return;
|
|
222
230
|
setAttributes(element, {
|
|
223
|
-
[
|
|
224
|
-
[
|
|
231
|
+
[SORTABLE_ATTRIBUTE_HORIZONTAL]: state.horizontal ? "" : void 0,
|
|
232
|
+
[SORTABLE_ATTRIBUTE_VERTICAL]: state.vertical ? "" : void 0
|
|
225
233
|
});
|
|
226
234
|
}
|
|
227
235
|
function validatePosition(_, from, to, position) {
|
|
@@ -234,33 +242,12 @@ function validatePosition(_, from, to, position) {
|
|
|
234
242
|
if (valid && to?.state.connections != null) valid = from.state.element.matches(to.state.connections);
|
|
235
243
|
return valid;
|
|
236
244
|
}
|
|
237
|
-
const ATTRIBUTE = "oui-sortable";
|
|
238
|
-
const ATTRIBUTE_ACTIVE = `${ATTRIBUTE}-active`;
|
|
239
|
-
const ATTRIBUTE_CONNECTIONS = `${ATTRIBUTE}-connections`;
|
|
240
|
-
const ATTRIBUTE_CONTAINER = `${ATTRIBUTE}-container`;
|
|
241
|
-
const ATTRIBUTE_DIRECTION = `${ATTRIBUTE}-direction`;
|
|
242
|
-
const ATTRIBUTE_HORIZONTAL = `${ATTRIBUTE}-horizontal`;
|
|
243
|
-
const ATTRIBUTE_ORIGIN = `${ATTRIBUTE}-origin`;
|
|
244
|
-
const ATTRIBUTE_PLACEHOLDER_DRAG = `${ATTRIBUTE}-placeholder-drag`;
|
|
245
|
-
const ATTRIBUTE_PLACEHOLDER_POSITION = `${ATTRIBUTE}-placeholder-position`;
|
|
246
|
-
const ATTRIBUTE_VERTICAL = `${ATTRIBUTE}-vertical`;
|
|
247
|
-
const CONTAINERS = /* @__PURE__ */ new Map();
|
|
248
|
-
const MESSAGE = "The element must be an instance of HTMLElement or SVGElement";
|
|
249
|
-
const SELECTOR = `[${ATTRIBUTE}]`;
|
|
250
|
-
const SELECTOR_ITEM = `[${ATTRIBUTE}] > *`;
|
|
251
245
|
const bound = {
|
|
252
246
|
constructor: OuiSortable,
|
|
253
247
|
property: "sortable"
|
|
254
248
|
};
|
|
255
|
-
const placeholder = {
|
|
256
|
-
drag: {
|
|
257
|
-
custom: void 0,
|
|
258
|
-
default: void 0
|
|
259
|
-
},
|
|
260
|
-
position: void 0
|
|
261
|
-
};
|
|
262
249
|
const addSortable = addDraggable.bind(bound);
|
|
263
250
|
const removeSortable = removeDraggable.bind(bound);
|
|
264
|
-
attributable(
|
|
251
|
+
attributable(SORTABLE_ATTRIBUTE, addSortable, removeSortable);
|
|
265
252
|
//#endregion
|
|
266
|
-
export {
|
|
253
|
+
export { createSortable };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { $ as OuiSortable, _t as sortablePlaceholder, at as SORTABLE_ATTRIBUTE_CONNECTIONS, ct as SORTABLE_ATTRIBUTE_HORIZONTAL, dt as SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION, et as OuiSortablePlaceholder, ft as SORTABLE_ATTRIBUTE_VERTICAL, gt as SORTABLE_SELECTOR_ITEM, ht as SORTABLE_SELECTOR, it as SORTABLE_ATTRIBUTE_ACTIVE, lt as SORTABLE_ATTRIBUTE_ORIGIN, mt as SORTABLE_MESSAGE, nt as OuiSortableState, ot as SORTABLE_ATTRIBUTE_CONTAINER, pt as SORTABLE_CONTAINERS, rt as SORTABLE_ATTRIBUTE, st as SORTABLE_ATTRIBUTE_DIRECTION, tt as OuiSortablePlaceholderDrag, ut as SORTABLE_ATTRIBUTE_PLACEHOLDER_DRAG } from "../movable.model-BHaK_mKw.mjs";
|
|
2
|
+
export { OuiSortable, OuiSortablePlaceholder, OuiSortablePlaceholderDrag, OuiSortableState, SORTABLE_ATTRIBUTE, SORTABLE_ATTRIBUTE_ACTIVE, SORTABLE_ATTRIBUTE_CONNECTIONS, SORTABLE_ATTRIBUTE_CONTAINER, SORTABLE_ATTRIBUTE_DIRECTION, SORTABLE_ATTRIBUTE_HORIZONTAL, SORTABLE_ATTRIBUTE_ORIGIN, SORTABLE_ATTRIBUTE_PLACEHOLDER_DRAG, SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION, SORTABLE_ATTRIBUTE_VERTICAL, SORTABLE_CONTAINERS, SORTABLE_MESSAGE, SORTABLE_SELECTOR, SORTABLE_SELECTOR_ITEM, sortablePlaceholder };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/js/sortable/sortable.model.ts
|
|
2
|
+
const SORTABLE_ATTRIBUTE = "oui-sortable";
|
|
3
|
+
const SORTABLE_ATTRIBUTE_ACTIVE = `${SORTABLE_ATTRIBUTE}-active`;
|
|
4
|
+
const SORTABLE_ATTRIBUTE_CONNECTIONS = `${SORTABLE_ATTRIBUTE}-connections`;
|
|
5
|
+
const SORTABLE_ATTRIBUTE_CONTAINER = `${SORTABLE_ATTRIBUTE}-container`;
|
|
6
|
+
const SORTABLE_ATTRIBUTE_DIRECTION = `${SORTABLE_ATTRIBUTE}-direction`;
|
|
7
|
+
const SORTABLE_ATTRIBUTE_HORIZONTAL = `${SORTABLE_ATTRIBUTE}-horizontal`;
|
|
8
|
+
const SORTABLE_ATTRIBUTE_ORIGIN = `${SORTABLE_ATTRIBUTE}-origin`;
|
|
9
|
+
const SORTABLE_ATTRIBUTE_PLACEHOLDER_DRAG = `${SORTABLE_ATTRIBUTE}-placeholder-drag`;
|
|
10
|
+
const SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION = `${SORTABLE_ATTRIBUTE}-placeholder-position`;
|
|
11
|
+
const SORTABLE_ATTRIBUTE_VERTICAL = `${SORTABLE_ATTRIBUTE}-vertical`;
|
|
12
|
+
const SORTABLE_CONTAINERS = /* @__PURE__ */ new Map();
|
|
13
|
+
const SORTABLE_MESSAGE = "The element must be an instance of HTMLElement or SVGElement";
|
|
14
|
+
const SORTABLE_SELECTOR = `[${SORTABLE_ATTRIBUTE}]`;
|
|
15
|
+
const SORTABLE_SELECTOR_ITEM = `[${SORTABLE_ATTRIBUTE}] > *`;
|
|
16
|
+
const sortablePlaceholder = {
|
|
17
|
+
drag: {
|
|
18
|
+
custom: void 0,
|
|
19
|
+
default: void 0
|
|
20
|
+
},
|
|
21
|
+
position: void 0
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { SORTABLE_ATTRIBUTE, SORTABLE_ATTRIBUTE_ACTIVE, SORTABLE_ATTRIBUTE_CONNECTIONS, SORTABLE_ATTRIBUTE_CONTAINER, SORTABLE_ATTRIBUTE_DIRECTION, SORTABLE_ATTRIBUTE_HORIZONTAL, SORTABLE_ATTRIBUTE_ORIGIN, SORTABLE_ATTRIBUTE_PLACEHOLDER_DRAG, SORTABLE_ATTRIBUTE_PLACEHOLDER_POSITION, SORTABLE_ATTRIBUTE_VERTICAL, SORTABLE_CONTAINERS, SORTABLE_MESSAGE, SORTABLE_SELECTOR, SORTABLE_SELECTOR_ITEM, sortablePlaceholder };
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { $ as OuiSortable, p as CreateOuiDraggableOptions } from "../movable.model-BHaK_mKw.mjs";
|
|
2
|
+
import { t as createSortable } from "../sortable.embedded-DzBKAwSG.mjs";
|
|
2
3
|
export { type CreateOuiDraggableOptions as CreateOuiSortableOptions, type OuiSortable, createSortable };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { $ as OuiSortable, p as CreateOuiDraggableOptions } from "./movable.model-BHaK_mKw.mjs";
|
|
2
|
+
//#region src/js/sortable/sortable.embedded.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Creates _(or retrieves)_ a _OuiSortable_ instance for an element
|
|
5
|
+
*
|
|
6
|
+
* @param element Element to make sortable
|
|
7
|
+
* @returns _OuiSortable_ instance
|
|
8
|
+
*/
|
|
9
|
+
declare function createSortable(element: HTMLElement, options?: CreateOuiDraggableOptions): OuiSortable;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { createSortable as t };
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
import { D as SPLITTER_SYMBOL, O as SPLITTER_TAGNAME, n as OuiSplitter } from "../splitter.model-DOLNjLVS.mjs";
|
|
2
|
+
//#region src/js/splitter/index.d.ts
|
|
2
3
|
declare global {
|
|
3
4
|
interface HTMLElementTagNameMap {
|
|
4
|
-
[
|
|
5
|
+
[SPLITTER_TAGNAME]: OuiSplitterElement;
|
|
5
6
|
}
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
export interface OuiSplitterElement {
|
|
9
|
+
[SPLITTER_SYMBOL]: OuiSplitter;
|
|
10
|
+
}
|
|
11
|
+
export declare class OuiSplitterElement extends HTMLElement {
|
|
9
12
|
static readonly observedAttributes: string[];
|
|
10
13
|
/**
|
|
11
14
|
* Maximum size for the first panel
|
|
@@ -44,6 +47,4 @@ declare class OuiSplitterElement extends HTMLElement {
|
|
|
44
47
|
disconnectedCallback(): void;
|
|
45
48
|
attributeChangedCallback(name: string): void;
|
|
46
49
|
}
|
|
47
|
-
|
|
48
|
-
//#endregion
|
|
49
|
-
export { OuiSplitterElement };
|
|
50
|
+
//#endregion
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { SPLITTER_ATTRIBUTE_ACTIVE, SPLITTER_ATTRIBUTE_HANDLE, SPLITTER_ATTRIBUTE_HORIZONTAL, SPLITTER_ATTRIBUTE_SEPARATOR, SPLITTER_ATTRIBUTE_SIZE, SPLITTER_ATTRIBUTE_TYPE, SPLITTER_KEYS_ABSOLUTE, SPLITTER_KEYS_ALL, SPLITTER_KEYS_HORIZONTAL, SPLITTER_KEYS_NEGATIVE, SPLITTER_KEYS_VERTICAL, SPLITTER_MESSAGE, SPLITTER_METHODS_OBSERVE, SPLITTER_NAVIGATION_MAXIMUM_PERCENTAGE, SPLITTER_NAVIGATION_MINIMUM_PERCENTAGE, SPLITTER_NAVIGATION_MODIFIER, SPLITTER_SELECTOR_HANDLE, SPLITTER_SYMBOL, SPLITTER_TAGNAME, splitterStyling } from "./splitter.model.mjs";
|
|
2
|
+
import { setAria } from "@oscarpalmer/toretto/aria";
|
|
3
|
+
import { getAttribute, setAttribute } from "@oscarpalmer/toretto/attribute";
|
|
4
|
+
import { getEventPosition, on } from "@oscarpalmer/toretto/event";
|
|
5
|
+
import { findAncestor } from "@oscarpalmer/toretto/find";
|
|
6
|
+
import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
|
|
7
|
+
import { setStyle } from "@oscarpalmer/toretto/style";
|
|
8
|
+
import { filter } from "@oscarpalmer/atoms/array/filter";
|
|
9
|
+
import { clamp } from "@oscarpalmer/atoms/number";
|
|
10
|
+
import { supportsTouch } from "@oscarpalmer/toretto/touch";
|
|
11
|
+
import { createElement } from "@oscarpalmer/toretto/create";
|
|
12
|
+
import { round } from "@oscarpalmer/atoms/math";
|
|
13
|
+
//#region src/js/splitter/index.ts
|
|
14
|
+
function OuiSplitter(element, panels) {
|
|
15
|
+
this.element = element;
|
|
16
|
+
this.panels = panels;
|
|
17
|
+
if (isNullableOrWhitespace(element.id)) element.id = `oui_splitter_${++index}`;
|
|
18
|
+
this.values = getValues(element);
|
|
19
|
+
this.handle = createHandle();
|
|
20
|
+
this.rectangle = element.getBoundingClientRect();
|
|
21
|
+
this.separator = createSeparator(this);
|
|
22
|
+
this.separator.append(this.handle);
|
|
23
|
+
panels[0].insertAdjacentElement("afterend", this.separator);
|
|
24
|
+
this.updateOrientation();
|
|
25
|
+
this.updateValues();
|
|
26
|
+
}
|
|
27
|
+
OuiSplitter.prototype.updateObserver = updateObserver;
|
|
28
|
+
OuiSplitter.prototype.updateOrientation = updateOrientation;
|
|
29
|
+
OuiSplitter.prototype.updateValues = updateValues;
|
|
30
|
+
var OuiSplitterElement = class extends HTMLElement {
|
|
31
|
+
static observedAttributes = [
|
|
32
|
+
"max",
|
|
33
|
+
"min",
|
|
34
|
+
SPLITTER_ATTRIBUTE_SIZE,
|
|
35
|
+
SPLITTER_ATTRIBUTE_TYPE
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Maximum size for the first panel
|
|
39
|
+
*/
|
|
40
|
+
get max() {
|
|
41
|
+
return this[SPLITTER_SYMBOL].values.max;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Maximum size for the first panel
|
|
45
|
+
*/
|
|
46
|
+
set max(value) {
|
|
47
|
+
if (typeof value === "number") setAttribute(this, "max", value.toString());
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Minimum size for the first panel
|
|
51
|
+
*/
|
|
52
|
+
get min() {
|
|
53
|
+
return this[SPLITTER_SYMBOL].values.min;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Minimum size for the first panel
|
|
57
|
+
*/
|
|
58
|
+
set min(value) {
|
|
59
|
+
if (typeof value === "number") setAttribute(this, "min", value.toString());
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Current size for the first panel
|
|
63
|
+
*/
|
|
64
|
+
get size() {
|
|
65
|
+
return this[SPLITTER_SYMBOL].values.now.current;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Current size for the first panel
|
|
69
|
+
*/
|
|
70
|
+
set size(value) {
|
|
71
|
+
if (typeof value === "number") setAttribute(this, SPLITTER_ATTRIBUTE_SIZE, value.toString());
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Orientation of the splitter
|
|
75
|
+
*/
|
|
76
|
+
get type() {
|
|
77
|
+
return getAttribute(this, "type") ?? "vertical";
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Orientation of the splitter
|
|
81
|
+
*/
|
|
82
|
+
set type(value) {
|
|
83
|
+
setAttribute(this, SPLITTER_ATTRIBUTE_TYPE, value);
|
|
84
|
+
}
|
|
85
|
+
constructor() {
|
|
86
|
+
super();
|
|
87
|
+
const panels = filter([...this.children], (child) => child instanceof Element);
|
|
88
|
+
if (panels.length !== 2) throw new Error(SPLITTER_MESSAGE);
|
|
89
|
+
this[SPLITTER_SYMBOL] = new OuiSplitter(this, panels);
|
|
90
|
+
}
|
|
91
|
+
connectedCallback() {
|
|
92
|
+
this[SPLITTER_SYMBOL].updateObserver(1);
|
|
93
|
+
}
|
|
94
|
+
disconnectedCallback() {
|
|
95
|
+
this[SPLITTER_SYMBOL].updateObserver(0);
|
|
96
|
+
}
|
|
97
|
+
attributeChangedCallback(name) {
|
|
98
|
+
switch (name) {
|
|
99
|
+
case "max":
|
|
100
|
+
case "min":
|
|
101
|
+
case SPLITTER_ATTRIBUTE_SIZE:
|
|
102
|
+
this[SPLITTER_SYMBOL].updateValues();
|
|
103
|
+
break;
|
|
104
|
+
case SPLITTER_ATTRIBUTE_TYPE: this[SPLITTER_SYMBOL].updateOrientation();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
function createHandle() {
|
|
109
|
+
return createElement("span", {
|
|
110
|
+
aria: { hidden: true },
|
|
111
|
+
attribute: { [SPLITTER_ATTRIBUTE_HANDLE]: "" }
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function createSeparator(splitter) {
|
|
115
|
+
return createElement("div", {
|
|
116
|
+
aria: {
|
|
117
|
+
controls: splitter.element.id,
|
|
118
|
+
label: "Resize panels"
|
|
119
|
+
},
|
|
120
|
+
attribute: { [SPLITTER_ATTRIBUTE_SEPARATOR]: "" },
|
|
121
|
+
property: {
|
|
122
|
+
role: "separator",
|
|
123
|
+
tabIndex: 0
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function getContained(min, value, max) {
|
|
128
|
+
return round(clamp(value, min, max), 6);
|
|
129
|
+
}
|
|
130
|
+
function getSize(splitter, value) {
|
|
131
|
+
const { height, left, top, width } = splitter.rectangle;
|
|
132
|
+
const fraction = (value - (splitter.types.horizontal ? top : left)) / (splitter.types.horizontal ? height : width);
|
|
133
|
+
return getContained(splitter.values.min, fraction, splitter.values.max);
|
|
134
|
+
}
|
|
135
|
+
function getTypes(splitter, width, height) {
|
|
136
|
+
const type = getAttribute(splitter.element, "type");
|
|
137
|
+
if (type === "horizontal") return {
|
|
138
|
+
auto: false,
|
|
139
|
+
horizontal: true
|
|
140
|
+
};
|
|
141
|
+
if (type === "auto") return {
|
|
142
|
+
auto: true,
|
|
143
|
+
horizontal: (height ?? splitter.rectangle.height) > (width ?? splitter.rectangle.width)
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
auto: false,
|
|
147
|
+
horizontal: false
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function getValue(element, name, defaultValue) {
|
|
151
|
+
const value = getAttribute(element, name);
|
|
152
|
+
if (isNullableOrWhitespace(value)) return defaultValue;
|
|
153
|
+
const parsed = Number.parseFloat(value);
|
|
154
|
+
if (Number.isNaN(parsed)) return defaultValue;
|
|
155
|
+
if (parsed < 0) return defaultValue;
|
|
156
|
+
return parsed > 1 ? parsed / 100 : parsed;
|
|
157
|
+
}
|
|
158
|
+
function getValues(element) {
|
|
159
|
+
const values = {
|
|
160
|
+
max: getValue(element, "max", SPLITTER_NAVIGATION_MAXIMUM_PERCENTAGE),
|
|
161
|
+
min: getValue(element, "min", SPLITTER_NAVIGATION_MINIMUM_PERCENTAGE),
|
|
162
|
+
now: {
|
|
163
|
+
current: .5,
|
|
164
|
+
previous: .5
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const value = getContained(values.min, getValue(element, SPLITTER_ATTRIBUTE_SIZE, values.now.current), values.max);
|
|
168
|
+
values.now.current = value;
|
|
169
|
+
values.now.previous = value;
|
|
170
|
+
return values;
|
|
171
|
+
}
|
|
172
|
+
function onEnd(reset) {
|
|
173
|
+
if (splitter == null) return;
|
|
174
|
+
splitter.handle.removeAttribute(SPLITTER_ATTRIBUTE_ACTIVE);
|
|
175
|
+
splitter.separator.removeAttribute(SPLITTER_ATTRIBUTE_ACTIVE);
|
|
176
|
+
if (reset) setSize(splitter, splitter.values.now.previous);
|
|
177
|
+
else splitter.values.now.previous = splitter.values.now.current;
|
|
178
|
+
splitter = void 0;
|
|
179
|
+
splitterStyling.remove();
|
|
180
|
+
}
|
|
181
|
+
function onKeydown(event) {
|
|
182
|
+
switch (true) {
|
|
183
|
+
case SPLITTER_KEYS_ALL.has(event.key):
|
|
184
|
+
onNavigate(event);
|
|
185
|
+
break;
|
|
186
|
+
case event.key === "Escape": onEnd(true);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function onNavigate(event) {
|
|
190
|
+
const separator = findAncestor(event, "[oui-splitter-separator]");
|
|
191
|
+
if (separator == null) return;
|
|
192
|
+
const splitter = findAncestor(separator, SPLITTER_TAGNAME)?.[SPLITTER_SYMBOL];
|
|
193
|
+
if (splitter == null) return;
|
|
194
|
+
const { types, values } = splitter;
|
|
195
|
+
if (SPLITTER_KEYS_ABSOLUTE.has(event.key)) {
|
|
196
|
+
setSize(splitter, event.key === "End" ? values.max : values.min, true);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (types.horizontal && !SPLITTER_KEYS_HORIZONTAL.has(event.key) || !(types.horizontal || SPLITTER_KEYS_VERTICAL.has(event.key))) return;
|
|
200
|
+
const offset = SPLITTER_KEYS_NEGATIVE.has(event.key) ? -1 : 1;
|
|
201
|
+
setSize(splitter, getContained(values.min, values.now.current + offset * SPLITTER_NAVIGATION_MODIFIER, values.max), true);
|
|
202
|
+
}
|
|
203
|
+
function onObservation(entries) {
|
|
204
|
+
if (frame != null) cancelAnimationFrame(frame);
|
|
205
|
+
frame = requestAnimationFrame(() => {
|
|
206
|
+
for (const entry of entries) {
|
|
207
|
+
const splitter = entry.target instanceof OuiSplitterElement || entry.target.hasAttribute(SPLITTER_ATTRIBUTE_HANDLE) || entry.target.hasAttribute(SPLITTER_ATTRIBUTE_SEPARATOR) ? findAncestor(entry.target, SPLITTER_TAGNAME)?.[SPLITTER_SYMBOL] : void 0;
|
|
208
|
+
if (splitter == null) return;
|
|
209
|
+
splitter.types = getTypes(splitter, entry.contentRect.width, entry.contentRect.height);
|
|
210
|
+
setAttribute(splitter.element, SPLITTER_ATTRIBUTE_HORIZONTAL, splitter.types.horizontal ? "" : void 0);
|
|
211
|
+
setAriaOrientation(splitter);
|
|
212
|
+
}
|
|
213
|
+
frame = void 0;
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function onPointerdown(event) {
|
|
217
|
+
if (supportsTouch.value ? event.type === "mousedown" : event.type === "touchstart") return;
|
|
218
|
+
const handle = findAncestor(event, SPLITTER_SELECTOR_HANDLE);
|
|
219
|
+
if (handle == null) return;
|
|
220
|
+
splitter = findAncestor(handle, SPLITTER_TAGNAME)?.[SPLITTER_SYMBOL];
|
|
221
|
+
if (splitter == null) return;
|
|
222
|
+
if (supportsTouch.value) event.preventDefault();
|
|
223
|
+
setAttribute(splitter.handle, SPLITTER_ATTRIBUTE_ACTIVE, "");
|
|
224
|
+
setAttribute(splitter.separator, SPLITTER_ATTRIBUTE_ACTIVE, "");
|
|
225
|
+
splitter.rectangle = splitter.element.getBoundingClientRect();
|
|
226
|
+
splitterStyling.set();
|
|
227
|
+
}
|
|
228
|
+
function onPointermove(event) {
|
|
229
|
+
if (splitter == null) return;
|
|
230
|
+
const position = getEventPosition(event);
|
|
231
|
+
if (position != null) {
|
|
232
|
+
splitter.values.now.current = getSize(splitter, splitter.types.horizontal ? position.y : position.x);
|
|
233
|
+
setSize(splitter, splitter.values.now.current);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function onPointerup() {
|
|
237
|
+
if (splitter != null) onEnd(false);
|
|
238
|
+
}
|
|
239
|
+
function setAriaOrientation(splitter) {
|
|
240
|
+
setAria(splitter.separator, "orientation", splitter.types.horizontal ? "horizontal" : "vertical");
|
|
241
|
+
}
|
|
242
|
+
function setAriaValue(splitter) {
|
|
243
|
+
setAria(splitter.separator, {
|
|
244
|
+
valuemax: splitter.values.max,
|
|
245
|
+
valuemin: splitter.values.min,
|
|
246
|
+
valuenow: splitter.values.now.current
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
function setSize(splitter, size, previous) {
|
|
250
|
+
splitter.values.now.current = size;
|
|
251
|
+
if (previous) splitter.values.now.previous = size;
|
|
252
|
+
setStyle(splitter.element, "--oui-splitter-size", `${size}`);
|
|
253
|
+
setAriaValue(splitter);
|
|
254
|
+
}
|
|
255
|
+
function updateObserver(add) {
|
|
256
|
+
if (this.types.auto) observer[SPLITTER_METHODS_OBSERVE[add]](this.element);
|
|
257
|
+
}
|
|
258
|
+
function updateOrientation() {
|
|
259
|
+
this.types = getTypes(this);
|
|
260
|
+
if (this.types.auto) observer.observe(this.element);
|
|
261
|
+
else observer.unobserve(this.element);
|
|
262
|
+
setAttribute(this.element, SPLITTER_ATTRIBUTE_HORIZONTAL, this.types.horizontal ? "" : void 0);
|
|
263
|
+
setAriaOrientation(this);
|
|
264
|
+
}
|
|
265
|
+
function updateValues() {
|
|
266
|
+
this.values = getValues(this.element);
|
|
267
|
+
requestAnimationFrame(() => {
|
|
268
|
+
setSize(this, this.values.now.current);
|
|
269
|
+
setAriaValue(this);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
const observer = new ResizeObserver(onObservation);
|
|
273
|
+
let index = 0;
|
|
274
|
+
let frame;
|
|
275
|
+
let splitter;
|
|
276
|
+
on(document, "keydown", onKeydown);
|
|
277
|
+
on(document, "mousedown", onPointerdown);
|
|
278
|
+
on(document, "pointermove", onPointermove);
|
|
279
|
+
on(document, "pointerup", onPointerup);
|
|
280
|
+
on(document, "touchcancel", onPointerup);
|
|
281
|
+
on(document, "touchstart", onPointerdown, { passive: false });
|
|
282
|
+
customElements.define(SPLITTER_TAGNAME, OuiSplitterElement);
|
|
283
|
+
//#endregion
|
|
284
|
+
export { OuiSplitterElement };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { A as splitterStyling, C as SPLITTER_NAVIGATION_MAXIMUM_TOTAL, D as SPLITTER_SYMBOL, E as SPLITTER_SELECTOR_HANDLE, O as SPLITTER_TAGNAME, S as SPLITTER_NAVIGATION_MAXIMUM_PERCENTAGE, T as SPLITTER_NAVIGATION_MODIFIER, _ as SPLITTER_KEYS_NEGATIVE, a as OuiSplitterValuesNow, b as SPLITTER_METHODS_CONNECT, c as SPLITTER_ATTRIBUTE_HORIZONTAL, d as SPLITTER_ATTRIBUTE_SEPARATOR, f as SPLITTER_ATTRIBUTE_SIZE, g as SPLITTER_KEYS_HORIZONTAL, h as SPLITTER_KEYS_ALL, i as OuiSplitterValues, k as SPLITTER_VALUE_DECIMALS, l as SPLITTER_ATTRIBUTE_MAX, m as SPLITTER_KEYS_ABSOLUTE, n as OuiSplitter, o as SPLITTER_ATTRIBUTE_ACTIVE, p as SPLITTER_ATTRIBUTE_TYPE, r as OuiSplitterTypes, s as SPLITTER_ATTRIBUTE_HANDLE, t as GenericOuiSplitterElement, u as SPLITTER_ATTRIBUTE_MIN, v as SPLITTER_KEYS_VERTICAL, w as SPLITTER_NAVIGATION_MINIMUM_PERCENTAGE, x as SPLITTER_METHODS_OBSERVE, y as SPLITTER_MESSAGE } from "../splitter.model-DOLNjLVS.mjs";
|
|
2
|
+
export { GenericOuiSplitterElement, OuiSplitter, OuiSplitterTypes, OuiSplitterValues, OuiSplitterValuesNow, SPLITTER_ATTRIBUTE_ACTIVE, SPLITTER_ATTRIBUTE_HANDLE, SPLITTER_ATTRIBUTE_HORIZONTAL, SPLITTER_ATTRIBUTE_MAX, SPLITTER_ATTRIBUTE_MIN, SPLITTER_ATTRIBUTE_SEPARATOR, SPLITTER_ATTRIBUTE_SIZE, SPLITTER_ATTRIBUTE_TYPE, SPLITTER_KEYS_ABSOLUTE, SPLITTER_KEYS_ALL, SPLITTER_KEYS_HORIZONTAL, SPLITTER_KEYS_NEGATIVE, SPLITTER_KEYS_VERTICAL, SPLITTER_MESSAGE, SPLITTER_METHODS_CONNECT, SPLITTER_METHODS_OBSERVE, SPLITTER_NAVIGATION_MAXIMUM_PERCENTAGE, SPLITTER_NAVIGATION_MAXIMUM_TOTAL, SPLITTER_NAVIGATION_MINIMUM_PERCENTAGE, SPLITTER_NAVIGATION_MODIFIER, SPLITTER_SELECTOR_HANDLE, SPLITTER_SYMBOL, SPLITTER_TAGNAME, SPLITTER_VALUE_DECIMALS, splitterStyling };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { toggleStyles } from "@oscarpalmer/toretto/style";
|
|
2
|
+
//#region src/js/splitter/splitter.model.ts
|
|
3
|
+
const SPLITTER_TAGNAME = "oui-splitter";
|
|
4
|
+
const SPLITTER_ATTRIBUTE_ACTIVE = `${SPLITTER_TAGNAME}-active`;
|
|
5
|
+
const SPLITTER_ATTRIBUTE_HANDLE = `${SPLITTER_TAGNAME}-handle`;
|
|
6
|
+
const SPLITTER_ATTRIBUTE_HORIZONTAL = `${SPLITTER_TAGNAME}-horizontal`;
|
|
7
|
+
const SPLITTER_ATTRIBUTE_MAX = "max";
|
|
8
|
+
const SPLITTER_ATTRIBUTE_MIN = "min";
|
|
9
|
+
const SPLITTER_ATTRIBUTE_SIZE = "size";
|
|
10
|
+
const SPLITTER_ATTRIBUTE_TYPE = "type";
|
|
11
|
+
const SPLITTER_ATTRIBUTE_SEPARATOR = `${SPLITTER_TAGNAME}-separator`;
|
|
12
|
+
const SPLITTER_KEYS_ABSOLUTE = /* @__PURE__ */ new Set(["End", "Home"]);
|
|
13
|
+
const SPLITTER_KEYS_HORIZONTAL = /* @__PURE__ */ new Set(["ArrowDown", "ArrowUp"]);
|
|
14
|
+
const SPLITTER_KEYS_NEGATIVE = /* @__PURE__ */ new Set(["ArrowLeft", "ArrowUp"]);
|
|
15
|
+
const SPLITTER_KEYS_VERTICAL = /* @__PURE__ */ new Set(["ArrowLeft", "ArrowRight"]);
|
|
16
|
+
const SPLITTER_KEYS_ALL = /* @__PURE__ */ new Set([
|
|
17
|
+
...SPLITTER_KEYS_ABSOLUTE,
|
|
18
|
+
...SPLITTER_KEYS_HORIZONTAL,
|
|
19
|
+
...SPLITTER_KEYS_VERTICAL
|
|
20
|
+
]);
|
|
21
|
+
const SPLITTER_MESSAGE = `<${SPLITTER_TAGNAME}> must have exactly two panels.`;
|
|
22
|
+
const SPLITTER_METHODS_CONNECT = ["delete", "set"];
|
|
23
|
+
const SPLITTER_METHODS_OBSERVE = ["unobserve", "observe"];
|
|
24
|
+
const SPLITTER_NAVIGATION_MAXIMUM_PERCENTAGE = .9;
|
|
25
|
+
const SPLITTER_NAVIGATION_MAXIMUM_TOTAL = 100;
|
|
26
|
+
const SPLITTER_NAVIGATION_MINIMUM_PERCENTAGE = .1;
|
|
27
|
+
const SPLITTER_NAVIGATION_MODIFIER = .05;
|
|
28
|
+
const SPLITTER_SELECTOR_HANDLE = `[${SPLITTER_ATTRIBUTE_HANDLE}]`;
|
|
29
|
+
const SPLITTER_SYMBOL = Symbol(SPLITTER_TAGNAME);
|
|
30
|
+
const SPLITTER_VALUE_DECIMALS = 6;
|
|
31
|
+
const splitterStyling = toggleStyles(document.body, {
|
|
32
|
+
touchAction: "none",
|
|
33
|
+
userSelect: "none",
|
|
34
|
+
webkitUserSelect: "none"
|
|
35
|
+
});
|
|
36
|
+
//#endregion
|
|
37
|
+
export { SPLITTER_ATTRIBUTE_ACTIVE, SPLITTER_ATTRIBUTE_HANDLE, SPLITTER_ATTRIBUTE_HORIZONTAL, SPLITTER_ATTRIBUTE_MAX, SPLITTER_ATTRIBUTE_MIN, SPLITTER_ATTRIBUTE_SEPARATOR, SPLITTER_ATTRIBUTE_SIZE, SPLITTER_ATTRIBUTE_TYPE, SPLITTER_KEYS_ABSOLUTE, SPLITTER_KEYS_ALL, SPLITTER_KEYS_HORIZONTAL, SPLITTER_KEYS_NEGATIVE, SPLITTER_KEYS_VERTICAL, SPLITTER_MESSAGE, SPLITTER_METHODS_CONNECT, SPLITTER_METHODS_OBSERVE, SPLITTER_NAVIGATION_MAXIMUM_PERCENTAGE, SPLITTER_NAVIGATION_MAXIMUM_TOTAL, SPLITTER_NAVIGATION_MINIMUM_PERCENTAGE, SPLITTER_NAVIGATION_MODIFIER, SPLITTER_SELECTOR_HANDLE, SPLITTER_SYMBOL, SPLITTER_TAGNAME, SPLITTER_VALUE_DECIMALS, splitterStyling };
|