{"version":3,"file":"nanonomad.cjs","sources":["../src/host.js","../src/capability-registry.js","../src/capabilities/idle.js","../src/capabilities/walk.js","../src/capabilities/jump.js","../src/capabilities/sit.js","../src/capabilities/fall.js","../src/capabilities/run.js","../src/capabilities/sleep.js","../src/capabilities/pee.js","../src/register-builtins.js","../src/environment.js","../src/movement-engine.js","../src/behavior-engine.js","../src/renderer.js","../src/config-manager.js","../src/NanoNomad.js","../src/character-providers.js"],"sourcesContent":["/**\n * Description: Creates a browser host object so the engine never touches global window/document directly.\n * Usage: Pass to NanoNomad({ host }); in SSR contexts omit start() until a host exists on the client.\n */\nexport function createBrowserHost(globalObj) {\n  const g = globalObj || (typeof globalThis !== 'undefined' ? globalThis : {});\n  const win = g.window || (typeof window !== 'undefined' ? window : null);\n  if (!win || !win.document) {\n    throw new Error('NanoNomad: createBrowserHost requires a Window with document');\n  }\n  return {\n    window: win,\n    document: win.document,\n  };\n}\n","/**\n * Description: Registry for capability modules; behavior engine resolves active set from character + admin lists.\n * Usage: Instantiate per NanoNomad instance; register builtins or custom capabilities before start().\n */\nexport class CapabilityRegistry {\n  constructor() {\n    this._capabilities = Object.create(null);\n  }\n\n  register(id, definition) {\n    const def = { ...definition, id };\n    this._capabilities[id] = def;\n  }\n\n  get(id) {\n    return this._capabilities[id] || null;\n  }\n\n  getAll() {\n    return { ...this._capabilities };\n  }\n\n  has(id) {\n    return !!this._capabilities[id];\n  }\n\n  resolve(characterCaps, enabledCaps) {\n    const resolved = Object.create(null);\n    const charList =\n      characterCaps && characterCaps.length ? characterCaps : CapabilityRegistry.getDefaultList();\n\n    for (let i = 0; i < charList.length; i++) {\n      const id = charList[i];\n      const cap = this._capabilities[id];\n      if (!cap) continue;\n\n      if (cap.system) {\n        resolved[id] = cap;\n        continue;\n      }\n\n      if (!enabledCaps || !enabledCaps.length || enabledCaps.indexOf(id) !== -1) {\n        resolved[id] = cap;\n      }\n    }\n\n    if (!resolved.idle && this._capabilities.idle) resolved.idle = this._capabilities.idle;\n    if (!resolved.fall && this._capabilities.fall) resolved.fall = this._capabilities.fall;\n\n    return resolved;\n  }\n\n  static getDefaultList() {\n    return ['idle', 'walk', 'jump', 'sit', 'fall'];\n  }\n}\n","export const idle = {\n  id: 'idle',\n  state: 'idle',\n  system: true,\n\n  enter(ctx) {\n    ctx.movement.stopWalk();\n    ctx.stateTimer = ctx.getStateDuration('idle');\n  },\n\n  update(ctx, dt) {\n    if (!ctx.movement.isGrounded()) {\n      ctx.transition('fall');\n      return;\n    }\n    ctx.stateTimer -= dt;\n    if (ctx.stateTimer <= 0) ctx.transitionToNext();\n  },\n\n  exit() {},\n};\n","function pickDirection(ctx) {\n  const pos = ctx.movement.getPosition();\n  const vp = ctx.environment.getViewport();\n  const petCenter = pos.x + (ctx.config.size || 48) / 2;\n  const platform = ctx.movement.getCurrentPlatform();\n\n  if (petCenter < vp.width * 0.12) return 1;\n  if (petCenter > vp.width * 0.88) return -1;\n\n  if (platform && platform.right - platform.left < vp.width * 0.8) {\n    const platCenter = (platform.left + platform.right) / 2;\n    if (petCenter < platCenter - 30) return 1;\n    if (petCenter > platCenter + 30) return -1;\n  }\n\n  return Math.random() < 0.5 ? -1 : 1;\n}\n\nexport const walk = {\n  id: 'walk',\n  state: 'walk',\n  system: false,\n\n  enter(ctx) {\n    ctx.walkDir = pickDirection(ctx);\n    ctx.movement.walkTo(ctx.walkDir);\n    ctx.stateTimer = ctx.getStateDuration('walk');\n  },\n\n  update(ctx, dt) {\n    if (!ctx.movement.isGrounded()) {\n      ctx.transition('fall');\n      return;\n    }\n    if (ctx.movement.isAtEdge() || ctx.movement.isAtViewportEdge()) {\n      ctx.transition('idle');\n      return;\n    }\n    ctx.movement.walkTo(ctx.walkDir);\n    ctx.stateTimer -= dt;\n    if (ctx.stateTimer <= 0) ctx.transitionToNext();\n  },\n\n  exit(ctx) {\n    ctx.movement.stopWalk();\n  },\n};\n","export const jump = {\n  id: 'jump',\n  state: 'jump',\n  system: false,\n\n  enter(ctx) {\n    ctx.movement.jump();\n  },\n\n  update(ctx) {\n    if (ctx.movement.isGrounded() && ctx.stateTime > 100) {\n      ctx.transition('idle');\n    }\n  },\n\n  exit() {},\n};\n","export const sit = {\n  id: 'sit',\n  state: 'sit',\n  system: false,\n\n  enter(ctx) {\n    ctx.movement.stopWalk();\n    ctx.stateTimer = ctx.getStateDuration('sit');\n  },\n\n  update(ctx, dt) {\n    if (!ctx.movement.isGrounded()) {\n      ctx.transition('fall');\n      return;\n    }\n    ctx.stateTimer -= dt;\n    if (ctx.stateTimer <= 0) ctx.transitionToNext();\n  },\n\n  exit() {},\n};\n","export const fall = {\n  id: 'fall',\n  state: 'fall',\n  system: true,\n\n  enter(ctx) {\n    ctx.movement.stopWalk();\n  },\n\n  update(ctx) {\n    if (ctx.movement.isGrounded()) {\n      ctx.transition('idle');\n    }\n  },\n\n  exit() {},\n};\n","const RUN_SPEED_MULT = 2.2;\n\nfunction pickRunDirection(ctx) {\n  const pos = ctx.movement.getPosition();\n  const vp = ctx.environment.getViewport();\n  const petCenter = pos.x + (ctx.config.size || 48) / 2;\n  const w = vp.width;\n\n  if (petCenter < w * 0.12) return 1;\n  if (petCenter > w * 0.88) return -1;\n  return Math.random() < 0.5 ? -1 : 1;\n}\n\nexport const run = {\n  id: 'run',\n  state: 'run',\n  system: false,\n\n  enter(ctx) {\n    ctx.walkDir = pickRunDirection(ctx);\n    ctx.movement.setSpeedMultiplier(RUN_SPEED_MULT);\n    ctx.movement.walkTo(ctx.walkDir);\n    ctx.stateTimer = ctx.getStateDuration('run');\n  },\n\n  update(ctx, dt) {\n    if (!ctx.movement.isGrounded()) {\n      ctx.transition('fall');\n      return;\n    }\n    if (ctx.movement.isAtEdge() || ctx.movement.isAtViewportEdge()) {\n      ctx.transition('idle');\n      return;\n    }\n    ctx.movement.walkTo(ctx.walkDir);\n    ctx.stateTimer -= dt;\n    if (ctx.stateTimer <= 0) ctx.transitionToNext();\n  },\n\n  exit(ctx) {\n    ctx.movement.stopWalk();\n    ctx.movement.setSpeedMultiplier(1);\n  },\n};\n","export const sleep = {\n  id: 'sleep',\n  state: 'sleep',\n  system: false,\n\n  enter(ctx) {\n    ctx.movement.stopWalk();\n    ctx.stateTimer = ctx.getStateDuration('sleep');\n  },\n\n  update(ctx, dt) {\n    if (!ctx.movement.isGrounded()) {\n      ctx.transition('fall');\n      return;\n    }\n    ctx.stateTimer -= dt;\n    if (ctx.stateTimer <= 0) ctx.transitionToNext();\n  },\n\n  exit() {},\n};\n","const PEE_DURATION_MIN = 2000;\nconst PEE_DURATION_MAX = 4000;\nconst APPROACH_TIMEOUT = 4000;\n\nexport const pee = {\n  id: 'pee',\n  state: 'pee',\n  system: false,\n\n  enter(ctx) {\n    ctx.movement.stopWalk();\n    ctx._peePhase = 'peeing';\n    ctx._peeApproachTime = 0;\n\n    const texts = ctx.environment.findTextElements();\n    if (texts.length > 0) {\n      const target = texts[Math.floor(Math.random() * texts.length)];\n      const pos = ctx.movement.getPosition();\n      const petSize = ctx.config.size || 48;\n      const dist = Math.abs(pos.x - target.x);\n\n      if (dist > petSize) {\n        ctx._peePhase = 'approach';\n        ctx._peeTargetX = target.x;\n        ctx.visualState = 'walk';\n        const dir = target.x > pos.x ? 1 : -1;\n        ctx.movement.walkTo(dir);\n        return;\n      }\n    }\n\n    ctx.stateTimer = ctx.randomRange(PEE_DURATION_MIN, PEE_DURATION_MAX);\n  },\n\n  update(ctx, dt) {\n    if (!ctx.movement.isGrounded()) {\n      ctx.transition('fall');\n      return;\n    }\n\n    if (ctx._peePhase === 'approach') {\n      ctx._peeApproachTime += dt;\n      const pos = ctx.movement.getPosition();\n      const arrived = Math.abs(pos.x - ctx._peeTargetX) < 30;\n      const timedOut = ctx._peeApproachTime > APPROACH_TIMEOUT;\n      const hitEdge = ctx.movement.isAtViewportEdge() || ctx.movement.isAtEdge();\n\n      if (arrived || timedOut || hitEdge) {\n        ctx.movement.stopWalk();\n        ctx._peePhase = 'peeing';\n        ctx.visualState = null;\n        ctx.stateTimer = ctx.randomRange(PEE_DURATION_MIN, PEE_DURATION_MAX);\n      }\n      return;\n    }\n\n    ctx.stateTimer -= dt;\n    if (ctx.stateTimer <= 0) ctx.transitionToNext();\n  },\n\n  exit(ctx) {\n    ctx.movement.stopWalk();\n    ctx.visualState = null;\n    ctx._peePhase = null;\n    ctx._peeTargetX = null;\n    ctx._peeApproachTime = 0;\n  },\n};\n","/**\n * Description: Registers all stock capabilities on a CapabilityRegistry instance.\n * Usage: registerBuiltinCapabilities(registry) before BehaviorEngine.init.\n */\nimport { idle } from './capabilities/idle.js';\nimport { walk } from './capabilities/walk.js';\nimport { jump } from './capabilities/jump.js';\nimport { sit } from './capabilities/sit.js';\nimport { fall } from './capabilities/fall.js';\nimport { run } from './capabilities/run.js';\nimport { sleep } from './capabilities/sleep.js';\nimport { pee } from './capabilities/pee.js';\n\nexport function registerBuiltinCapabilities(registry) {\n  registry.register('idle', idle);\n  registry.register('walk', walk);\n  registry.register('jump', jump);\n  registry.register('sit', sit);\n  registry.register('fall', fall);\n  registry.register('run', run);\n  registry.register('sleep', sleep);\n  registry.register('pee', pee);\n}\n","/**\n * Description: Cached DOM scan for platforms and text targets; uses injected host only (no raw window/document reads in core logic except via host).\n * Usage: new Environment(host); init(); update() each frame when dirty.\n */\nexport class Environment {\n  constructor(host) {\n    this._host = host;\n    this._platforms = [];\n    this._dirty = true;\n    this._MIN_WIDTH = 60;\n    this._SELECTORS = [\n      'header',\n      'nav',\n      'footer',\n      'aside',\n      'section',\n      'article',\n      '.card',\n      '.widget',\n      '.sidebar',\n      '.wp-block-image',\n      '.wp-block-button',\n      '.wp-block-group',\n      '.wp-block-cover',\n      '.wp-block-columns',\n      '.entry-content img',\n      '[class*=\"hero\"]',\n      '[class*=\"banner\"]',\n      'table',\n      '.woocommerce-product-gallery',\n    ].join(',');\n  }\n\n  init() {\n    this.scan();\n    const win = this._host.window;\n    win.addEventListener('scroll', this._markDirty, { passive: true });\n    win.addEventListener('resize', this._markDirty, { passive: true });\n  }\n\n  destroy() {\n    const win = this._host.window;\n    win.removeEventListener('scroll', this._markDirty);\n    win.removeEventListener('resize', this._markDirty);\n  }\n\n  _markDirty = () => {\n    this._dirty = true;\n  };\n\n  scan() {\n    this._platforms = [];\n    const win = this._host.window;\n    const doc = this._host.document;\n    const vw = win.innerWidth;\n    const vh = win.innerHeight;\n\n    this._platforms.push({ left: 0, right: vw, y: vh });\n\n    let elements;\n    try {\n      elements = doc.querySelectorAll(this._SELECTORS);\n    } catch {\n      this._dirty = false;\n      return;\n    }\n\n    for (let i = 0; i < elements.length; i++) {\n      const el = elements[i];\n      if (el.offsetParent === null && el.tagName !== 'BODY' && el.tagName !== 'HTML') continue;\n\n      const rect = el.getBoundingClientRect();\n      if (rect.width < this._MIN_WIDTH) continue;\n      if (rect.height < 10) continue;\n      if (rect.bottom < -50 || rect.top > vh + 50) continue;\n      if (rect.right < 0 || rect.left > vw) continue;\n\n      this._platforms.push({\n        left: Math.max(0, rect.left),\n        right: Math.min(vw, rect.right),\n        y: rect.top,\n      });\n    }\n\n    this._platforms.sort((a, b) => a.y - b.y);\n    this._dirty = false;\n  }\n\n  update() {\n    if (this._dirty) this.scan();\n  }\n\n  getPlatforms() {\n    return this._platforms;\n  }\n\n  getFloorY() {\n    return this._host.window.innerHeight;\n  }\n\n  getViewport() {\n    const win = this._host.window;\n    return { width: win.innerWidth, height: win.innerHeight };\n  }\n\n  findPlatformsNear(x, y, range) {\n    const results = [];\n    for (let i = 0; i < this._platforms.length; i++) {\n      const p = this._platforms[i];\n      if (Math.abs(p.y - y) > range) continue;\n      if (x < p.left || x > p.right) continue;\n      results.push(p);\n    }\n    return results;\n  }\n\n  findTextElements() {\n    const doc = this._host.document;\n    const win = this._host.window;\n    const selectors = 'h1,h2,h3,h4,h5,h6,p,.entry-title,blockquote,li,span,a,label';\n    const results = [];\n    const vh = win.innerHeight;\n    const vw = win.innerWidth;\n    let elements;\n    try {\n      elements = doc.querySelectorAll(selectors);\n    } catch {\n      return results;\n    }\n\n    for (let i = 0; i < elements.length; i++) {\n      const el = elements[i];\n      if (el.closest('#ndp-pet-container')) continue;\n      if (el.offsetParent === null && el.tagName !== 'BODY') continue;\n      const rect = el.getBoundingClientRect();\n      if (rect.width < 20 || rect.height < 10) continue;\n      if (rect.bottom < 0 || rect.top > vh) continue;\n      if (rect.right < 0 || rect.left > vw) continue;\n      results.push({\n        x: rect.left,\n        y: rect.bottom,\n        left: rect.left,\n        right: rect.right,\n        bottom: rect.bottom,\n      });\n    }\n    return results;\n  }\n}\n","/**\n * Description: Velocity-based physics; reads limits from character config; uses environment for collisions.\n * Usage: Construct with (environment, host); init(config); update(dtSec) each frame.\n */\nexport class MovementEngine {\n  constructor(environment, host) {\n    this._env = environment;\n    this._host = host;\n    this._config = null;\n    this._x = 0;\n    this._y = 0;\n    this._vx = 0;\n    this._vy = 0;\n    this._grounded = false;\n    this._currentPlatform = null;\n    this._facingDir = 1;\n    this._walkDir = 0;\n    this._speedMult = 1;\n    this._paused = false;\n    this._PET_SIZE = 48;\n    this._GRAVITY = 900;\n    this._WALK_SPEED = 70;\n    this._WALK_ACCEL = 400;\n    this._JUMP_FORCE = 320;\n    this._FRICTION = 8;\n  }\n\n  _clamp(val, min, max) {\n    return Math.max(min, Math.min(max, val));\n  }\n\n  init(cfg) {\n    this._config = cfg;\n    this._PET_SIZE = cfg.size || 48;\n\n    const lim = cfg.limits || cfg.physics || {};\n    this._GRAVITY = lim.gravity || 900;\n    this._WALK_SPEED = lim.walkSpeed || 70;\n    this._WALK_ACCEL = lim.walkAccel || 400;\n    this._JUMP_FORCE = lim.jumpForce || 320;\n    this._FRICTION = lim.friction || 8;\n\n    const speedMod = 0.3 + ((cfg.movementSpeed - 1) / 99) * 1.7;\n    this._WALK_SPEED *= speedMod;\n    this._WALK_ACCEL *= speedMod;\n\n    const win = this._host.window;\n    this._x = win.innerWidth * 0.3 + Math.random() * win.innerWidth * 0.4;\n    this._y = win.innerHeight - this._PET_SIZE;\n    this._grounded = true;\n\n    if (cfg.persistenceEnabled && win.localStorage) {\n      try {\n        const saved = JSON.parse(win.localStorage.getItem('ndp_state'));\n        if (saved && typeof saved.x === 'number') {\n          this._x = this._clamp(saved.x, 0, win.innerWidth - this._PET_SIZE);\n          this._y = this._clamp(saved.y, 0, win.innerHeight - this._PET_SIZE);\n        }\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n\n  update(dtSec) {\n    if (this._paused) return;\n\n    if (!this._grounded) {\n      this._vy += this._GRAVITY * dtSec;\n    }\n\n    if (this._walkDir !== 0 && this._grounded) {\n      const targetVx = this._WALK_SPEED * this._speedMult * this._walkDir;\n      this._vx += (targetVx - this._vx) * Math.min(1, this._WALK_ACCEL * dtSec);\n    }\n\n    if (this._grounded && this._walkDir === 0) {\n      if (Math.abs(this._vx) > 0.5) {\n        this._vx *= Math.max(0, 1 - this._FRICTION * dtSec);\n      } else {\n        this._vx = 0;\n      }\n    }\n\n    this._x += this._vx * dtSec;\n    this._y += this._vy * dtSec;\n\n    const win = this._host.window;\n    const vw = win.innerWidth;\n    if (this._x < 0) {\n      this._x = 0;\n      this._vx = 0;\n    }\n    if (this._x > vw - this._PET_SIZE) {\n      this._x = vw - this._PET_SIZE;\n      this._vx = 0;\n    }\n\n    this._resolveCollisions();\n\n    if (this._vx > 0.5) this._facingDir = 1;\n    else if (this._vx < -0.5) this._facingDir = -1;\n  }\n\n  _resolveCollisions() {\n    const petBottom = this._y + this._PET_SIZE;\n    const petCenterX = this._x + this._PET_SIZE / 2;\n    const platforms = this._env.getPlatforms();\n\n    this._grounded = false;\n    this._currentPlatform = null;\n\n    for (let i = 0; i < platforms.length; i++) {\n      const p = platforms[i];\n      if (petCenterX < p.left || petCenterX > p.right) continue;\n      if (p.y < this._y) continue;\n\n      if (petBottom >= p.y - 2 && petBottom <= p.y + 20 && this._vy >= 0) {\n        this._y = p.y - this._PET_SIZE;\n        this._vy = 0;\n        this._grounded = true;\n        this._currentPlatform = p;\n        break;\n      }\n    }\n\n    if (!this._grounded) {\n      const win = this._host.window;\n      const floorY = win.innerHeight;\n      if (petBottom >= floorY) {\n        this._y = floorY - this._PET_SIZE;\n        this._vy = 0;\n        this._grounded = true;\n        this._currentPlatform = { left: 0, right: win.innerWidth, y: floorY };\n      }\n    }\n  }\n\n  walkTo(direction) {\n    this._walkDir = direction > 0 ? 1 : direction < 0 ? -1 : 0;\n    if (this._walkDir !== 0) this._facingDir = this._walkDir;\n  }\n\n  stopWalk() {\n    this._walkDir = 0;\n  }\n\n  setSpeedMultiplier(mult) {\n    this._speedMult = Math.max(0.1, Math.min(4, mult));\n  }\n\n  jump() {\n    if (!this._grounded) return;\n    this._vy = -this._JUMP_FORCE;\n    this._grounded = false;\n    this._currentPlatform = null;\n  }\n\n  isGrounded() {\n    return this._grounded;\n  }\n\n  isAtEdge() {\n    if (!this._currentPlatform) return false;\n    const petCenterX = this._x + this._PET_SIZE / 2;\n    const margin = this._PET_SIZE * 0.4;\n    return petCenterX - margin < this._currentPlatform.left || petCenterX + margin > this._currentPlatform.right;\n  }\n\n  isAtViewportEdge() {\n    const win = this._host.window;\n    return this._x <= 3 || this._x >= win.innerWidth - this._PET_SIZE - 3;\n  }\n\n  getPosition() {\n    return { x: this._x, y: this._y };\n  }\n\n  getVelocity() {\n    return { x: this._vx, y: this._vy };\n  }\n\n  getFacing() {\n    return this._facingDir;\n  }\n\n  getCurrentPlatform() {\n    return this._currentPlatform;\n  }\n\n  pause() {\n    this._paused = true;\n  }\n\n  resume() {\n    this._paused = false;\n  }\n\n  isPaused() {\n    return this._paused;\n  }\n}\n","/**\n * Description: Capability-driven FSM; uses injected registry and engine references (no globals).\n * Usage: new BehaviorEngine(registry); init({ config, movement, environment }); update(dtMs).\n */\nimport { CapabilityRegistry } from './capability-registry.js';\n\nexport class BehaviorEngine {\n  constructor(registry) {\n    this._registry = registry;\n    this._config = null;\n    this._activeCaps = {};\n    this._currentState = 'idle';\n    this._paused = false;\n    this._freqMod = 1;\n    this._movement = null;\n    this._environment = null;\n\n    this._ctx = {\n      movement: null,\n      environment: null,\n      config: null,\n      stateTimer: 0,\n      stateTime: 0,\n      walkDir: 0,\n      visualState: null,\n      transition: (s) => this._transition(s),\n      transitionToNext: () => this._transitionToNext(),\n      getStateDuration: (n) => this._getStateDuration(n),\n      randomRange: (min, max) => min + Math.random() * (max - min),\n    };\n  }\n\n  _randomRange(min, max) {\n    return min + Math.random() * (max - min);\n  }\n\n  _getStateDuration(stateName) {\n    const s = (this._config.states || {})[stateName] || {};\n    const minD = s.minDuration || 2000;\n    const maxD = s.maxDuration || 5000;\n    return this._randomRange(minD, maxD) * this._freqMod;\n  }\n\n  _transitionToNext() {\n    const table = (this._config.transitions || {})[this._currentState];\n    if (!table) {\n      this._transition('idle');\n      return;\n    }\n\n    const filtered = Object.create(null);\n    let total = 0;\n    for (const key in table) {\n      if (Object.prototype.hasOwnProperty.call(table, key) && this._activeCaps[key]) {\n        filtered[key] = table[key];\n        total += table[key];\n      }\n    }\n\n    if (total === 0) {\n      this._transition('idle');\n      return;\n    }\n\n    const roll = Math.random() * total;\n    let cumulative = 0;\n    for (const key in filtered) {\n      if (Object.prototype.hasOwnProperty.call(filtered, key)) {\n        cumulative += filtered[key];\n        if (roll <= cumulative) {\n          this._transition(key);\n          return;\n        }\n      }\n    }\n    this._transition('idle');\n  }\n\n  _transition(newState) {\n    if (!this._activeCaps[newState]) newState = 'idle';\n\n    const current = this._activeCaps[this._currentState];\n    if (current && current.exit) current.exit(this._ctx);\n\n    this._currentState = newState;\n    this._ctx.stateTime = 0;\n    this._ctx.stateTimer = 0;\n    this._ctx.visualState = null;\n\n    const next = this._activeCaps[this._currentState];\n    if (next && next.enter) next.enter(this._ctx);\n  }\n\n  init({ config, movement, environment }) {\n    this._config = config;\n    this._paused = false;\n    this._freqMod = 2.0 - (((config.behaviorFrequency || 50) - 1) / 99) * 1.7;\n\n    this._movement = movement;\n    this._environment = environment;\n    this._ctx.movement = movement;\n    this._ctx.environment = environment;\n    this._ctx.config = config;\n\n    const charCaps = config.capabilities || CapabilityRegistry.getDefaultList();\n    const enabledCaps = config.enabledCapabilities || [];\n\n    this._activeCaps = this._registry.resolve(charCaps, enabledCaps);\n\n    this._transition('idle');\n  }\n\n  update(dtMs) {\n    if (this._paused) return;\n    this._ctx.stateTime += dtMs;\n    const cap = this._activeCaps[this._currentState];\n    if (cap && cap.update) cap.update(this._ctx, dtMs);\n  }\n\n  getState() {\n    return this._ctx.visualState || this._currentState;\n  }\n\n  pause() {\n    this._paused = true;\n    if (this._movement) this._movement.stopWalk();\n  }\n\n  resume() {\n    if (!this._paused) return;\n    this._paused = false;\n  }\n\n  getActiveCaps() {\n    return { ...this._activeCaps };\n  }\n}\n","/**\n * Description: DOM renderer for pet container + SVG / multi-pose; uses host and injectable fetch only.\n * Usage: new Renderer(host, fetchImpl); init(config, mountParent); update(x,y,state,dir); destroy().\n */\nexport class Renderer {\n  constructor(host, fetchImpl) {\n    this._host = host;\n    this._fetch = fetchImpl;\n    this._container = null;\n    this._petEl = null;\n    this._currentState = '';\n    this._currentDir = 1;\n    this._multiPose = false;\n    this._poses = Object.create(null);\n    this._activePose = '';\n    this._statePoseMap = Object.create(null);\n  }\n\n  init(config, mountParent) {\n    const doc = this._host.document;\n    const parent = mountParent || doc.body;\n\n    this._container = doc.createElement('div');\n    this._container.id = 'ndp-pet-container';\n    this._container.setAttribute('aria-hidden', 'true');\n    this._container.setAttribute('role', 'presentation');\n\n    this._petEl = doc.createElement('div');\n    this._petEl.id = 'ndp-pet';\n    this._petEl.className = 'ndp-pet ndp-state-idle';\n    this._currentState = 'idle';\n\n    this._container.appendChild(this._petEl);\n    parent.appendChild(this._container);\n\n    if (config.poses && config.statePoses) {\n      return this._initMultiPose(config);\n    }\n    return this._initSingleSvg(config);\n  }\n\n  _initMultiPose(config) {\n    this._multiPose = true;\n    this._statePoseMap = config.statePoses;\n    this._poses = Object.create(null);\n    this._activePose = '';\n\n    const poseIds = Object.keys(config.poses);\n    const promises = [];\n\n    for (let i = 0; i < poseIds.length; i++) {\n      const poseId = poseIds[i];\n      const url = config.characterBaseUrl + config.poses[poseId];\n      promises.push(\n        this._fetch(url)\n          .then((res) => {\n            if (!res.ok) throw new Error('Pose SVG missing: ' + poseId);\n            return res.text();\n          })\n          .then((svg) => {\n            const doc = this._host.document;\n            const wrapper = doc.createElement('div');\n            wrapper.className = 'ndp-pose ndp-pose-' + poseId;\n            wrapper.style.display = 'none';\n            wrapper.innerHTML = svg;\n            const svgNode = wrapper.querySelector('svg');\n            if (svgNode) {\n              svgNode.setAttribute('width', config.size || 48);\n              svgNode.setAttribute('height', config.size || 48);\n            }\n            this._petEl.appendChild(wrapper);\n            this._poses[poseId] = wrapper;\n          })\n          .catch(() => {\n            this._poses[poseId] = null;\n          })\n      );\n    }\n\n    return Promise.all(promises).then(() => {\n      const defaultPose = this._statePoseMap.idle || poseIds[0];\n      this._showPose(defaultPose);\n      this._applyColors(config);\n    });\n  }\n\n  _initSingleSvg(config) {\n    this._multiPose = false;\n    const svgUrl = config.characterBaseUrl + config.character + '.svg';\n    return this._fetch(svgUrl)\n      .then((res) => {\n        if (!res.ok) throw new Error('SVG not found');\n        return res.text();\n      })\n      .then((svg) => {\n        this._petEl.innerHTML = svg;\n        const svgNode = this._petEl.querySelector('svg');\n        if (svgNode) {\n          svgNode.setAttribute('width', config.size || 48);\n          svgNode.setAttribute('height', config.size || 48);\n        }\n        this._applyColors(config);\n      })\n      .catch(() => {\n        this._petEl.textContent = '\\uD83D\\uDC3E';\n        this._petEl.style.fontSize = (config.size || 48) + 'px';\n        this._petEl.style.lineHeight = '1';\n      });\n  }\n\n  _showPose(poseId) {\n    if (poseId === this._activePose) return;\n    if (this._poses[this._activePose]) this._poses[this._activePose].style.display = 'none';\n    if (this._poses[poseId]) {\n      this._poses[poseId].style.display = '';\n      this._activePose = poseId;\n    }\n  }\n\n  update(x, y, state, dir) {\n    if (!this._container) return;\n\n    this._container.style.transform = 'translate3d(' + Math.round(x) + 'px,' + Math.round(y) + 'px,0)';\n\n    if (state !== this._currentState) {\n      this._petEl.classList.remove('ndp-state-' + this._currentState);\n      this._petEl.classList.add('ndp-state-' + state);\n      this._currentState = state;\n\n      if (this._multiPose && this._statePoseMap[state]) {\n        this._showPose(this._statePoseMap[state]);\n      }\n    }\n\n    if (dir !== this._currentDir) {\n      this._petEl.style.transform = dir < 0 ? 'scaleX(-1)' : 'scaleX(1)';\n      this._currentDir = dir;\n    }\n  }\n\n  _applyColors(config) {\n    if (!this._petEl || !config.customColors) return;\n    const colors = config.customColors;\n    for (const key in colors) {\n      if (Object.prototype.hasOwnProperty.call(colors, key) && colors[key]) {\n        this._petEl.style.setProperty('--ndp-color-' + key, colors[key]);\n      }\n    }\n  }\n\n  setOpacity(value) {\n    if (!this._container) return;\n    this._container.style.opacity = value;\n  }\n\n  destroy() {\n    if (this._container && this._container.parentNode) {\n      this._container.parentNode.removeChild(this._container);\n    }\n    this._container = null;\n    this._petEl = null;\n    this._poses = Object.create(null);\n    this._activePose = '';\n    this._multiPose = false;\n  }\n\n  getElement() {\n    return this._container;\n  }\n}\n","/**\n * Description: Merges runtime options with character JSON; supports URL fetch or async characterProvider.\n * Usage: await mergeRuntimeConfig(runtimeConfig, { fetch: globalThis.fetch }).\n */\n\nconst DEFAULTS = {\n  character: 'default',\n  characterBaseUrl: '',\n  characterConfigUrl: '',\n  movementSpeed: 50,\n  behaviorFrequency: 50,\n  mobileEnabled: false,\n  persistenceEnabled: true,\n  pluginUrl: '',\n  enabledCapabilities: [],\n  customColors: {},\n  size: 48,\n  capabilities: ['idle', 'walk', 'jump', 'sit', 'fall'],\n  limits: {\n    gravity: 900,\n    walkSpeed: 70,\n    walkAccel: 400,\n    jumpForce: 320,\n    friction: 8,\n  },\n  states: {\n    idle: { minDuration: 2000, maxDuration: 5000 },\n    walk: { minDuration: 1500, maxDuration: 5000 },\n    jump: {},\n    sit: { minDuration: 3000, maxDuration: 7000 },\n    fall: {},\n  },\n  transitions: {\n    idle: { walk: 40, jump: 15, sit: 25, idle: 20 },\n    walk: { idle: 50, jump: 10, sit: 15, walk: 25 },\n    sit: { idle: 60, walk: 30, jump: 10 },\n    jump: { idle: 100 },\n    fall: { idle: 100 },\n  },\n};\n\nfunction cloneDefaults() {\n  return JSON.parse(JSON.stringify(DEFAULTS));\n}\n\nfunction applyCharacterData(config, data) {\n  if (data.size) config.size = data.size;\n  if (data.capabilities) config.capabilities = data.capabilities;\n  if (data.limits) {\n    config.limits = data.limits;\n    config.physics = data.limits;\n  }\n  if (data.states) config.states = data.states;\n  if (data.transitions) config.transitions = data.transitions;\n  if (data.colorPalette) config.colorPalette = data.colorPalette;\n  if (data.poses) config.poses = data.poses;\n  if (data.statePoses) config.statePoses = data.statePoses;\n}\n\n/**\n * Description: Builds the fully merged config object used by engines and renderer.\n * Usage: Pass WordPress ndpConfig or library options plus optional characterProvider for remote assets.\n */\nexport async function mergeRuntimeConfig(runtimeConfig, deps) {\n  const fetchFn = deps && deps.fetch ? deps.fetch : typeof fetch !== 'undefined' ? fetch.bind(globalThis) : null;\n\n  const config = cloneDefaults();\n  if (runtimeConfig) {\n    for (const key in runtimeConfig) {\n      if (Object.prototype.hasOwnProperty.call(runtimeConfig, key) && key !== 'characterProvider') {\n        config[key] = runtimeConfig[key];\n      }\n    }\n  }\n\n  config.movementSpeed = parseInt(String(config.movementSpeed), 10) || DEFAULTS.movementSpeed;\n  config.behaviorFrequency = parseInt(String(config.behaviorFrequency), 10) || DEFAULTS.behaviorFrequency;\n  config.mobileEnabled = !!config.mobileEnabled;\n  config.persistenceEnabled = !!config.persistenceEnabled;\n\n  if (!config.physics) config.physics = config.limits || DEFAULTS.limits;\n\n  const provider = runtimeConfig && runtimeConfig.characterProvider;\n\n  if (provider && typeof provider.getCharacter === 'function') {\n    const result = await provider.getCharacter(config.character);\n    if (result && result.config) {\n      applyCharacterData(config, result.config);\n    }\n    if (result && result.baseUrl) {\n      config.characterBaseUrl = result.baseUrl;\n      config.characterConfigUrl = result.configUrl || result.baseUrl + 'character.json';\n    }\n    return config;\n  }\n\n  if (config.characterConfigUrl && fetchFn) {\n    try {\n      const res = await fetchFn(config.characterConfigUrl);\n      if (res.ok) {\n        const data = await res.json();\n        applyCharacterData(config, data);\n      }\n    } catch {\n      /* keep defaults */\n    }\n  }\n\n  return config;\n}\n","/**\n * Description: Public orchestrator for the digital pet: config merge, engines, lifecycle, rAF loop.\n * Usage: const pet = new NanoNomad({ host, runtimeConfig }); await pet.start(); pet.pause(); pet.destroy();\n */\nimport { createBrowserHost } from './host.js';\nimport { CapabilityRegistry } from './capability-registry.js';\nimport { registerBuiltinCapabilities } from './register-builtins.js';\nimport { Environment } from './environment.js';\nimport { MovementEngine } from './movement-engine.js';\nimport { BehaviorEngine } from './behavior-engine.js';\nimport { Renderer } from './renderer.js';\nimport { mergeRuntimeConfig } from './config-manager.js';\n\nconst MOBILE_BREAKPOINT = 768;\nconst IDLE_TIMEOUT = 60000;\nconst SCROLL_FADE_OPACITY = 0.3;\nconst PERSIST_INTERVAL = 5000;\nconst PERSIST_KEY = 'ndp_state';\nconst MAX_FRAME_DT = 50;\n\nexport class NanoNomad {\n  /**\n   * Description: Constructs an engine instance without starting the loop (safe for SSR if no start()).\n   * Usage: Options: host, runtimeConfig, fetch, capabilityRegistry, mountTarget (HTMLElement), registerBuiltin (default true).\n   */\n  constructor(options = {}) {\n    this._options = options;\n    this._host = options.host || null;\n    this._fetch = options.fetch || (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : null);\n    this._mountTarget = options.mountTarget || null;\n    this._registry = options.capabilityRegistry || new CapabilityRegistry();\n    if (options.registerBuiltin !== false) {\n      registerBuiltinCapabilities(this._registry);\n    }\n\n    this._config = null;\n    this._environment = null;\n    this._movement = null;\n    this._behavior = null;\n    this._renderer = null;\n\n    this._running = false;\n    this._rafId = null;\n    this._lastTime = 0;\n    this._idleTimer = null;\n    this._userIdle = false;\n    this._scrollTimer = null;\n    this._persistTimer = null;\n\n    this._onVisibility = null;\n    this._onScroll = null;\n    this._onMouse = null;\n    this._onKey = null;\n    this._onTouch = null;\n    this._onBeforeUnload = null;\n  }\n\n  static createBrowserHost(globalObj) {\n    return createBrowserHost(globalObj);\n  }\n\n  _isMobile() {\n    return this._host.window.innerWidth < MOBILE_BREAKPOINT;\n  }\n\n  _gameLoop = (timestamp) => {\n    if (!this._running) return;\n\n    const dt = this._lastTime ? Math.min(timestamp - this._lastTime, MAX_FRAME_DT) : 16;\n    this._lastTime = timestamp;\n\n    this._environment.update();\n    this._behavior.update(dt);\n    this._movement.update(dt / 1000);\n\n    const pos = this._movement.getPosition();\n    const state = this._behavior.getState();\n    const dir = this._movement.getFacing();\n    this._renderer.update(pos.x, pos.y, state, dir);\n\n    this._rafId = this._host.window.requestAnimationFrame(this._gameLoop);\n  };\n\n  _startLoop() {\n    if (this._running) return;\n    this._running = true;\n    this._lastTime = 0;\n    this._rafId = this._host.window.requestAnimationFrame(this._gameLoop);\n  }\n\n  _stopLoop() {\n    this._running = false;\n    if (this._rafId) {\n      this._host.window.cancelAnimationFrame(this._rafId);\n      this._rafId = null;\n    }\n  }\n\n  _resetIdleTimer = () => {\n    if (this._userIdle) {\n      this._userIdle = false;\n      this._movement.resume();\n      this._behavior.resume();\n      this._renderer.setOpacity(1);\n      this._startLoop();\n    }\n    const win = this._host.window;\n    if (this._idleTimer) win.clearTimeout(this._idleTimer);\n    this._idleTimer = win.setTimeout(() => {\n      this._userIdle = true;\n      this._behavior.pause();\n      this._movement.pause();\n      this._stopLoop();\n    }, IDLE_TIMEOUT);\n  };\n\n  _handleVisibility = () => {\n    const doc = this._host.document;\n    if (doc.hidden) {\n      this._stopLoop();\n      this._behavior.pause();\n      this._movement.pause();\n    } else {\n      this._movement.resume();\n      this._behavior.resume();\n      this._startLoop();\n    }\n  };\n\n  _handleScroll = () => {\n    this._renderer.setOpacity(SCROLL_FADE_OPACITY);\n    const win = this._host.window;\n    if (this._scrollTimer) win.clearTimeout(this._scrollTimer);\n    this._scrollTimer = win.setTimeout(() => {\n      if (!this._userIdle) this._renderer.setOpacity(1);\n    }, 400);\n  };\n\n  _persistState = () => {\n    if (!this._config || !this._config.persistenceEnabled) return;\n    const win = this._host.window;\n    if (!win.localStorage) return;\n    try {\n      const pos = this._movement.getPosition();\n      win.localStorage.setItem(\n        PERSIST_KEY,\n        JSON.stringify({\n          x: Math.round(pos.x),\n          y: Math.round(pos.y),\n          state: this._behavior.getState(),\n          ts: Date.now(),\n        })\n      );\n    } catch {\n      /* quota */\n    }\n  };\n\n  _bindLifecycleEvents() {\n    const doc = this._host.document;\n    const win = this._host.window;\n\n    doc.addEventListener('visibilitychange', this._handleVisibility);\n    win.addEventListener('scroll', this._handleScroll, { passive: true });\n    doc.addEventListener('mousemove', this._resetIdleTimer, { passive: true });\n    doc.addEventListener('keydown', this._resetIdleTimer, { passive: true });\n    doc.addEventListener('touchstart', this._resetIdleTimer, { passive: true });\n    this._resetIdleTimer();\n  }\n\n  _unbindLifecycleEvents() {\n    const doc = this._host.document;\n    const win = this._host.window;\n    doc.removeEventListener('visibilitychange', this._handleVisibility);\n    win.removeEventListener('scroll', this._handleScroll);\n    doc.removeEventListener('mousemove', this._resetIdleTimer);\n    doc.removeEventListener('keydown', this._resetIdleTimer);\n    doc.removeEventListener('touchstart', this._resetIdleTimer);\n    if (this._idleTimer) win.clearTimeout(this._idleTimer);\n    if (this._scrollTimer) win.clearTimeout(this._scrollTimer);\n    this._idleTimer = null;\n    this._scrollTimer = null;\n  }\n\n  _startPersistence() {\n    if (!this._config || !this._config.persistenceEnabled) return;\n    const win = this._host.window;\n    this._persistTimer = win.setInterval(this._persistState, PERSIST_INTERVAL);\n    this._onBeforeUnload = this._persistState;\n    win.addEventListener('beforeunload', this._onBeforeUnload);\n  }\n\n  _stopPersistence() {\n    const win = this._host.window;\n    if (this._persistTimer) {\n      win.clearInterval(this._persistTimer);\n      this._persistTimer = null;\n    }\n    if (this._onBeforeUnload) {\n      win.removeEventListener('beforeunload', this._onBeforeUnload);\n      this._onBeforeUnload = null;\n    }\n  }\n\n  /**\n   * Description: Loads config, mounts DOM, wires engines, and starts the animation loop.\n   * Usage: await pet.start(); requires host set (or pass in constructor).\n   */\n  async start() {\n    if (!this._host) {\n      this._host = createBrowserHost(typeof window !== 'undefined' ? window : null);\n    }\n\n    const runtime = this._options.runtimeConfig || {};\n    this._config = await mergeRuntimeConfig(runtime, { fetch: this._fetch });\n\n    if (!this._config.mobileEnabled && this._isMobile()) {\n      return;\n    }\n\n    if (!this._fetch) {\n      throw new Error('NanoNomad: fetch is required to load character assets');\n    }\n\n    this._environment = new Environment(this._host);\n    this._movement = new MovementEngine(this._environment, this._host);\n    this._behavior = new BehaviorEngine(this._registry);\n    this._renderer = new Renderer(this._host, this._fetch);\n\n    await this._renderer.init(this._config, this._mountTarget);\n\n    this._environment.init();\n    this._movement.init(this._config);\n    this._behavior.init({\n      config: this._config,\n      movement: this._movement,\n      environment: this._environment,\n    });\n\n    this._bindLifecycleEvents();\n    this._startPersistence();\n    this._startLoop();\n  }\n\n  /**\n   * Description: Stops rAF and input listeners; does not remove DOM (use destroy).\n   */\n  pause() {\n    this._stopLoop();\n    this._behavior.pause();\n    this._movement.pause();\n  }\n\n  /**\n   * Description: Resumes after pause(); noop if not initialized.\n   */\n  resume() {\n    if (!this._behavior || !this._movement) return;\n    this._movement.resume();\n    this._behavior.resume();\n    this._startLoop();\n  }\n\n  /**\n   * Description: Tears down timers, listeners, DOM, and engine references.\n   */\n  destroy() {\n    this._stopLoop();\n    this._stopPersistence();\n    this._unbindLifecycleEvents();\n    if (this._environment) {\n      this._environment.destroy();\n      this._environment = null;\n    }\n    if (this._renderer) {\n      this._renderer.destroy();\n      this._renderer = null;\n    }\n    this._movement = null;\n    this._behavior = null;\n    this._config = null;\n  }\n\n  getConfig() {\n    return this._config;\n  }\n}\n","/**\n * Description: Factory for a characterProvider that loads character.json + resolves base URLs from a static root (CDN or /public/nanonomad-characters).\n * Usage: new NanoNomad({ runtimeConfig: { character: 'dog', characterProvider: createUrlCharacterProvider('https://cdn.example.com/nanonomad-characters/') } }).\n */\nexport function createUrlCharacterProvider(rootUrl) {\n  const root = rootUrl.endsWith('/') ? rootUrl : rootUrl + '/';\n\n  return {\n    async getCharacter(id) {\n      const slug = encodeURIComponent(id).replace(/%2F/g, '');\n      const baseUrl = root + slug + '/';\n      const configUrl = baseUrl + 'character.json';\n      const res = await fetch(configUrl);\n      if (!res.ok) {\n        throw new Error('NanoNomad: character not found: ' + id);\n      }\n      const config = await res.json();\n      return {\n        config,\n        baseUrl,\n        configUrl,\n      };\n    },\n  };\n}\n"],"names":["createBrowserHost","globalObj","win","CapabilityRegistry","id","definition","def","characterCaps","enabledCaps","resolved","charList","i","cap","idle","ctx","dt","pickDirection","pos","vp","petCenter","platform","platCenter","walk","jump","sit","fall","RUN_SPEED_MULT","pickRunDirection","w","run","sleep","PEE_DURATION_MIN","PEE_DURATION_MAX","APPROACH_TIMEOUT","pee","texts","target","petSize","dir","arrived","timedOut","hitEdge","registerBuiltinCapabilities","registry","Environment","host","__publicField","doc","vw","vh","elements","el","rect","a","b","x","y","range","results","p","selectors","MovementEngine","environment","val","min","max","cfg","lim","speedMod","saved","dtSec","targetVx","petBottom","petCenterX","platforms","floorY","direction","mult","margin","BehaviorEngine","s","n","stateName","minD","maxD","table","filtered","total","key","roll","cumulative","newState","current","next","config","movement","charCaps","dtMs","Renderer","fetchImpl","mountParent","parent","poseIds","promises","poseId","url","res","svg","wrapper","svgNode","defaultPose","svgUrl","state","colors","value","DEFAULTS","cloneDefaults","applyCharacterData","data","mergeRuntimeConfig","runtimeConfig","deps","fetchFn","provider","result","MOBILE_BREAKPOINT","IDLE_TIMEOUT","SCROLL_FADE_OPACITY","PERSIST_INTERVAL","PERSIST_KEY","MAX_FRAME_DT","NanoNomad","options","timestamp","runtime","createUrlCharacterProvider","rootUrl","root","slug","baseUrl","configUrl"],"mappings":"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"}