From 1870353616e5788568ba093502ac2bcbf19e9f7e Mon Sep 17 00:00:00 2001 From: Alex Hunt <45321761+alexmhunt@users.noreply.github.com> Date: Sun, 11 Oct 2020 15:24:55 -0400 Subject: [PATCH 1/8] Update README.md --- README.md | 52 +++------------------------------------------------- 1 file changed, 3 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index b61d3e2b..5dc001ee 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,10 @@ Assignment 4 - Creative Coding: Interactive Multimedia Experiences === -Due: October 11th, by 11:59 PM. +## Alex's Audiovisualizer +Alex Hunt - https://a4-alex-hunt.glitch.me/ -For this assignment we will focus on client-side development using popular audio/graphics/visualization technologies; the server requirements are minimal. The goal of this assignment is to refine our JavaScript knowledge while exploring the multimedia capabilities of the browser. - -Baseline Requirements ---- - -Your application is required to implement the following functionalities: - -- A server created using Express. This server can be as simple as needed. -- A client-side interactive experience using at least one of the following web technologies frameworks. - - [Three.js](https://threejs.org/): A library for 3D graphics / VR experiences - - [D3.js](https://d3js.org): A library that is primarily used for interactive data visualizations - - [Canvas](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API): A 2D raster drawing API included in all modern browsers - - [SVG](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API): A 2D vector drawing framework that enables shapes to be defined via XML. - - [Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API): An API for audio synthesis, analysis, processing, and file playback. -- A user interface for interaction with your project, which must expose at least six parameters for user control. [dat.gui](https://workshop.chromeexperiments.com/examples/gui/#1--Basic-Usage) is highly recommended for this. You might also explore interaction by tracking mouse movement via the `window.onmousemove` event handler in tandem with the `event.clientX` and `event.clientY` properties. Consider using the [Pointer Events API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events) to ensure that that mouse and touch events will both be supported in your app. -- Your application should display basic documentation for the user interface when the application first loads. This documentation should be dismissable, however, users should be able to redisplay it via either a help buton (this could, for example, be inside a dat.gui interface) or via a keyboard shortcut (commonly the question mark). -- Your HTML and CSS should validate. There are options/plugins for most IDEs to check validation. - -The interactive experience should possess a reasonable level of complexity. Some examples: -### Three.js -- A generative algorithm creates simple agents that move through a virtual world. Your interface controls the behavior / appearance of these agents. -- A simple 3D game -- An 3D audio visualization of a song of your choosing. User interaction should control aspects of the visualization. -### Canvas -- Implement a generative algorithm such as [Conway's Game of Life](https://bitstorm.org/gameoflife/) (or 1D cellular automata) and provide interactive controls. Note that the Game of Life has been created by 100s of people using ; we'll be checking to ensure that your implementation is not a copy of these. -- Design a 2D audio visualizer of a song of your choosing. User interaction should control visual aspects of the experience. -### Web Audio API -- Create a screen-based musical instrument using the Web Audio API. You can use projects such as [Interface.js](http://charlie-roberts.com/interface/) or [Nexus UI](https://nexus-js.github.io/ui/api/#Piano) to provide common musical interface elements, or use dat.GUI in combination with mouse/touch events (use the Pointer Events API). Your GUI should enable users to control aspects of sound synthesis. -### D3.js -- Create visualizations using the datasets found at [Awesome JSON Datasets](https://github.com/jdorfman/Awesome-JSON-Datasets). Experiment with providing different visualizations of the same data set, and providing users interactive control over visualization parameters and/or data filtering. Alternatively, create a single visualization with using one of the more complicated techniques shown at [d3js.org](d3js.org) and provide meaningful points of interaction for users. - -Deliverables ---- - -Do the following to complete this assignment: - -1. Implement your project with the above requirements. -3. Test your project to make sure that when someone goes to your main page on Glitch/Heroku/etc., it displays correctly. -4. Ensure that your project has the proper naming scheme `a4-firstname-lastname` so we can find it. -5. Fork this repository and modify the README to the specifications below. *NOTE: If you don't use Glitch for hosting (where we can see the files) then you must include all project files that you author in your repo for this assignment*. -6. Create and submit a Pull Request to the original repo. Name the pull request using the following template: `a4-firstname-lastname`. - -Sample Readme (delete the above when you're ready to submit, and modify the below so with your links and descriptions) ---- - -## Your Web Application Title - -your hosting link e.g. http://a4-charlieroberts.glitch.me +For this project, I created an audiovisualizer using Canvas and Web Audio API. Include a very brief summary of your project here. Images are encouraged when needed, along with concise, high-level text. Be sure to include: From 19fff02e2733810b21446e7c34379ec8313e9052 Mon Sep 17 00:00:00 2001 From: Alex Hunt <45321761+alexmhunt@users.noreply.github.com> Date: Sun, 11 Oct 2020 15:25:21 -0400 Subject: [PATCH 2/8] Add files via upload --- sample.png | Bin 0 -> 77080 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sample.png diff --git a/sample.png b/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..dd19a25fd1fe9593775005d063693fa442fb702e GIT binary patch literal 77080 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 Date: Sun, 11 Oct 2020 15:26:44 -0400 Subject: [PATCH 3/8] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5dc001ee..bb1c0542 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Assignment 4 - Creative Coding: Interactive Multimedia Experiences Alex Hunt - https://a4-alex-hunt.glitch.me/ For this project, I created an audiovisualizer using Canvas and Web Audio API. +![Sample](https://github.com/alexmhunt/a4-creative-coding/blob/master/sample.png?raw=true) Include a very brief summary of your project here. Images are encouraged when needed, along with concise, high-level text. Be sure to include: From 120f0340bf6145e86377d3bb9c7766714533ec59 Mon Sep 17 00:00:00 2001 From: Alex Hunt <45321761+alexmhunt@users.noreply.github.com> Date: Sun, 11 Oct 2020 15:31:50 -0400 Subject: [PATCH 4/8] Update README.md --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bb1c0542..d92aecd2 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,12 @@ Assignment 4 - Creative Coding: Interactive Multimedia Experiences ## Alex's Audiovisualizer Alex Hunt - https://a4-alex-hunt.glitch.me/ -For this project, I created an audiovisualizer using Canvas and Web Audio API. +For this project, I created a 2D audiovisualizer using Canvas and Web Audio API. As the song plays, it uses Web Audio API's realtime waveform analysis tools to make colorful balls bounce based on the amplitude (volume) at certain frequencies. ![Sample](https://github.com/alexmhunt/a4-creative-coding/blob/master/sample.png?raw=true) -Include a very brief summary of your project here. Images are encouraged when needed, along with concise, high-level text. Be sure to include: - -- the goal of the application -- challenges you faced in realizing the application -- the instructions you present in the website should be clear enough to use the application, but if you feel any need to provide additional instructions please do so here. +The goal of this application is to create an appealing visual based on a song in realtime. Some challenges I faced during development were: +- Interpreting output from audio waveform analysis +- Translating analysis output into a visual representation +- Implementing Javascript modules +- Implementing UI and linking it to Javscript to allow the user to customize the visuals +- Loading and playing an audio file from a CDN From 0f2e8b702d9a4ea29b362630c2d9a5731d05a26a Mon Sep 17 00:00:00 2001 From: "Glitch (a4-alex-hunt)" Date: Sun, 11 Oct 2020 23:56:15 +0000 Subject: [PATCH 5/8] =?UTF-8?q?=F0=9F=91=8B=F0=9F=8C=85=20Updated=20with?= =?UTF-8?q?=20Glitch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .glitch-assets | 10 + README.md | 39 +- package-lock.json | 74 ++ package.json | 29 + public/dat.gui.js | 2524 +++++++++++++++++++++++++++++++++++++++++++++ public/script.js | 142 +++ sample.png | Bin 77080 -> 0 bytes server.js | 27 + shrinkwrap.yaml | 413 ++++++++ views/index.html | 82 ++ 10 files changed, 3328 insertions(+), 12 deletions(-) create mode 100644 .glitch-assets create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/dat.gui.js create mode 100644 public/script.js delete mode 100644 sample.png create mode 100644 server.js create mode 100644 shrinkwrap.yaml create mode 100644 views/index.html diff --git a/.glitch-assets b/.glitch-assets new file mode 100644 index 00000000..d13d618b --- /dev/null +++ b/.glitch-assets @@ -0,0 +1,10 @@ +{"name":"drag-in-files.svg","date":"2016-10-22T16:17:49.954Z","url":"https://cdn.hyperdev.com/drag-in-files.svg","type":"image/svg","size":7646,"imageWidth":276,"imageHeight":276,"thumbnail":"https://cdn.hyperdev.com/drag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(102, 153, 205)","uuid":"adSBq97hhhpFNUna"} +{"name":"click-me.svg","date":"2016-10-23T16:17:49.954Z","url":"https://cdn.hyperdev.com/click-me.svg","type":"image/svg","size":7116,"imageWidth":276,"imageHeight":276,"thumbnail":"https://cdn.hyperdev.com/click-me.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(243, 185, 186)","uuid":"adSBq97hhhpFNUnb"} +{"name":"paste-me.svg","date":"2016-10-24T16:17:49.954Z","url":"https://cdn.hyperdev.com/paste-me.svg","type":"image/svg","size":7242,"imageWidth":276,"imageHeight":276,"thumbnail":"https://cdn.hyperdev.com/paste-me.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(42, 179, 185)","uuid":"adSBq97hhhpFNUnc"} +{"uuid":"adSBq97hhhpFNUna","deleted":true} +{"uuid":"adSBq97hhhpFNUnb","deleted":true} +{"uuid":"adSBq97hhhpFNUnc","deleted":true} +{"name":"Undertale OST 031 - Waterfall.mp3","date":"2020-10-09T17:59:22.595Z","url":"https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2FUndertale%20OST%20031%20-%20Waterfall.mp3","type":"audio/mpeg","size":3050194,"thumbnail":"https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2Fthumbnails%2FUndertale%20OST%20031%20-%20Waterfall.mp3","thumbnailWidth":210,"thumbnailHeight":210,"uuid":"6bbL3Xe3Z96nG8hq"} +{"uuid":"6bbL3Xe3Z96nG8hq","deleted":true} +{"name":"Undertale OST 031 - Waterfall.mp3","date":"2020-10-09T18:17:19.147Z","url":"https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2FUndertale%20OST%20031%20-%20Waterfall.mp3","type":"audio/mpeg","size":3050194,"thumbnail":"https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2Fthumbnails%2FUndertale%20OST%20031%20-%20Waterfall.mp3","thumbnailWidth":210,"thumbnailHeight":210,"uuid":"JUYYefytUhF7UfJ7"} +{"name":"Mick Gordon - 11. BFG Division (128 kbps).mp3","date":"2020-10-11T15:47:16.626Z","url":"https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2FMick%20Gordon%20-%2011.%20BFG%20Division%20(128%20kbps).mp3","type":"audio/mpeg","size":8104365,"thumbnail":"https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2Fthumbnails%2FMick%20Gordon%20-%2011.%20BFG%20Division%20(128%20kbps).mp3","thumbnailWidth":210,"thumbnailHeight":210,"uuid":"M3MIKqMkstTbq4PP"} diff --git a/README.md b/README.md index d92aecd2..887720bd 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,30 @@ -Assignment 4 - Creative Coding: Interactive Multimedia Experiences -=== +# hello-express -## Alex's Audiovisualizer -Alex Hunt - https://a4-alex-hunt.glitch.me/ +A server that serves a webpage, its resources, and some data -For this project, I created a 2D audiovisualizer using Canvas and Web Audio API. As the song plays, it uses Web Audio API's realtime waveform analysis tools to make colorful balls bounce based on the amplitude (volume) at certain frequencies. -![Sample](https://github.com/alexmhunt/a4-creative-coding/blob/master/sample.png?raw=true) -The goal of this application is to create an appealing visual based on a song in realtime. Some challenges I faced during development were: -- Interpreting output from audio waveform analysis -- Translating analysis output into a visual representation -- Implementing Javascript modules -- Implementing UI and linking it to Javscript to allow the user to customize the visuals -- Loading and playing an audio file from a CDN +## Your Project + +On the front-end, + +- Edit `views/index.html` to change the content of the webpage +- `public/client.js` is the javacript that runs when you load the webpage +- `public/style.css` is the styles for `views/index.html` +- Drag in `assets`, like images or music, to add them to your project + +On the back-end, + +- your app starts at `server.js` +- add frameworks and packages in `package.json` +- safely store app secrets in `.env` (nobody can see this but you and people you invite) + +Click `Show` in the header to see your app live. Updates to your code will instantly deploy. + + +## Made by [Glitch](https://glitch.com/) + +**Glitch** is the friendly community where you'll build the app of your dreams. Glitch lets you instantly create, remix, edit, and host an app, bot or site, and you can invite collaborators or helpers to simultaneously edit code with you. + +Find out more [about Glitch](https://glitch.com/about). + +( áµ” á´¥ áµ” ) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..93a00d77 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,74 @@ +{ + "name": "hello-express", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "bulma": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.1.tgz", + "integrity": "sha512-LSF69OumXg2HSKl2+rN0/OEXJy7WFEb681wtBlNS/ulJYR27J3rORHibdXZ6GVb/vyUzzYK/Arjyh56wjbFedA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } + }, + "dat.gui": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.7.tgz", + "integrity": "sha512-sRl/28gF/XRC5ywC9I4zriATTsQcpSsRG7seXCPnTkK8/EQMIbCu5NPMpICLGxX9ZEUvcXR3ArLYCtgreFoMDw==" + }, + "express": { + "version": "4.17.1", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..c48263c0 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "//1": "describes your app and its dependencies", + "//2": "https://docs.npmjs.com/files/package.json", + "//3": "updating this file will download and update your packages", + "name": "hello-express", + "version": "0.0.1", + "description": "A simple Node app built on Express, instantly up and running.", + "main": "server.js", + + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "cors": "^2.8.5", + "express": "^4.17.1" + }, + "engines": { + "node": "12.x" + }, + "repository": { + "url": "https://glitch.com/edit/#!/hello-express" + }, + "license": "MIT", + "keywords": [ + "node", + "glitch", + "express" + ] +} diff --git a/public/dat.gui.js b/public/dat.gui.js new file mode 100644 index 00000000..45947c4a --- /dev/null +++ b/public/dat.gui.js @@ -0,0 +1,2524 @@ +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +function ___$insertStyle(css) { + if (!css) { + return; + } + if (typeof window === 'undefined') { + return; + } + + var style = document.createElement('style'); + + style.setAttribute('type', 'text/css'); + style.innerHTML = css; + document.head.appendChild(style); + + return css; +} + +function colorToString (color, forceCSSHex) { + var colorFormat = color.__state.conversionName.toString(); + var r = Math.round(color.r); + var g = Math.round(color.g); + var b = Math.round(color.b); + var a = color.a; + var h = Math.round(color.h); + var s = color.s.toFixed(1); + var v = color.v.toFixed(1); + if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { + var str = color.hex.toString(16); + while (str.length < 6) { + str = '0' + str; + } + return '#' + str; + } else if (colorFormat === 'CSS_RGB') { + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } else if (colorFormat === 'CSS_RGBA') { + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + } else if (colorFormat === 'HEX') { + return '0x' + color.hex.toString(16); + } else if (colorFormat === 'RGB_ARRAY') { + return '[' + r + ',' + g + ',' + b + ']'; + } else if (colorFormat === 'RGBA_ARRAY') { + return '[' + r + ',' + g + ',' + b + ',' + a + ']'; + } else if (colorFormat === 'RGB_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + '}'; + } else if (colorFormat === 'RGBA_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; + } else if (colorFormat === 'HSV_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + '}'; + } else if (colorFormat === 'HSVA_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; + } + return 'unknown format'; +} + +var ARR_EACH = Array.prototype.forEach; +var ARR_SLICE = Array.prototype.slice; +var Common = { + BREAK: {}, + extend: function extend(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (!this.isUndefined(obj[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + defaults: function defaults(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (this.isUndefined(target[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + compose: function compose() { + var toCall = ARR_SLICE.call(arguments); + return function () { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length - 1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + each: function each(obj, itr, scope) { + if (!obj) { + return; + } + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { + var key = void 0; + var l = void 0; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (var _key in obj) { + if (itr.call(scope, obj[_key], _key) === this.BREAK) { + return; + } + } + } + }, + defer: function defer(fnc) { + setTimeout(fnc, 0); + }, + debounce: function debounce(func, threshold, callImmediately) { + var timeout = void 0; + return function () { + var obj = this; + var args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + var callNow = callImmediately || !timeout; + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + if (callNow) { + func.apply(obj, args); + } + }; + }, + toArray: function toArray(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + isUndefined: function isUndefined(obj) { + return obj === undefined; + }, + isNull: function isNull(obj) { + return obj === null; + }, + isNaN: function (_isNaN) { + function isNaN(_x) { + return _isNaN.apply(this, arguments); + } + isNaN.toString = function () { + return _isNaN.toString(); + }; + return isNaN; + }(function (obj) { + return isNaN(obj); + }), + isArray: Array.isArray || function (obj) { + return obj.constructor === Array; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + isNumber: function isNumber(obj) { + return obj === obj + 0; + }, + isString: function isString(obj) { + return obj === obj + ''; + }, + isBoolean: function isBoolean(obj) { + return obj === false || obj === true; + }, + isFunction: function isFunction(obj) { + return obj instanceof Function; + } +}; + +var INTERPRETATIONS = [ +{ + litmus: Common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) + }; + }, + write: colorToString + }, + SIX_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + write: colorToString + }, + CSS_RGB: { + read: function read(original) { + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + write: colorToString + }, + CSS_RGBA: { + read: function read(original) { + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + write: colorToString + } + } +}, +{ + litmus: Common.isNumber, + conversions: { + HEX: { + read: function read(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + write: function write(color) { + return color.hex; + } + } + } +}, +{ + litmus: Common.isArray, + conversions: { + RGB_ARRAY: { + read: function read(original) { + if (original.length !== 3) { + return false; + } + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b]; + } + }, + RGBA_ARRAY: { + read: function read(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } +}, +{ + litmus: Common.isObject, + conversions: { + RGBA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + RGB_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + HSVA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + HSV_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } +}]; +var result = void 0; +var toReturn = void 0; +var interpret = function interpret() { + toReturn = false; + var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; + Common.each(INTERPRETATIONS, function (family) { + if (family.litmus(original)) { + Common.each(family.conversions, function (conversion, conversionName) { + result = conversion.read(original); + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return Common.BREAK; + } + }); + return Common.BREAK; + } + }); + return toReturn; +}; + +var tmpComponent = void 0; +var ColorMath = { + hsv_to_rgb: function hsv_to_rgb(h, s, v) { + var hi = Math.floor(h / 60) % 6; + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - f * s); + var t = v * (1.0 - (1.0 - f) * s); + var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + rgb_to_hsv: function rgb_to_hsv(r, g, b) { + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h = void 0; + var s = void 0; + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + rgb_to_hex: function rgb_to_hex(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + component_from_hex: function component_from_hex(hex, componentIndex) { + return hex >> componentIndex * 8 & 0xFF; + }, + hex_with_component: function hex_with_component(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + + + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Color = function () { + function Color() { + classCallCheck(this, Color); + this.__state = interpret.apply(this, arguments); + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + this.__state.a = this.__state.a || 1; + } + createClass(Color, [{ + key: 'toString', + value: function toString() { + return colorToString(this); + } + }, { + key: 'toHexString', + value: function toHexString() { + return colorToString(this, true); + } + }, { + key: 'toOriginal', + value: function toOriginal() { + return this.__state.conversion.write(this); + } + }]); + return Color; +}(); +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + Color.recalculateRGB(this, component, componentHexIndex); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + this.__state[component] = v; + } + }); +} +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + Color.recalculateHSV(this); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + this.__state[component] = v; + } + }); +} +Color.recalculateRGB = function (color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; +Color.recalculateHSV = function (color) { + var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); + Common.extend(color.__state, { + s: result.s, + v: result.v + }); + if (!Common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (Common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); +Object.defineProperty(Color.prototype, 'a', { + get: function get$$1() { + return this.__state.a; + }, + set: function set$$1(v) { + this.__state.a = v; + } +}); +Object.defineProperty(Color.prototype, 'hex', { + get: function get$$1() { + if (this.__state.space !== 'HEX') { + this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); + this.__state.space = 'HEX'; + } + return this.__state.hex; + }, + set: function set$$1(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +var Controller = function () { + function Controller(object, property) { + classCallCheck(this, Controller); + this.initialValue = object[property]; + this.domElement = document.createElement('div'); + this.object = object; + this.property = property; + this.__onChange = undefined; + this.__onFinishChange = undefined; + } + createClass(Controller, [{ + key: 'onChange', + value: function onChange(fnc) { + this.__onChange = fnc; + return this; + } + }, { + key: 'onFinishChange', + value: function onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + }, { + key: 'setValue', + value: function setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + } + }, { + key: 'getValue', + value: function getValue() { + return this.object[this.property]; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + return this; + } + }, { + key: 'isModified', + value: function isModified() { + return this.initialValue !== this.getValue(); + } + }]); + return Controller; +}(); + +var EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; +var EVENT_MAP_INV = {}; +Common.each(EVENT_MAP, function (v, k) { + Common.each(v, function (e) { + EVENT_MAP_INV[e] = k; + }); +}); +var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; +function cssValueToPixels(val) { + if (val === '0' || Common.isUndefined(val)) { + return 0; + } + var match = val.match(CSS_VALUE_PIXELS); + if (!Common.isNull(match)) { + return parseFloat(match[1]); + } + return 0; +} +var dom = { + makeSelectable: function makeSelectable(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + elem.onselectstart = selectable ? function () { + return false; + } : function () {}; + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + makeFullscreen: function makeFullscreen(elem, hor, vert) { + var vertical = vert; + var horizontal = hor; + if (Common.isUndefined(horizontal)) { + horizontal = true; + } + if (Common.isUndefined(vertical)) { + vertical = true; + } + elem.style.position = 'absolute'; + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + fakeEvent: function fakeEvent(elem, eventType, pars, aux) { + var params = pars || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, + 0, + clientX, + clientY, + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + var init = evt.initKeyboardEvent || evt.initKeyEvent; + Common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + Common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + bind: function bind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + unbind: function unbind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + addClass: function addClass(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + removeClass: function removeClass(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + hasClass: function hasClass(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + getWidth: function getWidth(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); + }, + getHeight: function getHeight(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); + }, + getOffset: function getOffset(el) { + var elem = el; + var offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + isActive: function isActive(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } +}; + +var BooleanController = function (_Controller) { + inherits(BooleanController, _Controller); + function BooleanController(object, property) { + classCallCheck(this, BooleanController); + var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); + var _this = _this2; + _this2.__prev = _this2.getValue(); + _this2.__checkbox = document.createElement('input'); + _this2.__checkbox.setAttribute('type', 'checkbox'); + function onChange() { + _this.setValue(!_this.__prev); + } + dom.bind(_this2.__checkbox, 'change', onChange, false); + _this2.domElement.appendChild(_this2.__checkbox); + _this2.updateDisplay(); + return _this2; + } + createClass(BooleanController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); + } + }]); + return BooleanController; +}(Controller); + +var OptionController = function (_Controller) { + inherits(OptionController, _Controller); + function OptionController(object, property, opts) { + classCallCheck(this, OptionController); + var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); + var options = opts; + var _this = _this2; + _this2.__select = document.createElement('select'); + if (Common.isArray(options)) { + var map = {}; + Common.each(options, function (element) { + map[element] = element; + }); + options = map; + } + Common.each(options, function (value, key) { + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + _this2.updateDisplay(); + dom.bind(_this2.__select, 'change', function () { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + _this2.domElement.appendChild(_this2.__select); + return _this2; + } + createClass(OptionController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (dom.isActive(this.__select)) return this; + this.__select.value = this.getValue(); + return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); + } + }]); + return OptionController; +}(Controller); + +var StringController = function (_Controller) { + inherits(StringController, _Controller); + function StringController(object, property) { + classCallCheck(this, StringController); + var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); + var _this = _this2; + function onChange() { + _this.setValue(_this.__input.value); + } + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'keyup', onChange); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(StringController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); + } + }]); + return StringController; +}(Controller); + +function numDecimals(x) { + var _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + return 0; +} +var NumberController = function (_Controller) { + inherits(NumberController, _Controller); + function NumberController(object, property, params) { + classCallCheck(this, NumberController); + var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); + var _params = params || {}; + _this.__min = _params.min; + _this.__max = _params.max; + _this.__step = _params.step; + if (Common.isUndefined(_this.__step)) { + if (_this.initialValue === 0) { + _this.__impliedStep = 1; + } else { + _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; + } + } else { + _this.__impliedStep = _this.__step; + } + _this.__precision = numDecimals(_this.__impliedStep); + return _this; + } + createClass(NumberController, [{ + key: 'setValue', + value: function setValue(v) { + var _v = v; + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); + } + }, { + key: 'min', + value: function min(minValue) { + this.__min = minValue; + return this; + } + }, { + key: 'max', + value: function max(maxValue) { + this.__max = maxValue; + return this; + } + }, { + key: 'step', + value: function step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } + }]); + return NumberController; +}(Controller); + +function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} +var NumberControllerBox = function (_NumberController) { + inherits(NumberControllerBox, _NumberController); + function NumberControllerBox(object, property, params) { + classCallCheck(this, NumberControllerBox); + var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); + _this2.__truncationSuspended = false; + var _this = _this2; + var prevY = void 0; + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!Common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onBlur() { + onFinish(); + } + function onMouseDrag(e) { + var diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + prevY = e.clientY; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'mousedown', onMouseDown); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(NumberControllerBox, [{ + key: 'updateDisplay', + value: function updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerBox; +}(NumberController); + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} +var NumberControllerSlider = function (_NumberController) { + inherits(NumberControllerSlider, _NumberController); + function NumberControllerSlider(object, property, min, max, step) { + classCallCheck(this, NumberControllerSlider); + var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); + var _this = _this2; + _this2.__background = document.createElement('div'); + _this2.__foreground = document.createElement('div'); + dom.bind(_this2.__background, 'mousedown', onMouseDown); + dom.bind(_this2.__background, 'touchstart', onTouchStart); + dom.addClass(_this2.__background, 'slider'); + dom.addClass(_this2.__foreground, 'slider-fg'); + function onMouseDown(e) { + document.activeElement.blur(); + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + onMouseDrag(e); + } + function onMouseDrag(e) { + e.preventDefault(); + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + return false; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onTouchStart(e) { + if (e.touches.length !== 1) { + return; + } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + function onTouchMove(e) { + var clientX = e.touches[0].clientX; + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + } + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.updateDisplay(); + _this2.__background.appendChild(_this2.__foreground); + _this2.domElement.appendChild(_this2.__background); + return _this2; + } + createClass(NumberControllerSlider, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerSlider; +}(NumberController); + +var FunctionController = function (_Controller) { + inherits(FunctionController, _Controller); + function FunctionController(object, property, text) { + classCallCheck(this, FunctionController); + var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); + var _this = _this2; + _this2.__button = document.createElement('div'); + _this2.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(_this2.__button, 'click', function (e) { + e.preventDefault(); + _this.fire(); + return false; + }); + dom.addClass(_this2.__button, 'button'); + _this2.domElement.appendChild(_this2.__button); + return _this2; + } + createClass(FunctionController, [{ + key: 'fire', + value: function fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } + }]); + return FunctionController; +}(Controller); + +var ColorController = function (_Controller) { + inherits(ColorController, _Controller); + function ColorController(object, property) { + classCallCheck(this, ColorController); + var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); + _this2.__color = new Color(_this2.getValue()); + _this2.__temp = new Color(0); + var _this = _this2; + _this2.domElement = document.createElement('div'); + dom.makeSelectable(_this2.domElement, false); + _this2.__selector = document.createElement('div'); + _this2.__selector.className = 'selector'; + _this2.__saturation_field = document.createElement('div'); + _this2.__saturation_field.className = 'saturation-field'; + _this2.__field_knob = document.createElement('div'); + _this2.__field_knob.className = 'field-knob'; + _this2.__field_knob_border = '2px solid '; + _this2.__hue_knob = document.createElement('div'); + _this2.__hue_knob.className = 'hue-knob'; + _this2.__hue_field = document.createElement('div'); + _this2.__hue_field.className = 'hue-field'; + _this2.__input = document.createElement('input'); + _this2.__input.type = 'text'; + _this2.__input_textShadow = '0 1px 1px '; + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + onBlur.call(this); + } + }); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__selector, 'mousedown', function () { + dom.addClass(this, 'drag').bind(window, 'mouseup', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + dom.bind(_this2.__selector, 'touchstart', function () { + dom.addClass(this, 'drag').bind(window, 'touchend', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + var valueField = document.createElement('div'); + Common.extend(_this2.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + Common.extend(_this2.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + Common.extend(_this2.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + Common.extend(_this2.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + Common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + Common.extend(_this2.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + hueGradient(_this2.__hue_field); + Common.extend(_this2.__input.style, { + outline: 'none', + textAlign: 'center', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); + dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); + dom.bind(_this2.__field_knob, 'mousedown', fieldDown); + dom.bind(_this2.__field_knob, 'touchstart', fieldDown); + dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); + dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + _this2.__saturation_field.appendChild(valueField); + _this2.__selector.appendChild(_this2.__field_knob); + _this2.__selector.appendChild(_this2.__saturation_field); + _this2.__selector.appendChild(_this2.__hue_field); + _this2.__hue_field.appendChild(_this2.__hue_knob); + _this2.domElement.appendChild(_this2.__input); + _this2.domElement.appendChild(_this2.__selector); + _this2.updateDisplay(); + function setSV(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__saturation_field.getBoundingClientRect(); + var _ref = e.touches && e.touches[0] || e, + clientX = _ref.clientX, + clientY = _ref.clientY; + var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + _this.__color.v = v; + _this.__color.s = s; + _this.setValue(_this.__color.toOriginal()); + return false; + } + function setH(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__hue_field.getBoundingClientRect(); + var _ref2 = e.touches && e.touches[0] || e, + clientY = _ref2.clientY; + var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + _this.__color.h = h * 360; + _this.setValue(_this.__color.toOriginal()); + return false; + } + return _this2; + } + createClass(ColorController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var i = interpret(this.getValue()); + if (i !== false) { + var mismatch = false; + Common.each(Color.COMPONENTS, function (component) { + if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; + } + }, this); + if (mismatch) { + Common.extend(this.__color.__state, i); + } + } + Common.extend(this.__temp.__state, this.__color.__state); + this.__temp.a = 1; + var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; + var _flip = 255 - flip; + Common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + this.__temp.s = 1; + this.__temp.v = 1; + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + this.__input.value = this.__color.toString(); + Common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } + }]); + return ColorController; +}(Controller); +var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + Common.each(vendors, function (vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +var css = { + load: function load(url, indoc) { + var doc = indoc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function inject(cssContent, indoc) { + var doc = indoc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + var head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { + } + } +}; + +var saveDialogContents = "

