lezzo.org/clippy/dist/index.js.map
2023-07-06 11:04:37 +02:00

1 line
54 KiB
Plaintext

{"version":3,"file":"index.js","sources":["../src/queue.ts","../src/animator.ts","../src/utils.ts","../src/balloon.ts","../src/agent.ts","../src/agents/index.ts","../node_modules/rollup-plugin-styles/dist/runtime/inject-css.js","../src/index.ts","../src/load.ts"],"sourcesContent":["export default class Queue {\n private _queue: Function[];\n private _onEmptyCallback: any;\n private _active: any;\n\n constructor(onEmptyCallback: Function) {\n this._queue = [];\n this._onEmptyCallback = onEmptyCallback;\n }\n\n /***\n *\n * @param {function(Function)} func\n * @returns {jQuery.Deferred}\n */\n public queue(func: Function) {\n this._queue.push(func);\n\n if (this._queue.length === 1 && !this._active) {\n this._progressQueue();\n }\n }\n\n private _progressQueue() {\n\n // stop if nothing left in queue\n if (!this._queue.length) {\n this._onEmptyCallback();\n return;\n }\n\n let f = this._queue.shift();\n this._active = true;\n\n // execute function\n let completeFunction = this.next.bind(this);\n if (f) f(completeFunction);\n }\n\n public clear() {\n this._queue = [];\n }\n\n public next() {\n this._active = false;\n this._progressQueue();\n }\n}\n\n\n\n","import { AgentConfig, AgentWrapper, ClippyAnimation, ClippyFrame } from './types';\n\n\nexport default class Animator {\n public static States = { WAITING: 1, EXITED: 0 };\n\n private _el: HTMLElement;\n private _data: AgentConfig;\n private _currentFrameIndex: number;\n private _path: string;\n private _exiting: boolean;\n private _currentFrame?: ClippyFrame;\n private _started: boolean;\n private _sounds: Record<string, HTMLAudioElement>;\n private _overlays: HTMLElement[];\n private _endCallback?: Function;\n private _currentAnimation?: ClippyAnimation;\n private _loop?: number;\n\n public currentAnimationName: string | undefined;\n\n constructor (el: HTMLElement, config: AgentWrapper, sounds: Array<string>) {\n this._el = el;\n this._data = config.config;\n this._path = config.image;\n this._currentFrameIndex = 0;\n this._currentFrame = undefined;\n this._exiting = false;\n this._currentAnimation = undefined;\n this._endCallback = undefined;\n this._started = false;\n this._sounds = {};\n this.currentAnimationName = undefined;\n this.preloadSounds(sounds);\n this._overlays = [this._el];\n let curr = this._el;\n\n this._setupElement(this._el);\n for (let i = 1; i < this._data.overlayCount; i++) {\n const divEl = document.createElement('div');\n let inner = this._setupElement(divEl);\n curr.append(inner);\n this._overlays.push(inner);\n curr = inner;\n }\n }\n\n private _setupElement (el: HTMLElement) {\n let frameSize = this._data.framesize;\n el.style.display = \"none\";\n el.style.width = frameSize[0] + \"px\";\n el.style.height = frameSize[1] + \"px\";\n el.style.background = \"url('\" + this._path + \"') no-repeat\";\n \n return el;\n }\n\n animations () {\n let r = [];\n let d = this._data.animations;\n for (let n in d) {\n r.push(n);\n }\n return r;\n }\n\n preloadSounds (sounds: Array<string>) {\n\n // for (let i = 0; i < this._data.sounds.length; i++) {\n // let snd: string = this._data.sounds[i];\n // let uri = sounds[snd];\n // if (!uri) continue;\n // this._sounds[snd] = new Audio(uri);\n\n // }\n }\n\n hasAnimation (name: string) {\n return !!this._data.animations[name];\n }\n\n exitAnimation () {\n this._exiting = true;\n }\n\n showAnimation (animationName: string, stateChangeCallback: Function) {\n this._exiting = false;\n\n if (!this.hasAnimation(animationName)) {\n return false;\n }\n\n this._currentAnimation = this._data.animations[animationName];\n this.currentAnimationName = animationName;\n\n\n if (!this._started) {\n this._step();\n this._started = true;\n }\n\n this._currentFrameIndex = 0;\n this._currentFrame = undefined;\n this._endCallback = stateChangeCallback;\n\n return true;\n }\n\n private _draw () {\n let images: Array<Array<number>> = [];\n if (this._currentFrame) images = this._currentFrame.images || [];\n\n for (let i = 0; i < this._overlays.length; i++) {\n if (i < images.length) {\n let xy = images[i];\n let bg = -xy[0] + 'px ' + -xy[1] + 'px';\n this._overlays[i].style.backgroundPosition = bg;\n this._overlays[i].style.display = 'block';\n }\n else {\n this._overlays[i].style.display = 'none';\n }\n\n }\n }\n\n private _getNextAnimationFrame (): number {\n if (!this._currentAnimation) return 0;\n // No current frame. start animation.\n if (!this._currentFrame) return 0;\n let currentFrame = this._currentFrame;\n let branching = this._currentFrame.branching;\n\n\n if (this._exiting && currentFrame.exitBranch !== undefined) {\n return currentFrame.exitBranch;\n }\n else if (branching) {\n let rnd = Math.random() * 100;\n for (let i = 0; i < branching.branches.length; i++) {\n let branch = branching.branches[i];\n if (rnd <= branch.weight) {\n return branch.frameIndex;\n }\n\n rnd -= branch.weight;\n }\n }\n\n return this._currentFrameIndex + 1;\n }\n\n\n private _playSound () {\n let s = this._currentFrame?.sound;\n if (!s) return;\n let audio = this._sounds[s];\n if (audio) audio.play();\n }\n\n private _atLastFrame () {\n if (!this._currentAnimation) return false;\n return this._currentFrameIndex >= this._currentAnimation.frames.length - 1;\n }\n\n\n private _step () {\n if (!this._currentAnimation) return;\n let newFrameIndex = Math.min(this._getNextAnimationFrame(), this._currentAnimation.frames.length - 1);\n let frameChanged = !this._currentFrame || this._currentFrameIndex !== newFrameIndex;\n this._currentFrameIndex = newFrameIndex;\n\n // always switch frame data, unless we're at the last frame of an animation with a useExitBranching flag.\n if (!(this._atLastFrame() && this._currentAnimation.useExitBranching)) {\n this._currentFrame = this._currentAnimation.frames[this._currentFrameIndex];\n }\n\n this._draw();\n this._playSound();\n\n this._loop = window.setTimeout(this._step.bind(this), this._currentFrame!.duration);\n\n\n // fire events if the frames changed and we reached an end\n if (this._endCallback && frameChanged && this._atLastFrame()) {\n if (this._currentAnimation.useExitBranching && !this._exiting) {\n this._endCallback(this.currentAnimationName, Animator.States.WAITING);\n }\n else {\n this._endCallback(this.currentAnimationName, Animator.States.EXITED);\n }\n }\n }\n\n /***\n * Pause animation execution\n */\n pause () {\n window.clearTimeout(this._loop);\n }\n\n /***\n * Resume animation\n */\n resume () {\n this._step();\n }\n}\n\n\n","export const getWindowScroll = () => {\n const supportPageOffset = window.pageXOffset !== undefined;\n const isCSS1Compat = ((document.compatMode || \"\") === \"CSS1Compat\");\n\n const scrollLeft = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;\n const scrollTop = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;\n return {\n scrollLeft,\n scrollTop\n }\n}\n\nexport function getOffset(element: HTMLElement) {\n if (!element.getClientRects().length) {\n return { top: 0, left: 0 };\n }\n\n let rect = element.getBoundingClientRect();\n let win = element.ownerDocument.defaultView || { pageXOffset: 0, pageYOffset: 0 };\n return (\n {\n top: rect.top + win.pageYOffset,\n left: rect.left + win.pageXOffset\n });\n}\n\nexport function getWidth(el: HTMLElement, type: 'inner' | 'outer' | 'width' | 'full') {\n if (type === 'inner') // .innerWidth()\n return el.clientWidth;\n else if (type === 'outer') // .outerWidth()\n return el.offsetWidth;\n let s = window.getComputedStyle(el, null);\n if (type === 'width') // .width()\n return el.clientWidth - parseInt(s.getPropertyValue('padding-left')) - parseInt(s.getPropertyValue('padding-right'));\n else if (type === 'full') // .outerWidth(includeMargins = true)\n return el.offsetWidth + parseInt(s.getPropertyValue('margin-left')) + parseInt(s.getPropertyValue('margin-right'));\n return null;\n}\n\n\nexport function getHeight(el: HTMLElement, type: 'inner' | 'outer' | 'height' | 'full') {\n if (type === 'inner') // .innerHeight()\n return el.clientHeight;\n else if (type === 'outer') // .outerHeight()\n return el.offsetHeight;\n let s = window.getComputedStyle(el, null);\n if (type === 'height') // .height()\n return el.clientHeight - parseInt(s.getPropertyValue('padding-top')) - parseInt(s.getPropertyValue('padding-bottom'));\n else if (type === 'full') // .outerWidth(includeMargins = true)\n return el.offsetHeight + parseInt(s.getPropertyValue('margin-top')) + parseInt(s.getPropertyValue('margin-bottom'));\n return null;\n}\n\n\n// Stub for jQuery.Deferred\nexport class Deferred {\n public promise!: Promise<void>;\n public resolve!: (value?: any) => void;\n public reject!: (reason?: any) => void;\n\n constructor () {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","import { getHeight, getOffset, getWidth, getWindowScroll } from './utils';\nconst WORD_SPEAK_TIME: number = 200;\nconst CLOSE_BALLOON_DELAY = 2000;\nconst BALLOON_MARGIN = 15;\n\nexport default class Balloon {\n private _targetEl: HTMLElement;\n private _balloon?: HTMLElement;\n private _content?: HTMLElement;\n private _complete?: Function;\n\n private _hiding: number | null = null;\n private _loop: number | null = null;\n\n private _hidden: boolean;\n private _active: boolean = true;\n private _hold: boolean = false;\n\n private _addWord: (() => void) | null = null;\n \n constructor (targetEl: HTMLElement) {\n this._targetEl = targetEl;\n this._hidden = true;\n this._setup();\n }\n\n private _setup () {\n const balloonEl = document.createElement('div');\n balloonEl.className = 'clippy-balloon';\n balloonEl.setAttribute('hidden', 'true')\n const tipEl = document.createElement('div');\n tipEl.className = 'clippy-tip';\n const contentEl = document.createElement('div');\n contentEl.className = 'clippy-content';\n balloonEl.appendChild(tipEl);\n balloonEl.appendChild(contentEl);\n this._balloon = balloonEl;\n this._content = contentEl;\n\n const targetEl = this._targetEl;\n targetEl.insertAdjacentElement('afterend', balloonEl);\n }\n\n public reposition () {\n let sides = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\n\n for (let i = 0; i < sides.length; i++) {\n let s = sides[i];\n this._position(s);\n if (!this._isOut()) break;\n }\n }\n\n /***\n *\n * @param side\n * @private\n */\n private _position (side: string) {\n if (!this._balloon) return;\n\n let o = getOffset(this._targetEl);\n let h = getHeight(this._targetEl, 'height')!;\n let w = getWidth(this._targetEl, 'width')!;\n\n\n let {scrollLeft: sT, scrollTop: sL} = getWindowScroll();\n o.top -= sT;\n o.left -= sL;\n\n let bH = getHeight(this._balloon, 'outer')!;\n let bW = getWidth(this._balloon, 'outer')!; \n \n this._balloon.classList.remove('clippy-top-left');\n this._balloon.classList.remove('clippy-top-right');\n this._balloon.classList.remove('clippy-bottom-right');\n this._balloon.classList.remove('clippy-bottom-left');\n\n let left = 0, top = 0;\n switch (side) {\n case 'top-left':\n // right side of the balloon next to the right side of the agent\n left = o.left + w - bW;\n top = o.top - bH - BALLOON_MARGIN;\n break;\n case 'top-right':\n // left side of the balloon next to the left side of the agent\n left = o.left;\n top = o.top - bH - BALLOON_MARGIN;\n break;\n case 'bottom-right':\n // right side of the balloon next to the right side of the agent\n left = o.left;\n top = o.top + h + BALLOON_MARGIN;\n break;\n case 'bottom-left':\n // left side of the balloon next to the left side of the agent\n left = o.left + w - bW;\n top = o.top + h + BALLOON_MARGIN;\n break;\n }\n\n this._balloon.style.top = top + 'px';\n this._balloon.style.left = left + 'px';\n this._balloon.classList.add('clippy-' + side);\n }\n\n private _isOut () {\n if (!this._balloon) return;\n \n let o = getOffset(this._balloon);\n let bH = getHeight(this._balloon, 'outer')!;\n let bW = getWidth(this._balloon, 'outer')!; \n\n let wW = document.querySelector('html')!.clientWidth; \n let wH = document.querySelector('html')!.clientHeight;\n let {scrollLeft: sT, scrollTop: sL} = getWindowScroll();\n\n let top = o.top - sT;\n let left = o.left - sL;\n let m = 5;\n if (top - m < 0 || left - m < 0) return true;\n return (top + bH + m) > wH || (left + bW + m) > wW;\n }\n\n public speak (complete: Function, text: string, hold: boolean) {\n this._hidden = false;\n this.show();\n let c = this._content;\n\n if (!c) return;\n \n // set height to auto\n c.style.height = 'auto';\n c.style.width = 'auto';\n\n // add the text\n c.innerHTML = text;\n \n // set height\n c.style.height = c.style.height || '';\n c.style.width = c.style.width || '';\n c.innerHTML = '';\n this.reposition();\n\n this._complete = complete;\n this._sayWords(text, hold, complete);\n }\n\n public show () {\n if (!this._balloon) return;\n if (this._hidden) return;\n this._balloon.removeAttribute('hidden');\n }\n\n public hide (fast?: boolean) {\n if (fast) {\n this._balloon?.setAttribute('hidden', 'true');\n return;\n }\n\n this._hiding = window.setTimeout(this._finishHideBalloon.bind(this), CLOSE_BALLOON_DELAY);\n }\n\n private _finishHideBalloon () {\n if (this._active) return;\n this._balloon?.setAttribute('hidden', 'true');\n this._hidden = true;\n this._hiding = null;\n }\n\n private _sayWords (text: string, hold: boolean, complete: Function) {\n this._active = true;\n this._hold = hold;\n let words = text.split(/[^\\S-]/);\n let time = WORD_SPEAK_TIME;\n let el = this._content;\n let idx = 1;\n\n\n this._addWord = () => {\n if (!this._active) return;\n if (idx > words.length) {\n this._addWord = null;\n this._active = false;\n if (!this._hold) {\n complete();\n this.hide(false);\n }\n } else {\n if (el) el.innerHTML = words.slice(0, idx).join(' ');\n idx++;\n // @ts-ignore\n this._loop = window.setTimeout(this._addWord?.bind(this), time);\n }\n };\n\n this._addWord();\n\n }\n\n public close () {\n if (this._active) {\n this._hold = false;\n } else if (this._hold && this._complete) {\n this._complete();\n }\n }\n\n public pause () {\n if (this._loop) {\n window.clearTimeout(this._loop);\n }\n if (this._hiding) {\n window.clearTimeout(this._hiding);\n this._hiding = null;\n }\n }\n\n public resume () {\n if (this._addWord) {\n this._addWord();\n } else if (!this._hold && !this._hidden) {\n this._hiding = window.setTimeout(this._finishHideBalloon.bind(this), CLOSE_BALLOON_DELAY);\n }\n }\n}\n\n\n","import Queue from './queue'\nimport Animator from './animator'\nimport Balloon from './balloon'\nimport { AgentWrapper } from './types';\nimport { Deferred, getHeight, getOffset, getWidth, getWindowScroll } from './utils';\n\nexport interface AgentOptions {\n agent: AgentWrapper;\n selector?: string;\n}\n\nexport default class Agent {\n private _queue: Queue;\n private _el: HTMLElement;\n private _animator: Animator;\n private _balloon: Balloon;\n private _hidden: boolean = false;\n private _idleDfd?: Deferred;\n private _offset: { top: number; left: number; } = { top: 0, left: 0 };\n private _dragUpdateLoop?: number;\n private _targetX?: number;\n private _targetY?: number;\n private _moveHandle?: ((e: MouseEvent) => void); \n private _upHandle?: ((e: MouseEvent) => void); \n\n constructor (options: AgentOptions) {\n const {\n agent,\n selector\n } = options;\n\n this._queue = new Queue(this._onQueueEmpty.bind(this));\n\n const el = document.createElement('div');\n el.className = 'clippy';\n el.setAttribute('hidden', 'true');\n this._el = el;\n\n let selectorEl = selector ? document.getElementsByClassName(selector)[0] : undefined;\n (selectorEl || document.body).appendChild(this._el);\n \n\n this._animator = new Animator(this._el, agent, []);\n this._balloon = new Balloon(this._el);\n this._setupEvents();\n }\n\n /***\n *\n * @param {Number} x\n * @param {Number} y\n */\n gestureAt (x: number, y: number) {\n let d = this._getDirection(x, y);\n let gAnim = 'Gesture' + d;\n let lookAnim = 'Look' + d;\n\n let animation = this.hasAnimation(gAnim) ? gAnim : lookAnim;\n return this.play(animation);\n }\n\n /***\n *\n * @param {Boolean=} fast\n *\n */\n hide (fast: boolean, callback: () => void) {\n this._hidden = true;\n let el = this._el;\n this.stop();\n if (fast) {\n this._el.setAttribute('hidden', 'true');\n this.stop();\n this.pause();\n if (callback) callback();\n return;\n }\n\n return this._playInternal('Hide', () => {\n this._el.setAttribute('hidden', 'true');\n this.pause();\n if (callback) callback();\n })\n }\n\n\n moveTo (x: number, y: number, duration: number) {\n let dir = this._getDirection(x, y);\n let anim = 'Move' + dir;\n if (duration === undefined) duration = 1000;\n\n this._addToQueue( (complete: Function) => {\n // the simple case\n if (duration === 0) {\n this._el.style.top = y + 'px';\n this._el.style.left = x + 'px';\n this.reposition();\n complete();\n return;\n }\n\n // no animations\n if (!this.hasAnimation(anim)) {\n const endHandler = () => {\n this._el.removeEventListener('animationend', endHandler);\n complete();\n }\n this._el.addEventListener('animationend', endHandler);\n this._el.animate({ top: y, left: x }, {\n duration,\n iterations: 1,\n });\n return;\n }\n\n let callback = (name: string, state: number) => {\n // when exited, complete\n if (state === Animator.States.EXITED) {\n complete();\n }\n // if waiting,\n if (state === Animator.States.WAITING) {\n\n const endHandler = () => {\n this._el.removeEventListener('animationend', endHandler);\n this._animator.exitAnimation();;\n }\n this._el.addEventListener('animationend', endHandler);\n this._el.animate({ top: y + \"px\", left: x + \"px\"}, {\n duration,\n iterations: 1,\n });\n }\n\n };\n\n this._playInternal(anim, callback);\n }, this);\n }\n\n private _playInternal (animation: any, callback: Function) {\n\n // if we're inside an idle animation,\n if (this._isIdleAnimation() && this._idleDfd) {\n this._idleDfd.promise.finally(() => {\n this._playInternal(animation, callback);\n })\n }\n\n this._animator.showAnimation(animation, callback);\n }\n\n play (animation: any, timeout?: number, cb?: Function) {\n if (!this.hasAnimation(animation)) return false;\n\n if (timeout === undefined) timeout = 5000;\n\n\n this._addToQueue( (complete: Function) => {\n let completed = false;\n // handle callback\n let callback = function (name: string, state: number) {\n if (state === Animator.States.EXITED) {\n completed = true;\n if (cb) cb();\n complete();\n }\n };\n\n // if has timeout, register a timeout function\n if (timeout) {\n window.setTimeout(() => {\n if (completed) return;\n // exit after timeout\n this._animator.exitAnimation();\n }, timeout)\n }\n\n this._playInternal(animation, callback);\n }, this);\n\n return true;\n }\n\n /***\n *\n * @param {Boolean=} fast\n */\n show (fast: boolean = true) {\n\n this._hidden = false;\n if (fast) {\n this._el.removeAttribute('hidden');\n this.resume();\n this._onQueueEmpty();\n return;\n }\n\n const cssTop = this._el.style.top;\n const cssLeft = this._el.style.left;\n if (cssTop === 'auto' || !(cssLeft === 'auto')){\n let wW = document.querySelector('html')!.clientWidth; \n let wH = document.querySelector('html')!.clientHeight;\n let {scrollLeft: sT} = getWindowScroll();\n let left = wW * 0.8;\n let top = (wH + sT) * 0.8;\n this._el.style.top = top + 'px';\n this._el.style.left = left + 'px';\n }\n\n this.resume();\n return this.play('Show');\n }\n\n /***\n *\n * @param {String} text\n */\n speak (text: string, hold: boolean = false) {\n this._addToQueue( (complete: Function) => {\n this._balloon.speak(complete, text, hold);\n }, this);\n }\n\n\n /***\n * Close the current balloon\n */\n closeBalloon () {\n this._balloon.hide();\n }\n\n delay (time: number) {\n time = time || 250;\n\n this._addToQueue( (complete: Function) => {\n this._onQueueEmpty();\n window.setTimeout(complete, time);\n });\n }\n\n /***\n * Skips the current animation\n */\n stopCurrent () {\n this._animator.exitAnimation();\n this._balloon.close();\n }\n\n\n stop () {\n // clear the queue\n this._queue.clear();\n this._animator.exitAnimation();\n this._balloon.hide();\n }\n\n /***\n *\n * @param {String} name\n * @returns {Boolean}\n */\n hasAnimation (name: string) {\n return this._animator.hasAnimation(name);\n }\n\n /***\n * Gets a list of animation names\n *\n * @return {Array.<string>}\n */\n animations () {\n return this._animator.animations();\n }\n\n /***\n * Play a random animation\n * @return {Deferred}\n */\n animate (): any {\n let animations = this.animations();\n let anim = animations[Math.floor(Math.random() * animations.length)];\n // skip idle animations\n if (anim.indexOf('Idle') === 0) {\n return this.animate();\n }\n return this.play(anim);\n }\n\n /**************************** Utils ************************************/\n\n /***\n *\n * @param {Number} x\n * @param {Number} y\n * @return {String}\n * @private\n */\n private _getDirection (x: number, y: number) {\n let offset = getOffset(this._el);\n let h = getHeight(this._el, 'height')!;\n let w = getWidth(this._el, 'width')!;\n\n let centerX = (offset.left + w / 2);\n let centerY = (offset.top + h / 2);\n\n\n let a = centerY - y;\n let b = centerX - x;\n\n let r = Math.round((180 * Math.atan2(a, b)) / Math.PI);\n\n // Left and Right are for the character, not the screen :-/\n if (-45 <= r && r < 45) return 'Right';\n if (45 <= r && r < 135) return 'Up';\n if (135 <= r && r <= 180 || -180 <= r && r < -135) return 'Left';\n if (-135 <= r && r < -45) return 'Down';\n\n // sanity check\n return 'Top';\n }\n\n /**************************** Queue and Idle handling ************************************/\n\n /***\n * Handle empty queue.\n * We need to transition the animation to an idle state\n * @private\n */\n private _onQueueEmpty () {\n if (this._hidden || this._isIdleAnimation()) return;\n let idleAnim = this._getIdleAnimation();\n this._idleDfd = new Deferred();\n\n this._animator.showAnimation(idleAnim, this._onIdleComplete.bind(this));\n }\n\n private _onIdleComplete (name: string, state: number) {\n if (state === Animator.States.EXITED) {\n this._idleDfd?.resolve(undefined);\n }\n }\n\n /***\n * Is the current animation is Idle?\n * @return {Boolean}\n * @private\n */\n private _isIdleAnimation () {\n let c = this._animator.currentAnimationName;\n return c && c.indexOf('Idle') === 0;\n }\n\n\n /**\n * Gets a random Idle animation\n * @return {String}\n * @private\n */\n private _getIdleAnimation () {\n let animations = this.animations();\n let r = [];\n for (let i = 0; i < animations.length; i++) {\n let a = animations[i];\n if (a.indexOf('Idle') === 0) {\n r.push(a);\n }\n }\n\n // pick one\n let idx = Math.floor(Math.random() * r.length);\n return r[idx];\n }\n\n /**************************** Events ************************************/\n\n private _setupEvents () {\n window.addEventListener('resize', this.reposition.bind(this));\n this._el.addEventListener('mousedown', this._onMouseDown.bind(this));\n this._el.addEventListener('dblclick', this._onDoubleClick.bind(this));\n }\n\n private _onDoubleClick () {\n if (!this.play('ClickedOn')) {\n this.animate();\n }\n }\n\n reposition () {\n if (!(this._el.getAttribute('hidden') === 'true')) return;\n let o = getOffset(this._el);\n let bH = getHeight(this._el, 'outer')!;\n let bW = getWidth(this._el, 'outer')!; \n\n let wW = document.querySelector('html')!.clientWidth; \n let wH = document.querySelector('html')!.clientHeight;\n let {scrollLeft: sT, scrollTop: sL} = getWindowScroll();\n\n let top = o.top - sT;\n let left = o.left - sL;\n let m = 5;\n if (top - m < 0) {\n top = m;\n } else if ((top + bH + m) > wH) {\n top = wH - bH - m;\n }\n\n if (left - m < 0) {\n left = m;\n } else if (left + bW + m > wW) {\n left = wW - bW - m;\n }\n\n this._el.style.left = left + 'px';\n this._el.style.top = top + 'px';\n // reposition balloon\n this._balloon.reposition();\n }\n\n private _onMouseDown (e: MouseEvent) {\n e.preventDefault();\n this._startDrag(e);\n }\n\n\n /**************************** Drag ************************************/\n\n private _startDrag (e: MouseEvent) {\n // pause animations\n this.pause();\n this._balloon.hide(true);\n this._offset = this._calculateClickOffset(e);\n\n this._moveHandle = this._dragMove.bind(this);\n this._upHandle = this._finishDrag.bind(this);\n\n window.addEventListener(\"mousemove\", this._moveHandle);\n window.addEventListener(\"mouseup\", this._upHandle);\n\n this._dragUpdateLoop = window.setTimeout(this._updateLocation.bind(this), 10);\n }\n\n private _calculateClickOffset (e: MouseEvent) {\n let mouseX = e.pageX;\n let mouseY = e.pageY;\n let o = getOffset(this._el);\n return {\n top: mouseY - o.top,\n left: mouseX - o.left\n }\n\n }\n\n private _updateLocation () {\n this._el.style.top = (this._targetY || 0) + 'px';\n this._el.style.left = (this._targetX || 0) + 'px';\n this._dragUpdateLoop = window.setTimeout(this._updateLocation.bind(this), 10);\n }\n\n private _dragMove (e: MouseEvent) {\n e.preventDefault();\n let x = e.clientX - this._offset.left;\n let y = e.clientY - this._offset.top;\n this._targetX = x;\n this._targetY = y;\n }\n\n private _finishDrag () {\n window.clearTimeout(this._dragUpdateLoop);\n // remove handles\n if (this._moveHandle) {\n window.removeEventListener(\"mousemove\", this._moveHandle);\n }\n if (this._upHandle) {\n window.removeEventListener(\"mouseup\", this._upHandle);\n }\n // resume animations\n this._balloon.show();\n this.reposition();\n this.resume();\n\n }\n\n private _addToQueue (func: Function, scope?: any) {\n if (scope) func = func.bind(scope);\n this._queue.queue(func);\n }\n\n /**************************** Pause and Resume ************************************/\n\n pause () {\n this._animator.pause();\n this._balloon.pause();\n\n }\n\n resume () {\n this._animator.resume();\n this._balloon.resume();\n }\n\n}","import { AgentType } from '../types';\n\nfunction loadAgent (name: AgentType) {\n return new Promise<any>((resolve, reject) => {\n import(`./agents/${name}.js`).then(module => {\n resolve(module.default);\n }).catch(err => {\n reject(err);\n });\n });\n}\n\nexport const agents: Record<string, any> = {\n Bonzi: () => loadAgent('Bonzi'),\n Clippy: () => loadAgent('Clippy'),\n F1: () => loadAgent('F1'),\n Genie: () => loadAgent('Genie'),\n Genius: () => loadAgent('Genius'),\n Links: () => loadAgent('Links'),\n Merlin: () => loadAgent('Merlin'),\n Peedy: () => loadAgent('Peedy'),\n Rocky: () => loadAgent('Rocky'),\n Rover: () => loadAgent('Rover'),\n};","var e=[],t=[];function n(n,r){if(n&&\"undefined\"!=typeof document){var a,s=!0===r.prepend?\"prepend\":\"append\",d=!0===r.singleTag,i=\"string\"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName(\"head\")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c()}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n))}function c(){var e=document.createElement(\"style\");if(e.setAttribute(\"type\",\"text/css\"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a=\"prepend\"===s?\"afterbegin\":\"beforeend\";return i.insertAdjacentElement(a,e),e}}export{n as default};\n","import type Agent from './agent'\nimport type Animator from './animator'\nimport type Queue from './queue'\nimport type Balloon from './balloon'\nimport { load } from './load'\nimport { AgentType, AgentWrapper, Clippy } from './types'\nimport \"./clippy.css\";\n\nconst clippy: Clippy = {\n load,\n agents: {} as Record<AgentType, AgentWrapper>,\n}\n\nexport type { Agent, Animator, Queue, Balloon };\nexport default clippy;\n","import Agent from './agent'\nimport { agents } from './agents';\nimport { AgentWrapper, LoadOptions } from './types';\n\nexport const load = (options: LoadOptions) => {\n const {\n name,\n successCb,\n failCb,\n selector,\n } = options || {};\n\n // wrapper to the success callback\n agents[name]().then((agentConfig: AgentWrapper) => {\n const a = new Agent({\n agent: agentConfig,\n selector\n });\n if (successCb) successCb(a);\n }).catch((error: any) => {\n if (failCb) failCb(error);\n });\n\n}"],"names":["Queue","onEmptyCallback","this","_queue","_onEmptyCallback","queue","func","push","length","_active","_progressQueue","prototype","let","f","shift","completeFunction","next","bind","clear","Animator","el","config","sounds","_el","_data","_path","image","_currentFrameIndex","_currentFrame","undefined","_exiting","_currentAnimation","_endCallback","_started","_sounds","currentAnimationName","preloadSounds","_overlays","curr","_setupElement","i","overlayCount","const","divEl","document","createElement","inner","append","frameSize","framesize","style","display","width","height","background","animations","r","d","n","hasAnimation","name","exitAnimation","showAnimation","animationName","stateChangeCallback","_step","_draw","images","xy","bg","backgroundPosition","_getNextAnimationFrame","currentFrame","branching","exitBranch","rnd","Math","random","branches","branch","weight","frameIndex","_playSound","s","_a","sound","audio","play","_atLastFrame","frames","newFrameIndex","min","frameChanged","useExitBranching","_loop","window","setTimeout","duration","States","WAITING","EXITED","pause","clearTimeout","resume","getWindowScroll","supportPageOffset","pageXOffset","isCSS1Compat","compatMode","documentElement","scrollLeft","body","pageYOffset","scrollTop","getOffset","element","getClientRects","top","left","rect","getBoundingClientRect","win","ownerDocument","defaultView","getWidth","type","clientWidth","offsetWidth","getComputedStyle","parseInt","getPropertyValue","getHeight","clientHeight","offsetHeight","Deferred","promise","Promise","resolve","reject","Balloon","targetEl","_hiding","_hold","_addWord","_targetEl","_hidden","_setup","balloonEl","className","setAttribute","tipEl","contentEl","appendChild","_balloon","_content","insertAdjacentElement","reposition","sides","_position","_isOut","side","o","h","w","ref","sT","sL","bH","bW","classList","remove","add","wW","querySelector","wH","speak","complete","text","hold","show","c","innerHTML","_complete","_sayWords","removeAttribute","hide","fast","_finishHideBalloon","words","split","idx","slice","join","close","Agent","options","_offset","agent","selector","_onQueueEmpty","getElementsByClassName","_animator","_setupEvents","loadAgent","import","then","module","default","catch","err","gestureAt","x","y","_getDirection","gAnim","lookAnim","animation","callback","stop","_playInternal","moveTo","anim","_addToQueue","endHandler","removeEventListener","addEventListener","animate","iterations","state","_isIdleAnimation","_idleDfd","finally","timeout","cb","completed","cssTop","cssLeft","closeBalloon","delay","time","stopCurrent","floor","indexOf","offset","centerX","a","b","round","atan2","PI","idleAnim","_getIdleAnimation","_onIdleComplete","_onMouseDown","_onDoubleClick","getAttribute","e","preventDefault","_startDrag","_calculateClickOffset","_moveHandle","_dragMove","_upHandle","_finishDrag","_dragUpdateLoop","_updateLocation","mouseX","pageX","mouseY","pageY","_targetY","_targetX","clientX","clientY","scope","agents","Bonzi","Clippy","F1","Genie","Genius","Links","Merlin","Peedy","Rocky","Rover","t","prepend","singleTag","container","getElementsByTagName","u","charCodeAt","substring","styleSheet","cssText","createTextNode","attributes","Object","keys","clippy","successCb","failCb","agentConfig","error"],"mappings":"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"}