@ixfx/components 0.5.18 → 0.5.20
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/bundle/index.d.ts +107 -112
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +736 -361
- package/bundle/index.js.map +1 -1
- package/bundle/style.css +4 -2
- package/dist/ac-text.d.ts +7 -12
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +5 -4
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-CphdEaZd.js → button-pcDaCemT.js} +2 -2
- package/dist/{button-CphdEaZd.js.map → button-pcDaCemT.js.map} +1 -1
- package/dist/button.d.ts +2 -1
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +1 -0
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +2 -2
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-picker-DbypcEp6.js → colour-picker-D43Q96r0.js} +29 -16
- package/dist/colour-picker-D43Q96r0.js.map +1 -0
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/{crumb-navigation-DTwJ8468.js → crumb-navigation-Pif-kupA.js} +125 -27
- package/dist/crumb-navigation-Pif-kupA.js.map +1 -0
- package/dist/crumbs.d.ts +4 -4
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +1 -1
- package/dist/data-display.d.ts +2 -1
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +23 -25
- package/dist/data-display.js.map +1 -1
- package/dist/{decorate-VRK8rslU.js → decorate-DdjvVHS-.js} +2 -2
- package/dist/{decorate-VRK8rslU.js.map → decorate-DdjvVHS-.js.map} +1 -1
- package/dist/{defaults-DcE8RQJc.js → defaults-BkWCPJFL.js} +7 -1
- package/dist/{defaults-DcE8RQJc.js.map → defaults-BkWCPJFL.js.map} +1 -1
- package/dist/editable-label.d.ts +2 -1
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +2 -2
- package/dist/editable-label.js.map +1 -1
- package/dist/fallbacks-DEE1nCTt.js +406 -0
- package/dist/fallbacks-DEE1nCTt.js.map +1 -0
- package/dist/{hex-editor-Bk6rxhfg.js → hex-editor-B-UI4OZu.js} +8 -6
- package/dist/{hex-editor-Bk6rxhfg.js.map → hex-editor-B-UI4OZu.js.map} +1 -1
- package/dist/{hex-editor-Caq8vNQk.d.ts → hex-editor-CMIxtNgT.d.ts} +3 -2
- package/dist/hex-editor-CMIxtNgT.d.ts.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/highlight-B-eQrhhb.js.map +1 -1
- package/dist/{icon-BUwP1CZ1.d.ts → icon-Bd5BiU4b.d.ts} +4 -3
- package/dist/icon-Bd5BiU4b.d.ts.map +1 -0
- package/dist/{icon-DG9Lm3LT.js → icon-CK14NUcE.js} +5 -7
- package/dist/{icon-DG9Lm3LT.js.map → icon-CK14NUcE.js.map} +1 -1
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +2 -2
- package/dist/{incr-search-2pz21xtR.js → incr-search-CeERfijK.js} +6 -9
- package/dist/{incr-search-2pz21xtR.js.map → incr-search-CeERfijK.js.map} +1 -1
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +1 -1
- package/dist/{index-D9u_Q7-b.d.ts → index-BslNaMLo.d.ts} +3 -3
- package/dist/index-BslNaMLo.d.ts.map +1 -0
- package/dist/{index-DkhBGHgF.d.ts → index-Cdmrn0SZ.d.ts} +11 -11
- package/dist/index-Cdmrn0SZ.d.ts.map +1 -0
- package/dist/{index-BUB5SICW.d.ts → index-CkMIKEWp.d.ts} +4 -3
- package/dist/index-CkMIKEWp.d.ts.map +1 -0
- package/dist/{index-RqMh1i-O.d.ts → index-D87kRcEs.d.ts} +1 -2
- package/dist/index-D87kRcEs.d.ts.map +1 -0
- package/dist/{index-BKAlRgbq.d.ts → index-DrKRD8_a.d.ts} +7 -4
- package/dist/index-DrKRD8_a.d.ts.map +1 -0
- package/dist/{index-BeuCXtiO.d.ts → index-tX6fKF8m.d.ts} +3 -3
- package/dist/index-tX6fKF8m.d.ts.map +1 -0
- package/dist/index.d.ts +48 -53
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +155 -122
- package/dist/index.js.map +1 -1
- package/dist/interaction-_Y2qO3QI.js +1 -0
- package/dist/{labelled-input-base-hoKGwyKT.js → labelled-input-base-9K_w3oLj.js} +2 -2
- package/dist/{labelled-input-base-hoKGwyKT.js.map → labelled-input-base-9K_w3oLj.js.map} +1 -1
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-ORb1rGq6.d.ts} +3 -2
- package/dist/labelled-input-base-ORb1rGq6.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +5 -4
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +4 -4
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +2 -2
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +2 -2
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +3 -5
- package/dist/led.js.map +1 -1
- package/dist/{menu-CdwSe_XN.js → menu-BiFarLUA.js} +9 -8
- package/dist/{menu-CdwSe_XN.js.map → menu-BiFarLUA.js.map} +1 -1
- package/dist/{menu-item-BG5w7fi4.d.ts → menu-item-AtoP6bD4.d.ts} +4 -4
- package/dist/menu-item-AtoP6bD4.d.ts.map +1 -0
- package/dist/{menu-item-CrmUwIoJ.js → menu-item-yHSPV8nS.js} +10 -9
- package/dist/{menu-item-CrmUwIoJ.js.map → menu-item-yHSPV8nS.js.map} +1 -1
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +5 -7
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +26 -24
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +2 -1
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +14 -15
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +3 -3
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +1 -1
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +2 -1
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +3 -3
- package/dist/polar-pad.js.map +1 -1
- package/dist/{radial-input-CVxGH-Cp.js → radial-input-C4f-2Bya.js} +15 -25
- package/dist/{radial-input-CVxGH-Cp.js.map → radial-input-C4f-2Bya.js.map} +1 -1
- package/dist/{radial-input-BhZeyyP-.d.ts → radial-input-Dhu5ZGP5.d.ts} +3 -2
- package/dist/radial-input-Dhu5ZGP5.d.ts.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +3 -2
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +3 -3
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +3 -2
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +3 -3
- package/dist/range.js.map +1 -1
- package/dist/selecthorizontal.d.ts +2 -1
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +2 -2
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/{slider-input-TidGhvXt.d.ts → slider-input-BEaztT-g.d.ts} +3 -2
- package/dist/slider-input-BEaztT-g.d.ts.map +1 -0
- package/dist/{slider-input-CzmSVgm7.js → slider-input-SW7e2Ac2.js} +28 -31
- package/dist/{slider-input-CzmSVgm7.js.map → slider-input-SW7e2Ac2.js.map} +1 -1
- package/dist/slider-input.d.ts +1 -1
- package/dist/slider-input.js +1 -1
- package/dist/snap-container.d.ts +2 -1
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +5 -6
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +9 -2
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +88 -20
- package/dist/split-layout.js.map +1 -1
- package/dist/style.css +4 -2
- package/dist/swipe.d.ts +2 -1
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +4 -5
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-CLqlPnX-.d.ts → tab-list-B8v9KntS.d.ts} +12 -5
- package/dist/tab-list-B8v9KntS.d.ts.map +1 -0
- package/dist/{tab-list-6W5CgXix.js → tab-list-CR0v53KJ.js} +22 -4
- package/dist/tab-list-CR0v53KJ.js.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +1 -1
- package/dist/{tickled-controller-BF2Ea0DE.d.ts → tickled-controller-JDOR9B8V.d.ts} +9 -6
- package/dist/tickled-controller-JDOR9B8V.d.ts.map +1 -0
- package/dist/{tickled-styles-fNDdqf6l.js → tickled-styles-Bgo_Lpw-.js} +28 -28
- package/dist/tickled-styles-Bgo_Lpw-.js.map +1 -0
- package/dist/{timeline-B2fgDL4U.js → timeline-CdSI003L.js} +3 -3
- package/dist/{timeline-B2fgDL4U.js.map → timeline-CdSI003L.js.map} +1 -1
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-BlvBUQxx.d.ts → tooltip-BMTSUPBU.d.ts} +3 -2
- package/dist/tooltip-BMTSUPBU.d.ts.map +1 -0
- package/dist/{tree-BtiiDX1a.js → tree-CqPhQRHo.js} +11 -10
- package/dist/{tree-BtiiDX1a.js.map → tree-CqPhQRHo.js.map} +1 -1
- package/dist/{tree-component-DQ9vzdy5.d.ts → tree-component-CDLO1ITF.d.ts} +124 -8
- package/dist/tree-component-CDLO1ITF.d.ts.map +1 -0
- package/dist/tree.d.ts +4 -9
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/types-DSfbtHs3.d.ts +8 -0
- package/dist/types-DSfbtHs3.d.ts.map +1 -0
- package/dist/{wheel-nudge-DgMTRYlh.d.ts → wheel-nudge-C-ra_1os.d.ts} +2 -1
- package/dist/wheel-nudge-C-ra_1os.d.ts.map +1 -0
- package/dist/{wheel-nudge-BlSCe_hD.js → wheel-nudge-Dhzi5nHc.js} +2 -2
- package/dist/{wheel-nudge-BlSCe_hD.js.map → wheel-nudge-Dhzi5nHc.js.map} +1 -1
- package/dist/{xy-axis-CxHC8z5E.js → xy-axis-BpA2eJq6.js} +4 -6
- package/dist/{xy-axis-CxHC8z5E.js.map → xy-axis-BpA2eJq6.js.map} +1 -1
- package/dist/{xy-axis-5KhVTNoX.d.ts → xy-axis-CtDDQzGZ.d.ts} +6 -8
- package/dist/xy-axis-CtDDQzGZ.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +2 -1
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +3 -3
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/ac-token.md +7 -1
- package/docs-user/colour-picker.md +8 -4
- package/docs-user/crumbs.md +4 -0
- package/docs-user/menu.md +11 -8
- package/docs-user/split-layout.md +29 -7
- package/package.json +3 -1
- package/dist/colour-picker-DbypcEp6.js.map +0 -1
- package/dist/crumb-navigation-DTwJ8468.js.map +0 -1
- package/dist/fallbacks-DPgPEqo8.js +0 -218
- package/dist/fallbacks-DPgPEqo8.js.map +0 -1
- package/dist/hex-editor-Caq8vNQk.d.ts.map +0 -1
- package/dist/icon-BUwP1CZ1.d.ts.map +0 -1
- package/dist/index-BKAlRgbq.d.ts.map +0 -1
- package/dist/index-BUB5SICW.d.ts.map +0 -1
- package/dist/index-BeuCXtiO.d.ts.map +0 -1
- package/dist/index-D9u_Q7-b.d.ts.map +0 -1
- package/dist/index-DkhBGHgF.d.ts.map +0 -1
- package/dist/index-RqMh1i-O.d.ts.map +0 -1
- package/dist/interaction-D6efrBLo.js +0 -1
- package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +0 -1
- package/dist/menu-item-BG5w7fi4.d.ts.map +0 -1
- package/dist/radial-input-BhZeyyP-.d.ts.map +0 -1
- package/dist/slider-input-TidGhvXt.d.ts.map +0 -1
- package/dist/tab-list-6W5CgXix.js.map +0 -1
- package/dist/tab-list-CLqlPnX-.d.ts.map +0 -1
- package/dist/tickled-controller-BF2Ea0DE.d.ts.map +0 -1
- package/dist/tickled-styles-fNDdqf6l.js.map +0 -1
- package/dist/tooltip-BlvBUQxx.d.ts.map +0 -1
- package/dist/tree-component-DQ9vzdy5.d.ts.map +0 -1
- package/dist/types-DO3gt5vg.d.ts +0 -130
- package/dist/types-DO3gt5vg.d.ts.map +0 -1
- package/dist/wheel-nudge-DgMTRYlh.d.ts.map +0 -1
- package/dist/xy-axis-5KhVTNoX.d.ts.map +0 -1
- /package/bundle/{rolldown-runtime-D7D4PA-g.js → chunk-D7D4PA-g.js} +0 -0
- /package/dist/{rolldown-runtime-D7D4PA-g.js → chunk-D7D4PA-g.js} +0 -0
package/dist/snap-container.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
1
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
2
2
|
import { LitElement, css, html } from "lit";
|
|
3
3
|
import { property, state } from "lit/decorators.js";
|
|
4
4
|
//#region src/snap-container/snap-container.ts
|
|
@@ -95,11 +95,10 @@ let SnapContainer = class SnapContainer extends LitElement {
|
|
|
95
95
|
};
|
|
96
96
|
this._onKeyDown = (e) => {
|
|
97
97
|
let newSnap = this.snap;
|
|
98
|
-
if (this._isHorizontal)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
} else if (e.key === `ArrowUp`) newSnap = Math.max(0, this.snap - 1);
|
|
98
|
+
if (this._isHorizontal) if (e.key === `ArrowLeft`) newSnap = Math.max(0, this.snap - 1);
|
|
99
|
+
else if (e.key === `ArrowRight`) newSnap = Math.min(this.snapPositions - 1, this.snap + 1);
|
|
100
|
+
else return;
|
|
101
|
+
else if (e.key === `ArrowUp`) newSnap = Math.max(0, this.snap - 1);
|
|
103
102
|
else if (e.key === `ArrowDown`) newSnap = Math.min(this.snapPositions - 1, this.snap + 1);
|
|
104
103
|
else return;
|
|
105
104
|
e.preventDefault();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snap-container.js","names":["customElement"],"sources":["../src/snap-container/snap-container.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnapLogic = `centre` | `balanced`;\nexport type ClickSnapMode = `closest` | `step`;\n\n@customElement(`ixfx-snap-container`)\nexport class SnapContainer extends LitElement {\n static override styles = css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n --transition-duration: 200ms;\n }\n \n :host([orientation=\"horizontal\"]) {\n width: 100%;\n height: auto;\n min-height: 25px;\n }\n \n :host([orientation=\"vertical\"]) {\n height: 100%;\n width: auto;\n min-width: 25px;\n }\n \n :host(:not([orientation])) {\n width: 100%;\n min-height: 25px;\n }\n \n .container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: inherit;\n min-width: inherit;\n }\n \n ::slotted(*) {\n position: absolute;\n transition: left var(--transition-duration) ease-out, \n top var(--transition-duration) ease-out;\n cursor: grab;\n will-change: left, top;\n }\n \n ::slotted(*:active) {\n cursor: grabbing;\n }\n \n :host([orientation=\"vertical\"]) ::slotted(*) {\n transition: top var(--transition-duration) ease-out,\n left var(--transition-duration) ease-out;\n }\n \n .dragging {\n transition: none !important;\n }\n `;\n\n @property({ type: String, attribute: `orientation` })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property({ type: Number, attribute: `snap-positions` })\n snapPositions = 3;\n\n @property({ type: String, attribute: `snap-logic` })\n snapLogic: SnapLogic = `balanced`;\n\n @property({ type: String, attribute: `click-snap` })\n clickSnap: `closest` | `step` = `closest`;\n\n @property({ type: Number })\n snap = 0;\n\n @state()\n private _dragging = false;\n\n private _dragStart = 0;\n private _dragThreshold = 10;\n private _thresholdReached = false;\n private _currentDragIndex = 0;\n private _child: HTMLElement | null = null;\n\n private get _isHorizontal(): boolean {\n return this.orientation !== `vertical`;\n }\n\n private _getChild(): HTMLElement | null {\n if (this._child)\n return this._child;\n return this.firstElementChild as HTMLElement | null;\n }\n\n private _computeSnapPositions(): number[] {\n const positions: number[] = [];\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n if (containerSize === 0 || childSize === 0)\n return [];\n\n const availableSpace = containerSize - childSize;\n\n if (this.snapLogic === `centre`) {\n for (let i = 0; i < this.snapPositions; i++) {\n const fraction = i / (this.snapPositions - 1 || 1);\n positions.push(fraction * availableSpace);\n }\n } else {\n const firstPosition = 0;\n const lastPosition = availableSpace;\n\n if (this.snapPositions === 1) {\n positions.push(availableSpace / 2);\n } else if (this.snapPositions === 2) {\n positions.push(firstPosition, lastPosition);\n } else {\n positions.push(firstPosition);\n const middleCount = this.snapPositions - 2;\n for (let i = 1; i <= middleCount; i++) {\n const fraction = i / (middleCount + 1);\n positions.push(firstPosition + fraction * (lastPosition - firstPosition));\n }\n positions.push(lastPosition);\n }\n }\n\n return positions;\n }\n\n private _getSnapIndex(clientPos: number, containerRect: DOMRect): number {\n const offsetInAxis = this._isHorizontal\n ? clientPos - containerRect.left\n : clientPos - containerRect.top;\n\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return 0;\n\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const halfChild = childSize / 2;\n let closestIndex = 0;\n let closestDistance = Infinity;\n\n for (let i = 0; i < snapPositions.length; i++) {\n const snapCenter = snapPositions[i] + halfChild;\n const distance = Math.abs(offsetInAxis - snapCenter);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = i;\n }\n }\n\n return closestIndex;\n }\n\n private _clampChildPosition(position: number): number {\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const maxPosition = containerSize - childSize;\n return Math.max(0, Math.min(position, maxPosition));\n }\n\n private _updateChildPosition(index: number): void {\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return;\n\n const clampedIndex = Math.max(0, Math.min(index, snapPositions.length - 1));\n const position = snapPositions[clampedIndex];\n\n const child = this._getChild();\n if (!child)\n return;\n\n if (this._isHorizontal) {\n const clampedPosition = this._clampChildPosition(position);\n child.style.left = `${clampedPosition}px`;\n child.style.top = `0px`;\n } else {\n const clampedPosition = this._clampChildPosition(position);\n child.style.top = `${clampedPosition}px`;\n child.style.left = `0px`;\n }\n child.style.setProperty(`--snap-index`, String(clampedIndex));\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n const child = this._getChild();\n if (!child)\n return;\n\n const containerRect = this.getBoundingClientRect();\n const newIndex = this._getSnapIndex(\n this._isHorizontal ? e.clientX : e.clientY,\n containerRect,\n );\n\n if (child.contains(e.target as Node)) {\n e.preventDefault();\n e.stopPropagation();\n this._dragging = true;\n this._thresholdReached = false;\n this._dragStart = this._isHorizontal ? e.clientX : e.clientY;\n this._currentDragIndex = newIndex;\n child.classList.add(`dragging`);\n\n document.addEventListener(`pointermove`, this._onPointerMove);\n document.addEventListener(`pointerup`, this._onPointerUp);\n } else {\n let targetIndex: number;\n\n if (this.clickSnap === `step`) {\n targetIndex = this.snap;\n const childRect = child.getBoundingClientRect();\n const childCenter = this._isHorizontal\n ? childRect.left + childRect.width / 2\n : childRect.top + childRect.height / 2;\n const clickPos = this._isHorizontal ? e.clientX : e.clientY;\n\n if (clickPos > childCenter) {\n targetIndex = Math.min(this.snapPositions - 1, this.snap + 1);\n } else if (clickPos < childCenter) {\n targetIndex = Math.max(0, this.snap - 1);\n }\n } else {\n targetIndex = newIndex;\n }\n\n if (targetIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = targetIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n }\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n\n const currentPos = this._isHorizontal ? e.clientX : e.clientY;\n const delta = currentPos - this._dragStart;\n const containerRect = this.getBoundingClientRect();\n\n if (!this._thresholdReached && Math.abs(delta) < this._dragThreshold) {\n return;\n }\n\n this._thresholdReached = true;\n\n const newIndex = this._getSnapIndex(currentPos, containerRect);\n this._currentDragIndex = newIndex;\n this._updateChildPosition(newIndex);\n\n this.dispatchEvent(new CustomEvent<SnapInputDetail>(`snap-input`, {\n detail: { index: newIndex },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onPointerUp = (): void => {\n if (!this._dragging)\n return;\n\n this._dragging = false;\n const child = this._getChild();\n if (child)\n child.classList.remove(`dragging`);\n\n document.removeEventListener(`pointermove`, this._onPointerMove);\n document.removeEventListener(`pointerup`, this._onPointerUp);\n\n if (this._thresholdReached && this._currentDragIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = this._currentDragIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n let newSnap = this.snap;\n\n if (this._isHorizontal) {\n if (e.key === `ArrowLeft`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowRight`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n } else {\n if (e.key === `ArrowUp`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowDown`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n }\n\n e.preventDefault();\n\n if (newSnap !== this.snap) {\n const previousSnap = this.snap;\n this.snap = newSnap;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n override firstUpdated(): void {\n this._child = this.firstElementChild as HTMLElement | null;\n this._updateChildPosition(this.snap);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`snap`) && !this._dragging) {\n this._updateChildPosition(this.snap);\n }\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div \n class=\"container\"\n @pointerdown=${this._onPointerDown}\n tabindex=\"0\"\n @keydown=${this._onKeyDown}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nexport type SnapChangeDetail = {\n readonly previousSnap: number;\n readonly newSnap: number;\n};\n\nexport type SnapChangeEvent = CustomEvent<SnapChangeDetail>;\n\nexport type SnapInputDetail = {\n readonly index: number;\n};\n\nexport type SnapInputEvent = CustomEvent<SnapInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snap-container': SnapContainer;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snap-container.js","names":["customElement"],"sources":["../src/snap-container/snap-container.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnapLogic = `centre` | `balanced`;\nexport type ClickSnapMode = `closest` | `step`;\n\n@customElement(`ixfx-snap-container`)\nexport class SnapContainer extends LitElement {\n static override styles = css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n --transition-duration: 200ms;\n }\n \n :host([orientation=\"horizontal\"]) {\n width: 100%;\n height: auto;\n min-height: 25px;\n }\n \n :host([orientation=\"vertical\"]) {\n height: 100%;\n width: auto;\n min-width: 25px;\n }\n \n :host(:not([orientation])) {\n width: 100%;\n min-height: 25px;\n }\n \n .container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: inherit;\n min-width: inherit;\n }\n \n ::slotted(*) {\n position: absolute;\n transition: left var(--transition-duration) ease-out, \n top var(--transition-duration) ease-out;\n cursor: grab;\n will-change: left, top;\n }\n \n ::slotted(*:active) {\n cursor: grabbing;\n }\n \n :host([orientation=\"vertical\"]) ::slotted(*) {\n transition: top var(--transition-duration) ease-out,\n left var(--transition-duration) ease-out;\n }\n \n .dragging {\n transition: none !important;\n }\n `;\n\n @property({ type: String, attribute: `orientation` })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property({ type: Number, attribute: `snap-positions` })\n snapPositions = 3;\n\n @property({ type: String, attribute: `snap-logic` })\n snapLogic: SnapLogic = `balanced`;\n\n @property({ type: String, attribute: `click-snap` })\n clickSnap: `closest` | `step` = `closest`;\n\n @property({ type: Number })\n snap = 0;\n\n @state()\n private _dragging = false;\n\n private _dragStart = 0;\n private _dragThreshold = 10;\n private _thresholdReached = false;\n private _currentDragIndex = 0;\n private _child: HTMLElement | null = null;\n\n private get _isHorizontal(): boolean {\n return this.orientation !== `vertical`;\n }\n\n private _getChild(): HTMLElement | null {\n if (this._child)\n return this._child;\n return this.firstElementChild as HTMLElement | null;\n }\n\n private _computeSnapPositions(): number[] {\n const positions: number[] = [];\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n if (containerSize === 0 || childSize === 0)\n return [];\n\n const availableSpace = containerSize - childSize;\n\n if (this.snapLogic === `centre`) {\n for (let i = 0; i < this.snapPositions; i++) {\n const fraction = i / (this.snapPositions - 1 || 1);\n positions.push(fraction * availableSpace);\n }\n } else {\n const firstPosition = 0;\n const lastPosition = availableSpace;\n\n if (this.snapPositions === 1) {\n positions.push(availableSpace / 2);\n } else if (this.snapPositions === 2) {\n positions.push(firstPosition, lastPosition);\n } else {\n positions.push(firstPosition);\n const middleCount = this.snapPositions - 2;\n for (let i = 1; i <= middleCount; i++) {\n const fraction = i / (middleCount + 1);\n positions.push(firstPosition + fraction * (lastPosition - firstPosition));\n }\n positions.push(lastPosition);\n }\n }\n\n return positions;\n }\n\n private _getSnapIndex(clientPos: number, containerRect: DOMRect): number {\n const offsetInAxis = this._isHorizontal\n ? clientPos - containerRect.left\n : clientPos - containerRect.top;\n\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return 0;\n\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const halfChild = childSize / 2;\n let closestIndex = 0;\n let closestDistance = Infinity;\n\n for (let i = 0; i < snapPositions.length; i++) {\n const snapCenter = snapPositions[i] + halfChild;\n const distance = Math.abs(offsetInAxis - snapCenter);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = i;\n }\n }\n\n return closestIndex;\n }\n\n private _clampChildPosition(position: number): number {\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const maxPosition = containerSize - childSize;\n return Math.max(0, Math.min(position, maxPosition));\n }\n\n private _updateChildPosition(index: number): void {\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return;\n\n const clampedIndex = Math.max(0, Math.min(index, snapPositions.length - 1));\n const position = snapPositions[clampedIndex];\n\n const child = this._getChild();\n if (!child)\n return;\n\n if (this._isHorizontal) {\n const clampedPosition = this._clampChildPosition(position);\n child.style.left = `${clampedPosition}px`;\n child.style.top = `0px`;\n } else {\n const clampedPosition = this._clampChildPosition(position);\n child.style.top = `${clampedPosition}px`;\n child.style.left = `0px`;\n }\n child.style.setProperty(`--snap-index`, String(clampedIndex));\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n const child = this._getChild();\n if (!child)\n return;\n\n const containerRect = this.getBoundingClientRect();\n const newIndex = this._getSnapIndex(\n this._isHorizontal ? e.clientX : e.clientY,\n containerRect,\n );\n\n if (child.contains(e.target as Node)) {\n e.preventDefault();\n e.stopPropagation();\n this._dragging = true;\n this._thresholdReached = false;\n this._dragStart = this._isHorizontal ? e.clientX : e.clientY;\n this._currentDragIndex = newIndex;\n child.classList.add(`dragging`);\n\n document.addEventListener(`pointermove`, this._onPointerMove);\n document.addEventListener(`pointerup`, this._onPointerUp);\n } else {\n let targetIndex: number;\n\n if (this.clickSnap === `step`) {\n targetIndex = this.snap;\n const childRect = child.getBoundingClientRect();\n const childCenter = this._isHorizontal\n ? childRect.left + childRect.width / 2\n : childRect.top + childRect.height / 2;\n const clickPos = this._isHorizontal ? e.clientX : e.clientY;\n\n if (clickPos > childCenter) {\n targetIndex = Math.min(this.snapPositions - 1, this.snap + 1);\n } else if (clickPos < childCenter) {\n targetIndex = Math.max(0, this.snap - 1);\n }\n } else {\n targetIndex = newIndex;\n }\n\n if (targetIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = targetIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n }\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n\n const currentPos = this._isHorizontal ? e.clientX : e.clientY;\n const delta = currentPos - this._dragStart;\n const containerRect = this.getBoundingClientRect();\n\n if (!this._thresholdReached && Math.abs(delta) < this._dragThreshold) {\n return;\n }\n\n this._thresholdReached = true;\n\n const newIndex = this._getSnapIndex(currentPos, containerRect);\n this._currentDragIndex = newIndex;\n this._updateChildPosition(newIndex);\n\n this.dispatchEvent(new CustomEvent<SnapInputDetail>(`snap-input`, {\n detail: { index: newIndex },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onPointerUp = (): void => {\n if (!this._dragging)\n return;\n\n this._dragging = false;\n const child = this._getChild();\n if (child)\n child.classList.remove(`dragging`);\n\n document.removeEventListener(`pointermove`, this._onPointerMove);\n document.removeEventListener(`pointerup`, this._onPointerUp);\n\n if (this._thresholdReached && this._currentDragIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = this._currentDragIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n let newSnap = this.snap;\n\n if (this._isHorizontal) {\n if (e.key === `ArrowLeft`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowRight`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n } else {\n if (e.key === `ArrowUp`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowDown`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n }\n\n e.preventDefault();\n\n if (newSnap !== this.snap) {\n const previousSnap = this.snap;\n this.snap = newSnap;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n override firstUpdated(): void {\n this._child = this.firstElementChild as HTMLElement | null;\n this._updateChildPosition(this.snap);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`snap`) && !this._dragging) {\n this._updateChildPosition(this.snap);\n }\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div \n class=\"container\"\n @pointerdown=${this._onPointerDown}\n tabindex=\"0\"\n @keydown=${this._onKeyDown}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nexport type SnapChangeDetail = {\n readonly previousSnap: number;\n readonly newSnap: number;\n};\n\nexport type SnapChangeEvent = CustomEvent<SnapChangeDetail>;\n\nexport type SnapInputDetail = {\n readonly index: number;\n};\n\nexport type SnapInputEvent = CustomEvent<SnapInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snap-container': SnapContainer;\n }\n}\n"],"mappings":"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"}
|
package/dist/split-layout.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
+
|
|
2
3
|
//#region src/split-layout/split-layout.d.ts
|
|
3
4
|
/**
|
|
4
5
|
* Lays out two elements within a container, with a bar to resize them
|
|
@@ -17,10 +18,15 @@ import { LitElement } from "lit";
|
|
|
17
18
|
* maxSizeA/B: Maximum size for panel A or B (e.g., "200px" or "80%"). Default: none
|
|
18
19
|
*
|
|
19
20
|
* CSS variables
|
|
20
|
-
* --handle-size: 2px; // Width/height of
|
|
21
|
+
* --handle-size: 2px; // Width/height of split bar
|
|
21
22
|
* --handle-colour: var(--surface-5); // Colour of handle
|
|
22
23
|
* --handle-hover-colour: var(--surface-6); // Colour of handle when hovering
|
|
23
24
|
* --handle-active-colour: var(--accent); // Colour of handle when being used
|
|
25
|
+
* --handle-bg: var(--handle-colour); // Background of grab handle rectangle
|
|
26
|
+
* --handle-grab-colour: var(--surface-muted-text); // Colour of grab handle dots
|
|
27
|
+
* --handle-grab-dot-size: 3px; // Diameter of grab handle dots
|
|
28
|
+
* --handle-grab-size: 16px; // Length of grab handle
|
|
29
|
+
* --handle-grab-thickness: 8px; // Thickness of grab handle
|
|
24
30
|
*/
|
|
25
31
|
declare class SplitLayoutElement extends LitElement {
|
|
26
32
|
#private;
|
|
@@ -37,6 +43,7 @@ declare class SplitLayoutElement extends LitElement {
|
|
|
37
43
|
minSizeB: string;
|
|
38
44
|
maxSizeB: string;
|
|
39
45
|
private _hasCorner;
|
|
46
|
+
private get showGrabHandle();
|
|
40
47
|
disconnectedCallback(): void;
|
|
41
48
|
firstUpdated(): void;
|
|
42
49
|
updated(changedProperties: Map<string, unknown>): void;
|
|
@@ -48,7 +55,7 @@ declare global {
|
|
|
48
55
|
interface HTMLElementTagNameMap {
|
|
49
56
|
"ixfx-split-layout": SplitLayoutElement;
|
|
50
57
|
}
|
|
51
|
-
}
|
|
58
|
+
} //# sourceMappingURL=split-layout.d.ts.map
|
|
52
59
|
//#endregion
|
|
53
60
|
export { SplitLayoutElement };
|
|
54
61
|
//# sourceMappingURL=split-layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"split-layout.d.ts","names":[],"sources":["../src/split-layout/split-layout.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"split-layout.d.ts","names":[],"sources":["../src/split-layout/split-layout.ts"],"mappings":";;;;;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;cACa,kBAAA,SAA2B,UAAA;EAAA;EAEtC,MAAA;EAGA,KAAA;EAGA,KAAA;EAGA,MAAA;EAGA,MAAA;EAGA,WAAA;EAGA,UAAA;EAGA,UAAA;EAGA,QAAA;EAGA,QAAA;EAGA,QAAA;EAGA,QAAA;EAAA,QAGQ,UAAA;EAAA,YAEI,cAAA;EAuBZ,oBAAA;EAKA,YAAA;EAIA,OAAA,CAAQ,iBAAA,EAAmB,GAAA;EAgP3B,OAAA,IAAW,WAAA;EAsRX,MAAA,kBAAM,cAAA;EAAA,OAyCC,MAAA,gBAAM,SAAA;AAAA;AAAA,QA8IP,MAAA;EAAA,UACI,qBAAA;IACR,mBAAA,EAAqB,kBAAkB;EAAA;AAAA"}
|
package/dist/split-layout.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
3
|
import { LitElement, css, html } from "lit";
|
|
4
4
|
import { property, state } from "lit/decorators.js";
|
|
5
5
|
import { clamp } from "@ixfx/numbers";
|
|
@@ -49,8 +49,7 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
49
49
|
if (!bounds) return;
|
|
50
50
|
const threshold = 5;
|
|
51
51
|
if (this.layout === `horizontal`) {
|
|
52
|
-
const
|
|
53
|
-
const relativeY = clamp(y / bounds.height);
|
|
52
|
+
const relativeY = clamp((event.y - bounds.y) / bounds.height);
|
|
54
53
|
if (this.collapsible && this.collapsedA) {
|
|
55
54
|
if (relativeY > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
|
|
56
55
|
this.collapsedA = false;
|
|
@@ -88,8 +87,7 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
88
87
|
this.#collapsedBPointerAtCollapse = relativeY;
|
|
89
88
|
}
|
|
90
89
|
} else {
|
|
91
|
-
const
|
|
92
|
-
const relativeX = clamp(x / bounds.width);
|
|
90
|
+
const relativeX = clamp((event.x - bounds.x) / bounds.width);
|
|
93
91
|
if (this.collapsible && this.collapsedA) {
|
|
94
92
|
if (relativeX > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
|
|
95
93
|
this.collapsedA = false;
|
|
@@ -143,7 +141,7 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
143
141
|
if (nestedSplit) {
|
|
144
142
|
this.#nestedSplitInitialSizeA = nestedSplit.sizeA;
|
|
145
143
|
const nestedBounds = nestedSplit.getBoundingClientRect();
|
|
146
|
-
const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.
|
|
144
|
+
const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.split-bar`);
|
|
147
145
|
if (nestedHandle) {
|
|
148
146
|
this.#nestedSplitBounds = nestedBounds;
|
|
149
147
|
this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();
|
|
@@ -212,6 +210,11 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
212
210
|
event.preventDefault();
|
|
213
211
|
};
|
|
214
212
|
}
|
|
213
|
+
get showGrabHandle() {
|
|
214
|
+
const size = getComputedStyle(this).getPropertyValue(`--handle-size`).trim();
|
|
215
|
+
const num = Number.parseFloat(size);
|
|
216
|
+
return !Number.isNaN(num) && num > 3;
|
|
217
|
+
}
|
|
215
218
|
#elementBounds;
|
|
216
219
|
#startSizeA;
|
|
217
220
|
#startSizeB;
|
|
@@ -432,17 +435,30 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
432
435
|
<div id="zone">
|
|
433
436
|
<slot style=${sizeA} name="a"></slot>
|
|
434
437
|
${this._hasCorner ? html`<div class="corner-zone" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}
|
|
435
|
-
<div @pointerdown=${this.#onResizeHandleDown} class="
|
|
436
|
-
|
|
438
|
+
<div @pointerdown=${this.#onResizeHandleDown} class="split-bar">
|
|
439
|
+
${this.showGrabHandle ? html`
|
|
440
|
+
<div class="grab-handle">
|
|
441
|
+
<span class="dot"></span>
|
|
442
|
+
<span class="dot"></span>
|
|
443
|
+
<span class="dot"></span>
|
|
444
|
+
</div>
|
|
445
|
+
` : ``}
|
|
446
|
+
</div>
|
|
447
|
+
<slot style=${sizeB} name="b"></slot>
|
|
437
448
|
</div>`;
|
|
438
449
|
}
|
|
439
450
|
static {
|
|
440
451
|
this.styles = [themeFallbacks, css`
|
|
441
452
|
:host {
|
|
442
453
|
--handle-size: 2px;
|
|
443
|
-
--handle-colour:
|
|
454
|
+
--handle-colour: transparent;
|
|
444
455
|
--handle-hover-colour: var(--surface-6);
|
|
445
456
|
--handle-active-colour: var(--accent);
|
|
457
|
+
--handle-bg: var(--handle-colour);
|
|
458
|
+
--handle-grab-colour: var(--border-subtle-color);
|
|
459
|
+
--handle-grab-dot-size: 3px;
|
|
460
|
+
--handle-grab-size: 16px;
|
|
461
|
+
--handle-grab-thickness: 8px;
|
|
446
462
|
|
|
447
463
|
display: block;
|
|
448
464
|
box-sizing: border-box;
|
|
@@ -460,29 +476,80 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
460
476
|
slot {
|
|
461
477
|
display: block;
|
|
462
478
|
overflow: hidden;
|
|
479
|
+
border: var(--border-subtle);
|
|
480
|
+
border-radius: var(--radius-m);
|
|
463
481
|
}
|
|
464
482
|
:slotted(*) {
|
|
465
483
|
width: 100%;
|
|
466
484
|
height: 100%;
|
|
467
485
|
}
|
|
468
486
|
|
|
469
|
-
.
|
|
487
|
+
.split-bar {
|
|
488
|
+
position: relative;
|
|
470
489
|
background-color: var(--handle-colour);
|
|
490
|
+
transition: background-color 0.3s ease 0s;
|
|
471
491
|
width: var(--handle-size);
|
|
472
492
|
height: 100%;
|
|
473
493
|
cursor: ew-resize;
|
|
474
494
|
flex-shrink: 0;
|
|
495
|
+
border-radius: var(--radius-m);
|
|
496
|
+
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
@keyframes handle-hover {
|
|
500
|
+
from { background-color: var(--handle-colour); }
|
|
501
|
+
to { background-color: var(--handle-hover-colour); }
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.grab-handle {
|
|
505
|
+
position: absolute;
|
|
506
|
+
top: 50%;
|
|
507
|
+
left: 50%;
|
|
508
|
+
transform: translate(-50%, -50%);
|
|
509
|
+
display: flex;
|
|
510
|
+
align-items: center;
|
|
511
|
+
justify-content: center;
|
|
512
|
+
gap: var(--handle-grab-dot-size);
|
|
513
|
+
background: var(--handle-bg);
|
|
514
|
+
border-radius: var(--radius-s);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.grab-handle .dot {
|
|
518
|
+
width: var(--handle-grab-dot-size);
|
|
519
|
+
height: var(--handle-grab-dot-size);
|
|
520
|
+
border-radius: 50%;
|
|
521
|
+
background: var(--handle-grab-colour);
|
|
522
|
+
flex-shrink: 0;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
:host([layout="vertical"]) .grab-handle {
|
|
526
|
+
flex-direction: column;
|
|
527
|
+
width: var(--handle-grab-thickness);
|
|
528
|
+
height: var(--handle-grab-size);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
:host([layout="horizontal"]) .grab-handle {
|
|
532
|
+
flex-direction: row;
|
|
533
|
+
width: var(--handle-grab-size);
|
|
534
|
+
height: var(--handle-grab-thickness);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
#zone.user-resizing .grab-handle {
|
|
538
|
+
display: none;
|
|
475
539
|
}
|
|
476
540
|
#zone.user-resizing {
|
|
477
541
|
slot {
|
|
478
542
|
opacity: 0.5;
|
|
479
543
|
}
|
|
480
|
-
.
|
|
544
|
+
.split-bar {
|
|
481
545
|
background-color: var(--handle-active-colour);
|
|
546
|
+
transition: none;
|
|
547
|
+
animation: none !important;
|
|
482
548
|
}
|
|
483
549
|
}
|
|
484
|
-
|
|
485
|
-
|
|
550
|
+
|
|
551
|
+
#zone:not(.user-resizing) .split-bar:hover {
|
|
552
|
+
animation: handle-hover 0.001s ease-out 0.7s both;
|
|
486
553
|
}
|
|
487
554
|
|
|
488
555
|
.corner-zone {
|
|
@@ -501,17 +568,18 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
501
568
|
#zone {
|
|
502
569
|
flex-direction: column;
|
|
503
570
|
}
|
|
504
|
-
.
|
|
505
|
-
|
|
571
|
+
.split-bar {
|
|
572
|
+
position: relative;
|
|
573
|
+
background-color: var(--handle-colour);
|
|
574
|
+
transition: background-color 0.3s ease 0s;
|
|
506
575
|
height: var(--handle-size);
|
|
507
576
|
width: 100%;
|
|
508
577
|
cursor: ns-resize;
|
|
509
578
|
}
|
|
510
|
-
.
|
|
511
|
-
background-color: var(--handle-hover-colour);
|
|
512
|
-
}
|
|
513
|
-
#zone.user-resizing .resize-handle {
|
|
579
|
+
#zone.user-resizing .split-bar {
|
|
514
580
|
background-color: var(--handle-active-colour);
|
|
581
|
+
transition: none;
|
|
582
|
+
animation: none !important;
|
|
515
583
|
}
|
|
516
584
|
}
|
|
517
585
|
|
package/dist/split-layout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"split-layout.js","names":["#elementBounds","#startSizeA","#startSizeB","#onResizeHandleUp","#onResizeHandleMove","#collapsedAPointerAtCollapse","#hysteresisThreshold","#dispatchCollapsedEvent","#applyConstraints","#collapsedBPointerAtCollapse","#cornerStartX","#cornerStartY","#getNestedSplit","#nestedSplitInitialSizeA","#nestedSplitBounds","#nestedHandleBounds","#onCornerResizeUp","#onCornerResizeMove","#parseSizeAsFraction","#pendingNestedUpdate","#applyPendingNestedUpdate","#observer","#setupNestedSplitObserver","#updateCornerPosition","#updateDataCollapsed","#checkForNestedSplit","#nestedSplit","#minSizeToFraction","#maxSizeToFraction","#parseSizeToPx","#getIntersectionPoint","#onCornerResizeDown","#onResizeHandleDown","customElement"],"sources":["../src/split-layout/split-layout.ts"],"sourcesContent":["import { clamp } from \"@ixfx/numbers\";\nimport { css, html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n// TODO: Fire event when panels have been resized\n/**\n * Lays out two elements within a container, with a bar to resize them\n * proportionally.\n *\n * Events\n * ixfx-split-collapsed: Dispatched when a panel is collapsed/uncollapsed via drag.\n * detail: { panel: 'A' | 'B', collapsed: boolean }\n *\n * Attributes\n * layout: `vertical`|`horizontal`\n * sizeA/B: CSS size of section A or B. Can use relative or absolute values\n * fixedA/B: If _true_ size will be calculated in pixels. By default (_false_) it uses % of whole\n * collapsible: If _true_, panels can be collapsed by dragging to edge (default: false)\n * minSizeA/B: Minimum size for panel A or B (e.g., \"100px\" or \"20%\"). Default: none\n * maxSizeA/B: Maximum size for panel A or B (e.g., \"200px\" or \"80%\"). Default: none\n *\n * CSS variables\n * --handle-size: 2px; // Width/height of resize handle\n * --handle-colour: var(--surface-5); // Colour of handle\n * --handle-hover-colour: var(--surface-6); // Colour of handle when hovering\n * --handle-active-colour: var(--accent); // Colour of handle when being used\n */\n@customElement(`ixfx-split-layout`)\nexport class SplitLayoutElement extends LitElement {\n @property({ type: String })\n layout: `vertical` | `horizontal` = `vertical`;\n\n @property({ type: String })\n sizeA = ``;\n\n @property({ type: String })\n sizeB = ``;\n\n @property({ type: Boolean })\n fixedA = false;\n\n @property({ type: Boolean })\n fixedB = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedA = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedB = false;\n\n @property({ type: String })\n minSizeA = ``;\n\n @property({ type: String })\n maxSizeA = ``;\n\n @property({ type: String })\n minSizeB = ``;\n\n @property({ type: String })\n maxSizeB = ``;\n\n @state()\n private _hasCorner = false;\n\n #elementBounds: DOMRect | undefined;\n #startSizeA = ``;\n #startSizeB = ``;\n #cornerStartX = 0;\n #cornerStartY = 0;\n #nestedSplitInitialSizeA = ``;\n\n #cornerZone: HTMLElement | undefined;\n #nestedSplit: SplitLayoutElement | undefined;\n #nestedSplitBounds: DOMRect | undefined;\n #nestedHandleBounds: DOMRect | undefined;\n #observer: MutationObserver | undefined;\n #pendingNestedUpdate: { sizeA: number; sizeB: number } | null = null;\n #collapsedAPointerAtCollapse: number | undefined;\n #collapsedBPointerAtCollapse: number | undefined;\n #hysteresisThreshold = 0.1;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n firstUpdated() {\n this.#setupNestedSplitObserver();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)\n || changedProperties.has(`collapsedA`) || changedProperties.has(`collapsedB`)) {\n this.#updateCornerPosition();\n }\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)) {\n this.#updateDataCollapsed();\n }\n }\n\n #updateDataCollapsed() {\n if (this.collapsedA) {\n this.setAttribute(`data-collapsed-a`, ``);\n } else {\n this.removeAttribute(`data-collapsed-a`);\n }\n if (this.collapsedB) {\n this.setAttribute(`data-collapsed-b`, ``);\n } else {\n this.removeAttribute(`data-collapsed-b`);\n }\n }\n\n #dispatchCollapsedEvent(panel: `A` | `B`, collapsed: boolean) {\n this.dispatchEvent(new CustomEvent(`ixfx-split-collapsed`, {\n detail: { panel, collapsed },\n bubbles: true,\n composed: true,\n }));\n }\n\n #setupNestedSplitObserver() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n this.#observer = new MutationObserver(() => {\n this.#checkForNestedSplit();\n });\n\n this.#observer.observe(slotA, { characterData: true, childList: true, subtree: true });\n this.#checkForNestedSplit();\n }\n\n #checkForNestedSplit() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n const assignedElements = slotA.assignedElements();\n\n const findNestedSplit = (elements: Element[]): SplitLayoutElement | undefined => {\n for (const el of elements) {\n if (el.tagName === `IXFX-SPLIT-LAYOUT`) {\n return el as SplitLayoutElement;\n }\n const nested = findNestedSplit(Array.from(el.children));\n if (nested)\n return nested;\n }\n return undefined;\n };\n\n const nestedSplit = findNestedSplit(assignedElements);\n\n if (nestedSplit) {\n this.#nestedSplit = nestedSplit;\n this._hasCorner = true;\n requestAnimationFrame(() => this.#updateCornerPosition());\n } else {\n this.#nestedSplit = undefined;\n this._hasCorner = false;\n }\n }\n\n #getNestedSplit(): SplitLayoutElement | undefined {\n if (this.#nestedSplit)\n return this.#nestedSplit;\n\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return undefined;\n const assignedElements = slotA.assignedElements();\n return assignedElements.find(\n el => el.tagName === `IXFX-SPLIT-LAYOUT`,\n ) as SplitLayoutElement | undefined;\n }\n\n #parseSizeAsFraction(size: string, total: number): number {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``)) / total;\n } else if (size.endsWith(`%`)) {\n return Number.parseFloat(size.replace(`%`, ``)) / 100;\n }\n return 0.5;\n }\n\n #parseSizeToPx(size: string, total: number): number | null {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``));\n } else if (size.endsWith(`%`)) {\n return (Number.parseFloat(size.replace(`%`, ``)) / 100) * total;\n }\n return null;\n }\n\n #applyConstraints(sizeA: string, sizeB: string, total: number): { sizeA: string; sizeB: string } {\n let fractionA = this.#parseSizeAsFraction(sizeA, total);\n let fractionB = this.#parseSizeAsFraction(sizeB, total);\n\n const minA = this.#minSizeToFraction(this.minSizeA, total);\n const minB = this.#minSizeToFraction(this.minSizeB, total);\n const maxA = this.#maxSizeToFraction(this.maxSizeA, total);\n const maxB = this.#maxSizeToFraction(this.maxSizeB, total);\n\n if (minA !== null || minB !== null) {\n const minSum = (minA ?? 0) + (minB ?? 0);\n if (minSum > 1) {\n const scale = 1 / minSum;\n if (minA !== null)\n minA !== null ? fractionA = minA * scale : fractionA = 0;\n if (minB !== null)\n minB !== null ? fractionB = minB * scale : fractionB = 0;\n }\n\n if (fractionA < (minA ?? 0))\n fractionA = minA ?? 0;\n if (fractionB < (minB ?? 0))\n fractionB = minB ?? 0;\n }\n\n if (maxA !== null) {\n if (fractionA > maxA)\n fractionA = maxA;\n }\n if (maxB !== null) {\n if (fractionB > maxB)\n fractionB = maxB;\n }\n\n fractionB = 1 - fractionA;\n\n const isPercentA = !this.sizeA.endsWith(`px`);\n const _isPercentB = !this.sizeB.endsWith(`px`);\n\n if (isPercentA) {\n return { sizeA: `${fractionA * 100}%`, sizeB: `${fractionB * 100}%` };\n } else {\n return { sizeA: `${fractionA * total}px`, sizeB: `${fractionB * total}px` };\n }\n }\n\n #minSizeToFraction(minSize: string, total: number): number | null {\n if (minSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(minSize, total);\n if (px !== null)\n return px / total;\n if (minSize.endsWith(`%`))\n return Number.parseFloat(minSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #maxSizeToFraction(maxSize: string, total: number): number | null {\n if (maxSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(maxSize, total);\n if (px !== null)\n return px / total;\n if (maxSize.endsWith(`%`))\n return Number.parseFloat(maxSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #getIntersectionPoint(): { x: number; y: number } | null {\n const outerBounds = this.getBoundingClientRect();\n const zoneEl = this.getZone();\n if (!zoneEl)\n return null;\n\n const nestedSplit = this.#getNestedSplit();\n if (!nestedSplit)\n return null;\n\n const _zoneBounds = zoneEl.getBoundingClientRect();\n\n const outerFraction = this.#parseSizeAsFraction(this.sizeA || `50%`, outerBounds.width);\n\n let x: number, y: number;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n x = outerFraction * outerBounds.width;\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.height);\n y = nestedFraction * outerBounds.height;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.width);\n x = nestedFraction * outerBounds.width;\n y = outerFraction * outerBounds.height;\n } else {\n return null;\n }\n\n return { x, y };\n }\n\n #updateCornerPosition() {\n if (!this._hasCorner)\n return;\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (!cornerZone)\n return;\n\n const zoneEl = this.getZone();\n if (!zoneEl)\n return;\n\n const intersection = this.#getIntersectionPoint();\n if (!intersection) {\n cornerZone.style.display = `none`;\n return;\n }\n\n const cornerX = intersection.x - 6;\n const cornerY = intersection.y - 6;\n\n cornerZone.style.left = `${cornerX}px`;\n cornerZone.style.top = `${cornerY}px`;\n cornerZone.style.display = `block`;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n cornerZone.style.cursor = `nwse-resize`;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n cornerZone.style.cursor = `nesw-resize`;\n }\n }\n }\n\n getZone(): HTMLElement | undefined {\n if (!this.shadowRoot)\n return;\n const el = this.shadowRoot.querySelector(`#zone`);\n if (!el)\n return undefined;\n return el as HTMLElement;\n }\n\n #onResizeHandleDown = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n this.#elementBounds = this.getBoundingClientRect();\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n window.addEventListener(`pointerup`, this.#onResizeHandleUp);\n window.addEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n window.removeEventListener(`pointerup`, this.#onResizeHandleUp);\n window.removeEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleMove = (event: PointerEvent) => {\n const bounds = this.#elementBounds;\n if (!bounds)\n return;\n\n const threshold = 5;\n\n if (this.layout === `horizontal`) {\n const y = event.y - bounds.y;\n const relativeY = clamp(y / bounds.height);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeY > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeY < threshold / bounds.height) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeY;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeY < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeY > (1 - threshold / bounds.height)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeY;\n }\n } else {\n const x = event.x - bounds.x;\n const relativeX = clamp(x / bounds.width);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeX > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeX < threshold / bounds.width) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeX;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeX < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeX > (1 - threshold / bounds.width)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeX;\n }\n }\n event.preventDefault();\n };\n\n #onCornerResizeDown = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n\n this.#elementBounds = this.getBoundingClientRect();\n this.#cornerStartX = event.clientX;\n this.#cornerStartY = event.clientY;\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n this.#nestedSplitInitialSizeA = nestedSplit.sizeA;\n const nestedBounds = nestedSplit.getBoundingClientRect();\n const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.resize-handle`) as HTMLElement;\n if (nestedHandle) {\n this.#nestedSplitBounds = nestedBounds;\n this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();\n }\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.add(`user-resizing`);\n }\n }\n\n window.addEventListener(`pointerup`, this.#onCornerResizeUp);\n window.addEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #onCornerResizeUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.remove(`user-resizing`);\n }\n }\n window.removeEventListener(`pointerup`, this.#onCornerResizeUp);\n window.removeEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #applyPendingNestedUpdate() {\n if (!this.#pendingNestedUpdate)\n return;\n const { sizeA, sizeB } = this.#pendingNestedUpdate;\n const nested = this.#getNestedSplit();\n if (nested) {\n nested.sizeA = `${sizeA * 100}%`;\n nested.sizeB = `${sizeB * 100}%`;\n }\n this.#pendingNestedUpdate = null;\n }\n\n #onCornerResizeMove = (event: PointerEvent) => {\n const outerBounds = this.#elementBounds;\n const zoneEl = this.getZone();\n const nestedSplit = this.#getNestedSplit();\n if (!outerBounds || !zoneEl || !nestedSplit)\n return;\n\n const zoneBounds = zoneEl.getBoundingClientRect();\n const cursorZoneLocalX = event.clientX - zoneBounds.left;\n const cursorZoneLocalY = event.clientY - zoneBounds.top;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n let newOuterFraction = cursorZoneLocalX / outerBounds.width;\n const newNestedFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.width,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.width);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const newNestedFraction = cursorZoneLocalX / outerBounds.width;\n let newOuterFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.height,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.height);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n }\n\n event.preventDefault();\n };\n\n render() {\n const sizePrefix = this.layout === `vertical` ? `width` : `height`;\n let sizeA = this.sizeA;\n let sizeB = this.sizeB;\n\n if (this.collapsedA) {\n sizeA = `0px`;\n } else if (sizeA.length === 0 && sizeB.length === 0) {\n sizeB = sizeA = `50%`;\n } else if (sizeA.length === 0) {\n sizeA = `auto`;\n } else if (sizeB.length === 0) {\n sizeB = `auto`;\n }\n\n if (this.collapsedB) {\n sizeB = `0px`;\n }\n\n sizeA = `${sizePrefix}:${sizeA}`;\n sizeB = `${sizePrefix}:${sizeB}`;\n\n return html`\n <div id=\"zone\">\n <slot style=${sizeA} name=\"a\"></slot>\n ${this._hasCorner ? html`<div class=\"corner-zone\" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}\n <div @pointerdown=${this.#onResizeHandleDown} class=\"resize-handle\"></div>\n <slot style=${sizeB} name=\"b\"></slot> \n </div>`;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n --handle-size: 2px;\n --handle-colour: var(--surface-5);\n --handle-hover-colour: var(--surface-6);\n --handle-active-colour: var(--accent);\n\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n * {\n box-sizing: border-box;\n }\n #zone {\n display: flex;\n height: 100%;\n position: relative;\n }\n slot {\n display: block;\n overflow: hidden;\n }\n :slotted(*) {\n width: 100%;\n height: 100%;\n }\n\n .resize-handle {\n background-color: var(--handle-colour);\n width: var(--handle-size);\n height: 100%;\n cursor: ew-resize;\n flex-shrink: 0;\n }\n #zone.user-resizing {\n slot {\n opacity: 0.5;\n }\n .resize-handle {\n background-color: var(--handle-active-colour);\n }\n }\n .resize-handle:hover {\n background-color: var(--handle-hover-colour);\n }\n\n .corner-zone {\n position: absolute;\n width: 12px;\n height: 12px;\n z-index: 10;\n border-radius: 50%;\n background: transparent;\n }\n .corner-zone:hover {\n background: transparent;\n }\n\n :host([layout='horizontal']) {\n #zone {\n flex-direction: column;\n }\n .resize-handle {\n background-color: silver;\n height: var(--handle-size);\n width: 100%;\n cursor: ns-resize;\n }\n .resize-handle:hover {\n background-color: var(--handle-hover-colour);\n }\n #zone.user-resizing .resize-handle {\n background-color: var(--handle-active-colour);\n }\n }\n\n :host([data-collapsed-a]) slot[name=\"a\"],\n :host([data-collapsed-b]) slot[name=\"b\"] {\n display: none;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-split-layout\": SplitLayoutElement;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"split-layout.js","names":["#elementBounds","#startSizeA","#startSizeB","#onResizeHandleUp","#onResizeHandleMove","#collapsedAPointerAtCollapse","#hysteresisThreshold","#dispatchCollapsedEvent","#applyConstraints","#collapsedBPointerAtCollapse","#cornerStartX","#cornerStartY","#getNestedSplit","#nestedSplitInitialSizeA","#nestedSplitBounds","#nestedHandleBounds","#onCornerResizeUp","#onCornerResizeMove","#parseSizeAsFraction","#pendingNestedUpdate","#applyPendingNestedUpdate","#observer","#setupNestedSplitObserver","#updateCornerPosition","#updateDataCollapsed","#checkForNestedSplit","#nestedSplit","#minSizeToFraction","#maxSizeToFraction","#parseSizeToPx","#getIntersectionPoint","#onCornerResizeDown","#onResizeHandleDown","customElement"],"sources":["../src/split-layout/split-layout.ts"],"sourcesContent":["import { clamp } from \"@ixfx/numbers\";\nimport { css, html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n// TODO: Fire event when panels have been resized\n/**\n * Lays out two elements within a container, with a bar to resize them\n * proportionally.\n *\n * Events\n * ixfx-split-collapsed: Dispatched when a panel is collapsed/uncollapsed via drag.\n * detail: { panel: 'A' | 'B', collapsed: boolean }\n *\n * Attributes\n * layout: `vertical`|`horizontal`\n * sizeA/B: CSS size of section A or B. Can use relative or absolute values\n * fixedA/B: If _true_ size will be calculated in pixels. By default (_false_) it uses % of whole\n * collapsible: If _true_, panels can be collapsed by dragging to edge (default: false)\n * minSizeA/B: Minimum size for panel A or B (e.g., \"100px\" or \"20%\"). Default: none\n * maxSizeA/B: Maximum size for panel A or B (e.g., \"200px\" or \"80%\"). Default: none\n *\n * CSS variables\n * --handle-size: 2px; // Width/height of split bar\n * --handle-colour: var(--surface-5); // Colour of handle\n * --handle-hover-colour: var(--surface-6); // Colour of handle when hovering\n * --handle-active-colour: var(--accent); // Colour of handle when being used\n * --handle-bg: var(--handle-colour); // Background of grab handle rectangle\n * --handle-grab-colour: var(--surface-muted-text); // Colour of grab handle dots\n * --handle-grab-dot-size: 3px; // Diameter of grab handle dots\n * --handle-grab-size: 16px; // Length of grab handle\n * --handle-grab-thickness: 8px; // Thickness of grab handle\n */\n@customElement(`ixfx-split-layout`)\nexport class SplitLayoutElement extends LitElement {\n @property({ type: String })\n layout: `vertical` | `horizontal` = `vertical`;\n\n @property({ type: String })\n sizeA = ``;\n\n @property({ type: String })\n sizeB = ``;\n\n @property({ type: Boolean })\n fixedA = false;\n\n @property({ type: Boolean })\n fixedB = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedA = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedB = false;\n\n @property({ type: String })\n minSizeA = ``;\n\n @property({ type: String })\n maxSizeA = ``;\n\n @property({ type: String })\n minSizeB = ``;\n\n @property({ type: String })\n maxSizeB = ``;\n\n @state()\n private _hasCorner = false;\n\n private get showGrabHandle(): boolean {\n const size = getComputedStyle(this).getPropertyValue(`--handle-size`).trim();\n const num = Number.parseFloat(size);\n return !Number.isNaN(num) && num > 3;\n }\n\n #elementBounds: DOMRect | undefined;\n #startSizeA = ``;\n #startSizeB = ``;\n #cornerStartX = 0;\n #cornerStartY = 0;\n #nestedSplitInitialSizeA = ``;\n\n #cornerZone: HTMLElement | undefined;\n #nestedSplit: SplitLayoutElement | undefined;\n #nestedSplitBounds: DOMRect | undefined;\n #nestedHandleBounds: DOMRect | undefined;\n #observer: MutationObserver | undefined;\n #pendingNestedUpdate: { sizeA: number; sizeB: number } | null = null;\n #collapsedAPointerAtCollapse: number | undefined;\n #collapsedBPointerAtCollapse: number | undefined;\n #hysteresisThreshold = 0.1;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n firstUpdated() {\n this.#setupNestedSplitObserver();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)\n || changedProperties.has(`collapsedA`) || changedProperties.has(`collapsedB`)) {\n this.#updateCornerPosition();\n }\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)) {\n this.#updateDataCollapsed();\n }\n }\n\n #updateDataCollapsed() {\n if (this.collapsedA) {\n this.setAttribute(`data-collapsed-a`, ``);\n } else {\n this.removeAttribute(`data-collapsed-a`);\n }\n if (this.collapsedB) {\n this.setAttribute(`data-collapsed-b`, ``);\n } else {\n this.removeAttribute(`data-collapsed-b`);\n }\n }\n\n #dispatchCollapsedEvent(panel: `A` | `B`, collapsed: boolean) {\n this.dispatchEvent(new CustomEvent(`ixfx-split-collapsed`, {\n detail: { panel, collapsed },\n bubbles: true,\n composed: true,\n }));\n }\n\n #setupNestedSplitObserver() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n this.#observer = new MutationObserver(() => {\n this.#checkForNestedSplit();\n });\n\n this.#observer.observe(slotA, { characterData: true, childList: true, subtree: true });\n this.#checkForNestedSplit();\n }\n\n #checkForNestedSplit() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n const assignedElements = slotA.assignedElements();\n\n const findNestedSplit = (elements: Element[]): SplitLayoutElement | undefined => {\n for (const el of elements) {\n if (el.tagName === `IXFX-SPLIT-LAYOUT`) {\n return el as SplitLayoutElement;\n }\n const nested = findNestedSplit(Array.from(el.children));\n if (nested)\n return nested;\n }\n return undefined;\n };\n\n const nestedSplit = findNestedSplit(assignedElements);\n\n if (nestedSplit) {\n this.#nestedSplit = nestedSplit;\n this._hasCorner = true;\n requestAnimationFrame(() => this.#updateCornerPosition());\n } else {\n this.#nestedSplit = undefined;\n this._hasCorner = false;\n }\n }\n\n #getNestedSplit(): SplitLayoutElement | undefined {\n if (this.#nestedSplit)\n return this.#nestedSplit;\n\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return undefined;\n const assignedElements = slotA.assignedElements();\n return assignedElements.find(\n el => el.tagName === `IXFX-SPLIT-LAYOUT`,\n ) as SplitLayoutElement | undefined;\n }\n\n #parseSizeAsFraction(size: string, total: number): number {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``)) / total;\n } else if (size.endsWith(`%`)) {\n return Number.parseFloat(size.replace(`%`, ``)) / 100;\n }\n return 0.5;\n }\n\n #parseSizeToPx(size: string, total: number): number | null {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``));\n } else if (size.endsWith(`%`)) {\n return (Number.parseFloat(size.replace(`%`, ``)) / 100) * total;\n }\n return null;\n }\n\n #applyConstraints(sizeA: string, sizeB: string, total: number): { sizeA: string; sizeB: string } {\n let fractionA = this.#parseSizeAsFraction(sizeA, total);\n let fractionB = this.#parseSizeAsFraction(sizeB, total);\n\n const minA = this.#minSizeToFraction(this.minSizeA, total);\n const minB = this.#minSizeToFraction(this.minSizeB, total);\n const maxA = this.#maxSizeToFraction(this.maxSizeA, total);\n const maxB = this.#maxSizeToFraction(this.maxSizeB, total);\n\n if (minA !== null || minB !== null) {\n const minSum = (minA ?? 0) + (minB ?? 0);\n if (minSum > 1) {\n const scale = 1 / minSum;\n if (minA !== null)\n minA !== null ? fractionA = minA * scale : fractionA = 0;\n if (minB !== null)\n minB !== null ? fractionB = minB * scale : fractionB = 0;\n }\n\n if (fractionA < (minA ?? 0))\n fractionA = minA ?? 0;\n if (fractionB < (minB ?? 0))\n fractionB = minB ?? 0;\n }\n\n if (maxA !== null) {\n if (fractionA > maxA)\n fractionA = maxA;\n }\n if (maxB !== null) {\n if (fractionB > maxB)\n fractionB = maxB;\n }\n\n fractionB = 1 - fractionA;\n\n const isPercentA = !this.sizeA.endsWith(`px`);\n const _isPercentB = !this.sizeB.endsWith(`px`);\n\n if (isPercentA) {\n return { sizeA: `${fractionA * 100}%`, sizeB: `${fractionB * 100}%` };\n } else {\n return { sizeA: `${fractionA * total}px`, sizeB: `${fractionB * total}px` };\n }\n }\n\n #minSizeToFraction(minSize: string, total: number): number | null {\n if (minSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(minSize, total);\n if (px !== null)\n return px / total;\n if (minSize.endsWith(`%`))\n return Number.parseFloat(minSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #maxSizeToFraction(maxSize: string, total: number): number | null {\n if (maxSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(maxSize, total);\n if (px !== null)\n return px / total;\n if (maxSize.endsWith(`%`))\n return Number.parseFloat(maxSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #getIntersectionPoint(): { x: number; y: number } | null {\n const outerBounds = this.getBoundingClientRect();\n const zoneEl = this.getZone();\n if (!zoneEl)\n return null;\n\n const nestedSplit = this.#getNestedSplit();\n if (!nestedSplit)\n return null;\n\n const _zoneBounds = zoneEl.getBoundingClientRect();\n\n const outerFraction = this.#parseSizeAsFraction(this.sizeA || `50%`, outerBounds.width);\n\n let x: number, y: number;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n x = outerFraction * outerBounds.width;\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.height);\n y = nestedFraction * outerBounds.height;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.width);\n x = nestedFraction * outerBounds.width;\n y = outerFraction * outerBounds.height;\n } else {\n return null;\n }\n\n return { x, y };\n }\n\n #updateCornerPosition() {\n if (!this._hasCorner)\n return;\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (!cornerZone)\n return;\n\n const zoneEl = this.getZone();\n if (!zoneEl)\n return;\n\n const intersection = this.#getIntersectionPoint();\n if (!intersection) {\n cornerZone.style.display = `none`;\n return;\n }\n\n const cornerX = intersection.x - 6;\n const cornerY = intersection.y - 6;\n\n cornerZone.style.left = `${cornerX}px`;\n cornerZone.style.top = `${cornerY}px`;\n cornerZone.style.display = `block`;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n cornerZone.style.cursor = `nwse-resize`;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n cornerZone.style.cursor = `nesw-resize`;\n }\n }\n }\n\n getZone(): HTMLElement | undefined {\n if (!this.shadowRoot)\n return;\n const el = this.shadowRoot.querySelector(`#zone`);\n if (!el)\n return undefined;\n return el as HTMLElement;\n }\n\n #onResizeHandleDown = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n this.#elementBounds = this.getBoundingClientRect();\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n window.addEventListener(`pointerup`, this.#onResizeHandleUp);\n window.addEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n window.removeEventListener(`pointerup`, this.#onResizeHandleUp);\n window.removeEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleMove = (event: PointerEvent) => {\n const bounds = this.#elementBounds;\n if (!bounds)\n return;\n\n const threshold = 5;\n\n if (this.layout === `horizontal`) {\n const y = event.y - bounds.y;\n const relativeY = clamp(y / bounds.height);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeY > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeY < threshold / bounds.height) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeY;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeY < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeY > (1 - threshold / bounds.height)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeY;\n }\n } else {\n const x = event.x - bounds.x;\n const relativeX = clamp(x / bounds.width);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeX > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeX < threshold / bounds.width) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeX;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeX < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeX > (1 - threshold / bounds.width)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeX;\n }\n }\n event.preventDefault();\n };\n\n #onCornerResizeDown = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n\n this.#elementBounds = this.getBoundingClientRect();\n this.#cornerStartX = event.clientX;\n this.#cornerStartY = event.clientY;\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n this.#nestedSplitInitialSizeA = nestedSplit.sizeA;\n const nestedBounds = nestedSplit.getBoundingClientRect();\n const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.split-bar`) as HTMLElement;\n if (nestedHandle) {\n this.#nestedSplitBounds = nestedBounds;\n this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();\n }\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.add(`user-resizing`);\n }\n }\n\n window.addEventListener(`pointerup`, this.#onCornerResizeUp);\n window.addEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #onCornerResizeUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.remove(`user-resizing`);\n }\n }\n window.removeEventListener(`pointerup`, this.#onCornerResizeUp);\n window.removeEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #applyPendingNestedUpdate() {\n if (!this.#pendingNestedUpdate)\n return;\n const { sizeA, sizeB } = this.#pendingNestedUpdate;\n const nested = this.#getNestedSplit();\n if (nested) {\n nested.sizeA = `${sizeA * 100}%`;\n nested.sizeB = `${sizeB * 100}%`;\n }\n this.#pendingNestedUpdate = null;\n }\n\n #onCornerResizeMove = (event: PointerEvent) => {\n const outerBounds = this.#elementBounds;\n const zoneEl = this.getZone();\n const nestedSplit = this.#getNestedSplit();\n if (!outerBounds || !zoneEl || !nestedSplit)\n return;\n\n const zoneBounds = zoneEl.getBoundingClientRect();\n const cursorZoneLocalX = event.clientX - zoneBounds.left;\n const cursorZoneLocalY = event.clientY - zoneBounds.top;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n let newOuterFraction = cursorZoneLocalX / outerBounds.width;\n const newNestedFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.width,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.width);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const newNestedFraction = cursorZoneLocalX / outerBounds.width;\n let newOuterFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.height,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.height);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n }\n\n event.preventDefault();\n };\n\n render() {\n const sizePrefix = this.layout === `vertical` ? `width` : `height`;\n let sizeA = this.sizeA;\n let sizeB = this.sizeB;\n\n if (this.collapsedA) {\n sizeA = `0px`;\n } else if (sizeA.length === 0 && sizeB.length === 0) {\n sizeB = sizeA = `50%`;\n } else if (sizeA.length === 0) {\n sizeA = `auto`;\n } else if (sizeB.length === 0) {\n sizeB = `auto`;\n }\n\n if (this.collapsedB) {\n sizeB = `0px`;\n }\n\n sizeA = `${sizePrefix}:${sizeA}`;\n sizeB = `${sizePrefix}:${sizeB}`;\n\n return html`\n <div id=\"zone\">\n <slot style=${sizeA} name=\"a\"></slot>\n ${this._hasCorner ? html`<div class=\"corner-zone\" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}\n <div @pointerdown=${this.#onResizeHandleDown} class=\"split-bar\">\n ${this.showGrabHandle\n ? html`\n <div class=\"grab-handle\">\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n </div>\n `\n : ``}\n </div>\n <slot style=${sizeB} name=\"b\"></slot>\n </div>`;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n --handle-size: 2px;\n --handle-colour: transparent;\n --handle-hover-colour: var(--surface-6);\n --handle-active-colour: var(--accent);\n --handle-bg: var(--handle-colour);\n --handle-grab-colour: var(--border-subtle-color);\n --handle-grab-dot-size: 3px;\n --handle-grab-size: 16px;\n --handle-grab-thickness: 8px;\n\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n * {\n box-sizing: border-box;\n }\n #zone {\n display: flex;\n height: 100%;\n position: relative;\n }\n slot {\n display: block;\n overflow: hidden;\n border: var(--border-subtle);\n border-radius: var(--radius-m);\n }\n :slotted(*) {\n width: 100%;\n height: 100%;\n }\n\n .split-bar {\n position: relative;\n background-color: var(--handle-colour);\n transition: background-color 0.3s ease 0s;\n width: var(--handle-size);\n height: 100%;\n cursor: ew-resize;\n flex-shrink: 0;\n border-radius: var(--radius-m);\n\n }\n\n @keyframes handle-hover {\n from { background-color: var(--handle-colour); }\n to { background-color: var(--handle-hover-colour); }\n }\n\n .grab-handle {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--handle-grab-dot-size);\n background: var(--handle-bg);\n border-radius: var(--radius-s);\n }\n\n .grab-handle .dot {\n width: var(--handle-grab-dot-size);\n height: var(--handle-grab-dot-size);\n border-radius: 50%;\n background: var(--handle-grab-colour);\n flex-shrink: 0;\n }\n\n :host([layout=\"vertical\"]) .grab-handle {\n flex-direction: column;\n width: var(--handle-grab-thickness);\n height: var(--handle-grab-size);\n }\n\n :host([layout=\"horizontal\"]) .grab-handle {\n flex-direction: row;\n width: var(--handle-grab-size);\n height: var(--handle-grab-thickness);\n }\n\n #zone.user-resizing .grab-handle {\n display: none;\n }\n #zone.user-resizing {\n slot {\n opacity: 0.5;\n }\n .split-bar {\n background-color: var(--handle-active-colour);\n transition: none;\n animation: none !important;\n }\n }\n\n #zone:not(.user-resizing) .split-bar:hover {\n animation: handle-hover 0.001s ease-out 0.7s both;\n }\n\n .corner-zone {\n position: absolute;\n width: 12px;\n height: 12px;\n z-index: 10;\n border-radius: 50%;\n background: transparent;\n }\n .corner-zone:hover {\n background: transparent;\n }\n\n :host([layout='horizontal']) {\n #zone {\n flex-direction: column;\n }\n .split-bar {\n position: relative;\n background-color: var(--handle-colour);\n transition: background-color 0.3s ease 0s;\n height: var(--handle-size);\n width: 100%;\n cursor: ns-resize;\n }\n #zone.user-resizing .split-bar {\n background-color: var(--handle-active-colour);\n transition: none;\n animation: none !important;\n }\n }\n\n :host([data-collapsed-a]) slot[name=\"a\"],\n :host([data-collapsed-b]) slot[name=\"b\"] {\n display: none;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-split-layout\": SplitLayoutElement;\n }\n}\n"],"mappings":"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"}
|
package/dist/style.css
CHANGED
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
--space-xl: 16px;
|
|
37
37
|
--space-2xl: 20px;
|
|
38
38
|
--border: 1px solid oklch(25% .02 240);
|
|
39
|
-
--border-subtle:
|
|
39
|
+
--border-subtle-color: oklch(18% .02 240);
|
|
40
|
+
--border-subtle: 1px solid var(--border-subtle-color);
|
|
40
41
|
--radius-s: 3px;
|
|
41
42
|
--radius-m: 4px;
|
|
42
43
|
--radius-l: 6px;
|
|
@@ -106,7 +107,8 @@
|
|
|
106
107
|
--error: oklch(55% .15 20);
|
|
107
108
|
--error-text: #fff;
|
|
108
109
|
--border: 1px solid oklch(80% .01 240);
|
|
109
|
-
--border-subtle:
|
|
110
|
+
--border-subtle-color: oklch(88% .01 240);
|
|
111
|
+
--border-subtle: 1px solid var(--border-subtle-color);
|
|
110
112
|
--shadow-m: 0 2px 8px #0000001a;
|
|
111
113
|
--shadow-l: 0 4px 16px #00000026;
|
|
112
114
|
--prominence-idle-opacity: .55;
|
package/dist/swipe.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-
|
|
1
|
+
import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-C-ra_1os.js";
|
|
2
2
|
import { CSSResultGroup, LitElement, html } from "lit";
|
|
3
|
+
|
|
3
4
|
//#region src/swipe/swipe.d.ts
|
|
4
5
|
type SwipeInputDetail = {
|
|
5
6
|
readonly value: number;
|
package/dist/swipe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swipe.d.ts","names":[],"sources":["../src/swipe/swipe.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"swipe.d.ts","names":[],"sources":["../src/swipe/swipe.ts"],"mappings":";;;;KAmCY,gBAAA;EAAA,SAA8B,KAAK;AAAA;AAAA,KACnC,eAAA,GAAkB,WAAW,CAAC,gBAAA;AAAA,UAEzB,oBAAA;EACf,KAAA,EAAO,eAAe;AAAA;AAAA,UAGP,YAAA;EACf,gBAAA,oBAAoC,oBAAA,EAClC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,oBAAA,CAAqB,CAAA,YAC3D,OAAA,aAAoB,uBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,uBAAA;AAAA;AAAA,QAIhB,MAAA;EAAA,UACI,qBAAA;IACR,YAAA,EAAc,YAAY;EAAA;AAAA;AAAA,cAAA,iBAAA;cAKjB,YAAA,SAAqB,iBAAA;EAAA;EACJ,UAAA;EACA,QAAA;EACA,UAAA;EACA,iBAAA;EAAA,QAEpB,OAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QACA,eAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,QACA,MAAA;EAAA,QACA,OAAA;EAAA,QAEA,UAAA;EAAA,QACA,cAAA;EAAA,QACA,gBAAA;EAAA,QACA,cAAA;EAAA,QACA,eAAA;EAzBoB;;;;;;;;EA0EnB,gBAAA,CAAiB,SAAA,EAAW,cAAA,EAAgB,KAAA,EAAO,UAAA;EAUnD,iBAAA;EAaA,oBAAA;EAAA,QAUD,cAAA;EAAA,QAcA,cAAA;EAAA,OAoFQ,MAAA,EAAQ,cAAA;EA8Bf,MAAA,IAAU,UAAA,QAAkB,IAAA;AAAA"}
|
package/dist/swipe.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as themeFallbacks } from "./fallbacks-
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
3
|
import { t as prominenceStyles } from "./prominence-DlFShic3.js";
|
|
4
|
-
import { t as WheelNudgeMixin } from "./wheel-nudge-
|
|
4
|
+
import { t as WheelNudgeMixin } from "./wheel-nudge-Dhzi5nHc.js";
|
|
5
5
|
import { LitElement, css, html, svg } from "lit";
|
|
6
6
|
import { property } from "lit/decorators.js";
|
|
7
7
|
//#region src/swipe/swipe.ts
|
|
@@ -166,8 +166,7 @@ let SwipeElement = class SwipeElement extends WheelNudgeMixin(LitElement) {
|
|
|
166
166
|
const x0 = cx - half;
|
|
167
167
|
const x1 = cx + half;
|
|
168
168
|
const colorVar = i % 2 === 0 ? `var(--swipe-color-a, var(--surface-4))` : `var(--swipe-color-b, var(--surface-5))`;
|
|
169
|
-
|
|
170
|
-
return svg`<path d=${d} style="fill:${colorVar}"></path>`;
|
|
169
|
+
return svg`<path d=${`M${x0},0 L${x1},0 L${x1 + off},${mid} L${x1},${h} L${x0},${h} L${x0 + off},${mid}Z`} style="fill:${colorVar}"></path>`;
|
|
171
170
|
})}`;
|
|
172
171
|
}
|
|
173
172
|
static {
|