@combos-fun/plugin-development-tool 0.0.24 → 0.0.26

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/agent-skill.md CHANGED
@@ -13,6 +13,8 @@ import {
13
13
  CombosDevelopmentToolSystem,
14
14
  CombosDevelopmentToolTarget,
15
15
  COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,
16
+ COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION,
17
+ COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED,
16
18
  COMBOS_DEVELOPMENT_TOOL_REFRESH,
17
19
  COMBOS_DEVELOPMENT_TOOL_SET,
18
20
  type CombosDevelopmentToolTargetParams,
@@ -69,6 +71,16 @@ new CombosDevelopmentToolSystem({
69
71
 
70
72
  Outbound `postMessageOrigin` is separate — it limits which parent origin receives selection snapshots.
71
73
 
74
+ ## postMessage protocol
75
+
76
+ | Direction | type | Payload | Behavior |
77
+ |-----------|------|---------|----------|
78
+ | parent → iframe | `combos-development-tool:set` | `{ enabled: boolean }` | Enable/disable pick mode |
79
+ | parent → iframe | `combos-development-tool:clear-selection` | `{}` | Clear in-canvas outline |
80
+ | parent → iframe | `combos-development-tool:apply-property` | component field mutation | Live preview |
81
+ | iframe → parent | `combos-development-tool:gameobject-selected` | `{ snapshot, pointer }` | Object picked |
82
+ | iframe → parent | `combos-development-tool:gameobject-deselected` | `{ reason }` | Selection cleared (`parent-request`, `pick-disabled`, `target-removed`) |
83
+
72
84
  ## Verification
73
85
 
74
86
  `pnpm --filter @combos-fun/plugin-development-tool run build`.
@@ -14,6 +14,10 @@ const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS = 'combos-development-tool:set-success
14
14
  const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh';
15
15
  /** Emitted to `window.parent` when an object is selected while the tool is on. */
16
16
  const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED = 'combos-development-tool:gameobject-selected';
17
+ /** Parent → iframe: clear the current in-canvas selection outline. */
18
+ const COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION = 'combos-development-tool:clear-selection';
19
+ /** Emitted to `window.parent` when the current selection is cleared. */
20
+ const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED = 'combos-development-tool:gameobject-deselected';
17
21
  /** Parent → iframe: apply a value to a component field (live preview). */
18
22
  const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY = 'combos-development-tool:apply-property';
19
23
  /** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */
@@ -347,6 +351,22 @@ function applyPropertyWithHooks(go, componentName, path, value) {
347
351
  return applyPropertyValue(go, componentName, path, value);
348
352
  }
349
353
 
354
+ function buildGameObjectDeselectedPayload(reason) {
355
+ return {
356
+ type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED,
357
+ reason,
358
+ };
359
+ }
360
+ function shouldNotifyGameObjectDeselected(hadSelection) {
361
+ return hadSelection;
362
+ }
363
+ function isClearSelectionMessage(data) {
364
+ if (!data || typeof data !== 'object') {
365
+ return false;
366
+ }
367
+ return data.type === COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION;
368
+ }
369
+
350
370
  const OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';
351
371
  /**
352
372
  * **Off** at start. While enabled:
@@ -423,6 +443,9 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
423
443
  else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {
424
444
  this.requestSceneRescan();
425
445
  }
446
+ else if (isClearSelectionMessage(d)) {
447
+ this.clearSelectionAndNotify('parent-request');
448
+ }
426
449
  else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {
427
450
  this.handleApplyProperty(d);
428
451
  }
@@ -482,7 +505,7 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
482
505
  this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);
483
506
  this.detachAllPicks();
484
507
  this.restoreDisabledGameEvents();
485
- this.clearSelection();
508
+ this.clearSelectionAndNotify('pick-disabled');
486
509
  }
487
510
  /** Programmatic toggle (same effect as events). */
488
511
  setEnabled(on) {
@@ -490,7 +513,7 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
490
513
  return;
491
514
  this.enabled = on;
492
515
  if (!on) {
493
- this.clearSelection();
516
+ this.clearSelectionAndNotify('pick-disabled');
494
517
  this.detachAllPicks();
495
518
  this.restoreDisabledGameEvents();
496
519
  this.postSetSuccess(false);
@@ -568,7 +591,7 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
568
591
  else if (type === engine.OBSERVER_TYPE.REMOVE) {
569
592
  this.releasePick(gameObject);
570
593
  if (this.selected === gameObject) {
571
- this.clearSelection();
594
+ this.clearSelectionAndNotify('target-removed');
572
595
  }
573
596
  }
574
597
  }
@@ -944,6 +967,21 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
944
967
  }, this.postMessageOrigin);
945
968
  }
946
969
  }
