@geajs/ui 0.2.1 → 0.2.3
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/dist/accordion.mjs +12 -12
- package/dist/accordion.mjs.map +1 -1
- package/dist/alert.mjs +44 -23
- package/dist/alert.mjs.map +1 -1
- package/dist/avatar.mjs +11 -11
- package/dist/avatar.mjs.map +1 -1
- package/dist/badge.mjs +19 -12
- package/dist/badge.mjs.map +1 -1
- package/dist/button.mjs +33 -23
- package/dist/button.mjs.map +1 -1
- package/dist/card.mjs +85 -43
- package/dist/card.mjs.map +1 -1
- package/dist/checkbox.mjs +5 -5
- package/dist/checkbox.mjs.map +1 -1
- package/dist/clipboard.mjs +10 -10
- package/dist/clipboard.mjs.map +1 -1
- package/dist/collapsible.mjs +18 -11
- package/dist/collapsible.mjs.map +1 -1
- package/dist/combobox.mjs +62 -48
- package/dist/combobox.mjs.map +1 -1
- package/dist/dialog.mjs +19 -12
- package/dist/dialog.mjs.map +1 -1
- package/dist/dnd-manager.mjs +18 -26
- package/dist/dnd-manager.mjs.map +1 -1
- package/dist/drag-drop-context.mjs +15 -8
- package/dist/drag-drop-context.mjs.map +1 -1
- package/dist/draggable.mjs +39 -19
- package/dist/draggable.mjs.map +1 -1
- package/dist/droppable.mjs +22 -12
- package/dist/droppable.mjs.map +1 -1
- package/dist/file-upload.mjs +24 -21
- package/dist/file-upload.mjs.map +1 -1
- package/dist/hover-card.mjs +27 -17
- package/dist/hover-card.mjs.map +1 -1
- package/dist/input.mjs +36 -24
- package/dist/input.mjs.map +1 -1
- package/dist/label.mjs +22 -12
- package/dist/label.mjs.map +1 -1
- package/dist/menu.mjs +9 -9
- package/dist/menu.mjs.map +1 -1
- package/dist/number-input.mjs +5 -5
- package/dist/number-input.mjs.map +1 -1
- package/dist/pagination.mjs +8 -9
- package/dist/pagination.mjs.map +1 -1
- package/dist/pin-input.mjs +11 -11
- package/dist/pin-input.mjs.map +1 -1
- package/dist/popover.mjs +19 -12
- package/dist/popover.mjs.map +1 -1
- package/dist/progress.mjs +8 -8
- package/dist/progress.mjs.map +1 -1
- package/dist/radio-group.mjs +16 -12
- package/dist/radio-group.mjs.map +1 -1
- package/dist/rating-group.mjs +21 -15
- package/dist/rating-group.mjs.map +1 -1
- package/dist/select.d.mts +1 -0
- package/dist/select.mjs +22 -17
- package/dist/select.mjs.map +1 -1
- package/dist/separator.mjs +12 -9
- package/dist/separator.mjs.map +1 -1
- package/dist/skeleton.mjs +6 -7
- package/dist/skeleton.mjs.map +1 -1
- package/dist/slider.mjs +5 -5
- package/dist/slider.mjs.map +1 -1
- package/dist/switch.mjs +5 -5
- package/dist/switch.mjs.map +1 -1
- package/dist/tabs.mjs +28 -20
- package/dist/tabs.mjs.map +1 -1
- package/dist/tags-input.mjs +18 -14
- package/dist/tags-input.mjs.map +1 -1
- package/dist/textarea.mjs +28 -19
- package/dist/textarea.mjs.map +1 -1
- package/dist/theme.css +198 -165
- package/dist/toast.mjs +6 -7
- package/dist/toast.mjs.map +1 -1
- package/dist/toggle-group.mjs +16 -12
- package/dist/toggle-group.mjs.map +1 -1
- package/dist/tooltip.mjs +18 -11
- package/dist/tooltip.mjs.map +1 -1
- package/dist/tree-view.mjs +17 -10
- package/dist/tree-view.mjs.map +1 -1
- package/dist/zag-component.mjs.map +1 -1
- package/package.json +1 -2
- package/dist/tailwind-preset.d.mts +0 -51
- package/dist/tailwind-preset.mjs +0 -50
- package/dist/tailwind-preset.mjs.map +0 -1
package/dist/dnd-manager.mjs
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GEA_DOM_COMPONENT, GEA_PARENT_COMPONENT, GEA_PROXY_GET_RAW_TARGET, stashComponentForTransfer } from "@geajs/core";
|
|
2
2
|
//#region src/components/dnd-manager.ts
|
|
3
3
|
const DRAG_THRESHOLD_SQ = 25;
|
|
4
4
|
const DRAGGABLE_SEL = "[data-draggable-id]";
|
|
5
5
|
const DROPPABLE_SEL = "[data-droppable-id]";
|
|
6
|
+
function _rawComp(comp) {
|
|
7
|
+
return comp?.[GEA_PROXY_GET_RAW_TARGET] ?? comp;
|
|
8
|
+
}
|
|
6
9
|
var DndManager = class {
|
|
7
10
|
constructor() {
|
|
8
11
|
this.droppables = /* @__PURE__ */ new Map();
|
|
@@ -223,9 +226,13 @@ var DndManager = class {
|
|
|
223
226
|
};
|
|
224
227
|
this._animateDrop().then(() => {
|
|
225
228
|
this._restoreElStyles();
|
|
226
|
-
this.
|
|
227
|
-
|
|
229
|
+
const draggedComp = this._getComponentFromElement(this._sourceEl);
|
|
230
|
+
if (draggedComp) stashComponentForTransfer(draggedComp);
|
|
231
|
+
if (this._placeholder?.parentElement) this._placeholder.remove();
|
|
232
|
+
this._placeholder = null;
|
|
233
|
+
if (this._sourceEl?.parentElement === document.body) this._sourceEl.remove();
|
|
228
234
|
this._onDragEnd?.(result);
|
|
235
|
+
this._cleanup();
|
|
229
236
|
});
|
|
230
237
|
} else this._animateReturn().then(() => {
|
|
231
238
|
this._returnToSource();
|
|
@@ -266,7 +273,8 @@ var DndManager = class {
|
|
|
266
273
|
destContainer.insertBefore(sourceEl, refNode);
|
|
267
274
|
const draggedComp = this._getComponentFromElement(sourceEl);
|
|
268
275
|
if (!draggedComp) return;
|
|
269
|
-
const
|
|
276
|
+
const rawDragged = _rawComp(draggedComp);
|
|
277
|
+
const sourceParent = rawDragged[GEA_PARENT_COMPONENT];
|
|
270
278
|
if (!sourceParent) return;
|
|
271
279
|
const srcArr = this._findCompiledArray(sourceParent, draggedComp);
|
|
272
280
|
if (!srcArr) return;
|
|
@@ -275,32 +283,16 @@ var DndManager = class {
|
|
|
275
283
|
srcArr.arr.splice(srcArr.index, 1);
|
|
276
284
|
const destArr = destParent[srcArr.key];
|
|
277
285
|
if (Array.isArray(destArr)) destArr.splice(destination.index, 0, draggedComp);
|
|
278
|
-
|
|
279
|
-
if (Array.isArray(srcChildren)) {
|
|
280
|
-
const ci = srcChildren.indexOf(draggedComp);
|
|
281
|
-
if (ci !== -1) srcChildren.splice(ci, 1);
|
|
282
|
-
}
|
|
283
|
-
const destChildren = destParent[GEA_CHILD_COMPONENTS];
|
|
284
|
-
if (Array.isArray(destChildren) && !destChildren.includes(draggedComp)) destChildren.push(draggedComp);
|
|
285
|
-
draggedComp.parentComponent = destParent;
|
|
286
|
+
rawDragged[GEA_PARENT_COMPONENT] = destParent;
|
|
286
287
|
}
|
|
287
288
|
_findCompiledArray(parent, child) {
|
|
288
|
-
const
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
const idx = arr.indexOf(child);
|
|
293
|
-
if (idx !== -1) return {
|
|
294
|
-
key,
|
|
295
|
-
arr,
|
|
296
|
-
index: idx
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
for (const key of symbolKeys) if (String(key).includes("gea.listItems") && Array.isArray(parent[key])) {
|
|
300
|
-
const arr = parent[key];
|
|
289
|
+
for (const sym of Object.getOwnPropertySymbols(parent)) {
|
|
290
|
+
if (!(sym.description ?? "").startsWith("gea.listItems.")) continue;
|
|
291
|
+
const arr = parent[sym];
|
|
292
|
+
if (!Array.isArray(arr)) continue;
|
|
301
293
|
const idx = arr.indexOf(child);
|
|
302
294
|
if (idx !== -1) return {
|
|
303
|
-
key,
|
|
295
|
+
key: sym,
|
|
304
296
|
arr,
|
|
305
297
|
index: idx
|
|
306
298
|
};
|
package/dist/dnd-manager.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dnd-manager.mjs","names":[],"sources":["../src/components/dnd-manager.ts"],"sourcesContent":["import { GEA_CHILD_COMPONENTS, GEA_DOM_COMPONENT } from '@geajs/core'\n\nexport interface DragResult {\n draggableId: string\n source: { droppableId: string; index: number }\n destination: { droppableId: string; index: number }\n}\n\nconst DRAG_THRESHOLD_SQ = 25\nconst DRAGGABLE_SEL = '[data-draggable-id]'\nconst DROPPABLE_SEL = '[data-droppable-id]'\n\nclass DndManager {\n droppables = new Map<string, HTMLElement>()\n\n private _onDragEnd: ((result: DragResult) => void) | null = null\n get onDragEnd() {\n return this._onDragEnd\n }\n set onDragEnd(fn: ((result: DragResult) => void) | null) {\n this._onDragEnd = fn\n if (fn) this._ensureDocListener()\n }\n\n private _dragging = false\n private _started = false\n private _draggedId = ''\n private _sourceDroppableId = ''\n private _sourceIndex = 0\n private _sourceEl: HTMLElement | null = null\n private _sourceHeight = 0\n private _sourceRect: DOMRect | null = null\n private _savedCssText = ''\n private _placeholder: HTMLElement | null = null\n private _startX = 0\n private _startY = 0\n private _offsetX = 0\n private _offsetY = 0\n private _currentDroppableId: string | null = null\n private _currentIndex = 0\n private _lastClientY = 0\n private _cleanedUp = false\n\n private _boundMove = this._onPointerMove.bind(this)\n private _boundUp = this._onPointerUp.bind(this)\n private _boundKeyDown = this._onKeyDown.bind(this)\n private _boundDocDown = this._onDocumentPointerDown.bind(this)\n private _docListenerAttached = false\n\n get isDragging() {\n return this._started\n }\n\n private _ensureDocListener() {\n if (this._docListenerAttached || typeof document === 'undefined') return\n document.addEventListener('pointerdown', this._boundDocDown, true)\n this._docListenerAttached = true\n }\n\n private _onDocumentPointerDown(e: PointerEvent) {\n const el = (e.target as HTMLElement).closest?.(DRAGGABLE_SEL) as HTMLElement\n if (!el) return\n this.startTracking(e, el.dataset.draggableId!, el)\n }\n\n registerDroppable(id: string, el: HTMLElement) {\n this.droppables.set(id, el)\n this._ensureDocListener()\n }\n\n unregisterDroppable(id: string) {\n this.droppables.delete(id)\n }\n\n startTracking(e: PointerEvent, draggableId: string, el: HTMLElement) {\n if (this._dragging || e.button !== 0) return\n this._ensureDocListener()\n\n const droppableEl = el.closest(DROPPABLE_SEL) as HTMLElement\n if (!droppableEl) return\n\n const droppableId = droppableEl.dataset.droppableId!\n const siblings = Array.from(droppableEl.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n const sourceIndex = siblings.indexOf(el)\n if (sourceIndex === -1) return\n\n this._dragging = true\n this._started = false\n this._cleanedUp = false\n this._draggedId = draggableId\n this._sourceDroppableId = droppableId\n this._sourceIndex = sourceIndex\n this._sourceEl = el\n\n const rect = el.getBoundingClientRect()\n this._sourceHeight = rect.height\n this._sourceRect = rect\n this._startX = e.clientX\n this._startY = e.clientY\n this._lastClientY = e.clientY\n this._offsetX = e.clientX - rect.left\n this._offsetY = e.clientY - rect.top\n\n document.addEventListener('pointermove', this._boundMove)\n document.addEventListener('pointerup', this._boundUp)\n document.addEventListener('keydown', this._boundKeyDown)\n e.preventDefault()\n }\n\n private _onPointerMove(e: PointerEvent) {\n if (!this._dragging) return\n\n if (!this._started) {\n const dx = e.clientX - this._startX\n const dy = e.clientY - this._startY\n if (dx * dx + dy * dy < DRAG_THRESHOLD_SQ) return\n this._initDrag()\n this._updateTarget(e.clientX, e.clientY)\n return\n }\n\n this._sourceEl!.style.transform = `translate(${e.clientX - this._offsetX}px, ${e.clientY - this._offsetY}px)`\n this._updateTarget(e.clientX, e.clientY)\n this._lastClientY = e.clientY\n }\n\n private _initDrag() {\n this._started = true\n const el = this._sourceEl!\n const rect = this._sourceRect!\n\n document.querySelectorAll(DROPPABLE_SEL).forEach((dropEl) => {\n const id = (dropEl as HTMLElement).dataset.droppableId!\n if (!this.droppables.has(id)) {\n this.droppables.set(id, dropEl as HTMLElement)\n }\n })\n\n const elMargin = getComputedStyle(el).marginBottom\n this._savedCssText = el.style.cssText\n\n const placeholder = document.createElement('div')\n placeholder.className = 'gea-dnd-placeholder'\n placeholder.style.height = rect.height + 'px'\n placeholder.style.marginBottom = elMargin\n placeholder.style.transition = 'none'\n el.parentElement!.insertBefore(placeholder, el)\n\n document.body.appendChild(el)\n Object.assign(el.style, {\n position: 'fixed',\n top: '0px',\n left: '0',\n width: rect.width + 'px',\n height: rect.height + 'px',\n transform: `translate(${rect.left}px, ${rect.top}px)`,\n // rotate: '0deg',\n // transition: 'rotate 0.15s ease, box-shadow 0.15s ease',\n pointerEvents: 'none',\n zIndex: '99999',\n margin: '0',\n willChange: 'transform',\n boxShadow: 'none',\n })\n el.offsetHeight\n // el.style.rotate = '3deg'\n el.style.boxShadow = '5px 10px 30px 0px rgba(9, 30, 66, 0.15)'\n\n this._placeholder = placeholder\n\n this._currentDroppableId = this._sourceDroppableId\n this._currentIndex = this._sourceIndex\n }\n\n private _updateTarget(clientX: number, clientY: number) {\n let foundId: string | null = null\n let foundEl: HTMLElement | null = null\n\n for (const [id, el] of this.droppables) {\n const r = el.getBoundingClientRect()\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom) {\n foundId = id\n foundEl = el\n break\n }\n }\n\n if (!foundEl || foundId === null) {\n this._currentDroppableId = null\n return\n }\n\n const items = Array.from(foundEl.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n const movingDown = clientY >= this._lastClientY\n const threshold = movingDown ? 0 : 1\n let insertIndex = items.length\n for (let i = 0; i < items.length; i++) {\n const r = items[i].getBoundingClientRect()\n if (clientY < r.top + r.height * threshold) {\n insertIndex = i\n break\n }\n }\n\n this._currentDroppableId = foundId\n this._currentIndex = insertIndex\n\n if (!this._placeholder) return\n\n const refNode = (items[insertIndex] as HTMLElement) || null\n if (this._placeholder.parentElement !== foundEl || this._placeholder.nextElementSibling !== refNode) {\n if (this._placeholder.parentElement) {\n const ghost = document.createElement('div')\n ghost.style.height = this._sourceHeight + 'px'\n ghost.style.marginBottom = this._placeholder.style.marginBottom\n ghost.style.transition = 'height 0.2s cubic-bezier(0.2, 0, 0, 1)'\n ghost.style.overflow = 'hidden'\n this._placeholder.parentElement.insertBefore(ghost, this._placeholder)\n ghost.offsetHeight\n ghost.style.height = '0px'\n ghost.style.marginBottom = '0px'\n ghost.addEventListener('transitionend', () => ghost.remove(), { once: true })\n setTimeout(() => ghost.remove(), 250)\n }\n\n this._placeholder.style.transition = 'none'\n this._placeholder.style.height = '0px'\n foundEl.insertBefore(this._placeholder, refNode)\n this._placeholder.offsetHeight\n this._placeholder.style.transition = 'height 0.2s cubic-bezier(0.2, 0, 0, 1)'\n this._placeholder.style.height = this._sourceHeight + 'px'\n }\n }\n\n private _onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape' && this._dragging) {\n this._cancelDrag()\n }\n }\n\n private _cancelDrag() {\n this._removeGlobalListeners()\n if (!this._started) {\n this._dragging = false\n return\n }\n\n this._animateReturn().then(() => {\n this._returnToSource()\n this._cleanup()\n })\n }\n\n private _onPointerUp(_e: PointerEvent) {\n this._removeGlobalListeners()\n\n if (!this._started) {\n this._dragging = false\n return\n }\n\n const destination =\n this._currentDroppableId !== null ? { droppableId: this._currentDroppableId, index: this._currentIndex } : null\n\n const samePosition =\n destination && destination.droppableId === this._sourceDroppableId && destination.index === this._sourceIndex\n\n if (destination && this._placeholder && !samePosition) {\n const result: DragResult = {\n draggableId: this._draggedId,\n source: { droppableId: this._sourceDroppableId, index: this._sourceIndex },\n destination,\n }\n this._animateDrop().then(() => {\n this._restoreElStyles()\n this._performTransfer(destination)\n this._cleanup()\n this._onDragEnd?.(result)\n })\n } else {\n this._animateReturn().then(() => {\n this._returnToSource()\n this._cleanup()\n })\n }\n }\n\n private _getComponentFromElement(el: HTMLElement | null): any {\n let current: HTMLElement | null = el\n while (current) {\n const comp = (current as HTMLElement & { [GEA_DOM_COMPONENT]?: unknown })[GEA_DOM_COMPONENT]\n if (comp) return comp\n current = current.parentElement\n }\n return null\n }\n\n private _restoreElStyles() {\n if (!this._sourceEl) return\n this._sourceEl.style.cssText = this._savedCssText\n }\n\n private _returnToSource() {\n if (!this._sourceEl) return\n this._restoreElStyles()\n if (this._placeholder?.parentElement) {\n this._placeholder.parentElement.insertBefore(this._sourceEl, this._placeholder)\n } else {\n const container = this.droppables.get(this._sourceDroppableId)\n if (container) {\n const items = Array.from(container.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n container.insertBefore(this._sourceEl, items[this._sourceIndex] || null)\n }\n }\n }\n\n private _performTransfer(destination: { droppableId: string; index: number }) {\n const sourceEl = this._sourceEl\n if (!sourceEl) return\n\n const destContainer = this.droppables.get(destination.droppableId)\n if (!destContainer) return\n\n const destItems = Array.from(destContainer.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n const refNode = (destItems[destination.index] as HTMLElement) || null\n destContainer.insertBefore(sourceEl, refNode)\n\n const draggedComp = this._getComponentFromElement(sourceEl)\n if (!draggedComp) return\n\n const sourceParent = draggedComp.parentComponent\n if (!sourceParent) return\n\n const srcArr = this._findCompiledArray(sourceParent, draggedComp)\n if (!srcArr) return\n\n const destParent = this._getComponentFromElement(destContainer)\n if (!destParent) return\n\n srcArr.arr.splice(srcArr.index, 1)\n const destArr = destParent[srcArr.key]\n if (Array.isArray(destArr)) {\n destArr.splice(destination.index, 0, draggedComp)\n }\n\n const srcChildren = sourceParent[GEA_CHILD_COMPONENTS]\n if (Array.isArray(srcChildren)) {\n const ci = srcChildren.indexOf(draggedComp)\n if (ci !== -1) srcChildren.splice(ci, 1)\n }\n const destChildren = destParent[GEA_CHILD_COMPONENTS]\n if (Array.isArray(destChildren) && !destChildren.includes(draggedComp)) {\n destChildren.push(draggedComp)\n }\n draggedComp.parentComponent = destParent\n }\n\n private _findCompiledArray(parent: any, child: any): { key: PropertyKey; arr: any[]; index: number } | null {\n const stringKeys = Object.keys(parent)\n const symbolKeys = Object.getOwnPropertySymbols(parent)\n for (const key of stringKeys) {\n if (key.startsWith('_') && key.endsWith('Items') && Array.isArray((parent as any)[key])) {\n const arr = (parent as any)[key] as any[]\n const idx = arr.indexOf(child)\n if (idx !== -1) return { key, arr, index: idx }\n }\n }\n for (const key of symbolKeys) {\n if (String(key).includes('gea.listItems') && Array.isArray((parent as any)[key])) {\n const arr = (parent as any)[key] as any[]\n const idx = arr.indexOf(child)\n if (idx !== -1) return { key, arr, index: idx }\n }\n }\n return null\n }\n\n private _animateDrop(): Promise<void> {\n return new Promise((resolve) => {\n if (!this._sourceEl || !this._placeholder) return resolve()\n const phRect = this._placeholder.getBoundingClientRect()\n this._sourceEl.style.transition =\n 'transform 0.2s cubic-bezier(0.2, 0, 0, 1), rotate 0.2s cubic-bezier(0.2, 0, 0, 1), box-shadow 0.2s cubic-bezier(0.2, 0, 0, 1)'\n this._sourceEl.style.transform = `translate(${phRect.left}px, ${phRect.top}px)`\n this._sourceEl.style.rotate = '0deg'\n this._sourceEl.style.boxShadow = 'none'\n let done = false\n const finish = () => {\n if (done) return\n done = true\n resolve()\n }\n this._sourceEl.addEventListener('transitionend', finish, { once: true })\n setTimeout(finish, 250)\n })\n }\n\n private _animateReturn(): Promise<void> {\n return new Promise((resolve) => {\n if (!this._sourceEl || !this._sourceRect) return resolve()\n let targetX = this._sourceRect.left\n let targetY = this._sourceRect.top\n if (this._placeholder?.parentElement) {\n const phRect = this._placeholder.getBoundingClientRect()\n targetX = phRect.left\n targetY = phRect.top\n }\n this._sourceEl.style.transition =\n 'transform 0.2s cubic-bezier(0.2, 0, 0, 1), rotate 0.2s cubic-bezier(0.2, 0, 0, 1), box-shadow 0.2s cubic-bezier(0.2, 0, 0, 1)'\n this._sourceEl.style.transform = `translate(${targetX}px, ${targetY}px)`\n this._sourceEl.style.rotate = '0deg'\n this._sourceEl.style.boxShadow = 'none'\n let done = false\n const finish = () => {\n if (done) return\n done = true\n resolve()\n }\n this._sourceEl.addEventListener('transitionend', finish, { once: true })\n setTimeout(finish, 250)\n })\n }\n\n private _removeGlobalListeners() {\n document.removeEventListener('pointermove', this._boundMove)\n document.removeEventListener('pointerup', this._boundUp)\n document.removeEventListener('keydown', this._boundKeyDown)\n }\n\n private _cleanup() {\n if (this._cleanedUp) return\n this._cleanedUp = true\n\n this._placeholder?.remove()\n this._placeholder = null\n this._sourceEl = null\n this._sourceRect = null\n\n this._dragging = false\n this._started = false\n this._draggedId = ''\n this._currentDroppableId = null\n }\n\n destroy() {\n this._removeGlobalListeners()\n if (this._dragging) {\n if (this._sourceEl) this._returnToSource()\n this._cleanup()\n }\n if (this._docListenerAttached && typeof document !== 'undefined') {\n document.removeEventListener('pointerdown', this._boundDocDown, true)\n this._docListenerAttached = false\n }\n this.droppables.clear()\n this.onDragEnd = null\n }\n}\n\nexport const dndManager = new DndManager()\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dnd-manager.mjs","names":[],"sources":["../src/components/dnd-manager.ts"],"sourcesContent":["import {\n GEA_DOM_COMPONENT,\n GEA_PARENT_COMPONENT,\n GEA_PROXY_GET_RAW_TARGET,\n stashComponentForTransfer,\n} from '@geajs/core'\n\nexport interface DragResult {\n draggableId: string\n source: { droppableId: string; index: number }\n destination: { droppableId: string; index: number }\n}\n\nconst DRAG_THRESHOLD_SQ = 25\nconst DRAGGABLE_SEL = '[data-draggable-id]'\nconst DROPPABLE_SEL = '[data-droppable-id]'\n\nfunction _rawComp(comp: any): any {\n return comp?.[GEA_PROXY_GET_RAW_TARGET] ?? comp\n}\n\nclass DndManager {\n droppables = new Map<string, HTMLElement>()\n\n private _onDragEnd: ((result: DragResult) => void) | null = null\n get onDragEnd() {\n return this._onDragEnd\n }\n set onDragEnd(fn: ((result: DragResult) => void) | null) {\n this._onDragEnd = fn\n if (fn) this._ensureDocListener()\n }\n\n private _dragging = false\n private _started = false\n private _draggedId = ''\n private _sourceDroppableId = ''\n private _sourceIndex = 0\n private _sourceEl: HTMLElement | null = null\n private _sourceHeight = 0\n private _sourceRect: DOMRect | null = null\n private _savedCssText = ''\n private _placeholder: HTMLElement | null = null\n private _startX = 0\n private _startY = 0\n private _offsetX = 0\n private _offsetY = 0\n private _currentDroppableId: string | null = null\n private _currentIndex = 0\n private _lastClientY = 0\n private _cleanedUp = false\n\n private _boundMove = this._onPointerMove.bind(this)\n private _boundUp = this._onPointerUp.bind(this)\n private _boundKeyDown = this._onKeyDown.bind(this)\n private _boundDocDown = this._onDocumentPointerDown.bind(this)\n private _docListenerAttached = false\n\n get isDragging() {\n return this._started\n }\n\n private _ensureDocListener() {\n if (this._docListenerAttached || typeof document === 'undefined') return\n document.addEventListener('pointerdown', this._boundDocDown, true)\n this._docListenerAttached = true\n }\n\n private _onDocumentPointerDown(e: PointerEvent) {\n const el = (e.target as HTMLElement).closest?.(DRAGGABLE_SEL) as HTMLElement\n if (!el) return\n this.startTracking(e, el.dataset.draggableId!, el)\n }\n\n registerDroppable(id: string, el: HTMLElement) {\n this.droppables.set(id, el)\n this._ensureDocListener()\n }\n\n unregisterDroppable(id: string) {\n this.droppables.delete(id)\n }\n\n startTracking(e: PointerEvent, draggableId: string, el: HTMLElement) {\n if (this._dragging || e.button !== 0) return\n this._ensureDocListener()\n\n const droppableEl = el.closest(DROPPABLE_SEL) as HTMLElement\n if (!droppableEl) return\n\n const droppableId = droppableEl.dataset.droppableId!\n const siblings = Array.from(droppableEl.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n const sourceIndex = siblings.indexOf(el)\n if (sourceIndex === -1) return\n\n this._dragging = true\n this._started = false\n this._cleanedUp = false\n this._draggedId = draggableId\n this._sourceDroppableId = droppableId\n this._sourceIndex = sourceIndex\n this._sourceEl = el\n\n const rect = el.getBoundingClientRect()\n this._sourceHeight = rect.height\n this._sourceRect = rect\n this._startX = e.clientX\n this._startY = e.clientY\n this._lastClientY = e.clientY\n this._offsetX = e.clientX - rect.left\n this._offsetY = e.clientY - rect.top\n\n document.addEventListener('pointermove', this._boundMove)\n document.addEventListener('pointerup', this._boundUp)\n document.addEventListener('keydown', this._boundKeyDown)\n e.preventDefault()\n }\n\n private _onPointerMove(e: PointerEvent) {\n if (!this._dragging) return\n\n if (!this._started) {\n const dx = e.clientX - this._startX\n const dy = e.clientY - this._startY\n if (dx * dx + dy * dy < DRAG_THRESHOLD_SQ) return\n this._initDrag()\n this._updateTarget(e.clientX, e.clientY)\n return\n }\n\n this._sourceEl!.style.transform = `translate(${e.clientX - this._offsetX}px, ${e.clientY - this._offsetY}px)`\n this._updateTarget(e.clientX, e.clientY)\n this._lastClientY = e.clientY\n }\n\n private _initDrag() {\n this._started = true\n const el = this._sourceEl!\n const rect = this._sourceRect!\n\n document.querySelectorAll(DROPPABLE_SEL).forEach((dropEl) => {\n const id = (dropEl as HTMLElement).dataset.droppableId!\n if (!this.droppables.has(id)) {\n this.droppables.set(id, dropEl as HTMLElement)\n }\n })\n\n const elMargin = getComputedStyle(el).marginBottom\n this._savedCssText = el.style.cssText\n\n const placeholder = document.createElement('div')\n placeholder.className = 'gea-dnd-placeholder'\n placeholder.style.height = rect.height + 'px'\n placeholder.style.marginBottom = elMargin\n placeholder.style.transition = 'none'\n el.parentElement!.insertBefore(placeholder, el)\n\n document.body.appendChild(el)\n Object.assign(el.style, {\n position: 'fixed',\n top: '0px',\n left: '0',\n width: rect.width + 'px',\n height: rect.height + 'px',\n transform: `translate(${rect.left}px, ${rect.top}px)`,\n // rotate: '0deg',\n // transition: 'rotate 0.15s ease, box-shadow 0.15s ease',\n pointerEvents: 'none',\n zIndex: '99999',\n margin: '0',\n willChange: 'transform',\n boxShadow: 'none',\n })\n el.offsetHeight\n // el.style.rotate = '3deg'\n el.style.boxShadow = '5px 10px 30px 0px rgba(9, 30, 66, 0.15)'\n\n this._placeholder = placeholder\n\n this._currentDroppableId = this._sourceDroppableId\n this._currentIndex = this._sourceIndex\n }\n\n private _updateTarget(clientX: number, clientY: number) {\n let foundId: string | null = null\n let foundEl: HTMLElement | null = null\n\n for (const [id, el] of this.droppables) {\n const r = el.getBoundingClientRect()\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom) {\n foundId = id\n foundEl = el\n break\n }\n }\n\n if (!foundEl || foundId === null) {\n this._currentDroppableId = null\n return\n }\n\n const items = Array.from(foundEl.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n const movingDown = clientY >= this._lastClientY\n const threshold = movingDown ? 0 : 1\n let insertIndex = items.length\n for (let i = 0; i < items.length; i++) {\n const r = items[i].getBoundingClientRect()\n if (clientY < r.top + r.height * threshold) {\n insertIndex = i\n break\n }\n }\n\n this._currentDroppableId = foundId\n this._currentIndex = insertIndex\n\n if (!this._placeholder) return\n\n const refNode = (items[insertIndex] as HTMLElement) || null\n if (this._placeholder.parentElement !== foundEl || this._placeholder.nextElementSibling !== refNode) {\n if (this._placeholder.parentElement) {\n const ghost = document.createElement('div')\n ghost.style.height = this._sourceHeight + 'px'\n ghost.style.marginBottom = this._placeholder.style.marginBottom\n ghost.style.transition = 'height 0.2s cubic-bezier(0.2, 0, 0, 1)'\n ghost.style.overflow = 'hidden'\n this._placeholder.parentElement.insertBefore(ghost, this._placeholder)\n ghost.offsetHeight\n ghost.style.height = '0px'\n ghost.style.marginBottom = '0px'\n ghost.addEventListener('transitionend', () => ghost.remove(), { once: true })\n setTimeout(() => ghost.remove(), 250)\n }\n\n this._placeholder.style.transition = 'none'\n this._placeholder.style.height = '0px'\n foundEl.insertBefore(this._placeholder, refNode)\n this._placeholder.offsetHeight\n this._placeholder.style.transition = 'height 0.2s cubic-bezier(0.2, 0, 0, 1)'\n this._placeholder.style.height = this._sourceHeight + 'px'\n }\n }\n\n private _onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape' && this._dragging) {\n this._cancelDrag()\n }\n }\n\n private _cancelDrag() {\n this._removeGlobalListeners()\n if (!this._started) {\n this._dragging = false\n return\n }\n\n this._animateReturn().then(() => {\n this._returnToSource()\n this._cleanup()\n })\n }\n\n private _onPointerUp(_e: PointerEvent) {\n this._removeGlobalListeners()\n\n if (!this._started) {\n this._dragging = false\n return\n }\n\n const destination =\n this._currentDroppableId !== null ? { droppableId: this._currentDroppableId, index: this._currentIndex } : null\n\n const samePosition =\n destination && destination.droppableId === this._sourceDroppableId && destination.index === this._sourceIndex\n\n if (destination && this._placeholder && !samePosition) {\n const result: DragResult = {\n draggableId: this._draggedId,\n source: { droppableId: this._sourceDroppableId, index: this._sourceIndex },\n destination,\n }\n this._animateDrop().then(() => {\n this._restoreElStyles()\n // Stash the component for cross-list transfer so the destination's\n // reconciliation can adopt it (DOM subtree intact) instead of\n // disposing + recreating it from scratch.\n const draggedComp = this._getComponentFromElement(this._sourceEl)\n if (draggedComp) {\n stashComponentForTransfer(draggedComp)\n }\n if (this._placeholder?.parentElement) {\n this._placeholder.remove()\n }\n this._placeholder = null\n if (this._sourceEl?.parentElement === document.body) {\n this._sourceEl.remove()\n }\n this._onDragEnd?.(result)\n this._cleanup()\n })\n } else {\n this._animateReturn().then(() => {\n this._returnToSource()\n this._cleanup()\n })\n }\n }\n\n private _getComponentFromElement(el: HTMLElement | null): any {\n let current: HTMLElement | null = el\n while (current) {\n const comp = (current as any)[GEA_DOM_COMPONENT]\n if (comp) return comp\n current = current.parentElement\n }\n return null\n }\n\n private _restoreElStyles() {\n if (!this._sourceEl) return\n this._sourceEl.style.cssText = this._savedCssText\n }\n\n private _returnToSource() {\n if (!this._sourceEl) return\n this._restoreElStyles()\n if (this._placeholder?.parentElement) {\n this._placeholder.parentElement.insertBefore(this._sourceEl, this._placeholder)\n } else {\n const container = this.droppables.get(this._sourceDroppableId)\n if (container) {\n const items = Array.from(container.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n container.insertBefore(this._sourceEl, items[this._sourceIndex] || null)\n }\n }\n }\n\n private _performTransfer(destination: { droppableId: string; index: number }) {\n const sourceEl = this._sourceEl\n if (!sourceEl) return\n\n const destContainer = this.droppables.get(destination.droppableId)\n if (!destContainer) return\n\n const destItems = Array.from(destContainer.querySelectorAll(`:scope > ${DRAGGABLE_SEL}`))\n const refNode = (destItems[destination.index] as HTMLElement) || null\n destContainer.insertBefore(sourceEl, refNode)\n\n const draggedComp = this._getComponentFromElement(sourceEl)\n if (!draggedComp) return\n\n const rawDragged = _rawComp(draggedComp)\n const sourceParent = rawDragged[GEA_PARENT_COMPONENT]\n if (!sourceParent) return\n\n const srcArr = this._findCompiledArray(sourceParent, draggedComp)\n if (!srcArr) return\n\n const destParent = this._getComponentFromElement(destContainer)\n if (!destParent) return\n\n srcArr.arr.splice(srcArr.index, 1)\n const destArr = destParent[srcArr.key]\n if (Array.isArray(destArr)) {\n destArr.splice(destination.index, 0, draggedComp)\n }\n\n // Update the parent component pointer on the raw instance (symbol-keyed, not string prop).\n rawDragged[GEA_PARENT_COMPONENT] = destParent\n }\n\n private _findCompiledArray(parent: any, child: any): { key: symbol; arr: any[]; index: number } | null {\n // Component array lists are stored under geaListItemsSymbol(arrayPropName) symbol keys.\n // Walk the symbol keys of the parent to find which list contains the child.\n for (const sym of Object.getOwnPropertySymbols(parent)) {\n const desc = sym.description ?? ''\n if (!desc.startsWith('gea.listItems.')) continue\n const arr = parent[sym]\n if (!Array.isArray(arr)) continue\n const idx = arr.indexOf(child)\n if (idx !== -1) return { key: sym, arr, index: idx }\n }\n return null\n }\n\n private _animateDrop(): Promise<void> {\n return new Promise((resolve) => {\n if (!this._sourceEl || !this._placeholder) return resolve()\n const phRect = this._placeholder.getBoundingClientRect()\n this._sourceEl.style.transition =\n 'transform 0.2s cubic-bezier(0.2, 0, 0, 1), rotate 0.2s cubic-bezier(0.2, 0, 0, 1), box-shadow 0.2s cubic-bezier(0.2, 0, 0, 1)'\n this._sourceEl.style.transform = `translate(${phRect.left}px, ${phRect.top}px)`\n this._sourceEl.style.rotate = '0deg'\n this._sourceEl.style.boxShadow = 'none'\n let done = false\n const finish = () => {\n if (done) return\n done = true\n resolve()\n }\n this._sourceEl.addEventListener('transitionend', finish, { once: true })\n setTimeout(finish, 250)\n })\n }\n\n private _animateReturn(): Promise<void> {\n return new Promise((resolve) => {\n if (!this._sourceEl || !this._sourceRect) return resolve()\n let targetX = this._sourceRect.left\n let targetY = this._sourceRect.top\n if (this._placeholder?.parentElement) {\n const phRect = this._placeholder.getBoundingClientRect()\n targetX = phRect.left\n targetY = phRect.top\n }\n this._sourceEl.style.transition =\n 'transform 0.2s cubic-bezier(0.2, 0, 0, 1), rotate 0.2s cubic-bezier(0.2, 0, 0, 1), box-shadow 0.2s cubic-bezier(0.2, 0, 0, 1)'\n this._sourceEl.style.transform = `translate(${targetX}px, ${targetY}px)`\n this._sourceEl.style.rotate = '0deg'\n this._sourceEl.style.boxShadow = 'none'\n let done = false\n const finish = () => {\n if (done) return\n done = true\n resolve()\n }\n this._sourceEl.addEventListener('transitionend', finish, { once: true })\n setTimeout(finish, 250)\n })\n }\n\n private _removeGlobalListeners() {\n document.removeEventListener('pointermove', this._boundMove)\n document.removeEventListener('pointerup', this._boundUp)\n document.removeEventListener('keydown', this._boundKeyDown)\n }\n\n private _cleanup() {\n if (this._cleanedUp) return\n this._cleanedUp = true\n\n this._placeholder?.remove()\n this._placeholder = null\n this._sourceEl = null\n this._sourceRect = null\n\n this._dragging = false\n this._started = false\n this._draggedId = ''\n this._currentDroppableId = null\n }\n\n destroy() {\n this._removeGlobalListeners()\n if (this._dragging) {\n if (this._sourceEl) this._returnToSource()\n this._cleanup()\n }\n if (this._docListenerAttached && typeof document !== 'undefined') {\n document.removeEventListener('pointerdown', this._boundDocDown, true)\n this._docListenerAttached = false\n }\n this.droppables.clear()\n this.onDragEnd = null\n }\n}\n\nexport const dndManager = new DndManager()\n"],"mappings":";;AAaA,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AAEtB,SAAS,SAAS,MAAgB;AAChC,QAAO,OAAO,6BAA6B;;AAG7C,IAAM,aAAN,MAAiB;;oCACF,IAAI,KAA0B;oBAEiB;mBASxC;kBACD;oBACE;4BACQ;sBACN;mBACiB;uBAChB;qBACc;uBACd;sBACmB;iBACzB;iBACA;kBACC;kBACA;6BAC0B;uBACrB;sBACD;oBACF;oBAEA,KAAK,eAAe,KAAK,KAAK;kBAChC,KAAK,aAAa,KAAK,KAAK;uBACvB,KAAK,WAAW,KAAK,KAAK;uBAC1B,KAAK,uBAAuB,KAAK,KAAK;8BAC/B;;CA/B/B,IAAI,YAAY;AACd,SAAO,KAAK;;CAEd,IAAI,UAAU,IAA2C;AACvD,OAAK,aAAa;AAClB,MAAI,GAAI,MAAK,oBAAoB;;CA4BnC,IAAI,aAAa;AACf,SAAO,KAAK;;CAGd,qBAA6B;AAC3B,MAAI,KAAK,wBAAwB,OAAO,aAAa,YAAa;AAClE,WAAS,iBAAiB,eAAe,KAAK,eAAe,KAAK;AAClE,OAAK,uBAAuB;;CAG9B,uBAA+B,GAAiB;EAC9C,MAAM,KAAM,EAAE,OAAuB,UAAU,cAAc;AAC7D,MAAI,CAAC,GAAI;AACT,OAAK,cAAc,GAAG,GAAG,QAAQ,aAAc,GAAG;;CAGpD,kBAAkB,IAAY,IAAiB;AAC7C,OAAK,WAAW,IAAI,IAAI,GAAG;AAC3B,OAAK,oBAAoB;;CAG3B,oBAAoB,IAAY;AAC9B,OAAK,WAAW,OAAO,GAAG;;CAG5B,cAAc,GAAiB,aAAqB,IAAiB;AACnE,MAAI,KAAK,aAAa,EAAE,WAAW,EAAG;AACtC,OAAK,oBAAoB;EAEzB,MAAM,cAAc,GAAG,QAAQ,cAAc;AAC7C,MAAI,CAAC,YAAa;EAElB,MAAM,cAAc,YAAY,QAAQ;EAExC,MAAM,cADW,MAAM,KAAK,YAAY,iBAAiB,YAAY,gBAAgB,CAAC,CACzD,QAAQ,GAAG;AACxC,MAAI,gBAAgB,GAAI;AAExB,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK,aAAa;AAClB,OAAK,aAAa;AAClB,OAAK,qBAAqB;AAC1B,OAAK,eAAe;AACpB,OAAK,YAAY;EAEjB,MAAM,OAAO,GAAG,uBAAuB;AACvC,OAAK,gBAAgB,KAAK;AAC1B,OAAK,cAAc;AACnB,OAAK,UAAU,EAAE;AACjB,OAAK,UAAU,EAAE;AACjB,OAAK,eAAe,EAAE;AACtB,OAAK,WAAW,EAAE,UAAU,KAAK;AACjC,OAAK,WAAW,EAAE,UAAU,KAAK;AAEjC,WAAS,iBAAiB,eAAe,KAAK,WAAW;AACzD,WAAS,iBAAiB,aAAa,KAAK,SAAS;AACrD,WAAS,iBAAiB,WAAW,KAAK,cAAc;AACxD,IAAE,gBAAgB;;CAGpB,eAAuB,GAAiB;AACtC,MAAI,CAAC,KAAK,UAAW;AAErB,MAAI,CAAC,KAAK,UAAU;GAClB,MAAM,KAAK,EAAE,UAAU,KAAK;GAC5B,MAAM,KAAK,EAAE,UAAU,KAAK;AAC5B,OAAI,KAAK,KAAK,KAAK,KAAK,kBAAmB;AAC3C,QAAK,WAAW;AAChB,QAAK,cAAc,EAAE,SAAS,EAAE,QAAQ;AACxC;;AAGF,OAAK,UAAW,MAAM,YAAY,aAAa,EAAE,UAAU,KAAK,SAAS,MAAM,EAAE,UAAU,KAAK,SAAS;AACzG,OAAK,cAAc,EAAE,SAAS,EAAE,QAAQ;AACxC,OAAK,eAAe,EAAE;;CAGxB,YAAoB;AAClB,OAAK,WAAW;EAChB,MAAM,KAAK,KAAK;EAChB,MAAM,OAAO,KAAK;AAElB,WAAS,iBAAiB,cAAc,CAAC,SAAS,WAAW;GAC3D,MAAM,KAAM,OAAuB,QAAQ;AAC3C,OAAI,CAAC,KAAK,WAAW,IAAI,GAAG,CAC1B,MAAK,WAAW,IAAI,IAAI,OAAsB;IAEhD;EAEF,MAAM,WAAW,iBAAiB,GAAG,CAAC;AACtC,OAAK,gBAAgB,GAAG,MAAM;EAE9B,MAAM,cAAc,SAAS,cAAc,MAAM;AACjD,cAAY,YAAY;AACxB,cAAY,MAAM,SAAS,KAAK,SAAS;AACzC,cAAY,MAAM,eAAe;AACjC,cAAY,MAAM,aAAa;AAC/B,KAAG,cAAe,aAAa,aAAa,GAAG;AAE/C,WAAS,KAAK,YAAY,GAAG;AAC7B,SAAO,OAAO,GAAG,OAAO;GACtB,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO,KAAK,QAAQ;GACpB,QAAQ,KAAK,SAAS;GACtB,WAAW,aAAa,KAAK,KAAK,MAAM,KAAK,IAAI;GAGjD,eAAe;GACf,QAAQ;GACR,QAAQ;GACR,YAAY;GACZ,WAAW;GACZ,CAAC;AACF,KAAG;AAEH,KAAG,MAAM,YAAY;AAErB,OAAK,eAAe;AAEpB,OAAK,sBAAsB,KAAK;AAChC,OAAK,gBAAgB,KAAK;;CAG5B,cAAsB,SAAiB,SAAiB;EACtD,IAAI,UAAyB;EAC7B,IAAI,UAA8B;AAElC,OAAK,MAAM,CAAC,IAAI,OAAO,KAAK,YAAY;GACtC,MAAM,IAAI,GAAG,uBAAuB;AACpC,OAAI,WAAW,EAAE,QAAQ,WAAW,EAAE,SAAS,WAAW,EAAE,OAAO,WAAW,EAAE,QAAQ;AACtF,cAAU;AACV,cAAU;AACV;;;AAIJ,MAAI,CAAC,WAAW,YAAY,MAAM;AAChC,QAAK,sBAAsB;AAC3B;;EAGF,MAAM,QAAQ,MAAM,KAAK,QAAQ,iBAAiB,YAAY,gBAAgB,CAAC;EAE/E,MAAM,YADa,WAAW,KAAK,eACJ,IAAI;EACnC,IAAI,cAAc,MAAM;AACxB,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,IAAI,MAAM,GAAG,uBAAuB;AAC1C,OAAI,UAAU,EAAE,MAAM,EAAE,SAAS,WAAW;AAC1C,kBAAc;AACd;;;AAIJ,OAAK,sBAAsB;AAC3B,OAAK,gBAAgB;AAErB,MAAI,CAAC,KAAK,aAAc;EAExB,MAAM,UAAW,MAAM,gBAAgC;AACvD,MAAI,KAAK,aAAa,kBAAkB,WAAW,KAAK,aAAa,uBAAuB,SAAS;AACnG,OAAI,KAAK,aAAa,eAAe;IACnC,MAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,MAAM,SAAS,KAAK,gBAAgB;AAC1C,UAAM,MAAM,eAAe,KAAK,aAAa,MAAM;AACnD,UAAM,MAAM,aAAa;AACzB,UAAM,MAAM,WAAW;AACvB,SAAK,aAAa,cAAc,aAAa,OAAO,KAAK,aAAa;AACtE,UAAM;AACN,UAAM,MAAM,SAAS;AACrB,UAAM,MAAM,eAAe;AAC3B,UAAM,iBAAiB,uBAAuB,MAAM,QAAQ,EAAE,EAAE,MAAM,MAAM,CAAC;AAC7E,qBAAiB,MAAM,QAAQ,EAAE,IAAI;;AAGvC,QAAK,aAAa,MAAM,aAAa;AACrC,QAAK,aAAa,MAAM,SAAS;AACjC,WAAQ,aAAa,KAAK,cAAc,QAAQ;AAChD,QAAK,aAAa;AAClB,QAAK,aAAa,MAAM,aAAa;AACrC,QAAK,aAAa,MAAM,SAAS,KAAK,gBAAgB;;;CAI1D,WAAmB,GAAkB;AACnC,MAAI,EAAE,QAAQ,YAAY,KAAK,UAC7B,MAAK,aAAa;;CAItB,cAAsB;AACpB,OAAK,wBAAwB;AAC7B,MAAI,CAAC,KAAK,UAAU;AAClB,QAAK,YAAY;AACjB;;AAGF,OAAK,gBAAgB,CAAC,WAAW;AAC/B,QAAK,iBAAiB;AACtB,QAAK,UAAU;IACf;;CAGJ,aAAqB,IAAkB;AACrC,OAAK,wBAAwB;AAE7B,MAAI,CAAC,KAAK,UAAU;AAClB,QAAK,YAAY;AACjB;;EAGF,MAAM,cACJ,KAAK,wBAAwB,OAAO;GAAE,aAAa,KAAK;GAAqB,OAAO,KAAK;GAAe,GAAG;EAE7G,MAAM,eACJ,eAAe,YAAY,gBAAgB,KAAK,sBAAsB,YAAY,UAAU,KAAK;AAEnG,MAAI,eAAe,KAAK,gBAAgB,CAAC,cAAc;GACrD,MAAM,SAAqB;IACzB,aAAa,KAAK;IAClB,QAAQ;KAAE,aAAa,KAAK;KAAoB,OAAO,KAAK;KAAc;IAC1E;IACD;AACD,QAAK,cAAc,CAAC,WAAW;AAC7B,SAAK,kBAAkB;IAIvB,MAAM,cAAc,KAAK,yBAAyB,KAAK,UAAU;AACjE,QAAI,YACF,2BAA0B,YAAY;AAExC,QAAI,KAAK,cAAc,cACrB,MAAK,aAAa,QAAQ;AAE5B,SAAK,eAAe;AACpB,QAAI,KAAK,WAAW,kBAAkB,SAAS,KAC7C,MAAK,UAAU,QAAQ;AAEzB,SAAK,aAAa,OAAO;AACzB,SAAK,UAAU;KACf;QAEF,MAAK,gBAAgB,CAAC,WAAW;AAC/B,QAAK,iBAAiB;AACtB,QAAK,UAAU;IACf;;CAIN,yBAAiC,IAA6B;EAC5D,IAAI,UAA8B;AAClC,SAAO,SAAS;GACd,MAAM,OAAQ,QAAgB;AAC9B,OAAI,KAAM,QAAO;AACjB,aAAU,QAAQ;;AAEpB,SAAO;;CAGT,mBAA2B;AACzB,MAAI,CAAC,KAAK,UAAW;AACrB,OAAK,UAAU,MAAM,UAAU,KAAK;;CAGtC,kBAA0B;AACxB,MAAI,CAAC,KAAK,UAAW;AACrB,OAAK,kBAAkB;AACvB,MAAI,KAAK,cAAc,cACrB,MAAK,aAAa,cAAc,aAAa,KAAK,WAAW,KAAK,aAAa;OAC1E;GACL,MAAM,YAAY,KAAK,WAAW,IAAI,KAAK,mBAAmB;AAC9D,OAAI,WAAW;IACb,MAAM,QAAQ,MAAM,KAAK,UAAU,iBAAiB,YAAY,gBAAgB,CAAC;AACjF,cAAU,aAAa,KAAK,WAAW,MAAM,KAAK,iBAAiB,KAAK;;;;CAK9E,iBAAyB,aAAqD;EAC5E,MAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU;EAEf,MAAM,gBAAgB,KAAK,WAAW,IAAI,YAAY,YAAY;AAClE,MAAI,CAAC,cAAe;EAGpB,MAAM,UADY,MAAM,KAAK,cAAc,iBAAiB,YAAY,gBAAgB,CAAC,CAC9D,YAAY,UAA0B;AACjE,gBAAc,aAAa,UAAU,QAAQ;EAE7C,MAAM,cAAc,KAAK,yBAAyB,SAAS;AAC3D,MAAI,CAAC,YAAa;EAElB,MAAM,aAAa,SAAS,YAAY;EACxC,MAAM,eAAe,WAAW;AAChC,MAAI,CAAC,aAAc;EAEnB,MAAM,SAAS,KAAK,mBAAmB,cAAc,YAAY;AACjE,MAAI,CAAC,OAAQ;EAEb,MAAM,aAAa,KAAK,yBAAyB,cAAc;AAC/D,MAAI,CAAC,WAAY;AAEjB,SAAO,IAAI,OAAO,OAAO,OAAO,EAAE;EAClC,MAAM,UAAU,WAAW,OAAO;AAClC,MAAI,MAAM,QAAQ,QAAQ,CACxB,SAAQ,OAAO,YAAY,OAAO,GAAG,YAAY;AAInD,aAAW,wBAAwB;;CAGrC,mBAA2B,QAAa,OAA+D;AAGrG,OAAK,MAAM,OAAO,OAAO,sBAAsB,OAAO,EAAE;AAEtD,OAAI,EADS,IAAI,eAAe,IACtB,WAAW,iBAAiB,CAAE;GACxC,MAAM,MAAM,OAAO;AACnB,OAAI,CAAC,MAAM,QAAQ,IAAI,CAAE;GACzB,MAAM,MAAM,IAAI,QAAQ,MAAM;AAC9B,OAAI,QAAQ,GAAI,QAAO;IAAE,KAAK;IAAK;IAAK,OAAO;IAAK;;AAEtD,SAAO;;CAGT,eAAsC;AACpC,SAAO,IAAI,SAAS,YAAY;AAC9B,OAAI,CAAC,KAAK,aAAa,CAAC,KAAK,aAAc,QAAO,SAAS;GAC3D,MAAM,SAAS,KAAK,aAAa,uBAAuB;AACxD,QAAK,UAAU,MAAM,aACnB;AACF,QAAK,UAAU,MAAM,YAAY,aAAa,OAAO,KAAK,MAAM,OAAO,IAAI;AAC3E,QAAK,UAAU,MAAM,SAAS;AAC9B,QAAK,UAAU,MAAM,YAAY;GACjC,IAAI,OAAO;GACX,MAAM,eAAe;AACnB,QAAI,KAAM;AACV,WAAO;AACP,aAAS;;AAEX,QAAK,UAAU,iBAAiB,iBAAiB,QAAQ,EAAE,MAAM,MAAM,CAAC;AACxE,cAAW,QAAQ,IAAI;IACvB;;CAGJ,iBAAwC;AACtC,SAAO,IAAI,SAAS,YAAY;AAC9B,OAAI,CAAC,KAAK,aAAa,CAAC,KAAK,YAAa,QAAO,SAAS;GAC1D,IAAI,UAAU,KAAK,YAAY;GAC/B,IAAI,UAAU,KAAK,YAAY;AAC/B,OAAI,KAAK,cAAc,eAAe;IACpC,MAAM,SAAS,KAAK,aAAa,uBAAuB;AACxD,cAAU,OAAO;AACjB,cAAU,OAAO;;AAEnB,QAAK,UAAU,MAAM,aACnB;AACF,QAAK,UAAU,MAAM,YAAY,aAAa,QAAQ,MAAM,QAAQ;AACpE,QAAK,UAAU,MAAM,SAAS;AAC9B,QAAK,UAAU,MAAM,YAAY;GACjC,IAAI,OAAO;GACX,MAAM,eAAe;AACnB,QAAI,KAAM;AACV,WAAO;AACP,aAAS;;AAEX,QAAK,UAAU,iBAAiB,iBAAiB,QAAQ,EAAE,MAAM,MAAM,CAAC;AACxE,cAAW,QAAQ,IAAI;IACvB;;CAGJ,yBAAiC;AAC/B,WAAS,oBAAoB,eAAe,KAAK,WAAW;AAC5D,WAAS,oBAAoB,aAAa,KAAK,SAAS;AACxD,WAAS,oBAAoB,WAAW,KAAK,cAAc;;CAG7D,WAAmB;AACjB,MAAI,KAAK,WAAY;AACrB,OAAK,aAAa;AAElB,OAAK,cAAc,QAAQ;AAC3B,OAAK,eAAe;AACpB,OAAK,YAAY;AACjB,OAAK,cAAc;AAEnB,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK,aAAa;AAClB,OAAK,sBAAsB;;CAG7B,UAAU;AACR,OAAK,wBAAwB;AAC7B,MAAI,KAAK,WAAW;AAClB,OAAI,KAAK,UAAW,MAAK,iBAAiB;AAC1C,QAAK,UAAU;;AAEjB,MAAI,KAAK,wBAAwB,OAAO,aAAa,aAAa;AAChE,YAAS,oBAAoB,eAAe,KAAK,eAAe,KAAK;AACrE,QAAK,uBAAuB;;AAE9B,OAAK,WAAW,OAAO;AACvB,OAAK,YAAY;;;AAIrB,MAAa,aAAa,IAAI,YAAY"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { dndManager } from "./dnd-manager.mjs";
|
|
2
|
-
import { Component,
|
|
2
|
+
import { Component, GEA_ELEMENT, GEA_INSTANTIATE_CHILD_COMPONENTS, GEA_MOUNT_COMPILED_CHILD_COMPONENTS, GEA_ON_PROP_CHANGE, GEA_PATCH_NODE } from "@geajs/core";
|
|
3
3
|
//#region src/components/drag-drop-context.tsx
|
|
4
4
|
var DragDropContext = class extends Component {
|
|
5
5
|
static {
|
|
6
|
-
this
|
|
6
|
+
this.__geaTagName = "drag-drop-context";
|
|
7
7
|
}
|
|
8
8
|
created() {
|
|
9
9
|
dndManager.onDragEnd = (result) => {
|
|
@@ -17,22 +17,29 @@ var DragDropContext = class extends Component {
|
|
|
17
17
|
template(props) {
|
|
18
18
|
return `<div id="${this.id}" class="${`gea-dnd-context ${props.class || ""}`.trim()}">${props.children}</div>`;
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
[GEA_ON_PROP_CHANGE](key, value) {
|
|
21
21
|
if (key === "class") {
|
|
22
22
|
const __el = this[GEA_ELEMENT];
|
|
23
23
|
this.props;
|
|
24
24
|
const __boundValue = `gea-dnd-context ${value || ""}`;
|
|
25
25
|
if (__el) {
|
|
26
|
-
const __newClass =
|
|
26
|
+
const __newClass = String(__boundValue ?? "").trim().replace(/\s+/g, " ");
|
|
27
27
|
if (__el.className !== __newClass) __el.className = __newClass;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
if (key === "children") {
|
|
31
31
|
const __el = this[GEA_ELEMENT];
|
|
32
|
-
if (__el
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
if (__el) {
|
|
33
|
+
const __tw = document.createElement("template");
|
|
34
|
+
__tw.innerHTML = value;
|
|
35
|
+
const __newEl = __tw.content.firstElementChild;
|
|
36
|
+
const __existEl = __el.firstElementChild;
|
|
37
|
+
if (__newEl && __existEl && __tw.content.childNodes.length === 1) this.constructor[GEA_PATCH_NODE](__existEl, __newEl, true);
|
|
38
|
+
else if (__el.innerHTML !== value) {
|
|
39
|
+
__el.innerHTML = value;
|
|
40
|
+
this[GEA_INSTANTIATE_CHILD_COMPONENTS]();
|
|
41
|
+
if (this.parentComponent) this.parentComponent[GEA_MOUNT_COMPILED_CHILD_COMPONENTS]();
|
|
42
|
+
}
|
|
36
43
|
}
|
|
37
44
|
}
|
|
38
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drag-drop-context.mjs","names":["Component","
|
|
1
|
+
{"version":3,"file":"drag-drop-context.mjs","names":["Component","GEA_ON_PROP_CHANGE","GEA_ELEMENT","GEA_PATCH_NODE","GEA_INSTANTIATE_CHILD_COMPONENTS","GEA_MOUNT_COMPILED_CHILD_COMPONENTS","dndManager","DragResult","DragDropContext","__geaTagName","created","onDragEnd","result","props","dispose","destroy","template","__id","id","class","trim","children","key","value","__el","__boundValue","__newClass","String","replace","className","__tw","document","createElement","innerHTML","__newEl","content","firstElementChild","__existEl","childNodes","length","constructor","parentComponent"],"sources":["../src/components/drag-drop-context.tsx"],"sourcesContent":["import { Component } from '@geajs/core'\nimport { dndManager } from './dnd-manager'\nimport type { DragResult } from './dnd-manager'\n\nexport default class DragDropContext extends Component {\n created() {\n dndManager.onDragEnd = (result: DragResult) => {\n ;(this.props as any).onDragEnd?.(result)\n }\n }\n\n dispose() {\n dndManager.destroy()\n super.dispose()\n }\n\n template(props: any) {\n return <div class={`gea-dnd-context ${props.class || ''}`}>{props.children}</div>\n }\n}\n"],"mappings":";;;AAIA,IAAqBQ,kBAArB,cAA6CR,UAAU;;sBAAA;;CACrDU,UAAU;AACRJ,aAAWK,aAAaC,WAAuB;AAC3C,QAAKC,MAAcF,YAAYC,OAAO;;;CAI5CE,UAAU;AACRR,aAAWS,SAAS;AACpB,QAAMD,SAAS;;CAGjBE,SAASH,OAAY;AACnB,SAAA,YADmB,KAAAK,GACnB,WAAmB,mBAAmBL,MAAMM,SAAS,KAAIC,MAAA,CAAA,IAAGP,MAAMQ,SAAQ;;CAhB9E,CAAApB,oBAAwBqB,KAAKC,OAAK;AAAA,MAAAD,QAAA,SAAA;GAAA,MAAAE,OAAA,KAAAtB;AAeb,QAAAW;GAAA,MAAAY,eACE,mBAAmBF,SAAe;AAAI,OAAAC,MAhB7D;IACM,MAAME,aADXC,OAAOF,gBAAyB,GAAG,CAAEL,MAAM,CAACQ,QAAQ,QAAQ,IACf;AACxC,QAAIJ,KAAsBK,cAAcH,WAAYF,MAAsBK,YAAYH;;;AACvF,MAAAJ,QAAA,YAAA;GAAA,MAAAE,OAAA,KAAAtB;AAAA,OAAAsB,MAHL;IACI,MAAMM,OAAOC,SAASC,cAAc,WAAW;AAC/CF,SAAKG,YAASV;IACd,MAAMW,UAAUJ,KAAKK,QAAQC;IAC7B,MAAMC,YAAYb,KAAsBY;AACxC,QAAIF,WAAWG,aAAaP,KAAKK,QAAQG,WAAWC,WAAW,EAC7D,MAAKC,YAAWrC,gBAAwBkC,WAAWH,SAAS,KAAK;aACxDV,KAAsBS,cAASV,OAA4B;AACpEC,UAAsBS,YAASV;AAC/B,UAAInB,mCAAyB;AAC7B,SAAI,KAAKqC,gBAAiB,MAAKA,gBAAepC,sCAAyB"}
|
package/dist/draggable.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dndManager } from "./dnd-manager.mjs";
|
|
2
|
-
import { Component,
|
|
2
|
+
import { Component, GEA_ELEMENT, GEA_INSTANTIATE_CHILD_COMPONENTS, GEA_MOUNT_COMPILED_CHILD_COMPONENTS, GEA_ON_PROP_CHANGE, GEA_PATCH_NODE } from "@geajs/core";
|
|
3
3
|
//#region src/components/draggable.tsx
|
|
4
4
|
var Draggable = class extends Component {
|
|
5
5
|
constructor(..._args) {
|
|
@@ -7,7 +7,7 @@ var Draggable = class extends Component {
|
|
|
7
7
|
this._didDrag = false;
|
|
8
8
|
}
|
|
9
9
|
static {
|
|
10
|
-
this
|
|
10
|
+
this.__geaTagName = "gea-draggable";
|
|
11
11
|
}
|
|
12
12
|
_onPointerDown(e) {
|
|
13
13
|
const el = e.currentTarget.closest(".gea-draggable");
|
|
@@ -16,52 +16,72 @@ var Draggable = class extends Component {
|
|
|
16
16
|
dndManager.startTracking(e, this.props.draggableId, el);
|
|
17
17
|
}
|
|
18
18
|
template(props) {
|
|
19
|
-
return `<div id="${this.id}" class="${`gea-draggable ${props.class || ""}`.trim()}"${props.draggableId == null || props.draggableId === false ? "" : ` data-draggable-id="${props.draggableId}"`}${props.index == null || props.index === false ? "" : ` data-index="${props.index}"`}
|
|
19
|
+
return `<div id="${this.id}" class="${`gea-draggable ${props.class || ""}`.trim()}"${props.draggableId == null || props.draggableId === false ? "" : ` data-draggable-id="${props.draggableId}"`}${props.index == null || props.index === false ? "" : ` data-index="${props.index}"`}>${props.children}</div>`;
|
|
20
20
|
}
|
|
21
21
|
get events() {
|
|
22
22
|
if (this.__evts && this[GEA_ELEMENT]) return this.__evts;
|
|
23
|
-
const
|
|
23
|
+
const __id = this.id;
|
|
24
|
+
const __geaEvtsResult = {
|
|
25
|
+
pointerdown: { [`#${__id}`]: this.__event_pointerdown_0 },
|
|
26
|
+
click: { [`#${__id}`]: this.__event_click_1 }
|
|
27
|
+
};
|
|
24
28
|
if (this[GEA_ELEMENT]) this.__evts = __geaEvtsResult;
|
|
25
29
|
return __geaEvtsResult;
|
|
26
30
|
}
|
|
27
|
-
|
|
31
|
+
__event_pointerdown_0(e, targetComponent) {
|
|
32
|
+
this._onPointerDown(e);
|
|
33
|
+
}
|
|
34
|
+
__event_click_1(e, targetComponent) {
|
|
28
35
|
if (dndManager.isDragging) {
|
|
29
36
|
e.preventDefault();
|
|
30
37
|
e.stopPropagation();
|
|
31
38
|
}
|
|
32
39
|
}
|
|
33
|
-
|
|
40
|
+
[GEA_ON_PROP_CHANGE](key, value) {
|
|
34
41
|
if (key === "class") {
|
|
35
42
|
const __el = this[GEA_ELEMENT];
|
|
36
43
|
this.props;
|
|
37
44
|
const __boundValue = `gea-draggable ${value || ""}`;
|
|
38
45
|
if (__el) {
|
|
39
|
-
const __newClass =
|
|
46
|
+
const __newClass = String(__boundValue ?? "").trim().replace(/\s+/g, " ");
|
|
40
47
|
if (__el.className !== __newClass) __el.className = __newClass;
|
|
41
48
|
}
|
|
42
49
|
}
|
|
43
50
|
if (key === "draggableId") {
|
|
44
51
|
const __el = this[GEA_ELEMENT];
|
|
45
|
-
if (__el)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
if (__el) {
|
|
53
|
+
var __av = value;
|
|
54
|
+
if (__av == null || __av === false) __el.removeAttribute("data-draggable-id");
|
|
55
|
+
else {
|
|
56
|
+
const __newAttr = String(__av);
|
|
57
|
+
if (__el.getAttribute("data-draggable-id") !== __newAttr) __el.setAttribute("data-draggable-id", __newAttr);
|
|
58
|
+
}
|
|
49
59
|
}
|
|
50
60
|
}
|
|
51
61
|
if (key === "index") {
|
|
52
62
|
const __el = this[GEA_ELEMENT];
|
|
53
|
-
if (__el)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
63
|
+
if (__el) {
|
|
64
|
+
var __av = value;
|
|
65
|
+
if (__av == null || __av === false) __el.removeAttribute("data-index");
|
|
66
|
+
else {
|
|
67
|
+
const __newAttr = String(__av);
|
|
68
|
+
if (__el.getAttribute("data-index") !== __newAttr) __el.setAttribute("data-index", __newAttr);
|
|
69
|
+
}
|
|
57
70
|
}
|
|
58
71
|
}
|
|
59
72
|
if (key === "children") {
|
|
60
73
|
const __el = this[GEA_ELEMENT];
|
|
61
|
-
if (__el
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
74
|
+
if (__el) {
|
|
75
|
+
const __tw = document.createElement("template");
|
|
76
|
+
__tw.innerHTML = value;
|
|
77
|
+
const __newEl = __tw.content.firstElementChild;
|
|
78
|
+
const __existEl = __el.firstElementChild;
|
|
79
|
+
if (__newEl && __existEl && __tw.content.childNodes.length === 1) this.constructor[GEA_PATCH_NODE](__existEl, __newEl, true);
|
|
80
|
+
else if (__el.innerHTML !== value) {
|
|
81
|
+
__el.innerHTML = value;
|
|
82
|
+
this[GEA_INSTANTIATE_CHILD_COMPONENTS]();
|
|
83
|
+
if (this.parentComponent) this.parentComponent[GEA_MOUNT_COMPILED_CHILD_COMPONENTS]();
|
|
84
|
+
}
|
|
65
85
|
}
|
|
66
86
|
}
|
|
67
87
|
}
|
package/dist/draggable.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draggable.mjs","names":["Component","
|
|
1
|
+
{"version":3,"file":"draggable.mjs","names":["Component","GEA_ELEMENT","GEA_ON_PROP_CHANGE","GEA_PATCH_NODE","GEA_INSTANTIATE_CHILD_COMPONENTS","GEA_MOUNT_COMPILED_CHILD_COMPONENTS","dndManager","Draggable","__geaTagName","_didDrag","_onPointerDown","e","PointerEvent","el","currentTarget","HTMLElement","closest","startTracking","props","draggableId","template","__id","id","class","trim","index","children","events","__evts","__geaEvtsResult","pointerdown","__event_pointerdown_0","click","__event_click_1","targetComponent","isDragging","preventDefault","stopPropagation","key","value","__el","__boundValue","__newClass","String","replace","className","__av","removeAttribute","__newAttr","getAttribute","setAttribute","__tw","document","createElement","innerHTML","__newEl","content","firstElementChild","__existEl","childNodes","length","constructor","parentComponent"],"sources":["../src/components/draggable.tsx"],"sourcesContent":["import { Component } from '@geajs/core'\nimport { dndManager } from './dnd-manager'\n\nexport default class Draggable extends Component {\n _didDrag = false\n\n _onPointerDown(e: PointerEvent) {\n const el = (e.currentTarget as HTMLElement).closest('.gea-draggable') as HTMLElement\n if (!el) return\n this._didDrag = false\n dndManager.startTracking(e, this.props.draggableId as string, el)\n }\n\n template(props: any) {\n return (\n <div\n class={`gea-draggable ${props.class || ''}`}\n data-draggable-id={props.draggableId}\n data-index={props.index}\n pointerdown={(e: PointerEvent) => this._onPointerDown(e)}\n click={(e: MouseEvent) => {\n if (dndManager.isDragging) {\n e.preventDefault()\n e.stopPropagation()\n }\n }}\n >\n {props.children}\n </div>\n )\n }\n}\n"],"mappings":";;;AAGA,IAAqBO,YAArB,cAAuCP,UAAU;;;kBACpC;;;sBADoC;;CAG/CU,eAAeC,GAAiB;EAC9B,MAAME,KAAMF,EAAEG,cAA8BE,QAAQ,iBAAiB;AACrE,MAAI,CAACH,GAAI;AACT,OAAKJ,WAAW;AAChBH,aAAWW,cAAcN,GAAG,KAAKO,MAAMC,aAAuBN,GAAG;;CAGnEO,SAASF,OAAY;AACnB,SAAA,YADmB,KAAAI,GACnB,WAEW,iBAAiBJ,MAAMK,SAAS,KAAIC,MAAA,CAAA,GACxBN,MAAMC,eAAW,QAAjBD,MAAMC,gBAAW,QAAA,KAAA,uBAAjBD,MAAMC,YAAW,KACxBD,MAAMO,SAAK,QAAXP,MAAMO,UAAK,QAAA,KAAA,gBAAXP,MAAMO,MAAK,GAAA,GAStBP,MAAMQ,SAAQ;;CAGpB,IAAAC,SAAA;AAAA,MAAA,KAAAC,UAAA,KAAA3B,aAAA,QAAA,KAAA2B;EAAA,MAAAP,OAAA,KAAAC;EAAA,MAAAO,kBAAA;GAAAC,aAAA,GAAA,IAAAT,SAAA,KAAAU,uBAAA;GAAAC,OAAA,GAAA,IAAAX,SAAA,KAAAY,iBAAA;GAAA;AAAA,MAAA,KAAAhC,aAAA,MAAA2B,SAAAC;AAAA,SAAAA;;CA7BHE,sBAAsBpB,GAAGuB,iBAAiB;AAkBA,OAAKxB,eAAeC,EAAE;;CAlBhEsB,gBAAsBtB,GAAGuB,iBAAiB;AAoBhC,MAAI5B,WAAW6B,YAAY;AACzBxB,KAAEyB,gBAAgB;AAClBzB,KAAE0B,iBAAiB;;;CAtB/B,CAAAnC,oBAAwBoC,KAAKC,OAAK;AAAA,MAAAD,QAAA,SAAA;GAAA,MAAAE,OAAA,KAAAvC;AAYb,QAAAiB;GAAA,MAAAuB,eAGN,iBAAiBF,SAAe;AAAI,OAAAC,MAfnD;IACM,MAAME,aADXC,OAAOF,gBAAyB,GAAG,CAAEjB,MAAM,CAACoB,QAAQ,QAAQ,IACf;AACxC,QAAIJ,KAAsBK,cAAcH,WAAYF,MAAsBK,YAAYH;;;AACvF,MAAAJ,QAAA,eAAA;GAAA,MAAAE,OAAA,KAAAvC;AAAA,OAAAuC,MAAA;IAFC,IAAIM,OAAIP;AACR,QAAIO,QAAQ,QAAQA,SAAS,MAC3BN,MAAsBO,gBAAgB,oBAAoB;SACrD;KACL,MAAMC,YAAYL,OAAOG,KAAK;AAC9B,SAAIN,KAAsBS,aAAa,oBAAoB,KAAKD,UAC9DR,MAAsBU,aAAa,qBAAqBF,UAAU;;;;AACrE,MAAAV,QAAA,SAAA;GAAA,MAAAE,OAAA,KAAAvC;AAAA,OAAAuC,MAAA;IAPD,IAAIM,OAAIP;AACR,QAAIO,QAAQ,QAAQA,SAAS,MAC3BN,MAAsBO,gBAAgB,aAAa;SAC9C;KACL,MAAMC,YAAYL,OAAOG,KAAK;AAC9B,SAAIN,KAAsBS,aAAa,aAAa,KAAKD,UACvDR,MAAsBU,aAAa,cAAcF,UAAU;;;;AAC9D,MAAAV,QAAA,YAAA;GAAA,MAAAE,OAAA,KAAAvC;AAAA,OAAAuC,MARP;IACI,MAAMW,OAAOC,SAASC,cAAc,WAAW;AAC/CF,SAAKG,YAASf;IACd,MAAMgB,UAAUJ,KAAKK,QAAQC;IAC7B,MAAMC,YAAYlB,KAAsBiB;AACxC,QAAIF,WAAWG,aAAaP,KAAKK,QAAQG,WAAWC,WAAW,EAC7D,MAAKC,YAAW1D,gBAAwBuD,WAAWH,SAAS,KAAK;aACxDf,KAAsBc,cAASf,OAA4B;AACpEC,UAAsBc,YAASf;AAC/B,UAAInC,mCAAyB;AAC7B,SAAI,KAAK0D,gBAAiB,MAAKA,gBAAezD,sCAAyB"}
|
package/dist/droppable.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dndManager } from "./dnd-manager.mjs";
|
|
2
|
-
import { Component,
|
|
2
|
+
import { Component, GEA_ELEMENT, GEA_INSTANTIATE_CHILD_COMPONENTS, GEA_MOUNT_COMPILED_CHILD_COMPONENTS, GEA_ON_PROP_CHANGE, GEA_PATCH_NODE } from "@geajs/core";
|
|
3
3
|
//#region src/components/droppable.tsx
|
|
4
4
|
var Droppable = class extends Component {
|
|
5
5
|
constructor(..._args) {
|
|
@@ -7,7 +7,7 @@ var Droppable = class extends Component {
|
|
|
7
7
|
this._registered = false;
|
|
8
8
|
}
|
|
9
9
|
static {
|
|
10
|
-
this
|
|
10
|
+
this.__geaTagName = "gea-droppable";
|
|
11
11
|
}
|
|
12
12
|
_registerWithManager() {
|
|
13
13
|
const el = this.el?.querySelector("[data-droppable-id]");
|
|
@@ -32,30 +32,40 @@ var Droppable = class extends Component {
|
|
|
32
32
|
template(props) {
|
|
33
33
|
return `<div id="${this.id}" class="${`gea-droppable ${props.class || ""}`.trim()}"${props.droppableId == null || props.droppableId === false ? "" : ` data-droppable-id="${props.droppableId}"`}>${props.children}</div>`;
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
[GEA_ON_PROP_CHANGE](key, value) {
|
|
36
36
|
if (key === "class") {
|
|
37
37
|
const __el = this[GEA_ELEMENT];
|
|
38
38
|
this.props;
|
|
39
39
|
const __boundValue = `gea-droppable ${value || ""}`;
|
|
40
40
|
if (__el) {
|
|
41
|
-
const __newClass =
|
|
41
|
+
const __newClass = String(__boundValue ?? "").trim().replace(/\s+/g, " ");
|
|
42
42
|
if (__el.className !== __newClass) __el.className = __newClass;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
if (key === "droppableId") {
|
|
46
46
|
const __el = this[GEA_ELEMENT];
|
|
47
|
-
if (__el)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
if (__el) {
|
|
48
|
+
var __av = value;
|
|
49
|
+
if (__av == null || __av === false) __el.removeAttribute("data-droppable-id");
|
|
50
|
+
else {
|
|
51
|
+
const __newAttr = String(__av);
|
|
52
|
+
if (__el.getAttribute("data-droppable-id") !== __newAttr) __el.setAttribute("data-droppable-id", __newAttr);
|
|
53
|
+
}
|
|
51
54
|
}
|
|
52
55
|
}
|
|
53
56
|
if (key === "children") {
|
|
54
57
|
const __el = this[GEA_ELEMENT];
|
|
55
|
-
if (__el
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
if (__el) {
|
|
59
|
+
const __tw = document.createElement("template");
|
|
60
|
+
__tw.innerHTML = value;
|
|
61
|
+
const __newEl = __tw.content.firstElementChild;
|
|
62
|
+
const __existEl = __el.firstElementChild;
|
|
63
|
+
if (__newEl && __existEl && __tw.content.childNodes.length === 1) this.constructor[GEA_PATCH_NODE](__existEl, __newEl, true);
|
|
64
|
+
else if (__el.innerHTML !== value) {
|
|
65
|
+
__el.innerHTML = value;
|
|
66
|
+
this[GEA_INSTANTIATE_CHILD_COMPONENTS]();
|
|
67
|
+
if (this.parentComponent) this.parentComponent[GEA_MOUNT_COMPILED_CHILD_COMPONENTS]();
|
|
68
|
+
}
|
|
59
69
|
}
|
|
60
70
|
}
|
|
61
71
|
}
|
package/dist/droppable.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"droppable.mjs","names":["Component","
|
|
1
|
+
{"version":3,"file":"droppable.mjs","names":["Component","GEA_ON_PROP_CHANGE","GEA_ELEMENT","GEA_PATCH_NODE","GEA_INSTANTIATE_CHILD_COMPONENTS","GEA_MOUNT_COMPILED_CHILD_COMPONENTS","dndManager","Droppable","__geaTagName","_registered","_registerWithManager","el","querySelector","HTMLElement","registerDroppable","props","droppableId","created","queueMicrotask","onAfterRender","dispose","unregisterDroppable","template","__id","id","class","trim","children","key","value","__el","__boundValue","__newClass","String","replace","className","__av","removeAttribute","__newAttr","getAttribute","setAttribute","__tw","document","createElement","innerHTML","__newEl","content","firstElementChild","__existEl","childNodes","length","constructor","parentComponent"],"sources":["../src/components/droppable.tsx"],"sourcesContent":["import { Component } from '@geajs/core'\nimport { dndManager } from './dnd-manager'\n\nexport default class Droppable extends Component {\n private _registered = false\n\n _registerWithManager() {\n const el = this.el?.querySelector('[data-droppable-id]') as HTMLElement\n if (el && !this._registered) {\n dndManager.registerDroppable(this.props.droppableId as string, el)\n this._registered = true\n }\n }\n\n created() {\n queueMicrotask(() => this._registerWithManager())\n }\n\n onAfterRender() {\n this._registerWithManager()\n }\n\n dispose() {\n if (this._registered) {\n dndManager.unregisterDroppable(this.props.droppableId as string)\n this._registered = false\n }\n super.dispose()\n }\n\n template(props: any) {\n return (\n <div class={`gea-droppable ${props.class || ''}`} data-droppable-id={props.droppableId}>\n {props.children}\n </div>\n )\n }\n}\n"],"mappings":";;;AAGA,IAAqBO,YAArB,cAAuCP,UAAU;;;qBACzB;;;sBADyB;;CAG/CU,uBAAuB;EACrB,MAAMC,KAAK,KAAKA,IAAIC,cAAc,sBAAsB;AACxD,MAAID,MAAM,CAAC,KAAKF,aAAa;AAC3BH,cAAWQ,kBAAkB,KAAKC,MAAMC,aAAuBL,GAAG;AAClE,QAAKF,cAAc;;;CAIvBQ,UAAU;AACRC,uBAAqB,KAAKR,sBAAsB,CAAC;;CAGnDS,gBAAgB;AACd,OAAKT,sBAAsB;;CAG7BU,UAAU;AACR,MAAI,KAAKX,aAAa;AACpBH,cAAWe,oBAAoB,KAAKN,MAAMC,YAAsB;AAChE,QAAKP,cAAc;;AAErB,QAAMW,SAAS;;CAGjBE,SAASP,OAAY;AACnB,SAAA,YADmB,KAAAS,GACnB,WACc,iBAAiBT,MAAMU,SAAS,KAAIC,MAAA,CAAA,GAAqBX,MAAMC,eAAW,QAAjBD,MAAMC,gBAAW,QAAA,KAAA,uBAAjBD,MAAMC,YAAW,GAAA,GACnFD,MAAMY,SAAQ;;CAhCvB,CAAA1B,oBAAwB2B,KAAKC,OAAK;AAAA,MAAAD,QAAA,SAAA;GAAA,MAAAE,OAAA,KAAA5B;AA6Bb,QAAAa;GAAA,MAAAgB,eAEH,iBAAiBF,SAAe;AAAI,OAAAC,MA/BtD;IACM,MAAME,aADXC,OAAOF,gBAAyB,GAAG,CAAEL,MAAM,CAACQ,QAAQ,QAAQ,IACf;AACxC,QAAIJ,KAAsBK,cAAcH,WAAYF,MAAsBK,YAAYH;;;AACvF,MAAAJ,QAAA,eAAA;GAAA,MAAAE,OAAA,KAAA5B;AAAA,OAAA4B,MAAA;IAFC,IAAIM,OAAIP;AACR,QAAIO,QAAQ,QAAQA,SAAS,MAC3BN,MAAsBO,gBAAgB,oBAAoB;SACrD;KACL,MAAMC,YAAYL,OAAOG,KAAK;AAC9B,SAAIN,KAAsBS,aAAa,oBAAoB,KAAKD,UAC9DR,MAAsBU,aAAa,qBAAqBF,UAAU;;;;AACrE,MAAAV,QAAA,YAAA;GAAA,MAAAE,OAAA,KAAA5B;AAAA,OAAA4B,MARP;IACI,MAAMW,OAAOC,SAASC,cAAc,WAAW;AAC/CF,SAAKG,YAASf;IACd,MAAMgB,UAAUJ,KAAKK,QAAQC;IAC7B,MAAMC,YAAYlB,KAAsBiB;AACxC,QAAIF,WAAWG,aAAaP,KAAKK,QAAQG,WAAWC,WAAW,EAC7D,MAAKC,YAAWhD,gBAAwB6C,WAAWH,SAAS,KAAK;aACxDf,KAAsBc,cAASf,OAA4B;AACpEC,UAAsBc,YAASf;AAC/B,UAAIzB,mCAAyB;AAC7B,SAAI,KAAKgD,gBAAiB,MAAKA,gBAAe/C,sCAAyB"}
|
package/dist/file-upload.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { t as ZagComponent } from "./zag-component.mjs";
|
|
2
|
-
import { Component, GEA_APPLY_LIST_CHANGES,
|
|
2
|
+
import { Component, GEA_APPLY_LIST_CHANGES, GEA_DOM_ITEM, GEA_DOM_KEY, GEA_ELEMENT, GEA_ENSURE_ARRAY_CONFIGS, GEA_OBSERVE, GEA_ON_PROP_CHANGE, GEA_PATCH_COND, GEA_REGISTER_COND, GEA_RENDERED, GEA_SETUP_LOCAL_STATE_OBSERVERS, GEA_STORE_ROOT, geaCondPatchedSymbol, geaCondValueSymbol, geaEscapeHtml } from "@geajs/core";
|
|
3
3
|
import { normalizeProps } from "@zag-js/vanilla";
|
|
4
4
|
import * as fileUpload from "@zag-js/file-upload";
|
|
5
5
|
//#region src/components/file-upload.tsx
|
|
6
6
|
var FileUpload = class extends ZagComponent {
|
|
7
7
|
static {
|
|
8
|
-
this
|
|
8
|
+
this.__geaTagName = "file-upload";
|
|
9
9
|
}
|
|
10
10
|
#__rowEls_list;
|
|
11
11
|
#__dc_acceptedFiles;
|
|
@@ -72,13 +72,13 @@ var FileUpload = class extends ZagComponent {
|
|
|
72
72
|
Component._register(ZagComponent, "zag-component");
|
|
73
73
|
return `<div id="${__id}" data-part="root"${(props.class || "") == null || (props.class || "") === false ? "" : ` class="${((props.class || "") != null ? String(props.class || "") : "").trim()}"`}><!--${__id + "-c0"}-->${props.label && `<label data-part="label" class="file-upload-label text-sm font-medium mb-2 block">${geaEscapeHtml(String(props.label))}</label>` || ""}<!--${__id + "-c0-end"}--><div data-part="dropzone" class="file-upload-dropzone flex flex-col items-center justify-center rounded-lg border-2 border-dashed border-muted-foreground/25 p-8 text-center hover:border-muted-foreground/50 transition-colors"><p class="text-sm text-muted-foreground mb-2">Drag and drop files here</p><button data-part="trigger" class="file-upload-trigger inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow hover:bg-primary/90">Choose Files</button></div><input data-part="hidden-input" type="file" class="sr-only" /><!--${__id + "-c1"}-->${this.acceptedFiles.length > 0 && `<div class="file-upload-file-list mt-3 space-y-1">${this.acceptedFiles.map((file) => this.renderAcceptedFilesItem(file)).join("")}<button data-part="clear-trigger" class="file-upload-clear text-xs text-muted-foreground hover:text-foreground mt-1">Clear all</button></div>` || ""}<!--${__id + "-c1-end"}--></div>`;
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
[GEA_ON_PROP_CHANGE](key, value) {
|
|
76
76
|
if (key === "class") {
|
|
77
77
|
const __el = this[GEA_ELEMENT];
|
|
78
78
|
this.props;
|
|
79
79
|
const __boundValue = value || "";
|
|
80
80
|
if (__el) {
|
|
81
|
-
const __newClass =
|
|
81
|
+
const __newClass = String(__boundValue ?? "").trim().replace(/\s+/g, " ");
|
|
82
82
|
if (__el.className !== __newClass) __el.className = __newClass;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -87,9 +87,10 @@ var FileUpload = class extends ZagComponent {
|
|
|
87
87
|
}
|
|
88
88
|
__observe_local_acceptedFiles(value, change) {
|
|
89
89
|
if (this[GEA_RENDERED]) {
|
|
90
|
-
if (this[geaCondPatchedSymbol(1)])
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
if (!this[geaCondPatchedSymbol(1)]) {
|
|
91
|
+
this[geaCondPatchedSymbol(1)] = this[GEA_PATCH_COND](1);
|
|
92
|
+
if (this[geaCondPatchedSymbol(1)]) queueMicrotask(() => this[geaCondPatchedSymbol(1)] = false);
|
|
93
|
+
}
|
|
93
94
|
}
|
|
94
95
|
if (!this.__acceptedFiles_container) this.__acceptedFiles_container = this.$(":scope");
|
|
95
96
|
if (!this.__acceptedFiles_container) return;
|
|
@@ -103,33 +104,33 @@ var FileUpload = class extends ZagComponent {
|
|
|
103
104
|
}
|
|
104
105
|
__observe_local_acceptedFiles__join(value, change) {
|
|
105
106
|
if (this[GEA_RENDERED]) {
|
|
106
|
-
if (this[geaCondPatchedSymbol(1)])
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
if (!this[geaCondPatchedSymbol(1)]) {
|
|
108
|
+
this[geaCondPatchedSymbol(1)] = this[GEA_PATCH_COND](1);
|
|
109
|
+
if (this[geaCondPatchedSymbol(1)]) queueMicrotask(() => this[geaCondPatchedSymbol(1)] = false);
|
|
110
|
+
}
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
renderAcceptedFilesItem(file) {
|
|
113
|
-
return `<div data-
|
|
114
|
+
return `<div data-gid="${file?.name ?? file}" class="flex items-center justify-between rounded-md border px-3 py-2 text-sm"><span>${file.name}</span></div>`;
|
|
114
115
|
}
|
|
115
116
|
createAcceptedFilesItem(item) {
|
|
116
117
|
var __c = this.#__dc_acceptedFiles || (this.#__dc_acceptedFiles = this.__acceptedFiles_container);
|
|
117
|
-
if (!__c
|
|
118
|
+
if (!__c.__geaTpl) try {
|
|
118
119
|
var __tw = document.createElement("template");
|
|
119
120
|
__tw.innerHTML = this.renderAcceptedFilesItem({ name: 0 });
|
|
120
|
-
__c
|
|
121
|
-
__c
|
|
121
|
+
__c.__geaTpl = __tw.content.firstElementChild;
|
|
122
|
+
__c.__geaTpl?.removeAttribute("data-gid");
|
|
122
123
|
} catch (__err) {
|
|
123
124
|
console.error(__err);
|
|
124
125
|
}
|
|
125
|
-
if (__c
|
|
126
|
+
if (__c.__geaTpl) var el = __c.__geaTpl.cloneNode(true);
|
|
126
127
|
else {
|
|
127
128
|
var __fw = document.createElement("template");
|
|
128
129
|
__fw.innerHTML = this.renderAcceptedFilesItem(item);
|
|
129
130
|
var el = __fw.content.firstElementChild;
|
|
130
131
|
}
|
|
131
132
|
el.__ref_0 = el.firstElementChild;
|
|
132
|
-
el.__ref_0.
|
|
133
|
+
if (el.__ref_0.textContent !== `${item.name}`) el.__ref_0.textContent = `${item.name}`;
|
|
133
134
|
el[GEA_DOM_KEY] = String(item?.name ?? item);
|
|
134
135
|
el[GEA_DOM_ITEM] = item;
|
|
135
136
|
return el;
|
|
@@ -137,7 +138,7 @@ var FileUpload = class extends ZagComponent {
|
|
|
137
138
|
patchAcceptedFilesItem(row, item, __prevItem) {
|
|
138
139
|
if (!row) return;
|
|
139
140
|
if (!row.__ref_0) row.__ref_0 = row.firstElementChild;
|
|
140
|
-
row.__ref_0.
|
|
141
|
+
if (row.__ref_0.textContent !== `${item.name}`) row.__ref_0.textContent = `${item.name}`;
|
|
141
142
|
row[GEA_DOM_KEY] = String(item?.name ?? item);
|
|
142
143
|
(this.#__rowEls_list || (this.#__rowEls_list = {}))[String(item?.name ?? item)] = row;
|
|
143
144
|
row[GEA_DOM_ITEM] = item;
|
|
@@ -152,13 +153,15 @@ var FileUpload = class extends ZagComponent {
|
|
|
152
153
|
propPatchers: { "name": [(row, value, item) => {
|
|
153
154
|
const __target = row.__ref_0 || (row.__ref_0 = row.firstElementChild);
|
|
154
155
|
if (!__target) return;
|
|
155
|
-
|
|
156
|
-
}, (row, value) =>
|
|
156
|
+
if (__target.textContent !== `${item.name}`) __target.textContent = `${item.name}`;
|
|
157
|
+
}, (row, value) => {
|
|
158
|
+
row.classList.toggle("name", value);
|
|
159
|
+
}] }
|
|
157
160
|
};
|
|
158
161
|
}
|
|
159
162
|
[GEA_SETUP_LOCAL_STATE_OBSERVERS]() {
|
|
160
163
|
this[GEA_ENSURE_ARRAY_CONFIGS]();
|
|
161
|
-
if (!this
|
|
164
|
+
if (!this[GEA_STORE_ROOT]) return;
|
|
162
165
|
this[GEA_OBSERVE](this, ["acceptedFiles"], this.__observe_local_acceptedFiles);
|
|
163
166
|
this[GEA_OBSERVE](this, ["acceptedFiles", "join"], this.__observe_local_acceptedFiles__join);
|
|
164
167
|
this[GEA_OBSERVE](this, ["acceptedFiles", "map"], this.__observe_local_acceptedFiles__join);
|