@rb-games/core 0.1.1 → 0.1.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/chunk-5BLUF2HG.js +25 -0
- package/dist/chunk-5BLUF2HG.js.map +1 -0
- package/dist/chunk-DOHQE2YZ.js +392 -0
- package/dist/chunk-DOHQE2YZ.js.map +1 -0
- package/dist/chunk-FOZO6TLY.js +673 -0
- package/dist/chunk-FOZO6TLY.js.map +1 -0
- package/dist/chunk-G3PMV62Z.js +33 -0
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/chunk-JHN6RF66.js +1580 -0
- package/dist/chunk-JHN6RF66.js.map +1 -0
- package/dist/chunk-MI6BP7A6.js +11 -0
- package/dist/chunk-MI6BP7A6.js.map +1 -0
- package/dist/chunk-NAQG7TMS.js +5517 -0
- package/dist/chunk-NAQG7TMS.js.map +1 -0
- package/dist/chunk-NQMORMNP.js +15 -0
- package/dist/chunk-NQMORMNP.js.map +1 -0
- package/dist/chunk-RAEOBW6E.js +133 -0
- package/dist/chunk-RAEOBW6E.js.map +1 -0
- package/dist/chunk-UE7T7Z45.js +884 -0
- package/dist/chunk-UE7T7Z45.js.map +1 -0
- package/dist/chunk-YSLGJAV6.js +492 -0
- package/dist/chunk-YSLGJAV6.js.map +1 -0
- package/dist/devtools/index.js +2 -882
- package/dist/devtools/index.js.map +1 -1
- package/dist/engine/index.js +6 -1267
- package/dist/engine/index.js.map +1 -1
- package/dist/filters/index.js +1 -1
- package/dist/helpers/index.js +13 -39
- package/dist/helpers/index.js.map +1 -1
- package/dist/i18n/index.js +4 -525
- package/dist/i18n/index.js.map +1 -1
- package/dist/layout/index.js +2 -671
- package/dist/layout/index.js.map +1 -1
- package/dist/particle/index.js +1 -6
- package/dist/particle/index.js.map +1 -1
- package/dist/plugins/Plugin.types.d.ts +4 -2
- package/dist/plugins/Plugin.types.d.ts.map +1 -1
- package/dist/plugins/index.js +11 -523
- package/dist/plugins/index.js.map +1 -1
- package/dist/state-machine/index.js +4 -2
- package/dist/state-machine/index.js.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/ui/index.js +28 -536
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/index.js +5 -897
- package/dist/utils/index.js.map +1 -1
- package/dist/vite/index.js +4 -2
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../devtools/DraggableController.ts","../devtools/ResizableController.ts","../devtools/treePlugin.ts","../devtools/overlayPlugin.ts","../devtools/spriteTextPropertiesPlugin.ts","../devtools/spinePropertiesPlugin.ts","../devtools/index.ts"],"names":["_a","SECTION"],"mappings":"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","file":"chunk-UE7T7Z45.js","sourcesContent":["import type { Container, FederatedPointerEvent } from 'pixi.js';\n\nexport interface DraggableContainer extends Container {\n __draggable?: boolean;\n __dragging?: boolean;\n}\n\ninterface DragState {\n offsetX: number;\n offsetY: number;\n}\n\nconst dragStates = new WeakMap<Container, DragState>();\nconst originalEventModes = new WeakMap<Container, string>();\nconst originalCursors = new WeakMap<Container, string>();\n\nfunction onDragStart(this: DraggableContainer, e: FederatedPointerEvent) {\n if (!this.__draggable) return;\n\n this.__dragging = true;\n this.cursor = 'grabbing';\n\n const parent = this.parent;\n if (!parent) return;\n\n const localPos = parent.toLocal(e.global);\n\n dragStates.set(this, {\n offsetX: localPos.x - this.x,\n offsetY: localPos.y - this.y,\n });\n\n e.stopPropagation();\n}\n\nfunction onDragMove(this: DraggableContainer, e: FederatedPointerEvent) {\n if (!this.__dragging) return;\n\n const state = dragStates.get(this);\n if (!state) return;\n\n const parent = this.parent;\n if (!parent) return;\n\n const localPos = parent.toLocal(e.global);\n\n this.x = localPos.x - state.offsetX;\n this.y = localPos.y - state.offsetY;\n}\n\nfunction onDragEnd(this: DraggableContainer) {\n if (!this.__dragging) return;\n\n this.__dragging = false;\n this.cursor = 'grab';\n dragStates.delete(this);\n}\n\nexport function enableDrag(container: DraggableContainer): void {\n originalEventModes.set(container, container.eventMode as string);\n originalCursors.set(container, container.cursor as string);\n\n container.eventMode = 'static';\n container.cursor = 'grab';\n\n container.on('pointerdown', onDragStart, container);\n container.on('globalpointermove', onDragMove, container);\n container.on('pointerup', onDragEnd, container);\n container.on('pointerupoutside', onDragEnd, container);\n}\n\nexport function disableDrag(container: DraggableContainer): void {\n container.off('pointerdown', onDragStart, container);\n container.off('globalpointermove', onDragMove, container);\n container.off('pointerup', onDragEnd, container);\n container.off('pointerupoutside', onDragEnd, container);\n\n const originalMode = originalEventModes.get(container);\n if (originalMode !== undefined) {\n container.eventMode = originalMode as Container['eventMode'];\n }\n\n const originalCursor = originalCursors.get(container);\n if (originalCursor !== undefined) {\n container.cursor = originalCursor;\n }\n\n container.__dragging = false;\n dragStates.delete(container);\n originalEventModes.delete(container);\n originalCursors.delete(container);\n}\n\nexport function isDraggable(container: DraggableContainer): boolean {\n return container.__draggable === true;\n}\n\nexport function isDragging(container: DraggableContainer): boolean {\n return container.__dragging === true;\n}\n","import type { Container } from 'pixi.js';\n\nexport interface ResizableContainer extends Container {\n __resizable?: boolean;\n __resizing?: boolean;\n __resizeOverlay?: ResizeOverlay;\n}\n\ntype HandlePosition = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\ninterface ResizeState {\n handle: HandlePosition;\n startX: number;\n startY: number;\n startScaleX: number;\n startScaleY: number;\n startPosX: number;\n startPosY: number;\n startBounds: { width: number; height: number };\n}\n\ninterface ResizeOverlay {\n container: HTMLDivElement;\n handles: Map<HandlePosition, HTMLDivElement>;\n border: HTMLDivElement;\n animationId: number | null;\n}\n\nconst resizeStates = new WeakMap<Container, ResizeState>();\nconst HANDLE_SIZE = 10;\n\nconst cursors: Record<HandlePosition, string> = {\n nw: 'nwse-resize',\n n: 'ns-resize',\n ne: 'nesw-resize',\n e: 'ew-resize',\n se: 'nwse-resize',\n s: 'ns-resize',\n sw: 'nesw-resize',\n w: 'ew-resize',\n};\n\nfunction getCanvasElement(container: Container): HTMLCanvasElement | null {\n try {\n const renderer = (container as any).__pixiApp?.renderer ??\n (globalThis as any).__PIXI_APP__?.renderer;\n if (renderer?.canvas) return renderer.canvas;\n\n // Fallback: find canvas in DOM\n return document.querySelector('canvas');\n } catch {\n return document.querySelector('canvas');\n }\n}\n\nfunction createOverlayContainer(canvas: HTMLCanvasElement): HTMLDivElement {\n const div = document.createElement('div');\n div.className = '__pixi_resize_overlay__';\n div.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 10000;\n `;\n\n // Insert after canvas\n canvas.parentElement?.appendChild(div);\n\n return div;\n}\n\nfunction createBorderDiv(): HTMLDivElement {\n const div = document.createElement('div');\n div.style.cssText = `\n position: absolute;\n border: 2px dashed #00aaff;\n pointer-events: none;\n box-sizing: border-box;\n `;\n return div;\n}\n\nfunction createHandleDiv(pos: HandlePosition): HTMLDivElement {\n const div = document.createElement('div');\n div.dataset.handle = pos;\n div.style.cssText = `\n position: absolute;\n width: ${HANDLE_SIZE}px;\n height: ${HANDLE_SIZE}px;\n background: #00aaff;\n border: 1px solid white;\n border-radius: 2px;\n cursor: ${cursors[pos]};\n pointer-events: auto;\n transform: translate(-50%, -50%);\n transition: background 0.1s;\n `;\n\n div.addEventListener('mouseenter', () => {\n div.style.background = '#ff6600';\n });\n\n div.addEventListener('mouseleave', () => {\n div.style.background = '#00aaff';\n });\n\n return div;\n}\n\nfunction createResizeOverlay(container: ResizableContainer, canvas: HTMLCanvasElement): ResizeOverlay {\n const overlayContainer = createOverlayContainer(canvas);\n const border = createBorderDiv();\n overlayContainer.appendChild(border);\n\n const handles = new Map<HandlePosition, HTMLDivElement>();\n const positions: HandlePosition[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n\n positions.forEach((pos) => {\n const handle = createHandleDiv(pos);\n handles.set(pos, handle);\n overlayContainer.appendChild(handle);\n\n handle.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n onResizeStart(container, pos, e);\n });\n });\n\n return {\n container: overlayContainer,\n handles,\n border,\n animationId: null,\n };\n}\n\nfunction updateOverlayPositions(container: ResizableContainer, canvas: HTMLCanvasElement): void {\n const overlay = container.__resizeOverlay;\n if (!overlay) return;\n\n const bounds = container.getBounds();\n const canvasRect = canvas.getBoundingClientRect();\n\n // Calculate position relative to canvas\n const renderer = (globalThis as any).__PIXI_APP__?.renderer ??\n (container as any).__pixiApp?.renderer;\n\n let scaleX = 1;\n let scaleY = 1;\n\n if (renderer) {\n scaleX = canvasRect.width / renderer.width;\n scaleY = canvasRect.height / renderer.height;\n }\n\n const x = bounds.x * scaleX;\n const y = bounds.y * scaleY;\n const w = bounds.width * scaleX;\n const h = bounds.height * scaleY;\n\n // Update border\n overlay.border.style.left = `${x}px`;\n overlay.border.style.top = `${y}px`;\n overlay.border.style.width = `${w}px`;\n overlay.border.style.height = `${h}px`;\n\n // Update handles\n const handlePositions: Record<HandlePosition, { x: number; y: number }> = {\n nw: { x: x, y: y },\n n: { x: x + w / 2, y: y },\n ne: { x: x + w, y: y },\n e: { x: x + w, y: y + h / 2 },\n se: { x: x + w, y: y + h },\n s: { x: x + w / 2, y: y + h },\n sw: { x: x, y: y + h },\n w: { x: x, y: y + h / 2 },\n };\n\n overlay.handles.forEach((handle, pos) => {\n const { x: hx, y: hy } = handlePositions[pos];\n handle.style.left = `${hx}px`;\n handle.style.top = `${hy}px`;\n });\n}\n\nfunction startUpdateLoop(container: ResizableContainer, canvas: HTMLCanvasElement): void {\n const overlay = container.__resizeOverlay;\n if (!overlay) return;\n\n const update = () => {\n if (!container.__resizable || !container.__resizeOverlay) return;\n updateOverlayPositions(container, canvas);\n overlay.animationId = requestAnimationFrame(update);\n };\n\n overlay.animationId = requestAnimationFrame(update);\n}\n\nfunction stopUpdateLoop(overlay: ResizeOverlay): void {\n if (overlay.animationId !== null) {\n cancelAnimationFrame(overlay.animationId);\n overlay.animationId = null;\n }\n}\n\nfunction onResizeStart(container: ResizableContainer, handle: HandlePosition, e: PointerEvent): void {\n if (!container.__resizable) return;\n\n container.__resizing = true;\n\n const bounds = container.getLocalBounds();\n\n resizeStates.set(container, {\n handle,\n startX: e.clientX,\n startY: e.clientY,\n startScaleX: container.scale.x,\n startScaleY: container.scale.y,\n startPosX: container.x,\n startPosY: container.y,\n startBounds: { width: bounds.width, height: bounds.height },\n });\n\n const onMove = (moveEvent: PointerEvent) => {\n onResizeMove(container, moveEvent);\n };\n\n const onUp = () => {\n onResizeEnd(container);\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n };\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n}\n\nfunction onResizeMove(container: ResizableContainer, e: PointerEvent): void {\n const state = resizeStates.get(container);\n if (!state || !container.__resizing) return;\n\n const dx = e.clientX - state.startX;\n const dy = e.clientY - state.startY;\n\n const baseWidth = state.startBounds.width;\n const baseHeight = state.startBounds.height;\n const startWidth = baseWidth * state.startScaleX;\n const startHeight = baseHeight * state.startScaleY;\n\n let newScaleX = state.startScaleX;\n let newScaleY = state.startScaleY;\n let newX = state.startPosX;\n let newY = state.startPosY;\n\n switch (state.handle) {\n case 'e':\n newScaleX = (startWidth + dx) / baseWidth;\n break;\n case 'w':\n newScaleX = (startWidth - dx) / baseWidth;\n newX = state.startPosX + dx;\n break;\n case 's':\n newScaleY = (startHeight + dy) / baseHeight;\n break;\n case 'n':\n newScaleY = (startHeight - dy) / baseHeight;\n newY = state.startPosY + dy;\n break;\n case 'se':\n newScaleX = (startWidth + dx) / baseWidth;\n newScaleY = (startHeight + dy) / baseHeight;\n break;\n case 'sw':\n newScaleX = (startWidth - dx) / baseWidth;\n newScaleY = (startHeight + dy) / baseHeight;\n newX = state.startPosX + dx;\n break;\n case 'ne':\n newScaleX = (startWidth + dx) / baseWidth;\n newScaleY = (startHeight - dy) / baseHeight;\n newY = state.startPosY + dy;\n break;\n case 'nw':\n newScaleX = (startWidth - dx) / baseWidth;\n newScaleY = (startHeight - dy) / baseHeight;\n newX = state.startPosX + dx;\n newY = state.startPosY + dy;\n break;\n }\n\n // Minimum scale limit\n if (newScaleX > 0.1) {\n container.scale.x = newScaleX;\n container.x = newX;\n }\n if (newScaleY > 0.1) {\n container.scale.y = newScaleY;\n container.y = newY;\n }\n}\n\nfunction onResizeEnd(container: ResizableContainer): void {\n container.__resizing = false;\n resizeStates.delete(container);\n}\n\nexport function enableResize(container: ResizableContainer): void {\n if (container.__resizeOverlay) return;\n\n const canvas = getCanvasElement(container);\n if (!canvas) {\n console.warn('[ResizableController] Canvas not found');\n return;\n }\n\n const overlay = createResizeOverlay(container, canvas);\n container.__resizeOverlay = overlay;\n\n updateOverlayPositions(container, canvas);\n startUpdateLoop(container, canvas);\n}\n\nexport function disableResize(container: ResizableContainer): void {\n const overlay = container.__resizeOverlay;\n if (overlay) {\n stopUpdateLoop(overlay);\n overlay.container.remove();\n container.__resizeOverlay = undefined;\n }\n container.__resizing = false;\n resizeStates.delete(container);\n}\n\nexport function isResizable(container: ResizableContainer): boolean {\n return container.__resizable === true;\n}\n\nexport function isResizing(container: ResizableContainer): boolean {\n return container.__resizing === true;\n}\n","import type { Container } from 'pixi.js';\nimport type { PixiMetadata, TreeExtension } from '@pixi/devtools';\nimport { enableDrag, disableDrag, type DraggableContainer } from './DraggableController';\nimport { enableResize, disableResize, type ResizableContainer } from './ResizableController';\n\nexport interface TransformableContainer extends DraggableContainer, ResizableContainer { }\n\nexport const draggableTreePlugin: TreeExtension = {\n extension: {\n name: 'draggable-tree',\n type: 'sceneTree',\n },\n updateNodeMetadata(node: TransformableContainer, metadata: PixiMetadata) {\n // Drag toggle button\n metadata.buttons!.push({\n name: 'drag',\n icon: '✋',\n type: 'toggle',\n value: node.__draggable ?? false,\n });\n\n // Resize toggle button\n metadata.buttons!.push({\n name: 'resize',\n icon: '⤡',\n type: 'toggle',\n value: node.__resizable ?? false,\n });\n\n // Suffix indicators\n const suffixes: string[] = [];\n if (node.__draggable) suffixes.push('🔀');\n if (node.__resizable) suffixes.push('📐');\n\n if (suffixes.length > 0) {\n metadata.suffix = (metadata.suffix ?? '') + ' ' + suffixes.join('');\n }\n\n return metadata;\n },\n onButtonPress(container: TransformableContainer, buttonName: string, pressed?: boolean) {\n if (buttonName === 'drag') {\n container.__draggable = pressed;\n if (pressed) {\n enableDrag(container);\n } else {\n disableDrag(container);\n }\n } else if (buttonName === 'resize') {\n container.__resizable = pressed;\n if (pressed) {\n enableResize(container);\n } else {\n disableResize(container);\n }\n }\n },\n};\n","import type { Container } from 'pixi.js';\nimport type { OverlayExtension } from '@pixi/devtools';\nimport { isDragging, type DraggableContainer } from './DraggableController';\nimport { isResizing, type ResizableContainer } from './ResizableController';\n\ntype TransformableNode = DraggableContainer & ResizableContainer;\n\n// Default DevTools styles (from pixijs/devtools overlayExtension.ts)\nconst defaultSelectedStyle: Partial<CSSStyleDeclaration> = {\n backgroundColor: 'hsla(340, 70%, 44%, 0.35)',\n border: '1px solid hsla(0, 0%, 100%, 0.5)',\n};\n\nconst defaultHoverStyle: Partial<CSSStyleDeclaration> = {\n backgroundColor: 'hsla(192, 84%, 40%, 0.40)',\n border: '1px solid hsla(0, 0%, 100%, 0.5)',\n};\n\nexport const draggableOverlayPlugin: OverlayExtension = {\n extension: {\n name: 'draggable-overlay',\n type: 'overlay',\n },\n getSelectedStyle(node: Container | null) {\n const n = node as TransformableNode | null;\n\n // Dragging state - orange dashed\n if (n && isDragging(n)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.3)',\n border: '2px dashed orange',\n };\n }\n\n // Resizing state - orange dashed\n if (n && isResizing(n)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.3)',\n border: '2px dashed orange',\n };\n }\n\n // Draggable/Resizable enabled - orange solid\n if (n && (n.__draggable || n.__resizable)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.2)',\n border: '2px solid orange',\n };\n }\n\n // Default - return standard DevTools style\n return defaultSelectedStyle;\n },\n getHoverStyle(node: Container | null) {\n const n = node as TransformableNode | null;\n\n // Draggable/Resizable enabled - light orange\n if (n && (n.__draggable || n.__resizable)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.15)',\n border: '1px dashed orange',\n };\n }\n\n // Default - return standard DevTools style\n return defaultHoverStyle;\n },\n};","import type { Container } from 'pixi.js';\nimport type { PropertiesExtension, PropertiesEntry } from '@pixi/devtools';\n\nconst SECTION = 'SpriteText';\n\ninterface SpriteTextLike {\n text: string;\n plainText: string;\n font: string;\n fonts: string[];\n bbcodeEnabled: boolean;\n tint: number;\n fontSize: number;\n pivotHorizontal: string;\n pivotVertical: string;\n lineAlign: string;\n letterSpacing: number;\n spaceWidth: number;\n wordWrap: boolean;\n wordWrapWidth: number;\n breakWord: boolean;\n allowLineBreak: boolean;\n kerningEnabled: boolean;\n curveEnabled: boolean;\n curveControlXPercent: number;\n curveControlYPercent: number;\n}\n\nconst spriteTextProps: string[] = [\n 'spriteText.text',\n 'spriteText.font',\n 'spriteText.tint',\n 'spriteText.fontSize',\n 'spriteText.pivotHorizontal',\n 'spriteText.pivotVertical',\n 'spriteText.lineAlign',\n 'spriteText.letterSpacing',\n 'spriteText.spaceWidth',\n 'spriteText.wordWrap',\n 'spriteText.wordWrapWidth',\n 'spriteText.breakWord',\n 'spriteText.allowLineBreak',\n 'spriteText.kerningEnabled',\n 'spriteText.curveEnabled',\n 'spriteText.curveControlXPercent',\n 'spriteText.curveControlYPercent',\n];\n\nfunction isSpriteText(container: Container): boolean {\n // Check by constructor name or duck typing\n const name = container.constructor.name;\n if (name === 'SpriteText') return true;\n\n // Duck typing fallback\n const c = container as any;\n const isDuck = c._text !== undefined &&\n c._font !== undefined &&\n c._glyphs !== undefined;\n\n if (isDuck) {\n console.log('[SpriteText Plugin] Detected via duck typing:', name);\n }\n\n return isDuck;\n}\n\nexport const spriteTextPropertiesPlugin: PropertiesExtension = {\n extension: {\n type: 'sceneProperties' as any,\n name: 'spritetext-properties',\n priority: 10,\n },\n\n testNode(container: Container): boolean {\n return isSpriteText(container);\n },\n\n testProp(prop: string): boolean {\n return spriteTextProps.includes(prop);\n },\n\n setProperty(container: Container, prop: string, value: any): void {\n const spriteText = container as unknown as SpriteTextLike;\n const propName = prop.replace('spriteText.', '');\n\n switch (propName) {\n case 'text':\n spriteText.text = value;\n break;\n case 'font':\n spriteText.font = value;\n break;\n case 'tint':\n // DevTools sends color as number or hex string\n if (typeof value === 'string') {\n // Convert hex string (#ffffff) to number\n spriteText.tint = parseInt(value.replace('#', ''), 16);\n } else {\n spriteText.tint = value;\n }\n break;\n case 'fontSize':\n spriteText.fontSize = value;\n break;\n case 'pivotHorizontal':\n spriteText.pivotHorizontal = value;\n break;\n case 'pivotVertical':\n spriteText.pivotVertical = value;\n break;\n case 'lineAlign':\n spriteText.lineAlign = value;\n break;\n case 'letterSpacing':\n spriteText.letterSpacing = value;\n break;\n case 'spaceWidth':\n spriteText.spaceWidth = value;\n break;\n case 'wordWrap':\n spriteText.wordWrap = value;\n break;\n case 'wordWrapWidth':\n spriteText.wordWrapWidth = value;\n break;\n case 'breakWord':\n spriteText.breakWord = value;\n break;\n case 'allowLineBreak':\n spriteText.allowLineBreak = value;\n break;\n case 'kerningEnabled':\n spriteText.kerningEnabled = value;\n break;\n case 'curveEnabled':\n spriteText.curveEnabled = value;\n break;\n case 'curveControlXPercent':\n spriteText.curveControlXPercent = value;\n break;\n case 'curveControlYPercent':\n spriteText.curveControlYPercent = value;\n break;\n }\n },\n\n getProperties(container: Container): PropertiesEntry[] {\n try {\n const spriteText = container as unknown as SpriteTextLike;\n\n return [\n {\n prop: 'spriteText.text',\n value: spriteText.text,\n entry: {\n section: SECTION,\n label: 'Text',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.plainText',\n value: spriteText.plainText,\n entry: {\n section: SECTION,\n label: 'Plain Text',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.bbcodeEnabled',\n value: spriteText.bbcodeEnabled,\n entry: {\n section: SECTION,\n label: 'BBCode Enabled',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.font',\n value: spriteText.font,\n entry: {\n section: SECTION,\n label: 'Font',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.fonts',\n value: spriteText.fonts.join(', '),\n entry: {\n section: SECTION,\n label: 'Fonts',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.tint',\n // DevTools color picker expects number\n value: spriteText.tint,\n entry: {\n section: SECTION,\n label: 'Tint',\n type: 'color',\n },\n },\n {\n prop: 'spriteText.fontSize',\n value: spriteText.fontSize,\n entry: {\n section: SECTION,\n label: 'Font Size',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.pivotHorizontal',\n value: spriteText.pivotHorizontal,\n entry: {\n section: SECTION,\n label: 'Pivot H',\n type: 'select',\n options: { options: ['left', 'center', 'right'] },\n },\n },\n {\n prop: 'spriteText.pivotVertical',\n value: spriteText.pivotVertical,\n entry: {\n section: SECTION,\n label: 'Pivot V',\n type: 'select',\n options: { options: ['top', 'middle', 'bottom'] },\n },\n },\n {\n prop: 'spriteText.lineAlign',\n value: spriteText.lineAlign,\n entry: {\n section: SECTION,\n label: 'Line Align',\n type: 'select',\n options: { options: ['left', 'center', 'right'] },\n },\n },\n {\n prop: 'spriteText.letterSpacing',\n value: spriteText.letterSpacing,\n entry: {\n section: SECTION,\n label: 'Letter Spacing',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.spaceWidth',\n value: spriteText.spaceWidth,\n entry: {\n section: SECTION,\n label: 'Space Width',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.wordWrap',\n value: spriteText.wordWrap,\n entry: {\n section: SECTION,\n label: 'Word Wrap',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.wordWrapWidth',\n value: spriteText.wordWrapWidth,\n entry: {\n section: SECTION,\n label: 'Wrap Width',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.breakWord',\n value: spriteText.breakWord,\n entry: {\n section: SECTION,\n label: 'Break Word',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.allowLineBreak',\n value: spriteText.allowLineBreak,\n entry: {\n section: SECTION,\n label: 'Allow Line Break',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.kerningEnabled',\n value: spriteText.kerningEnabled,\n entry: {\n section: SECTION,\n label: 'Kerning',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.curveEnabled',\n value: spriteText.curveEnabled,\n entry: {\n section: SECTION,\n label: 'Curve Enabled',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.curveControlXPercent',\n value: spriteText.curveControlXPercent,\n entry: {\n section: SECTION,\n label: 'Curve X %',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.curveControlYPercent',\n value: spriteText.curveControlYPercent,\n entry: {\n section: SECTION,\n label: 'Curve Y %',\n type: 'number',\n },\n },\n ];\n } catch (e) {\n console.error('[SpriteText Plugin] Error getting properties:', e);\n return [];\n }\n },\n};\n","import type { Container } from 'pixi.js';\nimport type { PropertiesExtension, PropertiesEntry } from '@pixi/devtools';\n\nconst SECTION = 'Spine';\n\ninterface SpineLike {\n skeleton: {\n data: {\n animations: Array<{ name: string }>;\n skins: Array<{ name: string }>;\n };\n skin: { name: string } | null;\n };\n state: {\n tracks: Array<{ animation?: { name: string } } | null>;\n setAnimation: (trackIndex: number, animationName: string, loop: boolean) => void;\n setEmptyAnimation: (trackIndex: number, mixDuration: number) => void;\n };\n autoUpdate: boolean;\n}\n\nconst spineProps: string[] = [\n 'spine.currentAnimation',\n 'spine.currentSkin',\n 'spine.autoUpdate',\n 'spine.playAnimation',\n];\n\nfunction isSpine(container: Container): boolean {\n const name = container.constructor.name;\n if (name === 'Spine') return true;\n\n // Duck typing fallback\n const c = container as any;\n return c.skeleton !== undefined &&\n c.state !== undefined &&\n c.skeleton?.data?.animations !== undefined;\n}\n\nfunction getAnimationNames(spine: SpineLike): string[] {\n try {\n return spine.skeleton.data.animations.map(a => a.name);\n } catch {\n return [];\n }\n}\n\nfunction getSkinNames(spine: SpineLike): string[] {\n try {\n return spine.skeleton.data.skins.map(s => s.name);\n } catch {\n return [];\n }\n}\n\nfunction getCurrentAnimation(spine: SpineLike): string {\n try {\n const track = spine.state.tracks[0];\n return track?.animation?.name ?? '(none)';\n } catch {\n return '(none)';\n }\n}\n\nfunction getCurrentSkin(spine: SpineLike): string {\n try {\n return spine.skeleton.skin?.name ?? 'default';\n } catch {\n return 'default';\n }\n}\n\nexport const spinePropertiesPlugin: PropertiesExtension = {\n extension: {\n type: 'sceneProperties' as any,\n name: 'spine-properties',\n priority: 10,\n },\n\n testNode(container: Container): boolean {\n return isSpine(container);\n },\n\n testProp(prop: string): boolean {\n return spineProps.includes(prop);\n },\n\n setProperty(container: Container, prop: string, value: any): void {\n const spine = container as unknown as SpineLike;\n const propName = prop.replace('spine.', '');\n\n switch (propName) {\n case 'currentSkin':\n try {\n (spine.skeleton as any).setSkinByName(value);\n (spine.skeleton as any).setSlotsToSetupPose();\n } catch (e) {\n console.error('[Spine Plugin] Error setting skin:', e);\n }\n break;\n case 'playAnimation':\n try {\n if (value && value !== '(none)') {\n spine.state.setAnimation(0, value, true);\n } else {\n spine.state.setEmptyAnimation(0, 0.2);\n }\n } catch (e) {\n console.error('[Spine Plugin] Error playing animation:', e);\n }\n break;\n case 'autoUpdate':\n spine.autoUpdate = value;\n break;\n }\n },\n\n getProperties(container: Container): PropertiesEntry[] {\n try {\n const spine = container as unknown as SpineLike;\n const animations = getAnimationNames(spine);\n const skins = getSkinNames(spine);\n const currentAnim = getCurrentAnimation(spine);\n const currentSkin = getCurrentSkin(spine);\n\n return [\n {\n prop: 'spine.currentAnimation',\n value: currentAnim,\n entry: {\n section: SECTION,\n label: 'Current Animation',\n type: 'text',\n options: { disabled: true },\n },\n },\n {\n prop: 'spine.playAnimation',\n value: currentAnim,\n entry: {\n section: SECTION,\n label: 'Play Animation',\n type: 'select',\n options: { options: ['(none)', ...animations] },\n },\n },\n {\n prop: 'spine.currentSkin',\n value: currentSkin,\n entry: {\n section: SECTION,\n label: 'Skin',\n type: 'select',\n options: { options: skins },\n },\n },\n {\n prop: 'spine.autoUpdate',\n value: spine.autoUpdate,\n entry: {\n section: SECTION,\n label: 'Auto Update',\n type: 'boolean',\n },\n },\n ];\n } catch (e) {\n console.error('[Spine Plugin] Error getting properties:', e);\n return [];\n }\n },\n};\n","import { draggableTreePlugin } from './treePlugin';\nimport { draggableOverlayPlugin } from './overlayPlugin';\nimport { spriteTextPropertiesPlugin } from './spriteTextPropertiesPlugin';\nimport { spinePropertiesPlugin } from './spinePropertiesPlugin';\n\nexport * from './treePlugin';\nexport * from './overlayPlugin';\nexport * from './DraggableController';\nexport * from './ResizableController';\nexport * from './spriteTextPropertiesPlugin';\nexport * from './spinePropertiesPlugin';\n\ninterface Devtools {\n __PIXI_DEVTOOLS__: {\n extensions: any[];\n };\n}\n\nconst gThis = globalThis as unknown as Devtools;\n\ngThis.__PIXI_DEVTOOLS__ = {\n ...gThis.__PIXI_DEVTOOLS__,\n extensions: [\n ...(gThis.__PIXI_DEVTOOLS__?.extensions ?? []),\n draggableTreePlugin,\n draggableOverlayPlugin,\n spriteTextPropertiesPlugin,\n spinePropertiesPlugin,\n ],\n};\n"]}
|
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
import { require_lodash } from './chunk-NAQG7TMS.js';
|
|
2
|
+
import { __toESM } from './chunk-G3PMV62Z.js';
|
|
3
|
+
import { Rectangle, Color } from 'pixi.js';
|
|
4
|
+
|
|
5
|
+
// utils/DataInjector.ts
|
|
6
|
+
var import_lodash = __toESM(require_lodash(), 1);
|
|
7
|
+
function DataInjector(obj, path, data, replace = false) {
|
|
8
|
+
const result = (0, import_lodash.cloneDeep)(obj);
|
|
9
|
+
if (path === "" || path === void 0 || path === null) {
|
|
10
|
+
return (0, import_lodash.merge)({}, result, (0, import_lodash.cloneDeep)(data));
|
|
11
|
+
}
|
|
12
|
+
if (replace) {
|
|
13
|
+
(0, import_lodash.set)(result, path, (0, import_lodash.cloneDeep)(data));
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
const current = (0, import_lodash.get)(result, path);
|
|
17
|
+
const merged = (0, import_lodash.merge)({}, current ?? {}, data);
|
|
18
|
+
(0, import_lodash.set)(result, path, merged);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
function adjustColor(color, amount, sign) {
|
|
22
|
+
const colorObj = new Color(color);
|
|
23
|
+
const rgb = {
|
|
24
|
+
r: colorObj.red * 255,
|
|
25
|
+
g: colorObj.green * 255,
|
|
26
|
+
b: colorObj.blue * 255
|
|
27
|
+
};
|
|
28
|
+
const delta = 255 * amount * sign;
|
|
29
|
+
const newR = Math.max(0, Math.min(255, rgb.r + delta));
|
|
30
|
+
const newG = Math.max(0, Math.min(255, rgb.g + delta));
|
|
31
|
+
const newB = Math.max(0, Math.min(255, rgb.b + delta));
|
|
32
|
+
return new Color([newR / 255, newG / 255, newB / 255]);
|
|
33
|
+
}
|
|
34
|
+
function lightenColor(color, amount) {
|
|
35
|
+
return adjustColor(color, amount, 1);
|
|
36
|
+
}
|
|
37
|
+
function darkenColor(color, amount) {
|
|
38
|
+
return adjustColor(color, amount, -1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// utils/NumberFormatter.ts
|
|
42
|
+
var DEFAULT_CONFIG = {
|
|
43
|
+
mask: "#,##0.##",
|
|
44
|
+
denom: 1,
|
|
45
|
+
expressThreshold: 1e3,
|
|
46
|
+
expressUnits: ["K", "M", "B", "T", "Q"],
|
|
47
|
+
decimalPrecision: 2,
|
|
48
|
+
roundedSymbol: "+"
|
|
49
|
+
};
|
|
50
|
+
var NumberFormatter = class _NumberFormatter {
|
|
51
|
+
static instance;
|
|
52
|
+
config;
|
|
53
|
+
maskCache = /* @__PURE__ */ new Map();
|
|
54
|
+
/**
|
|
55
|
+
* Private constructor for singleton pattern
|
|
56
|
+
*/
|
|
57
|
+
constructor(config) {
|
|
58
|
+
this.config = config;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Configure the NumberFormatter singleton.
|
|
62
|
+
*
|
|
63
|
+
* @param config - Configuration options
|
|
64
|
+
* @returns NumberFormatter instance
|
|
65
|
+
*/
|
|
66
|
+
static configure(config) {
|
|
67
|
+
const finalConfig = { ...DEFAULT_CONFIG, ...config };
|
|
68
|
+
if (!_NumberFormatter.instance) {
|
|
69
|
+
_NumberFormatter.instance = new _NumberFormatter(finalConfig);
|
|
70
|
+
} else {
|
|
71
|
+
_NumberFormatter.instance.config = finalConfig;
|
|
72
|
+
_NumberFormatter.instance.maskCache.clear();
|
|
73
|
+
}
|
|
74
|
+
return _NumberFormatter.instance;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the singleton instance.
|
|
78
|
+
*
|
|
79
|
+
* If not configured yet, initializes with default configuration.
|
|
80
|
+
*
|
|
81
|
+
* @returns NumberFormatter instance
|
|
82
|
+
*/
|
|
83
|
+
static getInstance() {
|
|
84
|
+
if (!_NumberFormatter.instance) {
|
|
85
|
+
_NumberFormatter.instance = new _NumberFormatter(DEFAULT_CONFIG);
|
|
86
|
+
}
|
|
87
|
+
return _NumberFormatter.instance;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format a number using the configured mask.
|
|
91
|
+
*
|
|
92
|
+
* @param value - Number to format
|
|
93
|
+
* @param options - Optional formatting options
|
|
94
|
+
* @returns Formatted string
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* formatter.format(1500); // "$ 15.00"
|
|
99
|
+
* formatter.format(1500, { forceDecimals: true }); // "$ 15.00"
|
|
100
|
+
* formatter.format(1500, { ignoreDenom: true }); // "$ 1,500.00"
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
format(value, options = {}) {
|
|
104
|
+
const { prefix = "", forceDecimals = false, ignoreDenom = false } = options;
|
|
105
|
+
const actualValue = ignoreDenom ? value : value * this.config.denom;
|
|
106
|
+
let mask = this.config.mask;
|
|
107
|
+
if (forceDecimals) {
|
|
108
|
+
mask = mask.replace(/\.##/g, ".00");
|
|
109
|
+
}
|
|
110
|
+
return this.applyMask(mask, actualValue) + prefix;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Format a number in express mode (shortened with K/M/B/T).
|
|
114
|
+
*
|
|
115
|
+
* @param value - Number to format
|
|
116
|
+
* @param options - Optional formatting options
|
|
117
|
+
* @returns Formatted string with unit suffix
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* formatter.express(150000); // "$ 1.5K"
|
|
122
|
+
* formatter.express(2500000); // "$ 2.5M"
|
|
123
|
+
* formatter.express(500, { threshold: 100 }); // "$ 0.5K"
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
express(value, options = {}) {
|
|
127
|
+
const {
|
|
128
|
+
prefix = "",
|
|
129
|
+
forceDecimals = false,
|
|
130
|
+
ignoreDenom = false,
|
|
131
|
+
threshold = this.config.expressThreshold
|
|
132
|
+
} = options;
|
|
133
|
+
const actualValue = ignoreDenom ? value : value * this.config.denom;
|
|
134
|
+
if (actualValue < threshold) {
|
|
135
|
+
return this.format(value, { prefix, forceDecimals, ignoreDenom });
|
|
136
|
+
}
|
|
137
|
+
let unitIndex = -1;
|
|
138
|
+
let shortenedNum = actualValue;
|
|
139
|
+
while (shortenedNum >= 1e3 && unitIndex < this.config.expressUnits.length - 1) {
|
|
140
|
+
shortenedNum /= 1e3;
|
|
141
|
+
unitIndex++;
|
|
142
|
+
}
|
|
143
|
+
const factor = Math.pow(10, this.config.decimalPrecision);
|
|
144
|
+
const roundedNum = Math.floor(shortenedNum * factor) / factor;
|
|
145
|
+
const isRounded = roundedNum < shortenedNum;
|
|
146
|
+
let mask = this.config.mask;
|
|
147
|
+
if (forceDecimals) {
|
|
148
|
+
mask = mask.replace(/\.##/g, ".00");
|
|
149
|
+
}
|
|
150
|
+
const parsed = this.parseMask(mask);
|
|
151
|
+
const formattedNumber = this.applyMask(parsed.pattern, roundedNum) + (this.config.expressUnits[unitIndex] || "") + (isRounded ? this.config.roundedSymbol : "");
|
|
152
|
+
return parsed.prefix + formattedNumber + parsed.suffix + prefix;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Parse a mask string into its components.
|
|
156
|
+
*
|
|
157
|
+
* @param mask - Mask string to parse
|
|
158
|
+
* @returns Parsed mask information
|
|
159
|
+
* @internal
|
|
160
|
+
*/
|
|
161
|
+
parseMask(mask) {
|
|
162
|
+
if (this.maskCache.has(mask)) {
|
|
163
|
+
return this.maskCache.get(mask);
|
|
164
|
+
}
|
|
165
|
+
const len = mask.length;
|
|
166
|
+
const start = mask.search(/[0-9\-\+#]/);
|
|
167
|
+
const prefix = start > 0 ? mask.substring(0, start).trim() : "";
|
|
168
|
+
const str = mask.split("").reverse().join("");
|
|
169
|
+
const end = str.search(/[0-9\-\+#]/);
|
|
170
|
+
const offset = len - end;
|
|
171
|
+
const indx = offset + (mask.substring(offset, offset + 1) === "." ? 1 : 0);
|
|
172
|
+
const suffix = end > 0 ? mask.substring(indx, len).trim() : "";
|
|
173
|
+
const pattern = mask.substring(start, indx);
|
|
174
|
+
const result = pattern.match(/[^\d\-\+#]/g);
|
|
175
|
+
const decimal = result && result[result.length - 1] || ".";
|
|
176
|
+
const group = result && result[1] && result[0] || ",";
|
|
177
|
+
const parts = pattern.split(decimal);
|
|
178
|
+
const decimalPlaces = parts[1] ? parts[1].length : 0;
|
|
179
|
+
const szSep = parts[0].split(group);
|
|
180
|
+
const groupSize = szSep[1] ? szSep[szSep.length - 1].length : 0;
|
|
181
|
+
const cleanPattern = parts[0].replace(new RegExp(`\\${group}`, "g"), "");
|
|
182
|
+
const posLeadZero = cleanPattern.indexOf("0");
|
|
183
|
+
const parsed = {
|
|
184
|
+
pattern,
|
|
185
|
+
prefix,
|
|
186
|
+
suffix,
|
|
187
|
+
decimal,
|
|
188
|
+
group,
|
|
189
|
+
decimalPlaces,
|
|
190
|
+
posLeadZero,
|
|
191
|
+
groupSize
|
|
192
|
+
};
|
|
193
|
+
this.maskCache.set(mask, parsed);
|
|
194
|
+
return parsed;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Apply a mask to a number value.
|
|
198
|
+
*
|
|
199
|
+
* @param mask - Mask pattern
|
|
200
|
+
* @param value - Number to format
|
|
201
|
+
* @returns Formatted string
|
|
202
|
+
* @internal
|
|
203
|
+
*/
|
|
204
|
+
applyMask(mask, value) {
|
|
205
|
+
if (!mask || isNaN(+value) || value === "") return value;
|
|
206
|
+
const parsed = this.parseMask(mask);
|
|
207
|
+
let isNegative = value < 0;
|
|
208
|
+
value = Math.abs(value);
|
|
209
|
+
const maskParts = parsed.pattern.split(parsed.decimal);
|
|
210
|
+
value = value.toFixed(maskParts[1] ? maskParts[1].length : 0);
|
|
211
|
+
value = +value + "";
|
|
212
|
+
const posTrailZero = maskParts[1] ? maskParts[1].lastIndexOf("0") : -1;
|
|
213
|
+
let parts = value.split(".");
|
|
214
|
+
if (!parts[1] || parts[1] && parts[1].length <= posTrailZero) {
|
|
215
|
+
value = (+value).toFixed(posTrailZero + 1);
|
|
216
|
+
}
|
|
217
|
+
const szSep = maskParts[0].split(parsed.group);
|
|
218
|
+
const cleanMask = szSep.join("");
|
|
219
|
+
if (parsed.posLeadZero > -1) {
|
|
220
|
+
while (parts[0].length < cleanMask.length - parsed.posLeadZero) {
|
|
221
|
+
parts[0] = "0" + parts[0];
|
|
222
|
+
}
|
|
223
|
+
} else if (+parts[0] === 0) {
|
|
224
|
+
parts[0] = "";
|
|
225
|
+
}
|
|
226
|
+
const valueParts = value.split(".");
|
|
227
|
+
valueParts[0] = parts[0];
|
|
228
|
+
if (parsed.groupSize) {
|
|
229
|
+
const integer = valueParts[0];
|
|
230
|
+
let str = "";
|
|
231
|
+
const offset = integer.length % parsed.groupSize;
|
|
232
|
+
const len = integer.length;
|
|
233
|
+
for (let i = 0; i < len; i++) {
|
|
234
|
+
str += integer.charAt(i);
|
|
235
|
+
if (!((i - offset + 1) % parsed.groupSize) && i < len - parsed.groupSize) {
|
|
236
|
+
str += parsed.group;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
valueParts[0] = str;
|
|
240
|
+
}
|
|
241
|
+
valueParts[1] = maskParts[1] && valueParts[1] ? parsed.decimal + valueParts[1] : "";
|
|
242
|
+
const result = valueParts.join("");
|
|
243
|
+
if (result === "0" || result === "") {
|
|
244
|
+
isNegative = false;
|
|
245
|
+
}
|
|
246
|
+
return parsed.prefix + (isNegative ? "-" : "") + result + parsed.suffix;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Decimal/group separators and fraction length from the configured mask.
|
|
250
|
+
* Use for free-form numeric inputs (e.g. bet multipliers) that are not currency amounts.
|
|
251
|
+
*/
|
|
252
|
+
getMaskLocale() {
|
|
253
|
+
const parsed = this.parseMask(this.config.mask);
|
|
254
|
+
return {
|
|
255
|
+
decimal: parsed.decimal,
|
|
256
|
+
group: parsed.group,
|
|
257
|
+
decimalPlaces: parsed.decimalPlaces > 0 ? parsed.decimalPlaces : this.config.decimalPrecision
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Format a number using only the numeric portion of the mask (no prefix/suffix, no denom).
|
|
262
|
+
* Suitable for multipliers and limits (e.g. autoplay 10.5× bet).
|
|
263
|
+
*/
|
|
264
|
+
formatPlainNumber(value, options = {}) {
|
|
265
|
+
const { forceDecimals = false } = options;
|
|
266
|
+
const parsed = this.parseMask(this.config.mask);
|
|
267
|
+
let pattern = parsed.pattern;
|
|
268
|
+
if (forceDecimals) {
|
|
269
|
+
pattern = pattern.replace(/\.##/g, ".00");
|
|
270
|
+
}
|
|
271
|
+
return this.applyMask(pattern, value);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Get current configuration.
|
|
275
|
+
*
|
|
276
|
+
* @returns Current configuration
|
|
277
|
+
*/
|
|
278
|
+
getConfig() {
|
|
279
|
+
return { ...this.config };
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
// utils/ArrayUtils.ts
|
|
284
|
+
Object.defineProperty(Array.prototype, "exclude", {
|
|
285
|
+
value: function(...indexToExclude) {
|
|
286
|
+
return this.filter((_, index) => !indexToExclude.includes(index));
|
|
287
|
+
},
|
|
288
|
+
enumerable: false
|
|
289
|
+
});
|
|
290
|
+
Object.defineProperty(Array.prototype, "random", {
|
|
291
|
+
value: function() {
|
|
292
|
+
const randomIndex = Math.floor(Math.random() * this.length);
|
|
293
|
+
return this[randomIndex];
|
|
294
|
+
},
|
|
295
|
+
enumerable: false
|
|
296
|
+
});
|
|
297
|
+
Object.defineProperty(Array.prototype, "lastItem", {
|
|
298
|
+
value: function() {
|
|
299
|
+
return this[this.length - 1];
|
|
300
|
+
},
|
|
301
|
+
enumerable: false
|
|
302
|
+
});
|
|
303
|
+
Object.defineProperty(Array.prototype, "firstItem", {
|
|
304
|
+
value: function() {
|
|
305
|
+
return this[0];
|
|
306
|
+
},
|
|
307
|
+
enumerable: false
|
|
308
|
+
});
|
|
309
|
+
Object.defineProperty(Array.prototype, "clone", {
|
|
310
|
+
value: function() {
|
|
311
|
+
return [...this];
|
|
312
|
+
},
|
|
313
|
+
enumerable: false
|
|
314
|
+
});
|
|
315
|
+
Object.defineProperty(Array.prototype, "shuffle", {
|
|
316
|
+
value: function() {
|
|
317
|
+
const array = [...this];
|
|
318
|
+
for (let i = array.length - 1; i > 0; i--) {
|
|
319
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
320
|
+
[array[i], array[j]] = [array[j], array[i]];
|
|
321
|
+
}
|
|
322
|
+
return array;
|
|
323
|
+
},
|
|
324
|
+
enumerable: false
|
|
325
|
+
});
|
|
326
|
+
var __arrayUtilsLoaded = true;
|
|
327
|
+
function calculateAnimationSpeed(exportedFps = 12, speed = 1) {
|
|
328
|
+
return exportedFps / 60 * speed;
|
|
329
|
+
}
|
|
330
|
+
function applyAnchor(element, anchor, defaultAnchor) {
|
|
331
|
+
if (!("anchor" in element)) return;
|
|
332
|
+
const elementWithAnchor = element;
|
|
333
|
+
if (anchor) {
|
|
334
|
+
elementWithAnchor.anchor.set(anchor.x, anchor.y);
|
|
335
|
+
} else if (defaultAnchor) {
|
|
336
|
+
elementWithAnchor.anchor.set(defaultAnchor.x, defaultAnchor.y);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function applyScale(element, scale) {
|
|
340
|
+
if (scale === void 0) return;
|
|
341
|
+
if (typeof scale === "number") {
|
|
342
|
+
element.scale.set(scale);
|
|
343
|
+
} else {
|
|
344
|
+
element.scale.set(scale.x, scale.y);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function applyCommonProperties(element, config) {
|
|
348
|
+
if (config.alpha !== void 0) {
|
|
349
|
+
element.alpha = config.alpha;
|
|
350
|
+
}
|
|
351
|
+
if (config.blendMode) {
|
|
352
|
+
element.blendMode = config.blendMode;
|
|
353
|
+
}
|
|
354
|
+
applyScale(element, config.scale);
|
|
355
|
+
}
|
|
356
|
+
function updateBounds(existingBounds, x, y, width, height) {
|
|
357
|
+
if (existingBounds instanceof Rectangle) {
|
|
358
|
+
existingBounds.x = x;
|
|
359
|
+
existingBounds.y = y;
|
|
360
|
+
existingBounds.width = width;
|
|
361
|
+
existingBounds.height = height;
|
|
362
|
+
return existingBounds;
|
|
363
|
+
}
|
|
364
|
+
return new Rectangle(x, y, width, height);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// utils/Throttle.ts
|
|
368
|
+
function debounce(func, wait = 0, options = {}) {
|
|
369
|
+
let lastArgs;
|
|
370
|
+
let lastThis;
|
|
371
|
+
const maxWait = options.maxWait ? options.maxWait : wait;
|
|
372
|
+
let result;
|
|
373
|
+
let timerId;
|
|
374
|
+
let lastCallTime;
|
|
375
|
+
let lastInvokeTime = 0;
|
|
376
|
+
const leading = !!options.leading;
|
|
377
|
+
const maxing = "maxWait" in options;
|
|
378
|
+
const trailing = options.trailing ?? true;
|
|
379
|
+
const useRAF = wait !== 0 && typeof globalThis.requestAnimationFrame === "function";
|
|
380
|
+
if (typeof func !== "function") {
|
|
381
|
+
throw new TypeError("Expected a function");
|
|
382
|
+
}
|
|
383
|
+
function invokeFunc(time) {
|
|
384
|
+
const args = lastArgs;
|
|
385
|
+
const thisArg = lastThis;
|
|
386
|
+
lastArgs = lastThis = void 0;
|
|
387
|
+
lastInvokeTime = time;
|
|
388
|
+
result = func.apply(thisArg, args);
|
|
389
|
+
return result;
|
|
390
|
+
}
|
|
391
|
+
function startTimer(pendingFunc, milliseconds) {
|
|
392
|
+
if (useRAF) {
|
|
393
|
+
if (typeof timerId === "number") {
|
|
394
|
+
globalThis.cancelAnimationFrame(timerId);
|
|
395
|
+
}
|
|
396
|
+
return globalThis.requestAnimationFrame(pendingFunc);
|
|
397
|
+
}
|
|
398
|
+
return setTimeout(pendingFunc, milliseconds);
|
|
399
|
+
}
|
|
400
|
+
function cancelTimer(id) {
|
|
401
|
+
if (useRAF) {
|
|
402
|
+
globalThis.cancelAnimationFrame(id);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
clearTimeout(id);
|
|
406
|
+
}
|
|
407
|
+
function leadingEdge(time) {
|
|
408
|
+
lastInvokeTime = time;
|
|
409
|
+
timerId = startTimer(timerExpired, wait);
|
|
410
|
+
return leading ? invokeFunc(time) : result;
|
|
411
|
+
}
|
|
412
|
+
function remainingWait(time) {
|
|
413
|
+
const timeSinceLastCall = time - (lastCallTime || 0);
|
|
414
|
+
const timeSinceLastInvoke = time - lastInvokeTime;
|
|
415
|
+
const timeWaiting = wait - timeSinceLastCall;
|
|
416
|
+
return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
|
|
417
|
+
}
|
|
418
|
+
function shouldInvoke(time) {
|
|
419
|
+
const timeSinceLastCall = time - (lastCallTime || 0);
|
|
420
|
+
const timeSinceLastInvoke = time - lastInvokeTime;
|
|
421
|
+
return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
|
|
422
|
+
}
|
|
423
|
+
function timerExpired() {
|
|
424
|
+
const time = Date.now();
|
|
425
|
+
if (shouldInvoke(time)) {
|
|
426
|
+
return trailingEdge(time);
|
|
427
|
+
}
|
|
428
|
+
timerId = startTimer(timerExpired, remainingWait(time));
|
|
429
|
+
return void 0;
|
|
430
|
+
}
|
|
431
|
+
function trailingEdge(time) {
|
|
432
|
+
timerId = void 0;
|
|
433
|
+
if (trailing && lastArgs) {
|
|
434
|
+
return invokeFunc(time);
|
|
435
|
+
}
|
|
436
|
+
lastArgs = lastThis = void 0;
|
|
437
|
+
return result;
|
|
438
|
+
}
|
|
439
|
+
function cancel() {
|
|
440
|
+
if (timerId !== void 0) {
|
|
441
|
+
cancelTimer(timerId);
|
|
442
|
+
}
|
|
443
|
+
lastInvokeTime = 0;
|
|
444
|
+
lastArgs = lastCallTime = lastThis = timerId = void 0;
|
|
445
|
+
}
|
|
446
|
+
function flush() {
|
|
447
|
+
return timerId === void 0 ? result : trailingEdge(Date.now());
|
|
448
|
+
}
|
|
449
|
+
function pending() {
|
|
450
|
+
return timerId !== void 0;
|
|
451
|
+
}
|
|
452
|
+
function debounced(...args) {
|
|
453
|
+
const time = Date.now();
|
|
454
|
+
const isInvoking = shouldInvoke(time);
|
|
455
|
+
lastArgs = args;
|
|
456
|
+
lastThis = this;
|
|
457
|
+
lastCallTime = time;
|
|
458
|
+
if (isInvoking) {
|
|
459
|
+
if (timerId === void 0) {
|
|
460
|
+
return leadingEdge(lastCallTime);
|
|
461
|
+
}
|
|
462
|
+
if (maxing) {
|
|
463
|
+
timerId = startTimer(timerExpired, wait);
|
|
464
|
+
return invokeFunc(lastCallTime);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
if (timerId === void 0) {
|
|
468
|
+
timerId = startTimer(timerExpired, wait);
|
|
469
|
+
}
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
debounced.cancel = cancel;
|
|
473
|
+
debounced.flush = flush;
|
|
474
|
+
debounced.pending = pending;
|
|
475
|
+
return debounced;
|
|
476
|
+
}
|
|
477
|
+
function throttle(func, wait, options = {}) {
|
|
478
|
+
const leading = options.leading ?? true;
|
|
479
|
+
const trailing = options.trailing ?? true;
|
|
480
|
+
if (typeof func !== "function") {
|
|
481
|
+
throw new TypeError("Expected a function");
|
|
482
|
+
}
|
|
483
|
+
return debounce(func, wait, {
|
|
484
|
+
leading,
|
|
485
|
+
trailing,
|
|
486
|
+
maxWait: wait
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
export { DataInjector, NumberFormatter, __arrayUtilsLoaded, applyAnchor, applyCommonProperties, applyScale, calculateAnimationSpeed, darkenColor, debounce, lightenColor, throttle, updateBounds };
|
|
491
|
+
//# sourceMappingURL=chunk-YSLGJAV6.js.map
|
|
492
|
+
//# sourceMappingURL=chunk-YSLGJAV6.js.map
|