970
+ clearSelectionAndNotify(reason) {
971
+ const hadSelection = this.selected != null;
972
+ this.clearSelection();
973
+ if (!shouldNotifyGameObjectDeselected(hadSelection)) {
974
+ return;
975
+ }
976
+ this.postGameObjectDeselected(reason);
977
+ }
978
+ postGameObjectDeselected(reason) {
979
+ const payload = buildGameObjectDeselectedPayload(reason);
980
+ if (typeof window !== 'undefined' && window.parent && window.parent !== window) {
981
+ window.parent.postMessage(payload, this.postMessageOrigin);
982
+ }
983
+ this.game.emit(payload.type, { reason });
984
+ }
947
985
  clearSelection() {
948
986
  this.selected = null;
949
987
  this.invalidateOutlineBounds();
@@ -993,10 +1031,12 @@ var CombosDevelopmentToolSystem = CombosDevelopmentToolSystem$1;
993
1031
  /** Auto-generated by scripts/build-package.mjs — do not edit. */
994
1032
  Object.assign(CombosDevelopmentToolSystem, {
995
1033
  packageName: "@combos-fun/plugin-development-tool",
996
- packageVersion: "0.0.23",
1034
+ packageVersion: "0.0.26",
997
1035
  });
998
1036
 
999
1037
  exports.COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY = COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY;
1038
+ exports.COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION = COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION;
1039
+ exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED = COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED;
1000
1040
  exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED = COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED;
1001
1041
  exports.COMBOS_DEVELOPMENT_TOOL_READY = COMBOS_DEVELOPMENT_TOOL_READY;
1002
1042
  exports.COMBOS_DEVELOPMENT_TOOL_REFRESH = COMBOS_DEVELOPMENT_TOOL_REFRESH;
@@ -1010,9 +1050,12 @@ exports.CombosDevelopmentToolTarget = CombosDevelopmentToolTarget;
1010
1050
  exports.DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES;
1011
1051
  exports.applyPropertyValue = applyPropertyValue;
1012
1052
  exports.applyPropertyWithHooks = applyPropertyWithHooks;
1053
+ exports.buildGameObjectDeselectedPayload = buildGameObjectDeselectedPayload;
1013
1054
  exports.buildGameObjectSnapshot = buildGameObjectSnapshot;
1014
1055
  exports.isAllowedMessageOrigin = isAllowedMessageOrigin;
1056
+ exports.isClearSelectionMessage = isClearSelectionMessage;
1015
1057
  exports.mergeAllowedMessageOrigins = mergeAllowedMessageOrigins;
1016
1058
  exports.readPropertyValue = readPropertyValue;
1017
1059
  exports.readSourceAnchor = readSourceAnchor;
1060
+ exports.shouldNotifyGameObjectDeselected = shouldNotifyGameObjectDeselected;
1018
1061
  //# sourceMappingURL=plugin-development-tool.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-development-tool.cjs.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/messageOrigin.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Default inbound postMessage host suffixes (host + all subdomains). */\nexport const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [\n 'knoffice.tech',\n 'converge.ai',\n] as const;\n\n/**\n * Returns whether `origin` is allowed by `allowed`.\n *\n * Each entry in `allowed` is either:\n * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;\n * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;\n * - `'*'` — accept any origin (escape hatch).\n */\nexport function isAllowedMessageOrigin(\n origin: string,\n allowed: readonly string[],\n): boolean {\n if (allowed.includes('*')) {\n return true;\n }\n if (allowed.length === 0) {\n return false;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n return false;\n }\n\n const originLower = origin.toLowerCase();\n const hostLower = parsed.hostname.toLowerCase();\n\n for (const entry of allowed) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n if (trimmed.includes('://')) {\n if (originLower === trimmed.toLowerCase()) {\n return true;\n }\n continue;\n }\n\n const suffix = trimmed.toLowerCase().replace(/^\\./, '');\n if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */\nexport function mergeAllowedMessageOrigins(extra?: string[]): string[] {\n if (!extra?.length) {\n return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];\n }\n if (extra.includes('*')) {\n return ['*'];\n }\n\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isAllowedMessageOrigin,\n mergeAllowedMessageOrigins,\n} from './messageOrigin';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n /**\n * Extra inbound `postMessage` origins merged with {@link DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES}.\n * Each entry is a host suffix (e.g. `localhost`) or full origin. Pass `['*']` to accept any origin.\n */\n allowedMessageOrigins?: string[];\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private allowedMessageOrigins = mergeAllowedMessageOrigins();\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {\n return;\n }\n\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.23\",\n});\n"],"names":["Component","CombosDevelopmentToolSystem","System","OBSERVER_TYPE","Event","HIT_AREA_TYPE","Graphics","RendererSystem","GameObject","__decorate","decorators"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-development-tool.cjs.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/messageOrigin.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/selectionNotify.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: clear the current in-canvas selection outline. */\nexport const COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION =\n 'combos-development-tool:clear-selection' as const;\n\n/** Emitted to `window.parent` when the current selection is cleared. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED =\n 'combos-development-tool:gameobject-deselected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Default inbound postMessage host suffixes (host + all subdomains). */\nexport const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [\n 'knoffice.tech',\n 'converge.ai',\n] as const;\n\n/**\n * Returns whether `origin` is allowed by `allowed`.\n *\n * Each entry in `allowed` is either:\n * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;\n * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;\n * - `'*'` — accept any origin (escape hatch).\n */\nexport function isAllowedMessageOrigin(\n origin: string,\n allowed: readonly string[],\n): boolean {\n if (allowed.includes('*')) {\n return true;\n }\n if (allowed.length === 0) {\n return false;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n return false;\n }\n\n const originLower = origin.toLowerCase();\n const hostLower = parsed.hostname.toLowerCase();\n\n for (const entry of allowed) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n if (trimmed.includes('://')) {\n if (originLower === trimmed.toLowerCase()) {\n return true;\n }\n continue;\n }\n\n const suffix = trimmed.toLowerCase().replace(/^\\./, '');\n if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */\nexport function mergeAllowedMessageOrigins(extra?: string[]): string[] {\n if (!extra?.length) {\n return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];\n }\n if (extra.includes('*')) {\n return ['*'];\n }\n\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED,\n} from './constants';\n\nexport type DevelopmentToolDeselectReason = 'parent-request' | 'pick-disabled' | 'target-removed';\n\nexport function buildGameObjectDeselectedPayload(reason: DevelopmentToolDeselectReason) {\n return {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED,\n reason,\n } as const;\n}\n\nexport function shouldNotifyGameObjectDeselected(hadSelection: boolean): boolean {\n return hadSelection;\n}\n\nexport function isClearSelectionMessage(data: unknown): boolean {\n if (!data || typeof data !== 'object') {\n return false;\n }\n return (data as { type?: string }).type === COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION;\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isAllowedMessageOrigin,\n mergeAllowedMessageOrigins,\n} from './messageOrigin';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\nimport {\n buildGameObjectDeselectedPayload,\n isClearSelectionMessage,\n shouldNotifyGameObjectDeselected,\n type DevelopmentToolDeselectReason,\n} from './selectionNotify';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n /**\n * Extra inbound `postMessage` origins merged with {@link DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES}.\n * Each entry is a host suffix (e.g. `localhost`) or full origin. Pass `['*']` to accept any origin.\n */\n allowedMessageOrigins?: string[];\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private allowedMessageOrigins = mergeAllowedMessageOrigins();\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {\n return;\n }\n\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (isClearSelectionMessage(d)) {\n this.clearSelectionAndNotify('parent-request');\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelectionAndNotify('pick-disabled');\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelectionAndNotify('pick-disabled');\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelectionAndNotify('target-removed');\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelectionAndNotify(reason: DevelopmentToolDeselectReason) {\n const hadSelection = this.selected != null;\n this.clearSelection();\n if (!shouldNotifyGameObjectDeselected(hadSelection)) {\n return;\n }\n this.postGameObjectDeselected(reason);\n }\n\n private postGameObjectDeselected(reason: DevelopmentToolDeselectReason) {\n const payload = buildGameObjectDeselectedPayload(reason);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(payload.type, { reason });\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.26\",\n});\n"],"names":["Component","CombosDevelopmentToolSystem","System","OBSERVER_TYPE","Event","HIT_AREA_TYPE","Graphics","RendererSystem","GameObject","__decorate","decorators"],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),n=require("@combos-fun/plugin-renderer"),o=require("@combos-fun/plugin-renderer-graphics"),s=require("@combos-fun/plugin-renderer-event");const i="combos-development-tool:set",r="combos-development-tool:set-success",a="combos-development-tool:refresh",d="combos-development-tool:gameobject-selected",c="combos-development-tool:apply-property",h="combos-development-tool:set-paused",l="combos-development-tool:set-muted",u="combos-development-tool:state-changed";class p extends t.Component{constructor(){super(...arguments),this.payload={}}static{this.componentName="CombosDevelopmentToolTarget"}init(e){this.payload=e?.payload?{...e.payload}:{}}}const m=["knoffice.tech","converge.ai"];function f(e,t){if(t.includes("*"))return!0;if(0===t.length)return!1;let n;try{n=new URL(e)}catch{return!1}const o=e.toLowerCase(),s=n.hostname.toLowerCase();for(const e of t){const t=e.trim();if(!t)continue;if(t.includes("://")){if(o===t.toLowerCase())return!0;continue}const n=t.toLowerCase().replace(/^\./,"");if(s===n||s.endsWith(`.${n}`))return!0}return!1}function g(e){if(!e?.length)return[...m];if(e.includes("*"))return["*"];const t=new Set,n=[];for(const o of[...m,...e]){const e=o.trim();e&&!t.has(e)&&(t.add(e),n.push(e))}return n}const y=new Set(["gameObject","name","started","__componentDefaultParams","destroyed","inScene","worldTransform","children","_parent"]),w={Graphics:new Set(["graphics"]),Physics:new Set(["body","Body","PhysicsEngine","World","Constraint","mouseConstraint","bodyParams"]),Event:new Set(["hitArea"])};function b(e,t=0){if(null==e)return e;if("number"==typeof e||"string"==typeof e||"boolean"==typeof e)return e;if(!(t>6)){if(Array.isArray(e))return e.map(e=>b(e,t+1));if("object"==typeof e){const n={};for(const[o,s]of Object.entries(e)){if("function"==typeof s)continue;const e=b(s,t+1);void 0!==e&&(n[o]=e)}return n}}}function O(e){const t={},n=w[e.name];for(const o of Object.keys(e)){if(y.has(o)||o.startsWith("_"))continue;if(n?.has(o))continue;const s=e[o];if("function"==typeof s)continue;const i=b(s);void 0!==i&&(t[o]=i)}return t}function E(e){const t=e.getComponent(p),n=t?.payload?.source;var o;if((o=n)&&"object"==typeof o&&"string"==typeof o.file)return{file:n.file,anchor:n.anchor??e.name}}function S(e){const t=e.components.filter(e=>"CombosDevelopmentToolTarget"!==e.name).map(e=>({componentName:e.name,fields:O(e)}));return{id:e.id,name:e.name,components:t,source:E(e)}}function v(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;let i=s;for(let e=0;e<n.length-1;e++){const t=n[e];void 0!==i[t]&&null!==i[t]||(i[t]={}),i=i[t]}return i[n[n.length-1]]=o,!0}const G=new Set(["position","size","origin","anchor","scale","skew"]);function C(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e&&""!==e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}const M={Transform:function(e,t,n,o){const s=e.transform??t,i=s;if(1===n.length&&"rotation"===n[0]){const e=C(o);return void 0!==e&&(s.rotation=e,!0)}if(2===n.length&&G.has(n[0])){const t=n[0],s=n[1],r=C(o);if(void 0===r)return!1;const a=i[t];return!(!a||"object"!=typeof a)&&(a[s]=r,"position"===t&&(function(e){const t=e.getComponent("Physics");if(!t?.body)return;const{x:n,y:o}=e.transform.position;t.Body?.setPosition?t.Body.setPosition(t.body,{x:n,y:o}):(t.body.position.x=n,t.body.position.y=o)}(e),function(e){const t=e.getComponent("PlatformerMover");t&&(t.originX=e.transform.position.x,t.originY=e.transform.position.y)}(e)),!0)}return!1},Text:function(e,t,n,o){const s=t;if(1===n.length&&"text"===n[0])return s.text=String(o??""),!0;if(2===n.length&&"style"===n[0]){const e=n[1],t={...s.style??{},[e]:o};return s.style=t,!0}return!1},Sound:function(e,t,n,o){const s=t;if(1===n.length&&"volume"===n[0]||2===n.length&&"config"===n[0]&&"volume"===n[1]){const e=C(o);return void 0!==e&&(s.volume=e,!0)}return!1}};function P(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;const i=M[t];return!!i?.(e,s,n,o)||v(e,t,n,o)}const T="__combosDevelopmentToolOutline";let _=class extends t.System{constructor(){super(...arguments),this.postMessageOrigin="*",this.allowedMessageOrigins=g(),this.enabled=!1,this.outlineGo=null,this.selected=null,this.tapHandlers=new Map,this.tapOwners=new Map,this.disabledGameEventGoIds=new Set,this.pickEvents=new Set,this.needsRescan=!1,this.lastOutlineBounds=null,this.mutedWithoutSoundSystem=!1,this.onWindowSet=e=>{const t=e.detail;t&&"boolean"==typeof t.enabled&&this.setEnabled(t.enabled)},this.onWindowSetPaused=e=>{const t=e.detail;t&&"boolean"==typeof t.paused&&this.setPaused(t.paused)},this.onWindowSetMuted=e=>{const t=e.detail;t&&"boolean"==typeof t.muted&&this.setMuted(t.muted)},this.onWindowMessage=e=>{if(!f(e.origin,this.allowedMessageOrigins))return;const t=e.data;t&&"object"==typeof t&&(t.type===i&&"boolean"==typeof t.enabled?this.setEnabled(t.enabled):t.type===h&&"boolean"==typeof t.paused?this.setPaused(t.paused):t.type===l&&"boolean"==typeof t.muted?this.setMuted(t.muted):t.type===a?this.requestSceneRescan():t.type===c&&this.handleApplyProperty(t))},this.onGameSet=e=>{e&&"boolean"==typeof e.enabled&&this.setEnabled(e.enabled)},this.onGameRefresh=()=>{this.requestSceneRescan()},this.onGameSetPaused=e=>{e&&"boolean"==typeof e.paused&&this.setPaused(e.paused)},this.onGameSetMuted=e=>{e&&"boolean"==typeof e.muted&&this.setMuted(e.muted)},this.onWindowRefresh=()=>{this.requestSceneRescan()}}static{this.systemName="CombosDevelopmentToolSystem"}init(e){this.postMessageOrigin=e?.postMessageOrigin??"*",this.allowedMessageOrigins=g(e?.allowedMessageOrigins),"undefined"!=typeof window&&(window.addEventListener(i,this.onWindowSet),window.addEventListener(h,this.onWindowSetPaused),window.addEventListener(l,this.onWindowSetMuted),window.addEventListener(a,this.onWindowRefresh),window.addEventListener("message",this.onWindowMessage)),this.game.on(i,this.onGameSet),this.game.on(h,this.onGameSetPaused),this.game.on(l,this.onGameSetMuted),this.game.on(a,this.onGameRefresh),this.enabled&&(this.needsRescan=!0)}onDestroy(){"undefined"!=typeof window&&(window.removeEventListener(i,this.onWindowSet),window.removeEventListener(h,this.onWindowSetPaused),window.removeEventListener(l,this.onWindowSetMuted),window.removeEventListener(a,this.onWindowRefresh),window.removeEventListener("message",this.onWindowMessage)),this.game.off(i,this.onGameSet),this.game.off(h,this.onGameSetPaused),this.game.off(l,this.onGameSetMuted),this.game.off(a,this.onGameRefresh),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.clearSelection()}setEnabled(e){this.enabled!==e&&(this.enabled=e,e?this.needsRescan=!0:(this.clearSelection(),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.postSetSuccess(!1)))}get isEnabled(){return this.enabled}get isPaused(){return!this.game.playing}get isMuted(){const e=this.getSoundSystem();return e?e.muted:this.mutedWithoutSoundSystem}setPaused(e){e?this.game.playing&&this.game.pause():this.game.playing||this.game.resume(),this.postStateChanged()}setMuted(e){const t=this.getSoundSystem();t?t.muted=e:this.mutedWithoutSoundSystem=e,this.postStateChanged()}update(e){this.enabled&&this.needsRescan&&(this.needsRescan=!1,this.attachEditMode(),this.postSetSuccess(!0));for(const e of[...this.tapOwners.values()])e.destroyed&&this.releasePick(e);this.enabled&&this.selected&&this.outlineGo&&this.updateSelectionOutline()}componentChanged(e){if(!this.enabled)return;const{type:n,gameObject:o,componentName:s}=e;o&&"CombosDevelopmentToolTarget"===s&&(n===t.OBSERVER_TYPE.ADD?(this.stripGameEvent(o),this.ensurePick(o)):n===t.OBSERVER_TYPE.REMOVE&&(this.releasePick(o),this.selected===o&&this.clearSelection()))}requestSceneRescan(){this.enabled&&(this.needsRescan=!0)}attachEditMode(){this.detachAllPicks();const e=[];for(const t of this.game.scene.transform.children)this.collectGameObjects(t.gameObject,e);for(const t of e)this.isIgnoredPickGo(t)||this.stripGameEvent(t);for(const t of e)this.isIgnoredPickGo(t)||t.getComponent(p)&&this.ensurePick(t)}collectGameObjects(e,t){t.push(e);for(const n of e.transform.children)this.collectGameObjects(n.gameObject,t)}isIgnoredPickGo(e){return e.name===T||e===this.outlineGo}stripGameEvent(e){if(this.disabledGameEventGoIds.has(e.id))return;if(!e.getComponent(s.Event))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!1,this.disabledGameEventGoIds.add(e.id)}catch{}}restoreDisabledGameEvents(){for(const e of[...this.disabledGameEventGoIds]){const t=this.findGameObjectById(e);if(!t||t.destroyed){this.disabledGameEventGoIds.delete(e);continue}const n=this.getRendererContainer(t);if(n)try{n.interactive=!0}catch{}this.disabledGameEventGoIds.delete(e)}}detachAllPicks(){for(const e of[...this.tapOwners.values()])this.releasePick(e)}ensurePick(e){if(this.tapHandlers.has(e.id))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!0}catch{}let n=e.getComponent(s.Event);n||(n=e.addComponent(this.createPickEvent(e)),this.pickEvents.add(e.id));const o=t=>this.onSelect(e,t);this.tapHandlers.set(e.id,o),this.tapOwners.set(e.id,e),n.on("tap",o)}createPickEvent(e){const t=this.resolvePickBounds(e);return t.width>0&&t.height>0?new s.Event({hitArea:{type:s.HIT_AREA_TYPE.Rect,style:{x:t.x,y:t.y,width:t.width,height:t.height}}}):new s.Event}resolvePickBounds(e){if(this.shouldPreferRenderedBounds(e)){const t=this.resolveOwnGraphicsLocalBounds(e);if(t)return t;const n=this.resolveContainerLocalBounds(e);if(n)return n}const{width:t,height:n}=e.transform.size;if(t>0&&n>0)return{x:0,y:0,width:t,height:n};const o=this.resolveContainerLocalBounds(e);return o||{x:0,y:0,width:1,height:1}}shouldPreferRenderedBounds(e){return null!=e.getComponent(o.Graphics)}resolveOwnGraphicsLocalBounds(e){const t=e.getComponent(o.Graphics);if(!t?.graphics)return null;try{const e=t.graphics.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}return null}resolveContainerLocalBounds(e){const t=this.getRendererContainer(e);if(!t)return null;const n=this.getOutlineContainerIfChildOf(e);let o=!1;n?.parent===t&&(t.removeChild(n),o=!0);try{const e=t.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}finally{o&&n&&t.addChild(n)}return null}getOutlineContainerIfChildOf(e){return this.outlineGo&&this.outlineGo.parent===e?this.getRendererContainer(this.outlineGo):null}getRendererContainer(e){const t=this.game.getSystem(n.RendererSystem);if(!t?.containerManager)return null;try{return t.containerManager.getContainer(e.id)}catch{return null}}releasePick(e){const t=this.tapHandlers.get(e.id);if(!t)return;const n=e.getComponent(s.Event);if(n?.off("tap",t),this.tapHandlers.delete(e.id),this.tapOwners.delete(e.id),this.pickEvents.has(e.id)){try{e.removeComponent(s.Event)}catch{}this.pickEvents.delete(e.id)}}postSetSuccess(e){const t={type:r,enabled:e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(r,{enabled:e})}postStateChanged(){const e={paused:this.isPaused,muted:this.isMuted},t={type:u,...e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(u,e)}getSoundSystem(){const e=this.game.getSystem("SoundSystem");return e&&"object"==typeof e&&"muted"in e&&"boolean"==typeof e.muted?e:null}ensureOutline(){if(this.outlineGo)return;const e=new t.GameObject(T,{size:{width:1,height:1},position:{x:0,y:0},origin:{x:0,y:0}});e.addComponent(new o.Graphics),this.outlineGo=e}onSelect(e,t){if(!this.enabled)return;if(t?.stopPropagation?.(),this.ensureOutline(),!this.outlineGo)return;this.selected=e,this.outlineGo.parent&&this.outlineGo.remove(),e.addChild(this.outlineGo),this.invalidateOutlineBounds(),this.updateSelectionOutline();const n=S(e),o={type:d,snapshot:n,pointer:t?.data?.position??null};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(o,this.postMessageOrigin)}findGameObjectById(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);return t.find(t=>t.id===e)??null}findGameObjectBySource(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);const n=e.file.trim(),o=(e.anchor??"").trim();if(!o)return null;for(const e of t){const t=E(e);if(!t||t.file!==n)continue;if((t.anchor??e.name)===o)return e}return null}resolveApplyTarget(e){if("number"==typeof e.gameObjectId){const t=this.findGameObjectById(e.gameObjectId);if(t)return t}const t=e.source?.file?.trim(),n=e.source?.anchor?.trim();return t&&n?this.findGameObjectBySource({file:t,anchor:n}):null}handleApplyProperty(e){const t=e.componentName,n=e.path,o="number"==typeof e.gameObjectId,s=Boolean(e.source?.file?.trim())&&Boolean(e.source?.anchor?.trim());if(!o&&!s||"string"!=typeof t||!Array.isArray(n)||0===n.length)return;const i=this.resolveApplyTarget(e);if(!i)return;P(i,t,n,e.value)&&this.selected?.id===i.id&&(this.invalidateOutlineBounds(),this.updateSelectionOutline(),this.postSnapshotUpdate(i))}postSnapshotUpdate(e){const t=S(e);"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage({type:d,snapshot:t,pointer:null,source:"property-applied"},this.postMessageOrigin)}clearSelection(){this.selected=null,this.invalidateOutlineBounds(),this.outlineGo?.parent&&this.outlineGo.remove();const e=this.outlineGo?.getComponent(o.Graphics);e?.graphics&&e.graphics.clear()}updateSelectionOutline(){if(!this.enabled||!this.selected||!this.outlineGo)return;const e=this.outlineGo.getComponent(o.Graphics);if(!e?.graphics)return;const t=this.resolvePickBounds(this.selected);if(this.lastOutlineBounds&&this.pickBoundsEqual(this.lastOutlineBounds,t))return;this.lastOutlineBounds=t;const n=e.graphics;n.clear(),n.rect(t.x,t.y,t.width,t.height),n.stroke({width:4,color:5636010,alpha:1})}invalidateOutlineBounds(){this.lastOutlineBounds=null}pickBoundsEqual(e,t){const n=.01;return Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.width-t.width)<n&&Math.abs(e.height-t.height)<n}};_=e.__decorate([t.decorators.componentObserver({CombosDevelopmentToolTarget:[]})],_);var B=_;Object.assign(B,{packageName:"@combos-fun/plugin-development-tool",packageVersion:"0.0.23"}),exports.COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY=c,exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED=d,exports.COMBOS_DEVELOPMENT_TOOL_READY="combos-development-tool:ready",exports.COMBOS_DEVELOPMENT_TOOL_REFRESH=a,exports.COMBOS_DEVELOPMENT_TOOL_SET=i,exports.COMBOS_DEVELOPMENT_TOOL_SET_MUTED=l,exports.COMBOS_DEVELOPMENT_TOOL_SET_PAUSED=h,exports.COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS=r,exports.COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED=u,exports.CombosDevelopmentToolSystem=B,exports.CombosDevelopmentToolTarget=p,exports.DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES=m,exports.applyPropertyValue=v,exports.applyPropertyWithHooks=P,exports.buildGameObjectSnapshot=S,exports.isAllowedMessageOrigin=f,exports.mergeAllowedMessageOrigins=g,exports.readPropertyValue=function(e,t,n){const o=e.getComponent(t);if(!o||!n.length)return;let s=o;for(const e of n){if(null==s||"object"!=typeof s)return;s=s[e]}return s},exports.readSourceAnchor=E;
1
+ "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),n=require("@combos-fun/plugin-renderer"),o=require("@combos-fun/plugin-renderer-graphics"),s=require("@combos-fun/plugin-renderer-event");const i="combos-development-tool:set",r="combos-development-tool:set-success",a="combos-development-tool:refresh",d="combos-development-tool:gameobject-selected",c="combos-development-tool:clear-selection",l="combos-development-tool:gameobject-deselected",h="combos-development-tool:apply-property",u="combos-development-tool:set-paused",p="combos-development-tool:set-muted",m="combos-development-tool:state-changed";class f extends t.Component{constructor(){super(...arguments),this.payload={}}static{this.componentName="CombosDevelopmentToolTarget"}init(e){this.payload=e?.payload?{...e.payload}:{}}}const g=["knoffice.tech","converge.ai"];function y(e,t){if(t.includes("*"))return!0;if(0===t.length)return!1;let n;try{n=new URL(e)}catch{return!1}const o=e.toLowerCase(),s=n.hostname.toLowerCase();for(const e of t){const t=e.trim();if(!t)continue;if(t.includes("://")){if(o===t.toLowerCase())return!0;continue}const n=t.toLowerCase().replace(/^\./,"");if(s===n||s.endsWith(`.${n}`))return!0}return!1}function w(e){if(!e?.length)return[...g];if(e.includes("*"))return["*"];const t=new Set,n=[];for(const o of[...g,...e]){const e=o.trim();e&&!t.has(e)&&(t.add(e),n.push(e))}return n}const O=new Set(["gameObject","name","started","__componentDefaultParams","destroyed","inScene","worldTransform","children","_parent"]),b={Graphics:new Set(["graphics"]),Physics:new Set(["body","Body","PhysicsEngine","World","Constraint","mouseConstraint","bodyParams"]),Event:new Set(["hitArea"])};function E(e,t=0){if(null==e)return e;if("number"==typeof e||"string"==typeof e||"boolean"==typeof e)return e;if(!(t>6)){if(Array.isArray(e))return e.map(e=>E(e,t+1));if("object"==typeof e){const n={};for(const[o,s]of Object.entries(e)){if("function"==typeof s)continue;const e=E(s,t+1);void 0!==e&&(n[o]=e)}return n}}}function S(e){const t={},n=b[e.name];for(const o of Object.keys(e)){if(O.has(o)||o.startsWith("_"))continue;if(n?.has(o))continue;const s=e[o];if("function"==typeof s)continue;const i=E(s);void 0!==i&&(t[o]=i)}return t}function v(e){const t=e.getComponent(f),n=t?.payload?.source;var o;if((o=n)&&"object"==typeof o&&"string"==typeof o.file)return{file:n.file,anchor:n.anchor??e.name}}function G(e){const t=e.components.filter(e=>"CombosDevelopmentToolTarget"!==e.name).map(e=>({componentName:e.name,fields:S(e)}));return{id:e.id,name:e.name,components:t,source:v(e)}}function C(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;let i=s;for(let e=0;e<n.length-1;e++){const t=n[e];void 0!==i[t]&&null!==i[t]||(i[t]={}),i=i[t]}return i[n[n.length-1]]=o,!0}const M=new Set(["position","size","origin","anchor","scale","skew"]);function P(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e&&""!==e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}const T={Transform:function(e,t,n,o){const s=e.transform??t,i=s;if(1===n.length&&"rotation"===n[0]){const e=P(o);return void 0!==e&&(s.rotation=e,!0)}if(2===n.length&&M.has(n[0])){const t=n[0],s=n[1],r=P(o);if(void 0===r)return!1;const a=i[t];return!(!a||"object"!=typeof a)&&(a[s]=r,"position"===t&&(function(e){const t=e.getComponent("Physics");if(!t?.body)return;const{x:n,y:o}=e.transform.position;t.Body?.setPosition?t.Body.setPosition(t.body,{x:n,y:o}):(t.body.position.x=n,t.body.position.y=o)}(e),function(e){const t=e.getComponent("PlatformerMover");t&&(t.originX=e.transform.position.x,t.originY=e.transform.position.y)}(e)),!0)}return!1},Text:function(e,t,n,o){const s=t;if(1===n.length&&"text"===n[0])return s.text=String(o??""),!0;if(2===n.length&&"style"===n[0]){const e=n[1],t={...s.style??{},[e]:o};return s.style=t,!0}return!1},Sound:function(e,t,n,o){const s=t;if(1===n.length&&"volume"===n[0]||2===n.length&&"config"===n[0]&&"volume"===n[1]){const e=P(o);return void 0!==e&&(s.volume=e,!0)}return!1}};function _(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;const i=T[t];return!!i?.(e,s,n,o)||C(e,t,n,o)}function L(e){return{type:l,reason:e}}function B(e){return e}function x(e){return!(!e||"object"!=typeof e)&&e.type===c}const D="__combosDevelopmentToolOutline";let R=class extends t.System{constructor(){super(...arguments),this.postMessageOrigin="*",this.allowedMessageOrigins=w(),this.enabled=!1,this.outlineGo=null,this.selected=null,this.tapHandlers=new Map,this.tapOwners=new Map,this.disabledGameEventGoIds=new Set,this.pickEvents=new Set,this.needsRescan=!1,this.lastOutlineBounds=null,this.mutedWithoutSoundSystem=!1,this.onWindowSet=e=>{const t=e.detail;t&&"boolean"==typeof t.enabled&&this.setEnabled(t.enabled)},this.onWindowSetPaused=e=>{const t=e.detail;t&&"boolean"==typeof t.paused&&this.setPaused(t.paused)},this.onWindowSetMuted=e=>{const t=e.detail;t&&"boolean"==typeof t.muted&&this.setMuted(t.muted)},this.onWindowMessage=e=>{if(!y(e.origin,this.allowedMessageOrigins))return;const t=e.data;t&&"object"==typeof t&&(t.type===i&&"boolean"==typeof t.enabled?this.setEnabled(t.enabled):t.type===u&&"boolean"==typeof t.paused?this.setPaused(t.paused):t.type===p&&"boolean"==typeof t.muted?this.setMuted(t.muted):t.type===a?this.requestSceneRescan():x(t)?this.clearSelectionAndNotify("parent-request"):t.type===h&&this.handleApplyProperty(t))},this.onGameSet=e=>{e&&"boolean"==typeof e.enabled&&this.setEnabled(e.enabled)},this.onGameRefresh=()=>{this.requestSceneRescan()},this.onGameSetPaused=e=>{e&&"boolean"==typeof e.paused&&this.setPaused(e.paused)},this.onGameSetMuted=e=>{e&&"boolean"==typeof e.muted&&this.setMuted(e.muted)},this.onWindowRefresh=()=>{this.requestSceneRescan()}}static{this.systemName="CombosDevelopmentToolSystem"}init(e){this.postMessageOrigin=e?.postMessageOrigin??"*",this.allowedMessageOrigins=w(e?.allowedMessageOrigins),"undefined"!=typeof window&&(window.addEventListener(i,this.onWindowSet),window.addEventListener(u,this.onWindowSetPaused),window.addEventListener(p,this.onWindowSetMuted),window.addEventListener(a,this.onWindowRefresh),window.addEventListener("message",this.onWindowMessage)),this.game.on(i,this.onGameSet),this.game.on(u,this.onGameSetPaused),this.game.on(p,this.onGameSetMuted),this.game.on(a,this.onGameRefresh),this.enabled&&(this.needsRescan=!0)}onDestroy(){"undefined"!=typeof window&&(window.removeEventListener(i,this.onWindowSet),window.removeEventListener(u,this.onWindowSetPaused),window.removeEventListener(p,this.onWindowSetMuted),window.removeEventListener(a,this.onWindowRefresh),window.removeEventListener("message",this.onWindowMessage)),this.game.off(i,this.onGameSet),this.game.off(u,this.onGameSetPaused),this.game.off(p,this.onGameSetMuted),this.game.off(a,this.onGameRefresh),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.clearSelectionAndNotify("pick-disabled")}setEnabled(e){this.enabled!==e&&(this.enabled=e,e?this.needsRescan=!0:(this.clearSelectionAndNotify("pick-disabled"),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.postSetSuccess(!1)))}get isEnabled(){return this.enabled}get isPaused(){return!this.game.playing}get isMuted(){const e=this.getSoundSystem();return e?e.muted:this.mutedWithoutSoundSystem}setPaused(e){e?this.game.playing&&this.game.pause():this.game.playing||this.game.resume(),this.postStateChanged()}setMuted(e){const t=this.getSoundSystem();t?t.muted=e:this.mutedWithoutSoundSystem=e,this.postStateChanged()}update(e){this.enabled&&this.needsRescan&&(this.needsRescan=!1,this.attachEditMode(),this.postSetSuccess(!0));for(const e of[...this.tapOwners.values()])e.destroyed&&this.releasePick(e);this.enabled&&this.selected&&this.outlineGo&&this.updateSelectionOutline()}componentChanged(e){if(!this.enabled)return;const{type:n,gameObject:o,componentName:s}=e;o&&"CombosDevelopmentToolTarget"===s&&(n===t.OBSERVER_TYPE.ADD?(this.stripGameEvent(o),this.ensurePick(o)):n===t.OBSERVER_TYPE.REMOVE&&(this.releasePick(o),this.selected===o&&this.clearSelectionAndNotify("target-removed")))}requestSceneRescan(){this.enabled&&(this.needsRescan=!0)}attachEditMode(){this.detachAllPicks();const e=[];for(const t of this.game.scene.transform.children)this.collectGameObjects(t.gameObject,e);for(const t of e)this.isIgnoredPickGo(t)||this.stripGameEvent(t);for(const t of e)this.isIgnoredPickGo(t)||t.getComponent(f)&&this.ensurePick(t)}collectGameObjects(e,t){t.push(e);for(const n of e.transform.children)this.collectGameObjects(n.gameObject,t)}isIgnoredPickGo(e){return e.name===D||e===this.outlineGo}stripGameEvent(e){if(this.disabledGameEventGoIds.has(e.id))return;if(!e.getComponent(s.Event))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!1,this.disabledGameEventGoIds.add(e.id)}catch{}}restoreDisabledGameEvents(){for(const e of[...this.disabledGameEventGoIds]){const t=this.findGameObjectById(e);if(!t||t.destroyed){this.disabledGameEventGoIds.delete(e);continue}const n=this.getRendererContainer(t);if(n)try{n.interactive=!0}catch{}this.disabledGameEventGoIds.delete(e)}}detachAllPicks(){for(const e of[...this.tapOwners.values()])this.releasePick(e)}ensurePick(e){if(this.tapHandlers.has(e.id))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!0}catch{}let n=e.getComponent(s.Event);n||(n=e.addComponent(this.createPickEvent(e)),this.pickEvents.add(e.id));const o=t=>this.onSelect(e,t);this.tapHandlers.set(e.id,o),this.tapOwners.set(e.id,e),n.on("tap",o)}createPickEvent(e){const t=this.resolvePickBounds(e);return t.width>0&&t.height>0?new s.Event({hitArea:{type:s.HIT_AREA_TYPE.Rect,style:{x:t.x,y:t.y,width:t.width,height:t.height}}}):new s.Event}resolvePickBounds(e){if(this.shouldPreferRenderedBounds(e)){const t=this.resolveOwnGraphicsLocalBounds(e);if(t)return t;const n=this.resolveContainerLocalBounds(e);if(n)return n}const{width:t,height:n}=e.transform.size;if(t>0&&n>0)return{x:0,y:0,width:t,height:n};const o=this.resolveContainerLocalBounds(e);return o||{x:0,y:0,width:1,height:1}}shouldPreferRenderedBounds(e){return null!=e.getComponent(o.Graphics)}resolveOwnGraphicsLocalBounds(e){const t=e.getComponent(o.Graphics);if(!t?.graphics)return null;try{const e=t.graphics.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}return null}resolveContainerLocalBounds(e){const t=this.getRendererContainer(e);if(!t)return null;const n=this.getOutlineContainerIfChildOf(e);let o=!1;n?.parent===t&&(t.removeChild(n),o=!0);try{const e=t.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}finally{o&&n&&t.addChild(n)}return null}getOutlineContainerIfChildOf(e){return this.outlineGo&&this.outlineGo.parent===e?this.getRendererContainer(this.outlineGo):null}getRendererContainer(e){const t=this.game.getSystem(n.RendererSystem);if(!t?.containerManager)return null;try{return t.containerManager.getContainer(e.id)}catch{return null}}releasePick(e){const t=this.tapHandlers.get(e.id);if(!t)return;const n=e.getComponent(s.Event);if(n?.off("tap",t),this.tapHandlers.delete(e.id),this.tapOwners.delete(e.id),this.pickEvents.has(e.id)){try{e.removeComponent(s.Event)}catch{}this.pickEvents.delete(e.id)}}postSetSuccess(e){const t={type:r,enabled:e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(r,{enabled:e})}postStateChanged(){const e={paused:this.isPaused,muted:this.isMuted},t={type:m,...e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(m,e)}getSoundSystem(){const e=this.game.getSystem("SoundSystem");return e&&"object"==typeof e&&"muted"in e&&"boolean"==typeof e.muted?e:null}ensureOutline(){if(this.outlineGo)return;const e=new t.GameObject(D,{size:{width:1,height:1},position:{x:0,y:0},origin:{x:0,y:0}});e.addComponent(new o.Graphics),this.outlineGo=e}onSelect(e,t){if(!this.enabled)return;if(t?.stopPropagation?.(),this.ensureOutline(),!this.outlineGo)return;this.selected=e,this.outlineGo.parent&&this.outlineGo.remove(),e.addChild(this.outlineGo),this.invalidateOutlineBounds(),this.updateSelectionOutline();const n=G(e),o={type:d,snapshot:n,pointer:t?.data?.position??null};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(o,this.postMessageOrigin)}findGameObjectById(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);return t.find(t=>t.id===e)??null}findGameObjectBySource(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);const n=e.file.trim(),o=(e.anchor??"").trim();if(!o)return null;for(const e of t){const t=v(e);if(!t||t.file!==n)continue;if((t.anchor??e.name)===o)return e}return null}resolveApplyTarget(e){if("number"==typeof e.gameObjectId){const t=this.findGameObjectById(e.gameObjectId);if(t)return t}const t=e.source?.file?.trim(),n=e.source?.anchor?.trim();return t&&n?this.findGameObjectBySource({file:t,anchor:n}):null}handleApplyProperty(e){const t=e.componentName,n=e.path,o="number"==typeof e.gameObjectId,s=Boolean(e.source?.file?.trim())&&Boolean(e.source?.anchor?.trim());if(!o&&!s||"string"!=typeof t||!Array.isArray(n)||0===n.length)return;const i=this.resolveApplyTarget(e);if(!i)return;_(i,t,n,e.value)&&this.selected?.id===i.id&&(this.invalidateOutlineBounds(),this.updateSelectionOutline(),this.postSnapshotUpdate(i))}postSnapshotUpdate(e){const t=G(e);"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage({type:d,snapshot:t,pointer:null,source:"property-applied"},this.postMessageOrigin)}clearSelectionAndNotify(e){const t=null!=this.selected;this.clearSelection(),t&&this.postGameObjectDeselected(e)}postGameObjectDeselected(e){const t=L(e);"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(t.type,{reason:e})}clearSelection(){this.selected=null,this.invalidateOutlineBounds(),this.outlineGo?.parent&&this.outlineGo.remove();const e=this.outlineGo?.getComponent(o.Graphics);e?.graphics&&e.graphics.clear()}updateSelectionOutline(){if(!this.enabled||!this.selected||!this.outlineGo)return;const e=this.outlineGo.getComponent(o.Graphics);if(!e?.graphics)return;const t=this.resolvePickBounds(this.selected);if(this.lastOutlineBounds&&this.pickBoundsEqual(this.lastOutlineBounds,t))return;this.lastOutlineBounds=t;const n=e.graphics;n.clear(),n.rect(t.x,t.y,t.width,t.height),n.stroke({width:4,color:5636010,alpha:1})}invalidateOutlineBounds(){this.lastOutlineBounds=null}pickBoundsEqual(e,t){const n=.01;return Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.width-t.width)<n&&Math.abs(e.height-t.height)<n}};R=e.__decorate([t.decorators.componentObserver({CombosDevelopmentToolTarget:[]})],R);var j=R;Object.assign(j,{packageName:"@combos-fun/plugin-development-tool",packageVersion:"0.0.26"}),exports.COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY=h,exports.COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION=c,exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED=l,exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED=d,exports.COMBOS_DEVELOPMENT_TOOL_READY="combos-development-tool:ready",exports.COMBOS_DEVELOPMENT_TOOL_REFRESH=a,exports.COMBOS_DEVELOPMENT_TOOL_SET=i,exports.COMBOS_DEVELOPMENT_TOOL_SET_MUTED=p,exports.COMBOS_DEVELOPMENT_TOOL_SET_PAUSED=u,exports.COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS=r,exports.COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED=m,exports.CombosDevelopmentToolSystem=j,exports.CombosDevelopmentToolTarget=f,exports.DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES=g,exports.applyPropertyValue=C,exports.applyPropertyWithHooks=_,exports.buildGameObjectDeselectedPayload=L,exports.buildGameObjectSnapshot=G,exports.isAllowedMessageOrigin=y,exports.isClearSelectionMessage=x,exports.mergeAllowedMessageOrigins=w,exports.readPropertyValue=function(e,t,n){const o=e.getComponent(t);if(!o||!n.length)return;let s=o;for(const e of n){if(null==s||"object"!=typeof s)return;s=s[e]}return s},exports.readSourceAnchor=v,exports.shouldNotifyGameObjectDeselected=B;
@@ -8,6 +8,10 @@ declare const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS: "combos-development-tool:set-
8
8
  declare const COMBOS_DEVELOPMENT_TOOL_REFRESH: "combos-development-tool:refresh";
9
9
  /** Emitted to `window.parent` when an object is selected while the tool is on. */
10
10
  declare const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED: "combos-development-tool:gameobject-selected";
11
+ /** Parent → iframe: clear the current in-canvas selection outline. */
12
+ declare const COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION: "combos-development-tool:clear-selection";
13
+ /** Emitted to `window.parent` when the current selection is cleared. */
14
+ declare const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED: "combos-development-tool:gameobject-deselected";
11
15
  /** Parent → iframe: apply a value to a component field (live preview). */
12
16
  declare const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY: "combos-development-tool:apply-property";
13
17
  /** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */
@@ -150,6 +154,8 @@ declare class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSy
150
154
  private resolveApplyTarget;
151
155
  private handleApplyProperty;
152
156
  private postSnapshotUpdate;
157
+ private clearSelectionAndNotify;
158
+ private postGameObjectDeselected;
153
159
  private clearSelection;
154
160
  /** Redraw the green outline only when content bounds change (movement follows via child transform). */
155
161
  private updateSelectionOutline;
@@ -188,5 +194,13 @@ declare function readPropertyValue(go: GameObject, componentName: string, path:
188
194
 
189
195
  declare function applyPropertyWithHooks(go: GameObject, componentName: string, path: string[], value: unknown): boolean;
190
196
 
191
- export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, applyPropertyValue, applyPropertyWithHooks, buildGameObjectSnapshot, isAllowedMessageOrigin, mergeAllowedMessageOrigins, readPropertyValue, readSourceAnchor };
192
- export type { CombosDevelopmentToolSystemParams, CombosDevelopmentToolTargetParams, SceneEditComponentSnapshot, SceneEditGameObjectSnapshot, SceneEditPropertyRef, SceneSourceAnchor };
197
+ type DevelopmentToolDeselectReason = 'parent-request' | 'pick-disabled' | 'target-removed';
198
+ declare function buildGameObjectDeselectedPayload(reason: DevelopmentToolDeselectReason): {
199
+ readonly type: "combos-development-tool:gameobject-deselected";
200
+ readonly reason: DevelopmentToolDeselectReason;
201
+ };
202
+ declare function shouldNotifyGameObjectDeselected(hadSelection: boolean): boolean;
203
+ declare function isClearSelectionMessage(data: unknown): boolean;
204
+
205
+ export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, applyPropertyValue, applyPropertyWithHooks, buildGameObjectDeselectedPayload, buildGameObjectSnapshot, isAllowedMessageOrigin, isClearSelectionMessage, mergeAllowedMessageOrigins, readPropertyValue, readSourceAnchor, shouldNotifyGameObjectDeselected };
206
+ export type { CombosDevelopmentToolSystemParams, CombosDevelopmentToolTargetParams, DevelopmentToolDeselectReason, SceneEditComponentSnapshot, SceneEditGameObjectSnapshot, SceneEditPropertyRef, SceneSourceAnchor };
@@ -12,6 +12,10 @@ const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS = 'combos-development-tool:set-success
12
12
  const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh';
