{"version":3,"file":"index.umd.cjs","names":[],"sources":["../src/steps/base.js","../src/steps/duration.js","../src/steps/parallel.js","../src/steps/repeat.js","../src/steps/sequence.js","../src/math.js","../src/tweener.js","../src/steps/tweener.js","../src/entity.js","../src/inputs/base.js","../src/inputs/keyboard.js","../src/inputs/mouse.js","../src/shapes.js","../src/renderer.js","../src/scene.js","../src/timeline.js"],"sourcesContent":["export class BaseStep {\n  constructor({ entities } = {}) {\n    this.own = entities ?? null;\n    this.entities = this.own;\n    this.input = null;\n    this.startTime = 0;\n    this.time = 0;\n    this.done = false;\n  }\n\n  begin(time, entities, input) {\n    this.startTime = time;\n    this.time = time;\n    this.entities = this.own ?? entities ?? null;\n    this.input = input ?? null;\n    this.done = false;\n    this.enter();\n  }\n\n  enter() {}\n\n  get span() {\n    return null;\n  }\n\n  get elapsed() {\n    return this.time - this.startTime;\n  }\n\n  get finished() {\n    return this.done;\n  }\n\n  complete() {\n    this.done = true;\n  }\n\n  update(time) {\n    this.time = time;\n  }\n\n  destroy() {}\n}\n","import { BaseStep } from './base';\n\nexport class DurationStep extends BaseStep {\n  constructor({ duration, entities } = {}) {\n    super({ entities });\n\n    this.duration = duration;\n  }\n\n  get span() {\n    return this.duration ?? null;\n  }\n\n  get progress() {\n    if (!this.duration) throw new Error('A duration is required');\n\n    return Math.min(this.elapsed / this.duration, 1);\n  }\n\n  get finished() {\n    return this.done || this.progress >= 1;\n  }\n}\n","import { BaseStep } from './base';\n\nexport class ParallelStep extends BaseStep {\n  constructor(steps, { entities } = {}) {\n    super({ entities });\n\n    this.steps = steps;\n  }\n\n  begin(time, entities, input) {\n    super.begin(time, entities, input);\n\n    for (const step of this.steps) {\n      step.begin(time, this.entities, this.input);\n    }\n  }\n\n  get span() {\n    if (!this.steps.length) return 0;\n\n    let max = null;\n\n    for (const step of this.steps) {\n      const span = step.span;\n\n      if (span === null) continue;\n      if (max === null || span > max) max = span;\n    }\n\n    return max;\n  }\n\n  get finished() {\n    if (this.done) return true;\n\n    return this.steps.every((step) => step.finished);\n  }\n\n  update(time) {\n    super.update(time);\n\n    for (const step of this.steps) {\n      if (!step.finished) step.update(time);\n    }\n  }\n\n  destroy() {\n    for (const step of this.steps) {\n      step.destroy();\n    }\n  }\n}\n","import { BaseStep } from './base';\n\nexport class RepeatStep extends BaseStep {\n  constructor(step, { times = Infinity, entities } = {}) {\n    super({ entities });\n\n    this.step = step;\n    this.times = times;\n    this.count = 0;\n  }\n\n  begin(time, entities, input) {\n    super.begin(time, entities, input);\n\n    this.count = 0;\n    this.step.begin(time, this.entities, this.input);\n  }\n\n  get span() {\n    if (this.times === Infinity) return null;\n\n    const span = this.step.span;\n\n    return span === null ? null : span * this.times;\n  }\n\n  get finished() {\n    return this.done || this.count >= this.times;\n  }\n\n  update(time) {\n    super.update(time);\n\n    if (this.finished) return;\n\n    this.step.update(time);\n\n    if (!this.step.finished) return;\n\n    this.count++;\n\n    if (this.finished) return;\n\n    this.step.begin(time, this.entities, this.input);\n    this.step.update(time);\n  }\n\n  destroy() {\n    this.step.destroy();\n  }\n}\n","import { BaseStep } from './base';\n\nexport class SequenceStep extends BaseStep {\n  constructor(steps, { entities } = {}) {\n    super({ entities });\n\n    this.steps = steps;\n\n    this.reset();\n  }\n\n  reset() {\n    this.index = -1;\n    this.step = null;\n    this.done = false;\n  }\n\n  begin(time, entities, input) {\n    this.reset();\n    super.begin(time, entities, input);\n  }\n\n  get span() {\n    let total = 0;\n\n    for (const step of this.steps) {\n      if (step.span === null) return null;\n      total += step.span;\n    }\n\n    return total;\n  }\n\n  update(time) {\n    super.update(time);\n\n    while (!this.done) {\n      if (!this.step) {\n        const next = this.steps[this.index + 1];\n        if (!next) {\n          this.done = true;\n          return null;\n        }\n\n        this.index++;\n        this.step = next;\n        next.begin(time, this.entities, this.input);\n      }\n\n      const step = this.step;\n      step.update(time);\n\n      if (!step.finished) return step;\n\n      step.destroy();\n      this.step = null;\n    }\n\n    return null;\n  }\n}\n","export function lerp(from, to, t) {\n  return from + (to - from) * t;\n}\n\nexport function linear(progress) {\n  return progress;\n}\n\nexport function easeInOutSine(progress) {\n  return (1 - Math.cos(Math.PI * progress)) / 2;\n}\n\nexport function clamp(value, min, max) {\n  return Math.min(Math.max(value, min), max);\n}\n","import { easeInOutSine, lerp } from './math';\n\nfunction restyle(entry) {\n  const color = entry.color;\n\n  const r = Math.round(color.r);\n  const g = Math.round(color.g);\n  const b = Math.round(color.b);\n\n  if (r !== entry.r || g !== entry.g || b !== entry.b) {\n    entry.r = r;\n    entry.g = g;\n    entry.b = b;\n    entry.target.style = `rgb(${r} ${g} ${b})`;\n  }\n}\n\nclass Tween {\n  constructor(target, { startAt, duration, from, to, ease = easeInOutSine }) {\n    this.startAt = startAt;\n    this.endAt = duration > 0 ? startAt + duration : startAt;\n    this.duration = duration;\n    this.ease = ease;\n    this.settled = false;\n    this.props = [];\n    this.colors = [];\n\n    for (const key of Object.keys(to)) {\n      const end = to[key];\n\n      if (end !== null && typeof end === 'object') {\n        const into = target[key];\n\n        for (const leaf of Object.keys(end)) {\n          this.props.push({\n            into,\n            key: leaf,\n            from: from?.[key]?.[leaf] ?? into[leaf],\n            to: end[leaf],\n          });\n        }\n\n        if (key === 'color') this.colors.push({ target, color: into, r: NaN, g: NaN, b: NaN });\n\n        continue;\n      }\n\n      this.props.push({ into: target, key, from: from?.[key] ?? target[key], to: end });\n    }\n  }\n\n  update(elapsed) {\n    if (this.settled) {\n      if (elapsed >= this.endAt) return;\n      this.settled = false;\n    }\n\n    const progress = this.ease(\n      this.duration > 0 ? Math.min((elapsed - this.startAt) / this.duration, 1) : 1,\n    );\n\n    for (const prop of this.props) {\n      prop.into[prop.key] = lerp(prop.from, prop.to, progress);\n    }\n\n    for (const entry of this.colors) {\n      restyle(entry);\n    }\n\n    this.settled = elapsed >= this.endAt;\n  }\n}\n\nexport class Tweener {\n  constructor() {\n    this.tweens = [];\n  }\n\n  add(target, options) {\n    const tween = new Tween(target, options);\n\n    let slot = this.tweens.length;\n    while (slot > 0 && this.tweens[slot - 1].startAt > tween.startAt) {\n      slot--;\n    }\n\n    this.tweens.splice(slot, 0, tween);\n\n    return this;\n  }\n\n  clear() {\n    this.tweens.length = 0;\n    return this;\n  }\n\n  update(elapsed) {\n    for (const tween of this.tweens) {\n      if (tween.startAt > elapsed) break;\n      tween.update(elapsed);\n    }\n\n    return this;\n  }\n}\n","import { DurationStep } from './duration';\nimport { Tweener } from '../tweener';\n\nexport class TweenerStep extends DurationStep {\n  constructor({ duration, entities } = {}) {\n    super({ duration, entities });\n\n    this.tweener = new Tweener();\n  }\n\n  begin(time, entities, input) {\n    this.tweener.clear();\n    super.begin(time, entities, input);\n  }\n\n  tween(target, options) {\n    this.tweener.add(target, options);\n    return this;\n  }\n\n  update(time) {\n    super.update(time);\n    this.tweener.update(this.elapsed);\n  }\n}\n","export function rgb(color) {\n  return `rgb(${Math.round(color.r)} ${Math.round(color.g)} ${Math.round(color.b)})`;\n}\n\nexport class Entity {\n  constructor({ shape, x0 = 0, x1 = 0, y0 = 0, y1 = 0, color, alpha = 1, lineWidth = 1 } = {}) {\n    this.shape = shape;\n    this.x0 = x0;\n    this.x1 = x1;\n    this.y0 = y0;\n    this.y1 = y1;\n    this.color = { r: 0, g: 0, b: 0, ...color };\n    this.style = rgb(this.color);\n    this.alpha = alpha;\n    this.lineWidth = lineWidth;\n  }\n\n  recolor({ r, g, b }) {\n    const color = this.color;\n\n    if (r !== undefined) color.r = r;\n    if (g !== undefined) color.g = g;\n    if (b !== undefined) color.b = b;\n\n    this.style = rgb(color);\n\n    return this;\n  }\n\n  snapshot() {\n    return {\n      x0: this.x0,\n      x1: this.x1,\n      y0: this.y0,\n      y1: this.y1,\n      alpha: this.alpha,\n      lineWidth: this.lineWidth,\n      r: this.color.r,\n      g: this.color.g,\n      b: this.color.b,\n    };\n  }\n\n  restore(state) {\n    this.x0 = state.x0;\n    this.x1 = state.x1;\n    this.y0 = state.y0;\n    this.y1 = state.y1;\n    this.alpha = state.alpha;\n    this.lineWidth = state.lineWidth;\n\n    const color = this.color;\n    color.r = state.r;\n    color.g = state.g;\n    color.b = state.b;\n\n    this.style = rgb(color);\n  }\n}\n\nexport function rect(options) {\n  return new Entity({ ...options, shape: 'rect' });\n}\n\nexport function line(options) {\n  return new Entity({ ...options, shape: 'line' });\n}\n","export class Input {\n  constructor() {\n    this.target = null;\n    this.listeners = [];\n  }\n\n  get attached() {\n    return this.listeners.length > 0;\n  }\n\n  bindings() {\n    return {};\n  }\n\n  attach(target) {\n    if (this.attached) return this;\n\n    this.target = target ?? null;\n\n    if (!this.target?.addEventListener) return this;\n\n    for (const [type, handler] of Object.entries(this.bindings())) {\n      const listener = (event) => handler.call(this, event);\n\n      this.target.addEventListener(type, listener);\n      this.listeners.push([type, listener]);\n    }\n\n    return this;\n  }\n\n  detach() {\n    for (const [type, listener] of this.listeners) {\n      this.target.removeEventListener(type, listener);\n    }\n\n    this.listeners = [];\n\n    return this;\n  }\n\n  flush() {\n    return this;\n  }\n\n  reset() {\n    return this;\n  }\n}\n","import { Input } from './base';\n\nconst ALIASES = { ' ': 'space', spacebar: 'space', esc: 'escape' };\n\nfunction normalize(key) {\n  const name = String(key).toLowerCase();\n\n  return ALIASES[name] ?? name;\n}\n\nexport class KeyboardInput extends Input {\n  constructor({ prevent = [] } = {}) {\n    super();\n\n    this.prevent = new Set(prevent.map(normalize));\n    this.keys = new Set();\n    this.presses = new Set();\n    this.releases = new Set();\n  }\n\n  bindings() {\n    return {\n      keydown: this.onDown,\n      keyup: this.onUp,\n      blur: this.onBlur,\n    };\n  }\n\n  held(...keys) {\n    return keys.some((key) => this.keys.has(normalize(key)));\n  }\n\n  pressed(...keys) {\n    return keys.some((key) => this.presses.has(normalize(key)));\n  }\n\n  released(...keys) {\n    return keys.some((key) => this.releases.has(normalize(key)));\n  }\n\n  axis(negative, positive) {\n    return (this.held(...positive) ? 1 : 0) - (this.held(...negative) ? 1 : 0);\n  }\n\n  onDown(event) {\n    const key = normalize(event.key);\n\n    if (this.prevent.has(key)) event.preventDefault?.();\n    if (!this.keys.has(key)) this.presses.add(key);\n\n    this.keys.add(key);\n  }\n\n  onUp(event) {\n    const key = normalize(event.key);\n\n    if (this.prevent.has(key)) event.preventDefault?.();\n\n    this.keys.delete(key);\n    this.releases.add(key);\n  }\n\n  onBlur() {\n    for (const key of this.keys) {\n      this.releases.add(key);\n    }\n\n    this.keys.clear();\n  }\n\n  flush() {\n    this.presses.clear();\n    this.releases.clear();\n\n    return this;\n  }\n\n  reset() {\n    this.keys.clear();\n\n    return this.flush();\n  }\n}\n","import { Input } from './base';\n\nexport class MouseInput extends Input {\n  constructor() {\n    super();\n\n    this.x = 0;\n    this.y = 0;\n    this.inside = false;\n    this.down = false;\n    this.pressed = false;\n    this.released = false;\n  }\n\n  bindings() {\n    return {\n      pointerdown: this.onDown,\n      pointermove: this.onMove,\n      pointerup: this.onUp,\n      pointerleave: this.onLeave,\n    };\n  }\n\n  locate(event) {\n    const target = this.target;\n    const bounds = target.getBoundingClientRect?.();\n\n    if (!bounds?.width || !bounds?.height) {\n      return { x: event.offsetX ?? 0, y: event.offsetY ?? 0 };\n    }\n\n    return {\n      x: ((event.clientX - bounds.left) * (target.width ?? bounds.width)) / bounds.width,\n      y: ((event.clientY - bounds.top) * (target.height ?? bounds.height)) / bounds.height,\n    };\n  }\n\n  track(event) {\n    const { x, y } = this.locate(event);\n\n    this.x = x;\n    this.y = y;\n    this.inside = true;\n  }\n\n  onMove(event) {\n    this.track(event);\n  }\n\n  onDown(event) {\n    this.track(event);\n\n    this.down = true;\n    this.pressed = true;\n  }\n\n  onUp(event) {\n    this.track(event);\n\n    this.down = false;\n    this.released = true;\n  }\n\n  onLeave() {\n    this.inside = false;\n    this.down = false;\n  }\n\n  flush() {\n    this.pressed = false;\n    this.released = false;\n\n    return this;\n  }\n\n  reset() {\n    this.down = false;\n\n    return this.flush();\n  }\n}\n","export function drawRect(ctx, entity) {\n  ctx.fillRect(entity.x0, entity.y0, entity.x1 - entity.x0, entity.y1 - entity.y0);\n}\n\nexport function drawLine(ctx, entity) {\n  ctx.lineWidth = entity.lineWidth;\n\n  ctx.beginPath();\n  ctx.moveTo(entity.x0, entity.y0);\n  ctx.lineTo(entity.x1, entity.y1);\n  ctx.stroke();\n}\n","import { drawLine, drawRect } from './shapes';\n\nconst SHAPES = { line: drawLine, rect: drawRect };\n\nexport class Renderer {\n  constructor(canvas, { shapes } = {}) {\n    this.canvas = canvas;\n    this.shapes = shapes ? { ...SHAPES, ...shapes } : SHAPES;\n\n    const ctx = canvas.getContext('2d');\n    if (!ctx) throw new Error('Could not acquire a 2d rendering context');\n\n    this.ctx = ctx;\n  }\n\n  resolve(entity) {\n    const draw = this.shapes[entity.shape];\n    if (!draw) throw new Error(`Nothing knows how to draw a \"${entity.shape}\"`);\n\n    return draw;\n  }\n\n  clear() {\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n  }\n\n  render(entities, draws) {\n    const ctx = this.ctx;\n\n    let alpha = -1;\n    let style = null;\n\n    ctx.save();\n\n    for (let i = 0; i < entities.length; i++) {\n      const entity = entities[i];\n\n      if (entity.alpha !== alpha) {\n        alpha = entity.alpha;\n        ctx.globalAlpha = alpha;\n      }\n\n      const next = entity.style;\n\n      if (next !== style) {\n        style = next;\n        ctx.fillStyle = style;\n        ctx.strokeStyle = style;\n      }\n\n      draws[i](ctx, entity);\n    }\n\n    ctx.restore();\n  }\n}\n","import { Renderer } from './renderer';\n\nexport class Scene {\n  constructor({ canvas, renderer, timelines = [], input = null, loop = false } = {}) {\n    this.renderer = renderer ?? (canvas ? new Renderer(canvas) : null);\n    this.timelines = timelines;\n    this.input = input;\n    this.loop = loop;\n    this.startTime = null;\n    this.time = 0;\n\n    if (this.input) this.input.attach(this.renderer?.canvas ?? null);\n\n    this.build();\n  }\n\n  build() {\n    this.entities = this.timelines.flatMap((timeline) => timeline.entities);\n    this.draws = this.renderer\n      ? this.entities.map((entity) => this.renderer.resolve(entity))\n      : this.entities.map(() => null);\n\n    return this;\n  }\n\n  get elapsed() {\n    return this.startTime === null ? 0 : this.time - this.startTime;\n  }\n\n  get span() {\n    let max = null;\n\n    for (const timeline of this.timelines) {\n      const span = timeline.span;\n\n      if (span === null) continue;\n      if (max === null || span > max) max = span;\n    }\n\n    return max;\n  }\n\n  get finished() {\n    let leads = false;\n\n    for (const timeline of this.timelines) {\n      if (timeline.span === null) continue;\n\n      leads = true;\n      if (!timeline.finished) return false;\n    }\n\n    return leads;\n  }\n\n  advance(time) {\n    if (this.startTime === null) this.startTime = time;\n\n    this.time = time;\n\n    const elapsed = time - this.startTime;\n\n    for (const timeline of this.timelines) {\n      timeline.update(elapsed, this.input);\n    }\n\n    return this;\n  }\n\n  paint() {\n    if (!this.renderer) return this;\n\n    this.renderer.clear();\n    this.renderer.render(this.entities, this.draws);\n\n    return this;\n  }\n\n  render(time) {\n    this.advance(time);\n    this.paint();\n\n    if (this.loop && this.finished) this.reset();\n    if (this.input) this.input.flush();\n\n    return this;\n  }\n\n  reset() {\n    this.startTime = null;\n    this.time = 0;\n\n    for (const timeline of this.timelines) {\n      timeline.reset();\n    }\n\n    if (this.input) this.input.reset();\n\n    return this;\n  }\n\n  destroy() {\n    if (this.input) this.input.detach();\n\n    return this;\n  }\n}\n","import { RepeatStep, SequenceStep } from './steps';\n\nexport class Timeline {\n  constructor({ entities = [], steps = [], repeat = false } = {}) {\n    this.entities = entities.flat(Infinity);\n\n    const sequence = new SequenceStep(steps, { entities: this.entities });\n\n    this.root = repeat\n      ? new RepeatStep(sequence, { times: repeat === true ? Infinity : repeat })\n      : sequence;\n\n    this.initial = this.entities.map((entity) => entity.snapshot());\n    this.started = false;\n  }\n\n  get span() {\n    return this.root.span;\n  }\n\n  get finished() {\n    return this.started && this.root.finished;\n  }\n\n  reset() {\n    this.started = false;\n\n    for (let i = 0; i < this.entities.length; i++) {\n      this.entities[i].restore(this.initial[i]);\n    }\n  }\n\n  update(time, input) {\n    if (!this.started) {\n      this.started = true;\n      this.root.begin(time, this.entities, input);\n    }\n\n    return this.root.update(time);\n  }\n}\n"],"mappings":"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"}