"; + +var ControllerFactory = function ControllerFactory(object, property) { + var initialValue = object[property]; + if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + if (Common.isNumber(initialValue)) { + if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { + if (Common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); + } + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + if (Common.isNumber(arguments[4])) { + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + if (Common.isString(initialValue)) { + return new StringController(object, property); + } + if (Common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + if (Common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + return null; +}; + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} +var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; + +var CenteredDiv = function () { + function CenteredDiv() { + classCallCheck(this, CenteredDiv); + this.backgroundElement = document.createElement('div'); + Common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + this.domElement = document.createElement('div'); + Common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + var _this = this; + dom.bind(this.backgroundElement, 'click', function () { + _this.hide(); + }); + } + createClass(CenteredDiv, [{ + key: 'show', + value: function show() { + var _this = this; + this.backgroundElement.style.display = 'block'; + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + this.layout(); + Common.defer(function () { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + }, { + key: 'hide', + value: function hide() { + var _this = this; + var hide = function hide() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + this.backgroundElement.style.opacity = 0; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + }, { + key: 'layout', + value: function layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } + }]); + return CenteredDiv; +}(); + +var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); + +css.inject(styleSheet); +var CSS_NAMESPACE = 'dg'; +var HIDE_KEY_CODE = 72; +var CLOSE_BUTTON_HEIGHT = 20; +var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; +var SUPPORTS_LOCAL_STORAGE = function () { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}(); +var SAVE_DIALOGUE = void 0; +var autoPlaceVirgin = true; +var autoPlaceContainer = void 0; +var hide = false; +var hideableGuis = []; +var GUI = function GUI(pars) { + var _this = this; + var params = pars || {}; + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + dom.addClass(this.domElement, CSS_NAMESPACE); + this.__folders = {}; + this.__controllers = []; + this.__rememberedObjects = []; + this.__rememberedObjectIndecesToControllers = []; + this.__listening = []; + params = Common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + params = Common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + if (!Common.isUndefined(params.load)) { + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + if (Common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + params.resizable = Common.isUndefined(params.parent) && params.resizable; + if (params.autoPlace && Common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + var saveToLocalStorage = void 0; + var titleRow = void 0; + Object.defineProperties(this, + { + parent: { + get: function get$$1() { + return params.parent; + } + }, + scrollable: { + get: function get$$1() { + return params.scrollable; + } + }, + autoPlace: { + get: function get$$1() { + return params.autoPlace; + } + }, + closeOnTop: { + get: function get$$1() { + return params.closeOnTop; + } + }, + preset: { + get: function get$$1() { + if (_this.parent) { + return _this.getRoot().preset; + } + return params.load.preset; + }, + set: function set$$1(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + width: { + get: function get$$1() { + return params.width; + }, + set: function set$$1(v) { + params.width = v; + setWidth(_this, v); + } + }, + name: { + get: function get$$1() { + return params.name; + }, + set: function set$$1(v) { + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + closed: { + get: function get$$1() { + return params.closed; + }, + set: function set$$1(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + this.onResize(); + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + load: { + get: function get$$1() { + return params.load; + } + }, + useLocalStorage: { + get: function get$$1() { + return useLocalStorage; + }, + set: function set$$1(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + if (Common.isUndefined(params.parent)) { + this.closed = params.closed || false; + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + dom.bind(this.__closeButton, 'click', function () { + _this.closed = !_this.closed; + }); + } else { + if (params.closed === undefined) { + params.closed = true; + } + var titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + titleRow = addRow(_this, titleRowName); + var onClickTitle = function onClickTitle(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + if (!params.closed) { + this.closed = false; + } + } + if (params.autoPlace) { + if (Common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + autoPlaceContainer.appendChild(this.domElement); + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + if (!this.parent) { + setWidth(_this, params.width); + } + } + this.__resizeHandler = function () { + _this.onResizeDebounced(); + }; + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + if (params.resizable) { + addResizeHandle(this); + } + saveToLocalStorage = function saveToLocalStorage() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + this.saveToLocalStorageIfPossible = saveToLocalStorage; + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + Common.defer(function () { + root.width -= 1; + }); + } + if (!params.parent) { + resetWidth(); + } +}; +GUI.toggleHide = function () { + hide = !hide; + Common.each(hideableGuis, function (gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; +GUI._keydownHandler = function (e) { + if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); +Common.extend(GUI.prototype, +{ + add: function add(object, property) { + return _add(this, object, property, { + factoryArgs: Array.prototype.slice.call(arguments, 2) + }); + }, + addColor: function addColor(object, property) { + return _add(this, object, property, { + color: true + }); + }, + remove: function remove(controller) { + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + var _this = this; + Common.defer(function () { + _this.onResize(); + }); + }, + destroy: function destroy() { + if (this.parent) { + throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); + } + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + var _this = this; + Common.each(this.__folders, function (subfolder) { + _this.removeFolder(subfolder); + }); + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + removeListeners(this); + }, + addFolder: function addFolder(name) { + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); + } + var newGuiParams = { name: name, parent: this }; + newGuiParams.autoPlace = this.autoPlace; + if (this.load && + this.load.folders && + this.load.folders[name]) { + newGuiParams.closed = this.load.folders[name].closed; + newGuiParams.load = this.load.folders[name]; + } + var gui = new GUI(newGuiParams); + this.__folders[name] = gui; + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + removeFolder: function removeFolder(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + delete this.__folders[folder.name]; + if (this.load && + this.load.folders && + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + removeListeners(folder); + var _this = this; + Common.each(folder.__folders, function (subfolder) { + folder.removeFolder(subfolder); + }); + Common.defer(function () { + _this.onResize(); + }); + }, + open: function open() { + this.closed = false; + }, + close: function close() { + this.closed = true; + }, + hide: function hide() { + this.domElement.style.display = 'none'; + }, + show: function show() { + this.domElement.style.display = ''; + }, + onResize: function onResize() { + var root = this.getRoot(); + if (root.scrollable) { + var top = dom.getOffset(root.__ul).top; + var h = 0; + Common.each(root.__ul.childNodes, function (node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + if (root.__resize_handle) { + Common.defer(function () { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + onResizeDebounced: Common.debounce(function () { + this.onResize(); + }, 50), + remember: function remember() { + if (Common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; + } + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + var _this = this; + Common.each(Array.prototype.slice.call(arguments), function (object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + if (this.autoPlace) { + setWidth(this, this.width); + } + }, + getRoot: function getRoot() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + getSaveObject: function getSaveObject() { + var toReturn = this.load; + toReturn.closed = this.closed; + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + toReturn.folders = {}; + Common.each(this.__folders, function (element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + return toReturn; + }, + save: function save() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + saveAs: function saveAs(presetName) { + if (!this.load.remembered) { + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + revert: function revert(gui) { + Common.each(this.__controllers, function (controller) { + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + Common.each(this.__folders, function (folder) { + folder.revert(folder); + }); + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + listen: function listen(controller) { + var init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + updateDisplay: function updateDisplay() { + Common.each(this.__controllers, function (controller) { + controller.updateDisplay(); + }); + Common.each(this.__folders, function (folder) { + folder.updateDisplay(); + }); + } +}); +function addRow(gui, newDom, liBefore) { + var li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} +function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + Common.extend(controller, { + options: function options(_options) { + if (arguments.length > 1) { + var nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: nextSibling, + factoryArgs: [Common.toArray(arguments)] + }); + } + if (Common.isArray(_options) || Common.isObject(_options)) { + var _nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: _nextSibling, + factoryArgs: [_options] + }); + } + }, + name: function name(_name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = _name; + return controller; + }, + listen: function listen() { + controller.__gui.listen(controller); + return controller; + }, + remove: function remove() { + controller.__gui.remove(controller); + return controller; + } + }); + if (controller instanceof NumberControllerSlider) { + var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); + Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function () { + var args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + var r = function r(returned) { + if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { + var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + var wasListening = controller.__gui.__listening.indexOf(controller) > -1; + controller.remove(); + var newController = _add(gui, controller.object, controller.property, { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + newController.name(oldName); + if (wasListening) newController.listen(); + return newController; + } + return returned; + }; + controller.min = Common.compose(r, controller.min); + controller.max = Common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + dom.bind(controller.__checkbox, 'click', function (e) { + e.stopPropagation(); + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__button, 'click'); + }); + dom.bind(li, 'mouseover', function () { + dom.addClass(controller.__button, 'hover'); + }); + dom.bind(li, 'mouseout', function () { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = Common.compose(function (val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + controller.updateDisplay(); + } + controller.setValue = Common.compose(function (val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return val; + }, controller.setValue); +} +function recallSavedValue(gui, controller) { + var root = gui.getRoot(); + var matchedIndex = root.__rememberedObjects.indexOf(controller.object); + if (matchedIndex !== -1) { + var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; + } + controllerMap[controller.property] = controller; + if (root.load && root.load.remembered) { + var presetMap = root.load.remembered; + var preset = void 0; + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + return; + } + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + var value = preset[matchedIndex][controller.property]; + controller.initialValue = value; + controller.setValue(value); + } + } + } +} +function _add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error('Object "' + object + '" has no property "' + property + '"'); + } + var controller = void 0; + if (params.color) { + controller = new ColorController(object, property); + } else { + var factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + recallSavedValue(gui, controller); + dom.addClass(controller.domElement, 'c'); + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + var li = addRow(gui, container, params.before); + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, _typeof(controller.getValue())); + } + augmentController(gui, li, controller); + gui.__controllers.push(controller); + return controller; +} +function getLocalStorageHash(gui, key) { + return document.location.href + '.' + key; +} +function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} +function addSaveMenu(gui) { + var div = gui.__save_row = document.createElement('li'); + dom.addClass(gui.domElement, 'has-save'); + gui.__ul.insertBefore(div, gui.__ul.firstChild); + dom.addClass(div, 'save-row'); + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + var select = gui.__preset_select = document.createElement('select'); + if (gui.load && gui.load.remembered) { + Common.each(gui.load.remembered, function (value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + dom.bind(select, 'change', function () { + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + gui.preset = this.value; + }); + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + if (SUPPORTS_LOCAL_STORAGE) { + var explain = document.getElementById('dg-local-explain'); + var localStorageCheckBox = document.getElementById('dg-local-storage'); + var saveLocally = document.getElementById('dg-save-locally'); + saveLocally.style.display = 'block'; + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + showHideExplain(gui, explain); + dom.bind(localStorageCheckBox, 'change', function () { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + dom.bind(newConstructorTextArea, 'keydown', function (e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + dom.bind(gears, 'click', function () { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + dom.bind(button, 'click', function () { + gui.save(); + }); + dom.bind(button2, 'click', function () { + var presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + dom.bind(button3, 'click', function () { + gui.revert(); + }); +} +function addResizeHandle(gui) { + var pmouseX = void 0; + gui.__resize_handle = document.createElement('div'); + Common.extend(gui.__resize_handle.style, { + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + }); + function drag(e) { + e.preventDefault(); + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + return false; + } + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + function dragStart(e) { + e.preventDefault(); + pmouseX = e.clientX; + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + return false; + } + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} +function getCurrentPreset(gui, useInitialValues) { + var toReturn = {}; + Common.each(gui.__rememberedObjects, function (val, index) { + var savedValues = {}; + var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; + Common.each(controllerMap, function (controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + toReturn[index] = savedValues; + }); + return toReturn; +} +function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame$1.call(window, function () { + updateDisplays(controllerArray); + }); + } + Common.each(controllerArray, function (c) { + c.updateDisplay(); + }); +} + +var color = { + Color: Color, + math: ColorMath, + interpret: interpret +}; +var controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; +var dom$1 = { dom: dom }; +var gui = { GUI: GUI }; +var GUI$1 = GUI; +var index = { + color: color, + controllers: controllers, + dom: dom$1, + gui: gui, + GUI: GUI$1 +}; + +export { color, controllers, dom$1 as dom, gui, GUI$1 as GUI }; +export default index; +//# sourceMappingURL=dat.gui.module.js.map \ No newline at end of file diff --git a/public/script.js b/public/script.js new file mode 100644 index 00000000..bb2ab10c --- /dev/null +++ b/public/script.js @@ -0,0 +1,142 @@ +// client-side js, loaded by index.html +// run by the browser each time the page is loaded +import * as dat from './dat.gui.js'; + +const gui = new dat.GUI(); + +// audio + visual context +const canvas = document.getElementById("canvas"); +const ctx = canvas.getContext("2d"); +let audctx = null; +const playButton = document.getElementById("play") +let audioElement = null; +let coll = document.getElementsByClassName("collapsible"); + +// object to hold customizable parameters +let params = { + ballRadius : 3.0, + gravity: 2.0, + ballSpaceMultiplier : 5.0, + lowR : 46, medR : 59, highR : 59, + lowG : 30, medG : 193, highG : 248, + lowB : 217, medB : 255, highB : 255, +} + +// see dat.gui for making a HUD +// use module.js + +window.onload = function(){ + canvas.width = 1600; + canvas.height = 512 + createGUI(); + + ctx.fillStyle = 'rgba(10,10,10,1)' + ctx.fillRect( 0,0,canvas.width,canvas.height ) +} + + +playButton.onclick = function(){ + if(!audioElement){ + console.log("initializing audio...") + initAudio() + } + console.log(audioElement.paused) + if(audioElement.paused) + audioElement.play() + else + audioElement.pause() +}; + +function initAudio() { + audctx = new AudioContext(); + audioElement = document.createElement("audio"); + document.body.appendChild(audioElement); + + const analyser = audctx.createAnalyser(); + analyser.fftSize = 512 // 1024 bins + + const player = audctx.createMediaElementSource(audioElement) + player.connect(audctx.destination); + player.connect(analyser) + + audioElement.crossOrigin = "anonymous" // get this file through CORS + // link to file from assets + // toby fox - waterfall (undertale ost) + audioElement.src = 'https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2FUndertale%20OST%20031%20-%20Waterfall.mp3?v=1602267439147' + // mick gordon - bfg division (doom ost) + //audioElement.src = 'https://cdn.glitch.com/e986a1d5-113b-4a8f-8f90-c221dcd2a059%2FMick%20Gordon%20-%2011.%20BFG%20Division%20(128%20kbps).mp3?v=1602431236626' + audioElement.volume= "0.3" + const results = new Uint8Array(analyser.frequencyBinCount) + + // animation code + let draw = function(){ + // temporal recursion, call tthe function in the future + window.requestAnimationFrame( draw ) + + ctx.fillStyle = 'rgba(10,10,10,1)' + ctx.fillRect( 0,0,canvas.width,canvas.height ) + + analyser.getByteFrequencyData( results ) + + for( let i = 0; i < analyser.frequencyBinCount; i++ ) { + let space = 0; // space between balls + if(i === 0){space = 4;} + else{space = params.ballSpaceMultiplier * i;} + + // determine color based on amplitude of this bin + if(results[i] <= 50){ + ctx.fillStyle = `rgba(${params.lowR},${params.lowG},${params.lowB})` + } + else if(results[i] <= 100){ + ctx.fillStyle = `rgba(${params.medR},${params.medG},${params.medB})` + } + else{ + ctx.fillStyle = `rgba(${params.highR},${params.highG},${params.highB})` + } + + + //draw ball based on frequency bin + ctx.beginPath(); ctx.arc ( i+space, canvas.height-50-results[i] * params.gravity, params.ballRadius, 0, 2 * Math.PI, false); ctx.fill(); + //ctx.fillRect( i, canvas.height, 1, -results[i] ) // upside down + } + } + draw(); + +} + + + +function createGUI() { + gui.add(params, "ballRadius", 1, 10) + gui.add(params, "gravity", 1, 10) + gui.add(params, "ballSpaceMultiplier", 1, 10) + + // colors + // level 1 + gui.add(params, "lowR", 1, 255) + gui.add(params, "lowG", 1, 255) + gui.add(params, "lowB", 1, 255) + + // level 2 + gui.add(params, "medR", 1, 255) + gui.add(params, "medG", 1, 255) + gui.add(params, "medB", 1, 255) + + // level 3 + gui.add(params, "highR", 1, 255) + gui.add(params, "highG", 1, 255) + gui.add(params, "highB", 1, 255) +} + +let i; +for (i = 0; i < coll.length; i++) { + coll[i].addEventListener("click", function() { + this.classList.toggle("active"); + var content = this.nextElementSibling; + if (content.style.display === "block") { + content.style.display = "none"; + } else { + content.style.display = "block"; + } + }); +} \ No newline at end of file diff --git a/sample.png b/sample.png deleted file mode 100644 index dd19a25fd1fe9593775005d063693fa442fb702e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77080 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
+