13
13
  /** Emitted to `window.parent` when an object is selected while the tool is on. */
14
14
  const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED = 'combos-development-tool:gameobject-selected';
15
+ /** Parent → iframe: clear the current in-canvas selection outline. */
16
+ const COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION = 'combos-development-tool:clear-selection';
17
+ /** Emitted to `window.parent` when the current selection is cleared. */
18
+ const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED = 'combos-development-tool:gameobject-deselected';
15
19
  /** Parent → iframe: apply a value to a component field (live preview). */
16
20
  const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY = 'combos-development-tool:apply-property';
17
21
  /** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */
@@ -345,6 +349,22 @@ function applyPropertyWithHooks(go, componentName, path, value) {
345
349
  return applyPropertyValue(go, componentName, path, value);
346
350
  }
347
351
 
352
+ function buildGameObjectDeselectedPayload(reason) {
353
+ return {
354
+ type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED,
355
+ reason,
356
+ };
357
+ }
358
+ function shouldNotifyGameObjectDeselected(hadSelection) {
359
+ return hadSelection;
360
+ }
361
+ function isClearSelectionMessage(data) {
362
+ if (!data || typeof data !== 'object') {
363
+ return false;
364
+ }
365
+ return data.type === COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION;
366
+ }
367
+
348
368
  const OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';
