ember-primitives 0.60.1 → 0.61.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/declarations/components/resizable/state.d.ts +31 -0
- package/declarations/components/resizable/state.d.ts.map +1 -0
- package/declarations/components/resizable.d.ts +98 -0
- package/declarations/components/resizable.d.ts.map +1 -0
- package/declarations/dom-context.d.ts +6 -3
- package/declarations/dom-context.d.ts.map +1 -1
- package/declarations/index.d.ts +1 -0
- package/declarations/index.d.ts.map +1 -1
- package/dist/components/resizable/state.js +631 -0
- package/dist/components/resizable/state.js.map +1 -0
- package/dist/components/resizable.css +40 -0
- package/dist/components/resizable.js +82 -0
- package/dist/components/resizable.js.map +1 -0
- package/dist/dom-context.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/resizable/state.ts +815 -0
- package/src/components/resizable.css +40 -0
- package/src/components/resizable.gts +171 -0
- package/src/dom-context.gts +6 -3
- package/src/index.ts +5 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sources":["../../../src/components/resizable/state.ts"],"sourcesContent":["export type Orientation = 'horizontal' | 'vertical';\n\nconst GROUP_SELECTOR = '.ember-primitives__resizable';\nconst PANEL_CLASS = 'ember-primitives__resizable__panel';\nconst HANDLE_CLASS = 'ember-primitives__resizable__handle';\nconst MEMBER_SELECTOR = `.${PANEL_CLASS}, .${HANDLE_CLASS}`;\n\nconst DEFAULT_MIN = 0;\nconst DEFAULT_MAX = 100;\n\n/**\n * How far (in %) one keyboard arrow press moves a handle.\n * Holding Shift moves in coarser increments.\n */\nconst KEYBOARD_STEP = 1;\nconst KEYBOARD_STEP_COARSE = 10;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction numberAttribute(element: Element, name: string): number | undefined {\n const raw = element.getAttribute(name);\n\n if (raw === null) return undefined;\n\n const value = parseFloat(raw);\n\n return Number.isFinite(value) ? value : undefined;\n}\n\n/**\n * Panels declare their constraints in the DOM (via data attributes),\n * so the group can discover everything it needs with queries --\n * no registration required.\n */\nfunction minSizeOf(panel: Element): number {\n return numberAttribute(panel, 'data-min-size') ?? DEFAULT_MIN;\n}\n\nfunction maxSizeOf(panel: Element): number {\n return numberAttribute(panel, 'data-max-size') ?? DEFAULT_MAX;\n}\n\nfunction requestedSizeOf(panel: Element): number | undefined {\n return numberAttribute(panel, 'data-size');\n}\n\nfunction isCollapsible(panel: Element): boolean {\n return panel.hasAttribute('data-collapsible');\n}\n\nfunction sameMembers(a: HTMLElement[], b: HTMLElement[]): boolean {\n return a.length === b.length && a.every((element, index) => element === b[index]);\n}\n\nfunction precedes(a: Element, b: Element): boolean {\n return Boolean(b.compareDocumentPosition(a) & Node.DOCUMENT_POSITION_PRECEDING);\n}\n\n/**\n * The `data-collapsed` attribute is the source of truth for collapse\n * state (it is also the styling hook consumers use).\n */\nfunction isCollapsed(panel: HTMLElement): boolean {\n return isCollapsible(panel) && panel.hasAttribute('data-collapsed');\n}\n\nfunction setCollapsed(panel: HTMLElement, collapsed: boolean): void {\n if (collapsed === panel.hasAttribute('data-collapsed')) return;\n\n if (collapsed) {\n panel.setAttribute('data-collapsed', '');\n } else {\n panel.removeAttribute('data-collapsed');\n }\n}\n\n/**\n * The panels immediately before and after the given handle element,\n * in document order.\n */\nfunction neighborsOf(\n handleElement: HTMLElement,\n panels: HTMLElement[]\n): [HTMLElement | null, HTMLElement | null] {\n let prev: HTMLElement | null = null;\n let next: HTMLElement | null = null;\n\n for (const panel of panels) {\n const position = handleElement.compareDocumentPosition(panel);\n\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n prev = panel;\n } else if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n next = panel;\n\n break;\n }\n }\n\n return [prev, next];\n}\n\n/**\n * Sizes are floats that get re-derived (measurement, normalization),\n * so \"unchanged\" means within a small tolerance.\n */\nfunction isSameSize(existing: number | undefined, size: number): boolean {\n return existing !== undefined && Math.abs(existing - size) < 0.0001;\n}\n\n/**\n * Pixel measurements round to device pixels, so re-measuring a layout\n * yields values that differ from the stored ones by sub-pixel noise.\n * Only differences beyond this (in %) count as real drift worth\n * adopting -- re-encoding identical pixels as slightly different\n * percentages would dirty every panel for no visual change.\n */\nconst MEASUREMENT_TOLERANCE = 0.25;\n\n/**\n * Skips the write when the attribute already has the desired value,\n * so unchanged elements are left untouched.\n */\nfunction setAttribute(element: Element, name: string, value: string): void {\n if (element.getAttribute(name) !== value) {\n element.setAttribute(name, value);\n }\n}\n\ninterface Members {\n panels: HTMLElement[];\n handles: HTMLElement[];\n}\n\ninterface DragState {\n prev: HTMLElement;\n next: HTMLElement;\n startPrevSize: number;\n startNextSize: number;\n startCoordinate: number;\n /**\n * Total px occupied by the panels (excluding handles) at drag start,\n * used to convert px deltas to % deltas.\n */\n totalPx: number;\n members: Members;\n move: (event: PointerEvent) => void;\n end: (event: PointerEvent) => void;\n}\n\ninterface GroupOptions {\n orientation: () => Orientation | undefined;\n onLayoutChange: () => ((sizes: number[]) => void) | undefined;\n}\n\nexport class GroupState {\n element: HTMLElement | null = null;\n\n #options: GroupOptions;\n #drag: DragState | null = null;\n\n /**\n * Current size (%) per panel element.\n * The DOM is the source of truth for membership; this only remembers\n * sizes across relayouts.\n */\n #sizes = new Map<HTMLElement, number>();\n\n /**\n * The size (%) a collapsible panel had before it was collapsed,\n * so that expanding restores it.\n */\n #previousSizes = new WeakMap<HTMLElement, number>();\n\n /**\n * Membership as of the last layout, so mutation batches that don't\n * change membership (e.g. content changes inside a panel, or churn\n * within a nested group) can be ignored.\n */\n #knownPanels: HTMLElement[] = [];\n #knownHandles: HTMLElement[] = [];\n\n /**\n * The percentage that a flex-grow of 1 represents in this group.\n *\n * Panels without an inline style render at the CSS default\n * (`flex: 1 1 0px`), so an all-equal group needs no styles at all --\n * mounting one writes nothing. The unit is fixed the first time a\n * panel actually diverges, and from then on grow values are written\n * relative to it, so panels whose share doesn't change keep their\n * (possibly absent) style untouched.\n */\n #unit: number | null = null;\n\n constructor(options: GroupOptions) {\n this.#options = options;\n }\n\n get orientation(): Orientation {\n return this.#options.orientation() ?? 'horizontal';\n }\n\n get #isHorizontal(): boolean {\n return this.orientation === 'horizontal';\n }\n\n /**\n * This group's panels, in document order.\n * Panels of nested groups belong to their own group, not this one.\n */\n get panels(): HTMLElement[] {\n return this.#members().panels;\n }\n\n get handles(): HTMLElement[] {\n return this.#members().handles;\n }\n\n #members(): Members {\n const panels: HTMLElement[] = [];\n const handles: HTMLElement[] = [];\n const element = this.element;\n\n if (!element) return { panels, handles };\n\n for (const member of element.querySelectorAll<HTMLElement>(MEMBER_SELECTOR)) {\n if (member.closest(GROUP_SELECTOR) !== element) continue;\n\n (member.classList.contains(PANEL_CLASS) ? panels : handles).push(member);\n }\n\n return { panels, handles };\n }\n\n get sizes(): number[] {\n return this.panels.map((panel) => this.#sizes.get(panel) ?? 0);\n }\n\n /**\n * One MutationObserver for every group on the page. Each record is\n * routed to the group that owns it (the nearest group ancestor), so\n * churn inside a nested group never even pings its ancestors.\n */\n static #observed = new Map<HTMLElement, GroupState>();\n static #observer: MutationObserver | null = null;\n\n static #observerOptions: MutationObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-orientation'],\n // to distinguish real changes from same-value writes (see below)\n attributeOldValue: true,\n };\n\n static #handleMutations(mutations: MutationRecord[]): void {\n /**\n * true = the group's own data-orientation changed,\n * false = something in its subtree changed (membership check needed)\n */\n const affected = new Map<GroupState, boolean>();\n\n for (const mutation of mutations) {\n const target = mutation.target;\n\n if (!(target instanceof Element)) continue;\n\n if (mutation.type === 'attributes') {\n const group = GroupState.#observed.get(target as HTMLElement);\n\n /**\n * setAttribute queues a record even when the value is\n * unchanged (renderers do rewrite attributes with the same\n * value); only actual changes warrant a relayout.\n */\n const changed =\n mutation.attributeName &&\n mutation.oldValue !== target.getAttribute(mutation.attributeName);\n\n if (group && changed) affected.set(group, true);\n continue;\n }\n\n const groupElement = target.closest<HTMLElement>(GROUP_SELECTOR);\n const group = groupElement && GroupState.#observed.get(groupElement);\n\n if (group && !affected.has(group)) affected.set(group, false);\n }\n\n for (const [group, orientationChanged] of affected) {\n const members = group.#members();\n\n if (orientationChanged || group.#membershipChanged(members)) group.#layout(members);\n }\n }\n\n static #observe(element: HTMLElement, group: GroupState): void {\n GroupState.#observed.set(element, group);\n GroupState.#observer ??= new MutationObserver((mutations) =>\n GroupState.#handleMutations(mutations)\n );\n GroupState.#observer.observe(element, GroupState.#observerOptions);\n }\n\n static #unobserve(element: HTMLElement): void {\n GroupState.#observed.delete(element);\n\n const observer = GroupState.#observer;\n\n if (!observer) return;\n\n /**\n * MutationObserver has no per-target unobserve; disconnect and\n * re-observe the remaining groups (rare -- teardown only).\n */\n observer.disconnect();\n\n if (GroupState.#observed.size === 0) {\n GroupState.#observer = null;\n\n return;\n }\n\n for (const remaining of GroupState.#observed.keys()) {\n observer.observe(remaining, GroupState.#observerOptions);\n }\n }\n\n /**\n * Called (via modifier) when the group element is inserted.\n * Watches for panels being added/removed (and the orientation\n * changing) and performs the initial layout.\n */\n attach = (element: HTMLElement): (() => void) => {\n this.element = element;\n\n GroupState.#observe(element, this);\n\n this.#layout();\n\n return () => {\n GroupState.#unobserve(element);\n this.element = null;\n };\n };\n\n #membershipChanged(members: Members): boolean {\n return (\n !sameMembers(members.panels, this.#knownPanels) ||\n !sameMembers(members.handles, this.#knownHandles)\n );\n }\n\n /**\n * Panels that already have a size (or request one via `data-size`)\n * keep it; new panels take a share of the remaining space; everything\n * is normalized to 100.\n */\n #layout(members: Members = this.#members()): void {\n const { panels, handles } = members;\n\n if (this.#drag) this.#drag.members = members;\n\n this.#knownPanels = panels;\n this.#knownHandles = handles;\n\n if (panels.length === 0) return;\n\n let changed = false;\n\n // forget sizes of panels that left the DOM\n const current = new Set(panels);\n\n for (const known of this.#sizes.keys()) {\n if (!current.has(known)) {\n this.#sizes.delete(known);\n changed = true;\n }\n }\n\n // scratch space for the math below; #sizes itself is only\n // touched at the end, and only where values actually changed\n const computed = new Map<HTMLElement, number>();\n const unspecified: HTMLElement[] = [];\n let specifiedTotal = 0;\n\n for (const panel of panels) {\n const preferred = this.#sizes.get(panel) ?? requestedSizeOf(panel);\n\n if (preferred === undefined) {\n unspecified.push(panel);\n continue;\n }\n\n const size = isCollapsed(panel)\n ? preferred\n : clamp(preferred, minSizeOf(panel), maxSizeOf(panel));\n\n computed.set(panel, size);\n specifiedTotal += size;\n }\n\n if (unspecified.length > 0) {\n /**\n * Panels without a size share the remaining space.\n * When there is none left (e.g. a panel was added to an\n * already-full group), each takes an equal 1/n share and the\n * existing panels scale down to make room -- like a new window\n * opening in a tiling window manager.\n */\n const remaining = 100 - specifiedTotal;\n let share = remaining / unspecified.length;\n\n if (remaining < 1) {\n share = 100 / panels.length;\n\n if (specifiedTotal > 0) {\n const scale = Math.max(100 - share * unspecified.length, 0) / specifiedTotal;\n\n for (const [panel, size] of computed) {\n computed.set(panel, size * scale);\n }\n }\n }\n\n for (const panel of unspecified) {\n computed.set(panel, clamp(share, minSizeOf(panel), maxSizeOf(panel)));\n }\n }\n\n // normalize to 100\n let total = 0;\n\n for (const size of computed.values()) total += size;\n\n if (total > 0 && Math.abs(total - 100) > 0.01) {\n for (const [panel, size] of computed) {\n computed.set(panel, (size / total) * 100);\n }\n }\n\n /**\n * Commit minimally: keep the #sizes map, update only entries whose\n * value actually changed (with a small tolerance, so float dust\n * from re-normalizing doesn't count as a change).\n */\n const changedPanels: HTMLElement[] = [];\n\n for (const [panel, size] of computed) {\n if (!isSameSize(this.#sizes.get(panel), size)) {\n this.#sizes.set(panel, size);\n changedPanels.push(panel);\n changed = true;\n }\n }\n\n this.#apply(changedPanels, members);\n\n if (changed) this.#notify(panels);\n }\n\n /**\n * Writes the layout back to the DOM: flex sizing for exactly the\n * candidate panels whose rendered share would actually change, plus\n * the handles' ARIA attributes (which are guarded per-attribute).\n * (`data-collapsed` is managed at the explicit collapse/expand\n * points, not derived from sizes -- rendered pixel sizes include\n * borders/padding, so a collapsed panel rarely measures exactly 0.)\n */\n #apply(candidates: HTMLElement[], members: Members): void {\n /**\n * With no unit fixed yet, nothing has ever been written, so every\n * panel renders at the CSS default -- an equal 1/n share.\n */\n const unit = this.#unit ?? 100 / members.panels.length;\n\n for (const panel of candidates) {\n const size = this.#sizes.get(panel);\n\n if (size === undefined) continue;\n\n const inlineGrow = panel.style.flexGrow;\n const impliedPercent = (inlineGrow === '' ? 1 : parseFloat(inlineGrow)) * unit;\n\n if (isSameSize(impliedPercent, size)) continue;\n\n this.#unit ??= unit;\n panel.style.flex = `${size / unit} 1 0px`;\n }\n\n this.#syncHandles(members);\n }\n\n /**\n * Per the window-splitter pattern, each handle describes the panel\n * immediately before it. (A splitter between two side-by-side panes\n * is oriented *vertically*, and vice-versa.)\n */\n #syncHandles(members: Members): void {\n const { panels, handles } = members;\n const ariaOrientation = this.#isHorizontal ? 'vertical' : 'horizontal';\n\n let index = 0;\n\n for (const handle of handles) {\n let following = panels[index];\n\n while (following && precedes(following, handle)) {\n index++;\n following = panels[index];\n }\n\n const prev = panels[index - 1];\n\n setAttribute(handle, 'aria-orientation', ariaOrientation);\n\n if (!prev) continue;\n\n // Panels render their own (component-owned, incrementing) id\n if (prev.id) setAttribute(handle, 'aria-controls', prev.id);\n\n setAttribute(handle, 'aria-valuemin', `${minSizeOf(prev)}`);\n setAttribute(handle, 'aria-valuemax', `${maxSizeOf(prev)}`);\n setAttribute(handle, 'aria-valuenow', `${Math.round(this.#sizes.get(prev) ?? 0)}`);\n }\n }\n\n #notify(panels: HTMLElement[]): void {\n this.#options.onLayoutChange()?.(panels.map((panel) => this.#sizes.get(panel) ?? 0));\n }\n\n /**\n * Re-derive percentage sizes from actual rendered pixels.\n * Corrects any drift (e.g. from CSS min-sizes) before an interaction.\n */\n #syncSizesFromDOM(panels: HTMLElement[], measured?: number[]): void {\n // collapsed panels are 0 even though their borders/padding measure larger\n const px = panels.map((panel, index) =>\n isCollapsed(panel) ? 0 : (measured?.[index] ?? this.#pixelSizeOf(panel))\n );\n const total = px.reduce((sum, value) => sum + value, 0);\n\n if (total <= 0) return;\n\n panels.forEach((panel, index) => {\n const size = ((px[index] ?? 0) / total) * 100;\n const existing = this.#sizes.get(panel);\n\n if (existing === undefined || Math.abs(existing - size) > MEASUREMENT_TOLERANCE) {\n this.#sizes.set(panel, size);\n }\n });\n }\n\n #pixelSizeOf(panel: HTMLElement): number {\n const box = panel.getBoundingClientRect();\n\n return this.#isHorizontal ? box.width : box.height;\n }\n\n /**\n * Moves the boundary between the two panels by `requestedDelta` (%),\n * respecting both panels' min/max constraints.\n */\n #applyDelta(\n prev: HTMLElement,\n next: HTMLElement,\n basePrevSize: number,\n baseNextSize: number,\n requestedDelta: number,\n members: Members\n ): void {\n const total = basePrevSize + baseNextSize;\n const prevMin = minSizeOf(prev);\n const prevMax = maxSizeOf(prev);\n const prevCollapsible = isCollapsible(prev);\n\n let target = basePrevSize + requestedDelta;\n\n if (prevCollapsible && target < prevMin) {\n /**\n * Collapsible panels snap: below half the minimum they close\n * entirely; between half and the minimum they hold at the minimum.\n * (This also keeps a collapsed panel closed when its handle is\n * dragged further in the closing direction.)\n */\n target = target < prevMin / 2 ? 0 : prevMin;\n } else {\n target = clamp(target, prevMin, prevMax);\n }\n\n /**\n * The neighbor absorbs whatever the target panel gives or takes,\n * so its constraints bound the target too.\n */\n const nextMin = total - maxSizeOf(next);\n const nextMax = total - minSizeOf(next);\n\n if (nextMin > nextMax) return;\n\n target = clamp(target, nextMin, nextMax);\n\n // both panels' constraints cannot be satisfied at once\n if (!prevCollapsible && (target < prevMin || target > prevMax)) return;\n\n /**\n * Nothing to do when the clamped result matches the current sizes\n * (e.g. every pointermove past a min/max limit).\n */\n if (\n isSameSize(this.#sizes.get(prev), target) &&\n isSameSize(this.#sizes.get(next), total - target)\n ) {\n return;\n }\n\n if (prevCollapsible) {\n if (target === 0 && !isCollapsed(prev)) {\n this.#previousSizes.set(prev, basePrevSize);\n }\n\n setCollapsed(prev, target === 0);\n }\n\n this.#sizes.set(prev, target);\n this.#sizes.set(next, total - target);\n\n this.#apply([prev, next], members);\n this.#notify(members.panels);\n }\n\n startDrag(handleElement: HTMLElement, event: PointerEvent): void {\n if (event.button !== 0) return;\n if (this.#drag) return;\n\n const members = this.#members();\n const [prev, next] = neighborsOf(handleElement, members.panels);\n\n if (!prev || !next) return;\n\n const measured = members.panels.map((panel) => this.#pixelSizeOf(panel));\n\n this.#syncSizesFromDOM(members.panels, measured);\n\n const move = (moveEvent: PointerEvent) => this.#dragMove(moveEvent);\n const end = (endEvent: PointerEvent) => this.#endDrag(handleElement, endEvent);\n\n this.#drag = {\n prev,\n next,\n startPrevSize: this.#sizes.get(prev) ?? 0,\n startNextSize: this.#sizes.get(next) ?? 0,\n startCoordinate: this.#isHorizontal ? event.clientX : event.clientY,\n totalPx: measured.reduce((sum, value) => sum + value, 0),\n members,\n move,\n end,\n };\n\n try {\n /**\n * Retargets all subsequent pointer events to the handle,\n * even when the pointer is over an iframe.\n */\n handleElement.setPointerCapture(event.pointerId);\n } catch {\n // synthetic events (tests) may not have an active pointer\n }\n\n handleElement.addEventListener('pointermove', move);\n handleElement.addEventListener('pointerup', end);\n handleElement.addEventListener('pointercancel', end);\n handleElement.setAttribute('data-resizing', '');\n\n document.body.style.cursor = this.#isHorizontal ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }\n\n #dragMove(event: PointerEvent): void {\n const drag = this.#drag;\n\n if (!drag) return;\n if (drag.totalPx <= 0) return;\n\n const coordinate = this.#isHorizontal ? event.clientX : event.clientY;\n const deltaPercent = ((coordinate - drag.startCoordinate) / drag.totalPx) * 100;\n\n this.#applyDelta(\n drag.prev,\n drag.next,\n drag.startPrevSize,\n drag.startNextSize,\n deltaPercent,\n drag.members\n );\n }\n\n #endDrag(handleElement: HTMLElement, event: PointerEvent): void {\n const drag = this.#drag;\n\n if (!drag) return;\n\n this.#drag = null;\n\n try {\n handleElement.releasePointerCapture(event.pointerId);\n } catch {\n // may not have been captured (tests)\n }\n\n handleElement.removeEventListener('pointermove', drag.move);\n handleElement.removeEventListener('pointerup', drag.end);\n handleElement.removeEventListener('pointercancel', drag.end);\n handleElement.removeAttribute('data-resizing');\n\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n\n /**\n * Keyboard support for the WAI-ARIA window-splitter pattern.\n */\n handleKeyDown(handleElement: HTMLElement, event: KeyboardEvent): void {\n const members = this.#members();\n const [prev, next] = neighborsOf(handleElement, members.panels);\n\n if (!prev || !next) return;\n\n if (event.key === 'Enter') {\n this.#toggleCollapse(prev, next, members);\n\n return;\n }\n\n const step = event.shiftKey ? KEYBOARD_STEP_COARSE : KEYBOARD_STEP;\n const isHorizontal = this.#isHorizontal;\n\n let toDelta: ((prevSize: number) => number) | null = null;\n\n switch (event.key) {\n case 'ArrowLeft':\n if (isHorizontal) toDelta = () => -step;\n\n break;\n case 'ArrowRight':\n if (isHorizontal) toDelta = () => step;\n\n break;\n case 'ArrowUp':\n if (!isHorizontal) toDelta = () => -step;\n\n break;\n case 'ArrowDown':\n if (!isHorizontal) toDelta = () => step;\n\n break;\n case 'Home':\n toDelta = (prevSize) => minSizeOf(prev) - prevSize;\n\n break;\n case 'End':\n toDelta = (prevSize) => maxSizeOf(prev) - prevSize;\n\n break;\n }\n\n if (!toDelta) return;\n\n event.preventDefault();\n\n this.#syncSizesFromDOM(members.panels);\n\n const prevSize = this.#sizes.get(prev) ?? 0;\n\n this.#applyDelta(prev, next, prevSize, this.#sizes.get(next) ?? 0, toDelta(prevSize), members);\n }\n\n /**\n * Collapses (or restores) the panel before the handle,\n * giving the space to (or taking it from) the panel after it.\n *\n * Only does anything when the preceding panel is `@collapsible`.\n */\n #toggleCollapse(prev: HTMLElement, next: HTMLElement, members: Members): void {\n if (!isCollapsible(prev)) return;\n\n this.#syncSizesFromDOM(members.panels);\n\n const prevSize = this.#sizes.get(prev) ?? 0;\n const nextSize = this.#sizes.get(next) ?? 0;\n\n if (isCollapsed(prev)) {\n const preferred =\n this.#previousSizes.get(prev) ?? requestedSizeOf(prev) ?? Math.max(minSizeOf(prev), 10);\n const available = nextSize - minSizeOf(next);\n const restored = Math.min(preferred, available);\n\n if (restored <= 0) return;\n\n setCollapsed(prev, false);\n this.#sizes.set(prev, restored);\n this.#sizes.set(next, nextSize - restored);\n } else {\n this.#previousSizes.set(prev, prevSize);\n setCollapsed(prev, true);\n this.#sizes.set(prev, 0);\n this.#sizes.set(next, nextSize + prevSize);\n }\n\n this.#apply([prev, next], members);\n this.#notify(members.panels);\n }\n}\n"],"names":["GROUP_SELECTOR","PANEL_CLASS","HANDLE_CLASS","MEMBER_SELECTOR","DEFAULT_MIN","DEFAULT_MAX","KEYBOARD_STEP","KEYBOARD_STEP_COARSE","clamp","value","min","max","Math","numberAttribute","element","name","raw","getAttribute","undefined","parseFloat","Number","isFinite","minSizeOf","panel","maxSizeOf","requestedSizeOf","isCollapsible","hasAttribute","sameMembers","a","b","length","every","index","precedes","Boolean","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","isCollapsed","setCollapsed","collapsed","setAttribute","removeAttribute","neighborsOf","handleElement","panels","prev","next","position","DOCUMENT_POSITION_FOLLOWING","isSameSize","existing","size","abs","MEASUREMENT_TOLERANCE","GroupState","Map","WeakMap","constructor","options","orientation","#isHorizontal","handles","#members","member","querySelectorAll","closest","classList","contains","push","sizes","map","get","childList","subtree","attributes","attributeFilter","attributeOldValue","#handleMutations","mutations","affected","mutation","target","Element","type","group","changed","attributeName","oldValue","set","groupElement","has","orientationChanged","members","#observe","MutationObserver","observe","#unobserve","delete","observer","disconnect","remaining","keys","attach","#membershipChanged","#layout","current","Set","known","computed","unspecified","specifiedTotal","preferred","share","scale","total","values","changedPanels","#apply","candidates","unit","inlineGrow","style","flexGrow","impliedPercent","flex","#syncHandles","ariaOrientation","handle","following","id","round","#notify","onLayoutChange","#syncSizesFromDOM","measured","px","reduce","sum","forEach","#pixelSizeOf","box","getBoundingClientRect","width","height","#applyDelta","basePrevSize","baseNextSize","requestedDelta","prevMin","prevMax","prevCollapsible","nextMin","nextMax","startDrag","event","button","move","moveEvent","end","endEvent","startPrevSize","startNextSize","startCoordinate","clientX","clientY","totalPx","setPointerCapture","pointerId","addEventListener","document","body","cursor","userSelect","#dragMove","drag","coordinate","deltaPercent","#endDrag","releasePointerCapture","removeEventListener","handleKeyDown","key","step","shiftKey","isHorizontal","toDelta","prevSize","preventDefault","#toggleCollapse","nextSize","available","restored"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
.ember-primitives__resizable {
|
|
2
|
+
display: flex;
|
|
3
|
+
width: 100%;
|
|
4
|
+
height: 100%;
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.ember-primitives__resizable[data-orientation="horizontal"] {
|
|
9
|
+
flex-direction: row;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.ember-primitives__resizable[data-orientation="vertical"] {
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.ember-primitives__resizable__panel {
|
|
17
|
+
/* until the group assigns sizes, share space equally */
|
|
18
|
+
flex: 1 1 0px;
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
min-width: 0;
|
|
21
|
+
min-height: 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.ember-primitives__resizable__handle {
|
|
25
|
+
flex: 0 0 auto;
|
|
26
|
+
position: relative;
|
|
27
|
+
touch-action: none;
|
|
28
|
+
user-select: none;
|
|
29
|
+
-webkit-user-select: none;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.ember-primitives__resizable__handle[data-orientation="horizontal"] {
|
|
33
|
+
width: 0.5rem;
|
|
34
|
+
cursor: col-resize;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.ember-primitives__resizable__handle[data-orientation="vertical"] {
|
|
38
|
+
height: 0.5rem;
|
|
39
|
+
cursor: row-resize;
|
|
40
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import "./resizable.css"
|
|
2
|
+
import Component from '@glimmer/component';
|
|
3
|
+
import { on } from '@ember/modifier';
|
|
4
|
+
import { modifier } from 'ember-modifier';
|
|
5
|
+
import { Consume, Provide } from '../dom-context.js';
|
|
6
|
+
import { GroupState } from './resizable/state.js';
|
|
7
|
+
import { precompileTemplate } from '@ember/template-compilation';
|
|
8
|
+
import { setComponentTemplate } from '@ember/component';
|
|
9
|
+
import templateOnly from '@ember/component/template-only';
|
|
10
|
+
|
|
11
|
+
;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A resizable region within a `<Resizable>` group.
|
|
15
|
+
*
|
|
16
|
+
* Panels declare their constraints as data attributes, so the group
|
|
17
|
+
* discovers them with DOM queries -- there is no registration, and a
|
|
18
|
+
* Panel may contain another `<Resizable>` to nest layouts.
|
|
19
|
+
*/
|
|
20
|
+
let panelId = 0;
|
|
21
|
+
function nextPanelId() {
|
|
22
|
+
return `ember-primitives__resizable__panel--${panelId++}`;
|
|
23
|
+
}
|
|
24
|
+
const Panel = setComponentTemplate(precompileTemplate("<div class=\"ember-primitives__resizable__panel\" data-min-size={{@minSize}} data-max-size={{@maxSize}} data-size={{@size}} data-collapsible={{if @collapsible \"true\"}} ...attributes {{!-- after ...attributes: the id is component-owned (the handles'\n aria-controls depends on it being present and unique) --}} id={{(nextPanelId)}}>\n {{yield}}\n</div>", {
|
|
25
|
+
strictMode: true,
|
|
26
|
+
scope: () => ({
|
|
27
|
+
nextPanelId
|
|
28
|
+
})
|
|
29
|
+
}), templateOnly());
|
|
30
|
+
function onPointerDown(state) {
|
|
31
|
+
return event => state.startDrag(event.currentTarget, event);
|
|
32
|
+
}
|
|
33
|
+
function onKeyDown(state) {
|
|
34
|
+
return event => state.handleKeyDown(event.currentTarget, event);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The draggable (and keyboard-operable) divider between two Panels.
|
|
38
|
+
*
|
|
39
|
+
* Follows the WAI-ARIA window-splitter pattern, and controls the Panel
|
|
40
|
+
* immediately before it. Finds its group via DOM context, so it must be
|
|
41
|
+
* rendered inside a `<Resizable>`.
|
|
42
|
+
*
|
|
43
|
+
* Give each handle an accessible name (e.g. `aria-label="Resize sidebar"`).
|
|
44
|
+
*/
|
|
45
|
+
const Handle = setComponentTemplate(precompileTemplate("<Consume @key={{GroupState}} as |ctx|>\n <div class=\"ember-primitives__resizable__handle\" role=\"separator\" tabindex=\"0\" data-orientation={{ctx.data.orientation}} {{on \"pointerdown\" (onPointerDown ctx.data)}} {{on \"keydown\" (onKeyDown ctx.data)}} ...attributes>\n {{yield}}\n </div>\n</Consume>", {
|
|
46
|
+
strictMode: true,
|
|
47
|
+
scope: () => ({
|
|
48
|
+
Consume,
|
|
49
|
+
GroupState,
|
|
50
|
+
on,
|
|
51
|
+
onPointerDown,
|
|
52
|
+
onKeyDown
|
|
53
|
+
})
|
|
54
|
+
}), templateOnly());
|
|
55
|
+
/**
|
|
56
|
+
* A group of resizable panels, separated by draggable handles.
|
|
57
|
+
*
|
|
58
|
+
* Render `<Panel>` and `<Handle>` components inside -- they are their
|
|
59
|
+
* own imports, and find the group via DOM context / DOM queries.
|
|
60
|
+
*
|
|
61
|
+
* Groups can be nested (a `<Resizable>` inside a Panel) to build
|
|
62
|
+
* tree-shaped tiling layouts, i3 / tmux style.
|
|
63
|
+
*/
|
|
64
|
+
class Resizable extends Component {
|
|
65
|
+
state = new GroupState({
|
|
66
|
+
orientation: () => this.args.orientation,
|
|
67
|
+
onLayoutChange: () => this.args.onLayoutChange
|
|
68
|
+
});
|
|
69
|
+
attach = modifier(element => this.state.attach(element));
|
|
70
|
+
static {
|
|
71
|
+
setComponentTemplate(precompileTemplate("<div class=\"ember-primitives__resizable\" data-orientation={{this.state.orientation}} {{this.attach}} ...attributes>\n <Provide @data={{this.state}} @key={{GroupState}}>\n {{yield}}\n </Provide>\n</div>", {
|
|
72
|
+
strictMode: true,
|
|
73
|
+
scope: () => ({
|
|
74
|
+
Provide,
|
|
75
|
+
GroupState
|
|
76
|
+
})
|
|
77
|
+
}), this);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { Handle, Panel, Resizable };
|
|
82
|
+
//# sourceMappingURL=resizable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizable.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/dom-context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-context.js","sources":["../src/dom-context.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { cached, tracked } from \"@glimmer/tracking\";\nimport { assert } from \"@ember/debug\";\n\nimport { isElement } from \"./narrowing.ts\";\nimport { createStore } from \"./store.ts\";\n\nimport type { Newable } from \"./type-utils\";\nimport type Owner from \"@ember/owner\";\n\n/**\n * IMPLEMENTATION NOTE:\n * we don't use https://github.com/webcomponents-cg/community-protocols/blob/main/proposals/context.md\n * because it is not inherently reactive.\n *\n * Its *event* based, which opts you out of fine-grained reactivity.\n * We want minimal effort fine-grained reactivity.\n *\n * This Technique follows the DOM tree, and is synchronous,\n * allowing correct fine-grained signals-based reactivity.\n *\n * We *could* do less work to find Providers,\n * but only if we forgoe DOM-tree scoping.\n * We must traverse the DOM hierarchy to validate that we aren't accessing providers from different subtrees.\n */\nconst LOOKUP = new WeakMap<Text | Element, [unknown, () => unknown]>();\n\nexport class Provide<Data extends object> extends Component<{\n /**\n * The Element is not customizable\n * (and also sometimes doesn't exist (depending on the `@element` value))\n */\n Element: null;\n Args: {\n /**\n * What data do you want to provide to the DOM subtree?\n *\n * If this is a function or class, it will be instantiated and given an\n * owner + destroyable linkage via `createStore`\n */\n data: Data | (() => Data) | Newable<Data>;\n\n /**\n * Optionally, you may use string-based keys to reference the data in the Provide.\n *\n * This is not recommended though, because when using a class or other object-like structure,\n * the type in the `<Consume>` component can be derived from that class or object-like structure.\n * With string keys, the `<Consume>` type will be unknown.\n */\n key?: string;\n\n /**\n * Can be used to either customize the element tag ( defaults to div )\n * If set to `false`, we won't use an element for the Provider boundary.\n *\n * Setting this to `false` changes the DOM Node containing the Provider's data to be a text node -- which can be useful when certain CSS situations are needed.\n *\n * But setting to `false` has a hazard: it allows subsequent sibling subtrees to access adjacent providers.\n *\n * There is no way around caveat in library land, and in a framework implementation of context,\n * it can only be solved by having render-tree context implemented, and ignoring DOM\n * (which then makes the only difference between DOM-Context and Context be whether or not\n * the context punches through Portals)\n */\n element?: keyof HTMLElementTagNameMap | false | undefined;\n };\n Blocks: {\n /**\n * The content that this component will _provide_ data to the entire hierarchy.\n */\n default: [];\n };\n}> {\n get data() {\n assert(`@data is missing in <Provide>. Please pass @data.`, \"data\" in this.args);\n\n /**\n * This covers both classes and functions\n */\n if (typeof this.args.data === \"function\") {\n return createStore<Data>(this, this.args.data);\n }\n\n /**\n * Non-instantiable value\n */\n return this.args.data;\n }\n\n element: Text | HTMLElement;\n\n constructor(\n owner: Owner,\n args: {\n data: Data | (() => Data) | Newable<Data>;\n key?: string;\n },\n ) {\n super(owner, args);\n\n assert(\n `@element may only be \\`false\\` or a string (or undefined (default when not set))`,\n this.args.element === undefined ||\n this.args.element === false ||\n typeof this.args.element === \"string\",\n );\n\n if (this.useElementProvider) {\n this.element = document.createElement(this.args.element || \"div\");\n\n // This tells the browser to ignore everything about this element when it comes to styling\n this.element.style.display = \"contents\";\n } else {\n this.element = document.createTextNode(\"\");\n }\n\n const key = this.args.key ?? this.args.data;\n\n LOOKUP.set(this.element, [key, () => this.data]);\n }\n\n get useElementProvider() {\n return this.args.element !== false;\n }\n\n <template>\n {{#if (isElement this.element)}}\n {{this.element}}\n\n {{#in-element this.element}}\n {{yield}}\n {{/in-element}}\n\n {{else}}\n {{! NOTE! This type of provider will _allow_ non-descendents using the same key to find the provider and use it.\n\n For example:\n Provider\n Consumer\n\n Consumer (finds Provider)\n }}\n\n {{this.element}}\n {{yield}}\n\n {{/if}}\n </template>\n}\n\n/**\n * How this works:\n * - starting at some deep node (Text, Element, whatever),\n * start crawling up the ancenstry graph (of DOM Nodes).\n *\n * - This algo \"tops out\" (since we traverse upwards (otherwise this would be \"bottoming out\")) at the HTMLDocument (parent of the HTML Tag)\n *\n */\nfunction findForKey<Data>(startElement: Text, key: string | object): undefined | (() => Data) {\n let parent: ParentNode | Text | null | undefined = startElement;\n\n while (parent) {\n let target: ParentNode | ChildNode | Text | null | undefined = parent;\n\n while (target) {\n if (!(target instanceof Element) && !(target instanceof Text)) {\n target = target?.previousSibling;\n continue;\n }\n\n const maybe = LOOKUP.get(target);\n\n target = target?.previousSibling;\n\n if (!maybe) {\n continue;\n }\n\n if (maybe[0] === key) {\n return maybe[1] as () => Data;\n }\n }\n\n parent = parent.parentElement;\n }\n}\n\ntype DataForKey<Key> = Key extends string\n ? unknown\n : Key extends Newable<infer T>\n ? T\n : Key extends () => infer T\n ? T\n : Key;\n\nexport class Consume<Key extends object | string> extends Component<{\n Args: {\n key: Key;\n };\n Blocks: {\n default: [\n context: {\n data: DataForKey<Key>;\n },\n ];\n };\n}> {\n // SAFETY: We do a runtime assert in the getter below.\n @tracked getData!: () => DataForKey<Key>;\n\n element: Text;\n\n constructor(owner: Owner, args: { key: Key }) {\n super(owner, args);\n\n this.element = document.createTextNode(\"\");\n }\n\n @cached\n get context() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n return {\n get data(): DataForKey<Key> {\n const getData = findForKey<Key>(self.element, self.args.key);\n\n assert(\n `Could not find provided context in <Consume>. Please assure that there is a corresponding <Provide> component before using this <Consume> component`,\n getData,\n );\n\n // SAFETY: return type handled by getter's signature\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return getData() as any;\n },\n };\n }\n\n <template>\n {{this.element}}\n\n {{yield this.context}}\n </template>\n}\n"],"names":["LOOKUP","WeakMap","Provide","Component","data","assert","args","createStore","element","constructor","owner","undefined","useElementProvider","document","createElement","style","display","createTextNode","key","set","setComponentTemplate","precompileTemplate","strictMode","scope","isElement","findForKey","startElement","parent","target","Element","Text","previousSibling","maybe","get","parentElement","Consume","tracked","i","context","self","getData","n","prototype","cached"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dom-context.js","sources":["../src/dom-context.gts"],"sourcesContent":["import Component from \"@glimmer/component\";\nimport { cached, tracked } from \"@glimmer/tracking\";\nimport { assert } from \"@ember/debug\";\n\nimport { isElement } from \"./narrowing.ts\";\nimport { createStore } from \"./store.ts\";\n\nimport type { Newable } from \"./type-utils\";\nimport type Owner from \"@ember/owner\";\n\n/**\n * IMPLEMENTATION NOTE:\n * we don't use https://github.com/webcomponents-cg/community-protocols/blob/main/proposals/context.md\n * because it is not inherently reactive.\n *\n * Its *event* based, which opts you out of fine-grained reactivity.\n * We want minimal effort fine-grained reactivity.\n *\n * This Technique follows the DOM tree, and is synchronous,\n * allowing correct fine-grained signals-based reactivity.\n *\n * We *could* do less work to find Providers,\n * but only if we forgoe DOM-tree scoping.\n * We must traverse the DOM hierarchy to validate that we aren't accessing providers from different subtrees.\n */\nconst LOOKUP = new WeakMap<Text | Element, [unknown, () => unknown]>();\n\nexport class Provide<Data extends object> extends Component<{\n /**\n * The Element is not customizable\n * (and also sometimes doesn't exist (depending on the `@element` value))\n */\n Element: null;\n Args: {\n /**\n * What data do you want to provide to the DOM subtree?\n *\n * If this is a function or class, it will be instantiated and given an\n * owner + destroyable linkage via `createStore`\n */\n data: Data | (() => Data) | Newable<Data>;\n\n /**\n * Optionally, you may use keys to reference the data in the Provide,\n * e.g. when `@data` is an already-created instance and consumers\n * reference it by its class.\n *\n * Keys are compared by identity. String keys are not recommended,\n * because when using a class or other object-like structure,\n * the type in the `<Consume>` component can be derived from that class or object-like structure.\n * With string keys, the `<Consume>` type will be unknown.\n */\n key?: string | object;\n\n /**\n * Can be used to either customize the element tag ( defaults to div )\n * If set to `false`, we won't use an element for the Provider boundary.\n *\n * Setting this to `false` changes the DOM Node containing the Provider's data to be a text node -- which can be useful when certain CSS situations are needed.\n *\n * But setting to `false` has a hazard: it allows subsequent sibling subtrees to access adjacent providers.\n *\n * There is no way around caveat in library land, and in a framework implementation of context,\n * it can only be solved by having render-tree context implemented, and ignoring DOM\n * (which then makes the only difference between DOM-Context and Context be whether or not\n * the context punches through Portals)\n */\n element?: keyof HTMLElementTagNameMap | false | undefined;\n };\n Blocks: {\n /**\n * The content that this component will _provide_ data to the entire hierarchy.\n */\n default: [];\n };\n}> {\n get data() {\n assert(`@data is missing in <Provide>. Please pass @data.`, \"data\" in this.args);\n\n /**\n * This covers both classes and functions\n */\n if (typeof this.args.data === \"function\") {\n return createStore<Data>(this, this.args.data);\n }\n\n /**\n * Non-instantiable value\n */\n return this.args.data;\n }\n\n element: Text | HTMLElement;\n\n constructor(\n owner: Owner,\n args: {\n data: Data | (() => Data) | Newable<Data>;\n key?: string;\n },\n ) {\n super(owner, args);\n\n assert(\n `@element may only be \\`false\\` or a string (or undefined (default when not set))`,\n this.args.element === undefined ||\n this.args.element === false ||\n typeof this.args.element === \"string\",\n );\n\n if (this.useElementProvider) {\n this.element = document.createElement(this.args.element || \"div\");\n\n // This tells the browser to ignore everything about this element when it comes to styling\n this.element.style.display = \"contents\";\n } else {\n this.element = document.createTextNode(\"\");\n }\n\n const key = this.args.key ?? this.args.data;\n\n LOOKUP.set(this.element, [key, () => this.data]);\n }\n\n get useElementProvider() {\n return this.args.element !== false;\n }\n\n <template>\n {{#if (isElement this.element)}}\n {{this.element}}\n\n {{#in-element this.element}}\n {{yield}}\n {{/in-element}}\n\n {{else}}\n {{! NOTE! This type of provider will _allow_ non-descendents using the same key to find the provider and use it.\n\n For example:\n Provider\n Consumer\n\n Consumer (finds Provider)\n }}\n\n {{this.element}}\n {{yield}}\n\n {{/if}}\n </template>\n}\n\n/**\n * How this works:\n * - starting at some deep node (Text, Element, whatever),\n * start crawling up the ancenstry graph (of DOM Nodes).\n *\n * - This algo \"tops out\" (since we traverse upwards (otherwise this would be \"bottoming out\")) at the HTMLDocument (parent of the HTML Tag)\n *\n */\nfunction findForKey<Data>(startElement: Text, key: string | object): undefined | (() => Data) {\n let parent: ParentNode | Text | null | undefined = startElement;\n\n while (parent) {\n let target: ParentNode | ChildNode | Text | null | undefined = parent;\n\n while (target) {\n if (!(target instanceof Element) && !(target instanceof Text)) {\n target = target?.previousSibling;\n continue;\n }\n\n const maybe = LOOKUP.get(target);\n\n target = target?.previousSibling;\n\n if (!maybe) {\n continue;\n }\n\n if (maybe[0] === key) {\n return maybe[1] as () => Data;\n }\n }\n\n parent = parent.parentElement;\n }\n}\n\ntype DataForKey<Key> = Key extends string\n ? unknown\n : Key extends Newable<infer T>\n ? T\n : Key extends () => infer T\n ? T\n : Key;\n\nexport class Consume<Key extends object | string> extends Component<{\n Args: {\n key: Key;\n };\n Blocks: {\n default: [\n context: {\n data: DataForKey<Key>;\n },\n ];\n };\n}> {\n // SAFETY: We do a runtime assert in the getter below.\n @tracked getData!: () => DataForKey<Key>;\n\n element: Text;\n\n constructor(owner: Owner, args: { key: Key }) {\n super(owner, args);\n\n this.element = document.createTextNode(\"\");\n }\n\n @cached\n get context() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n return {\n get data(): DataForKey<Key> {\n const getData = findForKey<Key>(self.element, self.args.key);\n\n assert(\n `Could not find provided context in <Consume>. Please assure that there is a corresponding <Provide> component before using this <Consume> component`,\n getData,\n );\n\n // SAFETY: return type handled by getter's signature\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return getData() as any;\n },\n };\n }\n\n <template>\n {{this.element}}\n\n {{yield this.context}}\n </template>\n}\n"],"names":["LOOKUP","WeakMap","Provide","Component","data","assert","args","createStore","element","constructor","owner","undefined","useElementProvider","document","createElement","style","display","createTextNode","key","set","setComponentTemplate","precompileTemplate","strictMode","scope","isElement","findForKey","startElement","parent","target","Element","Text","previousSibling","maybe","get","parentElement","Consume","tracked","i","context","self","getData","n","prototype","cached"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ export { Portal } from './components/portal.js';
|
|
|
17
17
|
export { TARGETS as PORTALS, PortalTargets } from './components/portal-targets.js';
|
|
18
18
|
export { Progress } from './components/progress.js';
|
|
19
19
|
export { R as Rating } from './rating-BrIiwDLw.js';
|
|
20
|
+
export { Resizable, Handle as ResizableHandle, Panel as ResizablePanel } from './components/resizable.js';
|
|
20
21
|
export { Scroller } from './components/scroller.js';
|
|
21
22
|
export { Separator } from './components/separator.js';
|
|
22
23
|
export { Shadowed } from './components/shadowed.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * DANGER: this is a *barrel file*\n *\n * It forces the whole library to be loaded and all dependencies.\n *\n * If you have a small app, you probably don't want to import from here -- instead import from each sub-path.\n */\nimport { importSync, isDevelopingApp, macroCondition } from '@embroider/macros';\n\nif (macroCondition(isDevelopingApp())) {\n importSync('./components/violations.css');\n}\n\nexport { Accordion } from './components/accordion.gts';\nexport type {\n AccordionContentExternalSignature,\n AccordionHeaderExternalSignature,\n AccordionItemExternalSignature,\n AccordionTriggerExternalSignature,\n} from './components/accordion/public.ts';\nexport { Avatar } from './components/avatar.gts';\nexport { Breadcrumb } from './components/breadcrumb.gts';\nexport { Dialog, Dialog as Modal } from './components/dialog.gts';\nexport { Drawer } from './components/drawer.gts';\nexport { ExternalLink } from './components/external-link.gts';\nexport { Form } from './components/form.gts';\nexport { IncrementalEach } from './components/incremental-each.gts';\nexport { Key, KeyCombo } from './components/keys.gts';\nexport { StickyFooter } from './components/layout/sticky-footer.gts';\nexport { Link } from './components/link.gts';\nexport { Menu } from './components/menu.gts';\nexport { OTP, OTPInput } from './components/one-time-password.gts';\nexport { Popover } from './components/popover.gts';\nexport { Portal } from './components/portal.gts';\nexport { PortalTargets } from './components/portal-targets.gts';\nexport { TARGETS as PORTALS } from './components/portal-targets.gts';\nexport { Progress } from './components/progress.gts';\nexport { Rating } from './components/rating.gts';\nexport { Scroller } from './components/scroller.gts';\nexport { Separator } from './components/separator.gts';\nexport { Shadowed } from './components/shadowed.gts';\nexport { Slider } from './components/slider.gts';\nexport { Switch } from './components/switch.gts';\nexport { Toggle } from './components/toggle.gts';\nexport { ToggleGroup } from './components/toggle-group.gts';\nexport { VisuallyHidden } from './components/visually-hidden.gts';\nexport { Zoetrope } from './components/zoetrope.ts';\nexport * from './helpers.ts';\n"],"names":["macroCondition","isDevelopingApp","importSync"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * DANGER: this is a *barrel file*\n *\n * It forces the whole library to be loaded and all dependencies.\n *\n * If you have a small app, you probably don't want to import from here -- instead import from each sub-path.\n */\nimport { importSync, isDevelopingApp, macroCondition } from '@embroider/macros';\n\nif (macroCondition(isDevelopingApp())) {\n importSync('./components/violations.css');\n}\n\nexport { Accordion } from './components/accordion.gts';\nexport type {\n AccordionContentExternalSignature,\n AccordionHeaderExternalSignature,\n AccordionItemExternalSignature,\n AccordionTriggerExternalSignature,\n} from './components/accordion/public.ts';\nexport { Avatar } from './components/avatar.gts';\nexport { Breadcrumb } from './components/breadcrumb.gts';\nexport { Dialog, Dialog as Modal } from './components/dialog.gts';\nexport { Drawer } from './components/drawer.gts';\nexport { ExternalLink } from './components/external-link.gts';\nexport { Form } from './components/form.gts';\nexport { IncrementalEach } from './components/incremental-each.gts';\nexport { Key, KeyCombo } from './components/keys.gts';\nexport { StickyFooter } from './components/layout/sticky-footer.gts';\nexport { Link } from './components/link.gts';\nexport { Menu } from './components/menu.gts';\nexport { OTP, OTPInput } from './components/one-time-password.gts';\nexport { Popover } from './components/popover.gts';\nexport { Portal } from './components/portal.gts';\nexport { PortalTargets } from './components/portal-targets.gts';\nexport { TARGETS as PORTALS } from './components/portal-targets.gts';\nexport { Progress } from './components/progress.gts';\nexport { Rating } from './components/rating.gts';\nexport {\n Resizable,\n Handle as ResizableHandle,\n Panel as ResizablePanel,\n} from './components/resizable.gts';\nexport { Scroller } from './components/scroller.gts';\nexport { Separator } from './components/separator.gts';\nexport { Shadowed } from './components/shadowed.gts';\nexport { Slider } from './components/slider.gts';\nexport { Switch } from './components/switch.gts';\nexport { Toggle } from './components/toggle.gts';\nexport { ToggleGroup } from './components/toggle-group.gts';\nexport { VisuallyHidden } from './components/visually-hidden.gts';\nexport { Zoetrope } from './components/zoetrope.ts';\nexport * from './helpers.ts';\n"],"names":["macroCondition","isDevelopingApp","importSync"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,IAAIA,cAAc,CAACC,eAAe,EAAE,CAAC,EAAE;EACrCC,UAAU,CAAC,6BAA6B,CAAC;AAC3C"}
|