@zag-js/splitter
Version:
Core logic for the splitter widget implemented as a state machine
87 lines (85 loc) • 3.08 kB
JavaScript
import "./chunk-QZ7TP4HQ.mjs";
// src/splitter.dom.ts
import { isHTMLElement, queryAll } from "@zag-js/dom-query";
var getRootId = (ctx) => ctx.ids?.root ?? `splitter:${ctx.id}`;
var getResizeTriggerId = (ctx, id) => ctx.ids?.resizeTrigger?.(id) ?? `splitter:${ctx.id}:splitter:${id}`;
var getLabelId = (ctx) => ctx.ids?.label ?? `splitter:${ctx.id}:label`;
var getPanelId = (ctx, id) => ctx.ids?.panel?.(id) ?? `splitter:${ctx.id}:panel:${id}`;
var getPanelEls = (ctx) => queryAll(getRootEl(ctx), `[data-part=panel][data-ownedby='${CSS.escape(getRootId(ctx))}']`);
var getGlobalCursorId = (ctx) => `splitter:${ctx.id}:global-cursor`;
var getRootEl = (ctx) => ctx.getById(getRootId(ctx));
var getResizeTriggerEl = (ctx, id) => id != null ? ctx.getById(getResizeTriggerId(ctx, id)) : null;
var getPanelEl = (ctx, id) => ctx.getById(getPanelId(ctx, id));
var getPanelIdFromEl = (el) => {
return isHTMLElement(el) && el.dataset.part === "panel" ? el.dataset.id : void 0;
};
var getPrevPanelId = (el) => {
let prev = el?.previousElementSibling ?? null;
while (prev) {
const id = getPanelIdFromEl(prev);
if (id) return id;
prev = prev.previousElementSibling;
}
};
var getNextPanelId = (el) => {
let next = el?.nextElementSibling ?? null;
while (next) {
const id = getPanelIdFromEl(next);
if (id) return id;
next = next.nextElementSibling;
}
};
var resolveResizeTriggerId = (ctx, id) => {
const [beforeId, afterId] = id.split(":");
if (beforeId && afterId) return id;
const triggerEl = getResizeTriggerEl(ctx, id);
const resolvedBeforeId = beforeId || getPrevPanelId(triggerEl);
const resolvedAfterId = afterId || getNextPanelId(triggerEl);
return resolvedBeforeId && resolvedAfterId ? `${resolvedBeforeId}:${resolvedAfterId}` : null;
};
var getCursor = (state, x) => {
let cursor = x ? "col-resize" : "row-resize";
if (state.isAtMin) cursor = x ? "e-resize" : "s-resize";
if (state.isAtMax) cursor = x ? "w-resize" : "n-resize";
return cursor;
};
var getResizeTriggerEls = (ctx) => {
return queryAll(getRootEl(ctx), `[role=separator][data-ownedby='${CSS.escape(getRootId(ctx))}']`);
};
var getGlobalCursorEl = (ctx) => {
return ctx.getDoc().getElementById(getGlobalCursorId(ctx));
};
var setupGlobalCursor = (ctx, state, x, nonce) => {
const styleEl = getGlobalCursorEl(ctx);
const textContent = `* { cursor: ${getCursor(state, x)} !important; }`;
if (styleEl) {
styleEl.textContent = textContent;
} else {
const style = ctx.getDoc().createElement("style");
if (nonce) style.nonce = nonce;
style.id = getGlobalCursorId(ctx);
style.textContent = textContent;
ctx.getDoc().head.appendChild(style);
}
};
var removeGlobalCursor = (ctx) => {
const styleEl = getGlobalCursorEl(ctx);
styleEl?.remove();
};
export {
getCursor,
getGlobalCursorEl,
getGlobalCursorId,
getLabelId,
getPanelEl,
getPanelEls,
getPanelId,
getResizeTriggerEl,
getResizeTriggerEls,
getResizeTriggerId,
getRootEl,
getRootId,
removeGlobalCursor,
resolveResizeTriggerId,
setupGlobalCursor
};