349
369
  /**
350
370
  * **Off** at start. While enabled:
@@ -421,6 +441,9 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
421
441
  else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {
422
442
  this.requestSceneRescan();
423
443
  }
444
+ else if (isClearSelectionMessage(d)) {
445
+ this.clearSelectionAndNotify('parent-request');
446
+ }
424
447
  else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {
425
448
  this.handleApplyProperty(d);
426
449
  }
@@ -480,7 +503,7 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
480
503
  this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);
481
504
  this.detachAllPicks();
482
505
  this.restoreDisabledGameEvents();
483
- this.clearSelection();
506
+ this.clearSelectionAndNotify('pick-disabled');
484
507
  }
485
508
  /** Programmatic toggle (same effect as events). */
486
509
  setEnabled(on) {
@@ -488,7 +511,7 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
488
511
  return;
489
512
  this.enabled = on;
490
513
  if (!on) {
491
- this.clearSelection();
514
+ this.clearSelectionAndNotify('pick-disabled');
492
515
  this.detachAllPicks();
493
516
  this.restoreDisabledGameEvents();
494
517
  this.postSetSuccess(false);
@@ -566,7 +589,7 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
566
589
  else if (type === OBSERVER_TYPE.REMOVE) {
567
590
  this.releasePick(gameObject);
568
591
  if (this.selected === gameObject) {
569
- this.clearSelection();
592
+ this.clearSelectionAndNotify('target-removed');
570
593
  }
571
594
  }
572
595
  }
@@ -942,6 +965,21 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
942
965
  }, this.postMessageOrigin);
