UNPKG

@zag-js/splitter

Version:

Core logic for the splitter widget implemented as a state machine

87 lines (85 loc) 3.08 kB
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 };