+ Alex's Audiovisualizer +

+

+ Toby Fox - Waterfall (Undertale OST) +

+ + +
+ + +

+ Welcome to my audiovisualizer! This represents a song's waveform with a series of colorful, bouncing balls. + Start the visualization by clicking on the "Play/Pause" button. + Using the controls menu at the top-right, you can change the following parameters:
+

+
    +
  • ballRadius: Size of the balls
  • +
  • gravity: How high the balls bounce
  • +
  • ballSpaceMultiplier: Space between the balls
  • +
  • lowR, lowG, lowB: RGB value for low volume
  • +
  • medR, medG, medB: RGB value for medium volume
  • +
  • highR, highG, highB: RGB value for high volume
  • +
+ Click on "Help" to collapse/open this menu. +
+
+ + From 1619e443afdf5de4da653522b5daea3de12c6f1e Mon Sep 17 00:00:00 2001 From: Alex Hunt <45321761+alexmhunt@users.noreply.github.com> Date: Sun, 11 Oct 2020 20:17:08 -0400 Subject: [PATCH 6/8] Delete README.md --- README.md | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 887720bd..00000000 --- a/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# hello-express - -A server that serves a webpage, its resources, and some data - - -## Your Project - -On the front-end, - -- Edit `views/index.html` to change the content of the webpage -- `public/client.js` is the javacript that runs when you load the webpage -- `public/style.css` is the styles for `views/index.html` -- Drag in `assets`, like images or music, to add them to your project - -On the back-end, - -- your app starts at `server.js` -- add frameworks and packages in `package.json` -- safely store app secrets in `.env` (nobody can see this but you and people you invite) - -Click `Show` in the header to see your app live. Updates to your code will instantly deploy. - - -## Made by [Glitch](https://glitch.com/) - -**Glitch** is the friendly community where you'll build the app of your dreams. Glitch lets you instantly create, remix, edit, and host an app, bot or site, and you can invite collaborators or helpers to simultaneously edit code with you. - -Find out more [about Glitch](https://glitch.com/about). - -( áµ” á´¥ áµ” ) \ No newline at end of file From 7bb1482afa56fb76ad49b2031bbc6bda1d2a0f09 Mon Sep 17 00:00:00 2001 From: Alex Hunt <45321761+alexmhunt@users.noreply.github.com> Date: Sun, 11 Oct 2020 20:18:40 -0400 Subject: [PATCH 7/8] Create README.md --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..d92aecd2 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +Assignment 4 - Creative Coding: Interactive Multimedia Experiences +=== + +## Alex's Audiovisualizer +Alex Hunt - https://a4-alex-hunt.glitch.me/ + +For this project, I created a 2D audiovisualizer using Canvas and Web Audio API. As the song plays, it uses Web Audio API's realtime waveform analysis tools to make colorful balls bounce based on the amplitude (volume) at certain frequencies. +![Sample](https://github.com/alexmhunt/a4-creative-coding/blob/master/sample.png?raw=true) + +The goal of this application is to create an appealing visual based on a song in realtime. Some challenges I faced during development were: +- Interpreting output from audio waveform analysis +- Translating analysis output into a visual representation +- Implementing Javascript modules +- Implementing UI and linking it to Javscript to allow the user to customize the visuals +- Loading and playing an audio file from a CDN From 805f9dbd783afa323e4fe21a0a9eea75dee4348b Mon Sep 17 00:00:00 2001 From: Alex Hunt <45321761+alexmhunt@users.noreply.github.com> Date: Sun, 11 Oct 2020 20:19:16 -0400 Subject: [PATCH 8/8] Add files via upload --- sample.png | Bin 0 -> 77080 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sample.png diff --git a/sample.png b/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..dd19a25fd1fe9593775005d063693fa442fb702e GIT binary patch literal 77080 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 { + response.sendFile(__dirname + "/views/index.html"); +}); + +app.get("/test", (request, response) => { + console.log(request); +}); + + +// listen for requests :) +const listener = app.listen(process.env.PORT, () => { + console.log("Your app is listening on port " + listener.address().port); +}); diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml new file mode 100644 index 00000000..730f609c --- /dev/null +++ b/shrinkwrap.yaml @@ -0,0 +1,413 @@ +dependencies: + cors: 2.8.5 + express: 4.17.1 +packages: + /accepts/1.3.7: + dependencies: + mime-types: 2.1.25 + negotiator: 0.6.2 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + /array-flatten/1.1.1: + dev: false + resolution: + integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + /body-parser/1.19.0: + dependencies: + bytes: 3.1.0 + content-type: 1.0.4 + debug: 2.6.9 + depd: 1.1.2 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + on-finished: 2.3.0 + qs: 6.7.0 + raw-body: 2.4.0 + type-is: 1.6.18 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + /bytes/3.1.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + /content-disposition/0.5.3: + dependencies: + safe-buffer: 5.1.2 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + /content-type/1.0.4: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + /cookie-signature/1.0.6: + dev: false + resolution: + integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + /cookie/0.4.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + /cors/2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + /debug/2.6.9: + dependencies: + ms: 2.0.0 + dev: false + resolution: + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + /depd/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + /destroy/1.0.4: + dev: false + resolution: + integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + /ee-first/1.1.1: + dev: false + resolution: + integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + /encodeurl/1.0.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + /escape-html/1.0.3: + dev: false + resolution: + integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + /etag/1.8.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + /express/4.17.1: + dependencies: + accepts: 1.3.7 + array-flatten: 1.1.1 + body-parser: 1.19.0 + content-disposition: 0.5.3 + content-type: 1.0.4 + cookie: 0.4.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 1.1.2 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.3.0 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.5 + qs: 6.7.0 + range-parser: 1.2.1 + safe-buffer: 5.1.2 + send: 0.17.1 + serve-static: 1.14.1 + setprototypeof: 1.1.1 + statuses: 1.5.0 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: false + engines: + node: '>= 0.10.0' + resolution: + integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + /finalhandler/1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + /forwarded/0.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + /fresh/0.5.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + /http-errors/1.7.2: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + /http-errors/1.7.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + /iconv-lite/0.4.24: + dependencies: + safer-buffer: 2.1.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /inherits/2.0.3: + dev: false + resolution: + integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + /inherits/2.0.4: + dev: false + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /ipaddr.js/1.9.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + /media-typer/0.3.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + /merge-descriptors/1.0.1: + dev: false + resolution: + integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + /methods/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + /mime-db/1.42.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== + /mime-types/2.1.25: + dependencies: + mime-db: 1.42.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== + /mime/1.6.0: + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + /ms/2.0.0: + dev: false + resolution: + integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + /ms/2.1.1: + dev: false + resolution: + integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + /negotiator/0.6.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + /object-assign/4.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /on-finished/2.3.0: + dependencies: + ee-first: 1.1.1 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + /parseurl/1.3.3: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + /path-to-regexp/0.1.7: + dev: false + resolution: + integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + /proxy-addr/2.0.5: + dependencies: + forwarded: 0.1.2 + ipaddr.js: 1.9.0 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + /qs/6.7.0: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + /range-parser/1.2.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + /raw-body/2.4.0: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + /safe-buffer/5.1.2: + dev: false + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safer-buffer/2.1.2: + dev: false + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /send/0.17.1: + dependencies: + debug: 2.6.9 + depd: 1.1.2 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 1.7.3 + mime: 1.6.0 + ms: 2.1.1 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + /serve-static/1.14.1: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.17.1 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + /setprototypeof/1.1.1: + dev: false + resolution: + integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + /statuses/1.5.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + /toidentifier/1.0.0: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + /type-is/1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.25 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + /unpipe/1.0.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + /utils-merge/1.0.1: + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + /vary/1.1.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +registry: 'https://registry.npmjs.org/' +shrinkwrapMinorVersion: 9 +shrinkwrapVersion: 3 +specifiers: + cors: ^2.8.5 + express: ^4.17.1 diff --git a/views/index.html b/views/index.html new file mode 100644 index 00000000..fb69b8ef --- /dev/null +++ b/views/index.html @@ -0,0 +1,82 @@ + + + + + + + + + + + CS4241 Assignment 4 + + + + + + + +