943
966
  }
944
967
  }
968
+ clearSelectionAndNotify(reason) {
969
+ const hadSelection = this.selected != null;
970
+ this.clearSelection();
971
+ if (!shouldNotifyGameObjectDeselected(hadSelection)) {
972
+ return;
973
+ }
974
+ this.postGameObjectDeselected(reason);
975
+ }
976
+ postGameObjectDeselected(reason) {
977
+ const payload = buildGameObjectDeselectedPayload(reason);
978
+ if (typeof window !== 'undefined' && window.parent && window.parent !== window) {
979
+ window.parent.postMessage(payload, this.postMessageOrigin);
980
+ }
981
+ this.game.emit(payload.type, { reason });
982
+ }
945
983
  clearSelection() {
946
984
  this.selected = null;
947
985
  this.invalidateOutlineBounds();
@@ -991,8 +1029,8 @@ var CombosDevelopmentToolSystem$1 = CombosDevelopmentToolSystem;
991
1029
  /** Auto-generated by scripts/build-package.mjs — do not edit. */
992
1030
  Object.assign(CombosDevelopmentToolSystem$1, {
993
1031
  packageName: "@combos-fun/plugin-development-tool",
994
- packageVersion: "0.0.23",
1032
+ packageVersion: "0.0.26",
995
1033
  });
996
1034
 
997
- export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem$1 as CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, applyPropertyValue, applyPropertyWithHooks, buildGameObjectSnapshot, isAllowedMessageOrigin, mergeAllowedMessageOrigins, readPropertyValue, readSourceAnchor };
1035
+ export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem$1 as CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, applyPropertyValue, applyPropertyWithHooks, buildGameObjectDeselectedPayload, buildGameObjectSnapshot, isAllowedMessageOrigin, isClearSelectionMessage, mergeAllowedMessageOrigins, readPropertyValue, readSourceAnchor, shouldNotifyGameObjectDeselected };
998
1036
  //# sourceMappingURL=plugin-development-tool.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-development-tool.esm.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/messageOrigin.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Default inbound postMessage host suffixes (host + all subdomains). */\nexport const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [\n 'knoffice.tech',\n 'converge.ai',\n] as const;\n\n/**\n * Returns whether `origin` is allowed by `allowed`.\n *\n * Each entry in `allowed` is either:\n * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;\n * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;\n * - `'*'` — accept any origin (escape hatch).\n */\nexport function isAllowedMessageOrigin(\n origin: string,\n allowed: readonly string[],\n): boolean {\n if (allowed.includes('*')) {\n return true;\n }\n if (allowed.length === 0) {\n return false;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n return false;\n }\n\n const originLower = origin.toLowerCase();\n const hostLower = parsed.hostname.toLowerCase();\n\n for (const entry of allowed) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n if (trimmed.includes('://')) {\n if (originLower === trimmed.toLowerCase()) {\n return true;\n }\n continue;\n }\n\n const suffix = trimmed.toLowerCase().replace(/^\\./, '');\n if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */\nexport function mergeAllowedMessageOrigins(extra?: string[]): string[] {\n if (!extra?.length) {\n return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];\n }\n if (extra.includes('*')) {\n return ['*'];\n }\n\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isAllowedMessageOrigin,\n mergeAllowedMessageOrigins,\n} from './messageOrigin';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n /**\n * Extra inbound `postMessage` origins merged with {@link DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES}.\n * Each entry is a host suffix (e.g. `localhost`) or full origin. Pass `['*']` to accept any origin.\n */\n allowedMessageOrigins?: string[];\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private allowedMessageOrigins = mergeAllowedMessageOrigins();\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {\n return;\n }\n\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.23\",\n});\n"],"names":["CombosDevelopmentToolSystem"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-development-tool.esm.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/messageOrigin.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/selectionNotify.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: clear the current in-canvas selection outline. */\nexport const COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION =\n 'combos-development-tool:clear-selection' as const;\n\n/** Emitted to `window.parent` when the current selection is cleared. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED =\n 'combos-development-tool:gameobject-deselected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Default inbound postMessage host suffixes (host + all subdomains). */\nexport const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [\n 'knoffice.tech',\n 'converge.ai',\n] as const;\n\n/**\n * Returns whether `origin` is allowed by `allowed`.\n *\n * Each entry in `allowed` is either:\n * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;\n * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;\n * - `'*'` — accept any origin (escape hatch).\n */\nexport function isAllowedMessageOrigin(\n origin: string,\n allowed: readonly string[],\n): boolean {\n if (allowed.includes('*')) {\n return true;\n }\n if (allowed.length === 0) {\n return false;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n return false;\n }\n\n const originLower = origin.toLowerCase();\n const hostLower = parsed.hostname.toLowerCase();\n\n for (const entry of allowed) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n if (trimmed.includes('://')) {\n if (originLower === trimmed.toLowerCase()) {\n return true;\n }\n continue;\n }\n\n const suffix = trimmed.toLowerCase().replace(/^\\./, '');\n if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */\nexport function mergeAllowedMessageOrigins(extra?: string[]): string[] {\n if (!extra?.length) {\n return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];\n }\n if (extra.includes('*')) {\n return ['*'];\n }\n\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED,\n} from './constants';\n\nexport type DevelopmentToolDeselectReason = 'parent-request' | 'pick-disabled' | 'target-removed';\n\nexport function buildGameObjectDeselectedPayload(reason: DevelopmentToolDeselectReason) {\n return {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_DESELECTED,\n reason,\n } as const;\n}\n\nexport function shouldNotifyGameObjectDeselected(hadSelection: boolean): boolean {\n return hadSelection;\n}\n\nexport function isClearSelectionMessage(data: unknown): boolean {\n if (!data || typeof data !== 'object') {\n return false;\n }\n return (data as { type?: string }).type === COMBOS_DEVELOPMENT_TOOL_CLEAR_SELECTION;\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isAllowedMessageOrigin,\n mergeAllowedMessageOrigins,\n} from './messageOrigin';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\nimport {\n buildGameObjectDeselectedPayload,\n isClearSelectionMessage,\n shouldNotifyGameObjectDeselected,\n type DevelopmentToolDeselectReason,\n} from './selectionNotify';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n /**\n * Extra inbound `postMessage` origins merged with {@link DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES}.\n * Each entry is a host suffix (e.g. `localhost`) or full origin. Pass `['*']` to accept any origin.\n */\n allowedMessageOrigins?: string[];\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private allowedMessageOrigins = mergeAllowedMessageOrigins();\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {\n return;\n }\n\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (isClearSelectionMessage(d)) {\n this.clearSelectionAndNotify('parent-request');\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelectionAndNotify('pick-disabled');\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelectionAndNotify('pick-disabled');\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelectionAndNotify('target-removed');\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelectionAndNotify(reason: DevelopmentToolDeselectReason) {\n const hadSelection = this.selected != null;\n this.clearSelection();\n if (!shouldNotifyGameObjectDeselected(hadSelection)) {\n return;\n }\n this.postGameObjectDeselected(reason);\n }\n\n private postGameObjectDeselected(reason: DevelopmentToolDeselectReason) {\n const payload = buildGameObjectDeselectedPayload(reason);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(payload.type, { reason });\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.26\",\n});\n"],"names":["CombosDevelopmentToolSystem"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@combos-fun/plugin-development-tool",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "description": "only useful for combos.fun preview page, no need to understand and modify",
5
5
  "main": "index.js",
6
6
  "module": "dist/plugin-development-tool.esm.js",
@@ -37,11 +37,15 @@
37
37
  "author": "sun668 <q947692259@gmail.com>",
38
38
  "dependencies": {
39
39
  "@combos-fun/engine": "0.0.24",
40
- "@combos-fun/plugin-renderer-event": "0.0.24",
41
40
  "@combos-fun/plugin-renderer": "0.0.24",
41
+ "@combos-fun/plugin-renderer-event": "0.0.24",
42
42
  "@combos-fun/plugin-renderer-graphics": "0.0.24"
43
43
  },
44
44
  "scripts": {
45
- "build": "node ../../scripts/build-package.mjs"
45
+ "build": "node ../../scripts/build-package.mjs",
46
+ "test": "node --import tsx --test test/selectionNotify.test.ts"
47
+ },
48
+ "devDependencies": {
49
+ "tsx": "^4.20.3"
46
50
  }
47
- }
51
+ }