From ffc52d24eef5c41ad6904faa11d86c1c6faa7f06 Mon Sep 17 00:00:00 2001 From: greggman Date: Mon, 4 Dec 2023 04:51:36 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20greggman?= =?UTF-8?q?/muigui@6e6396b5bb9fdf19604256f5023c49d6b91b8932=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintignore | 2 - .eslintrc.cjs | 1 + README.md | 391 +- build/pull-vsa.js | 21 + build/serve.js | 1 + build/tsconfig-serve.json | 2 +- dist/0.x/controllers/Button.d.ts | 1 + dist/0.x/controllers/Canvas.d.ts | 2 +- dist/0.x/controllers/ColorChooser.d.ts | 1 + dist/0.x/controllers/PopDownController.d.ts | 2 +- dist/0.x/esm.d.ts | 6 + dist/0.x/libs/color-utils.d.ts | 20 + dist/0.x/libs/graph.d.ts | 6 + dist/0.x/libs/monitor.d.ts | 3 + dist/0.x/muigui.d.ts | 2 + dist/0.x/muigui.js | 277 +- dist/0.x/muigui.js.map | 2 +- dist/0.x/muigui.min.js | 2 +- dist/0.x/muigui.min.js.map | 2 +- dist/0.x/muigui.module.js | 333 +- dist/0.x/muigui.module.js.map | 2 +- dist/0.x/muigui.module.min.js | 2 +- dist/0.x/muigui.module.min.js.map | 2 +- dist/0.x/styles/muigui.css.d.ts | 24 +- examples/3rdParty/twgl-full.module.js | 10085 ++++++++++++++++ examples/js/index/VSAEffect.js | 343 + examples/js/index/effects.js | 27 + examples/js/index/effects/admo.js | 390 + examples/js/index/effects/bwow.js | 328 + examples/js/index/effects/codez.js | 636 + examples/js/index/effects/cyty.js | 675 ++ examples/js/index/effects/discus.js | 247 + examples/js/index/effects/dotto-chouhoukei.js | 391 + examples/js/index/effects/hexit2.js | 224 + examples/js/index/effects/loop-test.js | 323 + examples/js/index/effects/pookymelon.js | 388 + examples/js/index/effects/rollin.js | 629 + examples/js/index/effects/starfield.js | 317 + examples/js/index/effects/ung.js | 621 + examples/js/index/index.js | 293 + examples/js/{index-umd.js => lots-umd.js} | 408 +- examples/js/{index.js => lots.js} | 42 +- examples/js/{cube.js => model.js} | 11 +- examples/layout/layout.js | 30 +- index-umd.html => examples/lots-umd.html | 4 +- examples/lots.html | 99 + images/muigui-screenshot.png | Bin 80026 -> 29056 bytes index.html | 688 +- package-lock.json | 287 +- package.json | 4 +- src/controllers/Button.js | 3 + src/controllers/Canvas.js | 4 +- src/controllers/ColorChooser.js | 23 +- src/controllers/Folder.js | 1 + src/controllers/PopDownController.js | 5 +- src/controllers/Text.js | 2 +- src/controllers/TextNumber.js | 2 +- src/controllers/create-controller.js | 3 + src/esm.ts | 8 + src/libs/color-utils.js | 44 + src/libs/graph.js | 42 + src/libs/monitor.js | 5 + src/muigui.js | 19 +- src/styles/muigui.css.js | 148 +- src/views/NumberView.js | 13 +- src/views/TextView.js | 8 +- tsconfig.json | 10 +- 67 files changed, 18369 insertions(+), 568 deletions(-) create mode 100644 build/pull-vsa.js create mode 100644 dist/0.x/libs/graph.d.ts create mode 100644 dist/0.x/libs/monitor.d.ts create mode 100644 examples/3rdParty/twgl-full.module.js create mode 100644 examples/js/index/VSAEffect.js create mode 100644 examples/js/index/effects.js create mode 100644 examples/js/index/effects/admo.js create mode 100644 examples/js/index/effects/bwow.js create mode 100644 examples/js/index/effects/codez.js create mode 100644 examples/js/index/effects/cyty.js create mode 100644 examples/js/index/effects/discus.js create mode 100644 examples/js/index/effects/dotto-chouhoukei.js create mode 100644 examples/js/index/effects/hexit2.js create mode 100644 examples/js/index/effects/loop-test.js create mode 100644 examples/js/index/effects/pookymelon.js create mode 100644 examples/js/index/effects/rollin.js create mode 100644 examples/js/index/effects/starfield.js create mode 100644 examples/js/index/effects/ung.js create mode 100644 examples/js/index/index.js rename examples/js/{index-umd.js => lots-umd.js} (67%) rename examples/js/{index.js => lots.js} (97%) rename examples/js/{cube.js => model.js} (95%) rename index-umd.html => examples/lots-umd.html (95%) create mode 100644 examples/lots.html create mode 100644 src/libs/graph.js create mode 100644 src/libs/monitor.js diff --git a/.eslintignore b/.eslintignore index e4fc7fe..43821ad 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,7 +1,5 @@ test/js test/mocha.js -/webgl-lint.js dist examples/3rdParty out -examples/**/*.js diff --git a/.eslintrc.cjs b/.eslintrc.cjs index c3b9a4f..080f24a 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,4 +1,5 @@ /* global module */ +/* global __dirname */ module.exports = { parser: '@typescript-eslint/parser', diff --git a/README.md b/README.md index a70362c..4c7410f 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,11 @@ -# muigui - -# NOT READY for USE - - +I'm under sure how much time I'll continue to put into this. +I get the feeling other people are far more motivated to make +UIs. Maybe if I'm lucky they'll take some inspiration from +the thoughts above and I'll find they've covered it all. ## License diff --git a/build/pull-vsa.js b/build/pull-vsa.js new file mode 100644 index 0000000..000c98b --- /dev/null +++ b/build/pull-vsa.js @@ -0,0 +1,21 @@ +import fs from 'fs'; +import process from 'process'; + +// node build/pull-vsa.js ...url-to-vsa +const urls = process.argv.slice(2); + +for (const url of urls) { + const req = await fetch(`${url}?format=json`); + const data = await req.json(); + const filename = `examples/js/index/effects/${data.name}.js`; + const shader = data.settings.shader; + data.settings.shader = '--shader--'; + const s = `\ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default ${JSON.stringify(data, null, 2) + .replace(/"(.*?)":/g, '$1:') + .replace('"--shader--"', `\`${shader}\``)};\n`; + console.log('write', filename); + fs.writeFileSync(filename, s); +} \ No newline at end of file diff --git a/build/serve.js b/build/serve.js index a373cb6..db9e638 100644 --- a/build/serve.js +++ b/build/serve.js @@ -5,6 +5,7 @@ import chokidar from 'chokidar'; spawn('./node_modules/.bin/tsc', [ '--watch', + '--project', 'build/tsconfig-serve.json', ], { stdio: 'inherit', }); diff --git a/build/tsconfig-serve.json b/build/tsconfig-serve.json index 76f2768..91bcac4 100644 --- a/build/tsconfig-serve.json +++ b/build/tsconfig-serve.json @@ -1,6 +1,6 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "out/src" + "outDir": "../out" } } diff --git a/dist/0.x/controllers/Button.d.ts b/dist/0.x/controllers/Button.d.ts index 50f0953..36c33e7 100644 --- a/dist/0.x/controllers/Button.d.ts +++ b/dist/0.x/controllers/Button.d.ts @@ -1,5 +1,6 @@ export default class Button extends Controller { constructor(object: any, property: any, options?: {}); + name(name: any): void; setOptions(options: any): void; #private; } diff --git a/dist/0.x/controllers/Canvas.d.ts b/dist/0.x/controllers/Canvas.d.ts index bbdc33f..0e89042 100644 --- a/dist/0.x/controllers/Canvas.d.ts +++ b/dist/0.x/controllers/Canvas.d.ts @@ -1,5 +1,5 @@ export default class Canvas extends LabelController { - constructor(); + constructor(name: any); get canvas(): HTMLElement; #private; } diff --git a/dist/0.x/controllers/ColorChooser.d.ts b/dist/0.x/controllers/ColorChooser.d.ts index ebbfe71..f753db9 100644 --- a/dist/0.x/controllers/ColorChooser.d.ts +++ b/dist/0.x/controllers/ColorChooser.d.ts @@ -1,4 +1,5 @@ export default class ColorChooser extends PopDownController { + ___setKnobHelper: boolean; setOptions(options: any): this; #private; } diff --git a/dist/0.x/controllers/PopDownController.d.ts b/dist/0.x/controllers/PopDownController.d.ts index 97d01cf..1494c29 100644 --- a/dist/0.x/controllers/PopDownController.d.ts +++ b/dist/0.x/controllers/PopDownController.d.ts @@ -4,7 +4,7 @@ export default class PopDownController extends ValueController { updateDisplay(): void; setOptions(options: any): void; addTop(view: any): any; - addBottom(view: any): any; + addBottom(view: any): import("../views/View.js").default; #private; } import ValueController from './ValueController.js'; diff --git a/dist/0.x/esm.d.ts b/dist/0.x/esm.d.ts index 0f10034..3f79c9b 100644 --- a/dist/0.x/esm.d.ts +++ b/dist/0.x/esm.d.ts @@ -7,4 +7,10 @@ export { default as Select } from './controllers/Select.js'; export { default as Slider } from './controllers/Slider.js'; export { default as TextNumber } from './controllers/TextNumber.js'; export { default as Vec2 } from './controllers/Vec2.js'; +import { graph } from './libs/graph.js'; +import { monitor } from './libs/monitor.js'; +export declare const helpers: { + graph: typeof graph; + monitor: typeof monitor; +}; export default GUI; diff --git a/dist/0.x/libs/color-utils.d.ts b/dist/0.x/libs/color-utils.d.ts index d145154..83fdfcc 100644 --- a/dist/0.x/libs/color-utils.d.ts +++ b/dist/0.x/libs/color-utils.d.ts @@ -139,6 +139,26 @@ export const colorFormatConverters: { to: (v: any) => string; }; }; + 'float-hsv': { + color: { + from: (v: any) => (boolean | number[])[]; + to: (v: any) => number[]; + }; + text: { + from: (s: any) => any[]; + to: (v: any) => string; + }; + }; + 'float-hsva': { + color: { + from: (v: any) => (boolean | any[])[]; + to: (v: any) => any[]; + }; + text: { + from: (s: any) => any[]; + to: (v: any) => string; + }; + }; 'object-rgb': { color: { from: (v: any) => (boolean | { diff --git a/dist/0.x/libs/graph.d.ts b/dist/0.x/libs/graph.d.ts new file mode 100644 index 0000000..c51769e --- /dev/null +++ b/dist/0.x/libs/graph.d.ts @@ -0,0 +1,6 @@ +export function graph(canvas: any, data: any, { min, max, interval, color, }: { + min?: number | undefined; + max?: number | undefined; + interval?: number | undefined; + color: any; +}): void; diff --git a/dist/0.x/libs/monitor.d.ts b/dist/0.x/libs/monitor.d.ts new file mode 100644 index 0000000..38062e3 --- /dev/null +++ b/dist/0.x/libs/monitor.d.ts @@ -0,0 +1,3 @@ +export function monitor(label: any, object: any, property: any, { interval }?: { + interval?: number | undefined; +}): void; diff --git a/dist/0.x/muigui.d.ts b/dist/0.x/muigui.d.ts index 985e780..0f79fdd 100644 --- a/dist/0.x/muigui.d.ts +++ b/dist/0.x/muigui.d.ts @@ -5,6 +5,7 @@ export class GUIFolder extends Folder { addDivider(): any; addFolder(name: any): any; addLabel(text: any): any; + addButton(name: any, fn: any): any; } export class GUI extends GUIFolder { static converters: { @@ -34,6 +35,7 @@ export class GUI extends GUIFolder { static setTheme(name: any): void; constructor(options?: {}); setStyle(css: any): void; + setTheme(name: any): void; #private; } export default GUI; diff --git a/dist/0.x/muigui.js b/dist/0.x/muigui.js index ce955f2..0b7c18f 100644 --- a/dist/0.x/muigui.js +++ b/dist/0.x/muigui.js @@ -1,4 +1,4 @@ -/* muigui@0.0.12, license MIT */ +/* muigui@0.0.13, license MIT */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : @@ -17,16 +17,24 @@ --menu-bg-color: #f8f8f8; --menu-sep-color: #bbb; --hover-bg-color: #999; - --focus-color: #68C; - --range-color: #888888; + --focus-color: #8BF; + --range-color: #AAA; --invalid-color: #FF0000; --selected-color: rgb(255, 255, 255, 0.9); --button-bg-color: var(--value-bg-color); + --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==); + --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+); + --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=); + --range-left-color: var(--value-color); --range-right-color: var(--value-bg-color); --range-right-hover-color: var(--hover-bg-color); + --button-image: + linear-gradient( + rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2) + ); color: var(--color); background-color: var(--bg-color); @@ -43,7 +51,7 @@ --menu-bg-color: #080808; --menu-sep-color: #444444; --hover-bg-color: #666666; - --focus-color: #88AAFF; + --focus-color: #458; /*#88AAFF*/; --range-color: #888888; --invalid-color: #FF6666; --selected-color: rgba(255, 255, 255, 0.3); @@ -53,9 +61,15 @@ --range-left-color: var(--value-color); --range-right-color: var(--value-bg-color); --range-right-hover-color: var(--hover-bg-color); + --button-image: linear-gradient( + rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4) + ); color: var(--color); background-color: var(--bg-color); + + --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==); + --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+); } } @@ -64,7 +78,6 @@ --label-width: 45%; --number-width: 40%; - --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; --font-size: 11px; --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace; @@ -157,6 +170,9 @@ min-width: 0; min-height: var(--line-height); } +.muigui-root { + z-index: 1; +} .muigui-root, .muigui-menu { display: flex; @@ -181,8 +197,7 @@ color: var(--color); background-color: var(--menu-bg-color); min-height: var(--line-height); - padding-top: 0.2em; - padding-bottom: 0.2em; + padding: 0.2em; cursor: pointer; border-radius: var(--border-radius); } @@ -203,7 +218,7 @@ .muigui-controller>*:nth-child(1) { flex: 1 0 var(--label-width); min-width: 0; - white-space: pre; + /* white-space: pre; why?? */ } .muigui-controller>label:nth-child(1) { place-content: center start; @@ -245,32 +260,41 @@ /* fix! */ .muigui-open>button>label::before, .muigui-closed>button>label::before { + content: "X"; + color: rgba(0, 0, 0, 0); + background-color: var(--range-color); + border-radius: 0.2em; width: 1.25em; - height: var(--line-height); + margin-right: 0.25em; + height: 1.25em; /*var(--line-height);*/ display: inline-grid; place-content: center start; pointer-events: none; } .muigui-open>button>label::before { - content: "ⓧ"; /*"▼";*/ + background-image: var(--image-open); } .muigui-closed>button>label::before { - content: "⨁"; /*"▶";*/ + background-image: var(--image-closed); } -.muigui-open>*:nth-child(2) { - transition: max-height 0.2s ease-out, - opacity 0.5s ease-out; - max-height: 100vh; + +.muigui-open>.muigui-open-container { + transition: all 0.1s ease-out; overflow: auto; - opacity: 1; + height: 100%; } - -.muigui-closed>*:nth-child(2) { - transition: max-height 0.2s ease-out, - opacity 1s; - max-height: 0; - opacity: 0; +.muigui-closed>.muigui-open-container { + transition: all 0.1s ease-out; overflow: hidden; + min-height: 0; +} +.muigui-open>.muigui-open-container>* { + transition: all 0.1s ease-out; + margin-top: 0px; +} +.muigui-closed>.muigui-open-container>* { + transition: all 0.1s ease-out; + margin-top: -100%; } /* ---- popdown ---- */ @@ -282,8 +306,12 @@ .muigui-value>*:nth-child(1).muigui-pop-down-top { flex: 0; } -.muigui-pop-down-bottom { +.muigui-closed .muigui-pop-down-bottom { + max-height: 0; +} +.muigui-value .muigui-pop-down-bottom { + margin: 0; } .muigui-pop-down-values { @@ -305,6 +333,10 @@ width: auto; color: var(--value-color); background-color: var(--value-bg-color); + background-image: var(--image-checkerboard); + background-size: 10px 10px; + background-position: 0 0, 0 5px, 5px -5px, -5px 0px; + cursor: pointer; display: grid; @@ -396,14 +428,16 @@ .muigui-button { display: grid; - + padding: 2px 0 2px 0; } .muigui-button button { border: none; color: var(--value-color); background-color: var(--button-bg-color); + background-image: var(--button-image); cursor: pointer; place-content: center center; + height: var(--line-height); } /* ------ [ color ] ------ */ @@ -615,9 +649,9 @@ border-bottom: 1px solid rgba(0,0,0,0.2); border-right: 1px solid rgba(0,0,0,0.2); background-color: var(--range-color); - margin-top: calc((var(--line-height) - 2px) / -2); - width: calc(var(--line-height) - 2px); - height: calc(var(--line-height) - 2px); + margin-top: calc((var(--line-height) - 6px) / -2); + width: calc(var(--line-height) - 6px); + height: calc(var(--line-height) - 6px); } .muigui-range input[type=range]::-webkit-slider-runnable-track { @@ -701,8 +735,14 @@ `, themes: { - default: '', - float: ` + default: { + include: ['default'], + css: ` + `, + }, + float: { + include: ['default'], + css: ` :root { color-scheme: light dark, } @@ -759,6 +799,58 @@ --range-color: rgba(0, 0, 0, 0.125); } `, + }, + form: { + include: [], + css: ` + .muigui { + --width: 100%; + --label-width: 45%; + --number-width: 40%; + } + .muigui-root>button { + display: none; + } + .muigui-controller { + margin-top: 1em; + } + .muigui-label-controller { + display: flex; + flex-direction: column; + align-items: stretch; + margin-top: 1em; + } + .muigui-label-controller:has(.muigui-checkbox) { + flex-direction: row; + } + .muigui-value { + display: flex; + align-items: stretch; + } + .muigui-value>* { + flex: 1 1 auto; + min-width: 0; + } + .muigui-controller>*:nth-child(1) { + flex: 1 0 var(--label-width); + min-width: 0; + white-space: pre; + } + .muigui-controller>label:nth-child(1) { + place-content: center start; + display: inline-grid; + overflow: hidden; + } + .muigui-controller>*:nth-child(2) { + flex: 1 1 75%; + min-width: 0; + } + `, + }, + none: { + include: [], + css: '', + }, }, }; @@ -1120,6 +1212,9 @@ })); this.setOptions({name: property, ...options}); } + name(name) { + this.#buttonElem.textContent = name; + } setOptions(options) { copyExistingProperties(this.#options, options); const {name} = this.#options; @@ -1511,15 +1606,22 @@ const wheelHelper = createWheelHelper(); super(createElem('input', { type: 'number', - onInput: () => this.#handleInput(setValue, true), - onChange: () => this.#handleInput(setFinalValue, false), + onInput: () => { + this.#handleInput(setValue, true); + }, + onChange: () => { + this.#handleInput(setFinalValue, false); + }, onWheel: e => { e.preventDefault(); const {min, max, step} = this.#options; const delta = wheelHelper(e, step); const v = parseFloat(this.domElement.value); const newV = clamp$1(stepify(v + delta, v => v, step), min, max); - setter.setValue(newV); + const [valid, outV] = this.#from(newV); + if (valid) { + setter.setValue(outV); + } }, })); this.setOptions(options); @@ -1564,7 +1666,7 @@ #step; constructor(object, property, options = {}) { - super(object, property, 'muigui-checkbox'); + super(object, property, 'muigui-text-number'); this.#textView = this.add(new NumberView(this, options)); this.updateDisplay(); } @@ -1722,8 +1824,12 @@ const setFinalValue = setter.setFinalValue.bind(setter); super(createElem('input', { type: 'text', - onInput: () => this.#handleInput(setValue, true), - onChange: () => this.#handleInput(setFinalValue, false), + onInput: () => { + this.#handleInput(setValue, true); + }, + onChange: () => { + this.#handleInput(setFinalValue, false); + }, })); this.setOptions(options); } @@ -1756,7 +1862,7 @@ class Text extends ValueController { constructor(object, property) { - super(object, property, 'muigui-checkbox'); + super(object, property, 'muigui-text'); this.add(new TextView(this)); this.updateDisplay(); } @@ -1781,6 +1887,9 @@ if (Array.isArray(arg1)) { return new Select(object, property, {keyValues: arg1}); } + if (arg1 && arg1.keyValues) { + return new Select(object, property, {keyValues: arg1.keyValues}); + } const t = typeof object[property]; switch (t) { @@ -2392,6 +2501,50 @@ to: v => Array.from(v).map(v => f3(v)).join(', '), }, }, + 'float-hsv': { + color: { + from: v => [true, rgbFloatToHSV01(hexToFloatRGB(v))], + to: v => hsv01ToRGBFloat(floatRGBToHex(v)), + }, + text: { + from: strTo3Floats, + // need Array.from because map of Float32Array makes a Float32Array + to: v => Array.from(v).map(v => f3(v)).join(', '), + }, + }, + 'float-hsva': { + color: { + from: v => [true, rgbaFloatToHSVA01(hexToFloatRGB(v))], + to: v => hsva01ToRGBAFloat(floatRGBToHex(v)), + }, + text: { + from: strTo4Floats, + // need Array.from because map of Float32Array makes a Float32Array + to: v => Array.from(v).map(v => f3(v)).join(', '), + }, + }, + //'float-hsl': { + // color: { + // from: v => [true, rgbFloatToHsl01(hexToFloatRGB(v))], + // to: v => hsl01ToRGBFloat(floatRGBToHex(v)), + // }, + // text: { + // from: strTo3Floats, + // // need Array.from because map of Float32Array makes a Float32Array + // to: v => Array.from(v).map(v => f3(v)).join(', '), + // }, + //}, + //'float-hsla': { + // color: { + // from: v => [true, hexToFloatRGBA(v)], + // to: floatRGBAToHex, + // }, + // text: { + // from: strTo4Floats, + // // need Array.from because map of Float32Array makes a Float32Array + // to: v => Array.from(v).map(v => f3(v)).join(', '), + // }, + //}, 'object-rgb': { color: { from: v => [true, hexToObjectRGB(v)], @@ -2464,8 +2617,8 @@ class Canvas extends LabelController { #canvasElem; - constructor() { - super('muigui-canvas'); + constructor(name) { + super('muigui-canvas', name); this.#canvasElem = this.add( new ElementView('canvas', 'muigui-canvas'), ).domElement; @@ -2626,6 +2779,7 @@ type: 'button', onClick: () => this.toggleOpen(), }, [this.#labelElem])); + this.pushContainer(new Container('muigui-open-container')); this.pushContainer(new Container()); this.name(name); this.open(); @@ -2974,7 +3128,10 @@ })); this.#checkboxElem = checkboxElem; this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values')); - this.#bottom = this.add(new ElementView('div', 'muigui-pop-down-bottom')); + const container = new ElementView('div', 'muigui-pop-down-bottom muigui-open-container'); + this.#bottom = new ElementView('div'); + container.add(this.#bottom); + this.add(container); this.setOptions(options); } setKnobColor(bgCssColor/*, fgCssColor*/) { @@ -3010,7 +3167,6 @@ #colorView; #textView; #to; - #setKnobHelper; constructor(object, property, options = {}) { super(object, property, 'muigui-color-chooser'); @@ -3022,20 +3178,22 @@ this.addTop(this.#textView); this.addBottom(this.#colorView); // WTF! FIX! - this.#setKnobHelper = () => { - if (this.#to) { - const hex6Or8 = this.#to(this.getValue()); - const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8)); - hsl[2] = (hsl[2] + 50) % 100; - const hex = uint8RGBToHex(hslToRgbUint8(hsl)); - this.setKnobColor(`${hex6Or8.substring(0, 7)}FF`, hex); - } - }; + this.___setKnobHelper = true; this.updateDisplay(); } + #setKnobHelper() { + if (this.#to) { + const hex6Or8 = this.#to(this.getValue()); + const alpha = hex6Or8.length === 9 ? hex6Or8.substring(7, 9) : 'FF'; + const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8)); + hsl[2] = (hsl[2] + 50) % 100; + const hex = uint8RGBToHex(hslToRgbUint8(hsl)); + this.setKnobColor(`${hex6Or8.substring(0, 7)}${alpha}`, hex); + } + } updateDisplay() { super.updateDisplay(); - if (this.#setKnobHelper) { + if (this.___setKnobHelper) { this.#setKnobHelper(); } } @@ -3144,6 +3302,10 @@ addLabel(text) { return this.addController(new Label(text)); } + addButton(name, fn) { + const o = {fn}; + return this.add(o, 'fn').name(name); + } } class MuiguiElement extends HTMLElement { @@ -3156,7 +3318,7 @@ customElements.define('muigui-element', MuiguiElement); const baseStyleSheet = new CSSStyleSheet(); - baseStyleSheet.replaceSync(css.default); + //baseStyleSheet.replaceSync(css.default); const userStyleSheet = new CSSStyleSheet(); function makeStyleSheetUpdater(styleSheet) { @@ -3183,6 +3345,11 @@ const updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet); const updateUserStyle = makeStyleSheetUpdater(userStyleSheet); + function getTheme(name) { + const { include, css: cssStr } = css.themes[name]; + return `${include.map(m => css[m]).join('\n')} : css.default}\n${cssStr || ''}`; + } + class GUI extends GUIFolder { static converters = converters; static mapRange = mapRange; @@ -3214,13 +3381,14 @@ } if (parent) { const muiguiElement = createElem('muigui-element'); - muiguiElement.shadowRoot.adoptedStyleSheets = [baseStyleSheet, userStyleSheet, this.#localStyleSheet]; + muiguiElement.shadowRoot.adoptedStyleSheets = [this.#localStyleSheet, baseStyleSheet, userStyleSheet]; muiguiElement.shadow.appendChild(this.domElement); parent.appendChild(muiguiElement); } if (title) { this.title(title); } + this.#localStyleSheet.replaceSync(css.default); this.domElement.classList.add('muigui', 'muigui-colors'); } setStyle(css) { @@ -3238,8 +3406,11 @@ static getUserStyleSheet() { return userStyleSheet; } + setTheme(name) { + this.setStyle(getTheme(name)); + } static setTheme(name) { - GUI.setBaseStyles(`${css.default}\n${css.themes[name] || ''}`); + GUI.setBaseStyles(getTheme(name)); } } diff --git a/dist/0.x/muigui.js.map b/dist/0.x/muigui.js.map index c0fb460..4dc408b 100644 --- a/dist/0.x/muigui.js.map +++ b/dist/0.x/muigui.js.map @@ -1 +1 @@ -{"version":3,"file":"muigui.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/controllers/create-controller.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/layout/Layout.js","../../src/layout/Column.js","../../src/layout/Frame.js","../../src/layout/Grid.js","../../src/layout/Row.js","../../src/muigui.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/controllers/Direction.js","../../src/views/RadioGridView.js","../../src/controllers/RadioGrid.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/controllers/Slider.js","../../src/views/Vec2View.js","../../src/controllers/Vec2.js","../../src/umd.js"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #68C;\n --range-color: #888888;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #88AAFF;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n width: 1.25em;\n height: var(--line-height);\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n content: \"ⓧ\"; /*\"▼\";*/\n}\n.muigui-closed>button>label::before {\n content: \"⨁\"; /*\"▶\";*/\n}\n.muigui-open>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 0.5s ease-out;\n max-height: 100vh;\n overflow: auto;\n opacity: 1;\n}\n\n.muigui-closed>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 1s;\n max-height: 0;\n opacity: 0;\n overflow: hidden;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-pop-down-bottom {\n\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n cursor: pointer;\n place-content: center center;\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 2px) / -2);\n width: calc(var(--line-height) - 2px);\n height: calc(var(--line-height) - 2px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: '',\n float: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-checkbox');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor() {\n super('muigui-canvas');\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n this.#bottom = this.add(new ElementView('div', 'muigui-pop-down-bottom'));\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n #setKnobHelper;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.#setKnobHelper = () => {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}FF`, hex);\n }\n };\n this.updateDisplay();\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.#setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport View from '../views/View.js';\n\nfunction showCSS(ob) {\n if (ob.prototype.css) {\n showCSS(ob.prototype);\n }\n}\n\nexport default class Layout extends View {\n static css = 'bar';\n constructor(tag, className) {\n super(createElem(tag, {className}));\n\n showCSS(this);\n }\n}\n\n/*\nclass ValueController ?? {\n const row = this.add(new Row());\n const label = row.add(new Label());\n const div = row.add(new Div());\n const row = div.add(new Row());\n}\n*/\n\n/*\nclass MyCustomThing extends ValueController {\n constructor(object, property, options) {\n const topRow = this.add(new Row());\n const bottomRow = this.add(new Row());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n }\n}\n new Grid([\n [new\n ]\n */","import Layout from './Layout.js';\n\nexport default class Column extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Frame extends Layout {\n static css = 'foo';\n constructor() {\n super('div', 'muigui-frame');\n }\n static get foo() {\n return 'boo';\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Grid extends Layout {\n constructor() {\n super('div', 'muigui-grid');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Row extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\nbaseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [baseStyleSheet, userStyleSheet, this.#localStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n static setTheme(name) {\n GUI.setBaseStyles(`${css.default}\\n${css.themes[name] || ''}`);\n }\n}\n\nexport default GUI;\n","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n","import GUI from './muigui.js';\n\nimport ColorChooser from './controllers/ColorChooser.js';\nimport Direction from './controllers/Direction.js';\nimport RadioGrid from './controllers/RadioGrid.js';\nimport Range from './controllers/Range.js';\nimport Select from './controllers/Select.js';\nimport Slider from './controllers/Slider.js';\nimport TextNumber from './controllers/TextNumber.js';\nimport Vec2 from './controllers/Vec2.js';\n\nGUI.ColorChooser = ColorChooser;\nGUI.Direction = Direction;\nGUI.RadioGrid = RadioGrid;\nGUI.Range = Range;\nGUI.Select = Select;\nGUI.Slider = Slider;\nGUI.TextNumber = TextNumber;\nGUI.Vec2 = Vec2;\n\nexport default GUI;"],"names":["clamp","euclideanModulo","lerp","identity","noop","svg"],"mappings":";;;;;;;AAAA,YAAe;EACf,EAAE,OAAO,EAAE,CAAC;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;EACD,MAAM,EAAE;EACR,EAAE,OAAO,EAAE,EAAE;EACb,EAAE,KAAK,EAAE,CAAC;AACV;AACA;AACA;AACA;AAC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"} \ No newline at end of file +{"version":3,"file":"muigui.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/controllers/create-controller.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/layout/Layout.js","../../src/layout/Column.js","../../src/layout/Frame.js","../../src/layout/Grid.js","../../src/layout/Row.js","../../src/muigui.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/controllers/Direction.js","../../src/views/RadioGridView.js","../../src/controllers/RadioGrid.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/controllers/Slider.js","../../src/views/Vec2View.js","../../src/controllers/Vec2.js","../../src/umd.js"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #8BF;\n --range-color: #AAA;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: \n linear-gradient(\n rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #458; /*#88AAFF*/;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: linear-gradient(\n rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root {\n z-index: 1;\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n /* white-space: pre; why?? */\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n content: \"X\";\n color: rgba(0, 0, 0, 0);\n background-color: var(--range-color);\n border-radius: 0.2em;\n width: 1.25em;\n margin-right: 0.25em;\n height: 1.25em; /*var(--line-height);*/\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n background-image: var(--image-open);\n}\n.muigui-closed>button>label::before {\n background-image: var(--image-closed);\n}\n\n.muigui-open>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: auto;\n height: 100%;\n}\n.muigui-closed>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: hidden;\n min-height: 0;\n}\n.muigui-open>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: 0px;\n}\n.muigui-closed>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: -100%;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-closed .muigui-pop-down-bottom {\n max-height: 0;\n}\n\n.muigui-value .muigui-pop-down-bottom {\n margin: 0;\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n background-image: var(--image-checkerboard);\n background-size: 10px 10px;\n background-position: 0 0, 0 5px, 5px -5px, -5px 0px;\n\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n padding: 2px 0 2px 0;\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n background-image: var(--button-image);\n cursor: pointer;\n place-content: center center;\n height: var(--line-height);\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 6px) / -2);\n width: calc(var(--line-height) - 6px);\n height: calc(var(--line-height) - 6px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: {\n include: ['default'],\n css: `\n `,\n },\n float: {\n include: ['default'],\n css: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n },\n form: {\n include: [],\n css: `\n .muigui {\n --width: 100%;\n --label-width: 45%;\n --number-width: 40%;\n }\n .muigui-root>button {\n display: none;\n }\n .muigui-controller {\n margin-top: 1em;\n }\n .muigui-label-controller {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n margin-top: 1em;\n }\n .muigui-label-controller:has(.muigui-checkbox) {\n flex-direction: row;\n }\n .muigui-value {\n display: flex;\n align-items: stretch;\n }\n .muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n }\n .muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n }\n .muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n }\n .muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n }\n `,\n },\n none: {\n include: [],\n css: '',\n },\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n name(name) {\n this.#buttonElem.textContent = name;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n const [valid, outV] = this.#from(newV);\n if (valid) {\n setter.setValue(outV);\n }\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-text-number');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-text');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n if (arg1 && arg1.keyValues) {\n return new Select(object, property, {keyValues: arg1.keyValues});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsv': {\n color: {\n from: v => [true, rgbFloatToHSV01(hexToFloatRGB(v))],\n to: v => hsv01ToRGBFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsva': {\n color: {\n from: v => [true, rgbaFloatToHSVA01(hexToFloatRGB(v))],\n to: v => hsva01ToRGBAFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n //'float-hsl': {\n // color: {\n // from: v => [true, rgbFloatToHsl01(hexToFloatRGB(v))],\n // to: v => hsl01ToRGBFloat(floatRGBToHex(v)),\n // },\n // text: {\n // from: strTo3Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n //'float-hsla': {\n // color: {\n // from: v => [true, hexToFloatRGBA(v)],\n // to: floatRGBAToHex,\n // },\n // text: {\n // from: strTo4Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor(name) {\n super('muigui-canvas', name);\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container('muigui-open-container'));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n const container = new ElementView('div', 'muigui-pop-down-bottom muigui-open-container');\n this.#bottom = new ElementView('div');\n container.add(this.#bottom);\n this.add(container);\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.___setKnobHelper = true;\n this.updateDisplay();\n }\n #setKnobHelper() {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const alpha = hex6Or8.length === 9 ? hex6Or8.substring(7, 9) : 'FF';\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}${alpha}`, hex);\n }\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.___setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport View from '../views/View.js';\n\nfunction showCSS(ob) {\n if (ob.prototype.css) {\n showCSS(ob.prototype);\n }\n}\n\nexport default class Layout extends View {\n static css = 'bar';\n constructor(tag, className) {\n super(createElem(tag, {className}));\n\n showCSS(this);\n }\n}\n\n/*\nclass ValueController ?? {\n const row = this.add(new Row());\n const label = row.add(new Label());\n const div = row.add(new Div());\n const row = div.add(new Row());\n}\n*/\n\n/*\nclass MyCustomThing extends ValueController {\n constructor(object, property, options) {\n const topRow = this.add(new Row());\n const bottomRow = this.add(new Row());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n }\n}\n new Grid([\n [new\n ]\n */","import Layout from './Layout.js';\n\nexport default class Column extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Frame extends Layout {\n static css = 'foo';\n constructor() {\n super('div', 'muigui-frame');\n }\n static get foo() {\n return 'boo';\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Grid extends Layout {\n constructor() {\n super('div', 'muigui-grid');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Row extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n addButton(name, fn) {\n const o = {fn};\n return this.add(o, 'fn').name(name);\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\n//baseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nfunction getTheme(name) {\n const { include, css: cssStr } = css.themes[name];\n return `${include.map(m => css[m]).join('\\n')} : css.default}\\n${cssStr || ''}`;\n}\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [this.#localStyleSheet, baseStyleSheet, userStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.#localStyleSheet.replaceSync(css.default);\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n setTheme(name) {\n this.setStyle(getTheme(name));\n }\n static setTheme(name) {\n GUI.setBaseStyles(getTheme(name));\n }\n}\n\nexport default GUI;\n","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n","import GUI from './muigui.js';\n\nimport ColorChooser from './controllers/ColorChooser.js';\nimport Direction from './controllers/Direction.js';\nimport RadioGrid from './controllers/RadioGrid.js';\nimport Range from './controllers/Range.js';\nimport Select from './controllers/Select.js';\nimport Slider from './controllers/Slider.js';\nimport TextNumber from './controllers/TextNumber.js';\nimport Vec2 from './controllers/Vec2.js';\n\nGUI.ColorChooser = ColorChooser;\nGUI.Direction = Direction;\nGUI.RadioGrid = RadioGrid;\nGUI.Range = Range;\nGUI.Select = Select;\nGUI.Slider = Slider;\nGUI.TextNumber = TextNumber;\nGUI.Vec2 = Vec2;\n\nexport default GUI;"],"names":["clamp","euclideanModulo","lerp","identity","noop","svg"],"mappings":";;;;;;;AAAA,YAAe;EACf,EAAE,OAAO,EAAE,CAAC;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;EACD,MAAM,EAAE;EACR,EAAE,OAAO,EAAE;EACX,IAAI,OAAO,EAAE,CAAC,SAAS,CAAC;EACxB,IAAI,GAAG,EAAE,CAAC;AACV,IAAI,CAAC;EACL,GAAG;EACH,EAAE,KAAK,EAAE;EACT,IAAI,OAAO,EAAE,CAAC,SAAS,CAAC;EACxB,IAAI,GAAG,EAAE,CAAC;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;EACD,GAAG;EACH,EAAE,IAAI,EAAE;EACR,IAAI,OAAO,EAAE,EAAE;EACf,IAAI,GAAG,EAAE,CAAC;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC;EACH,GAAG;EACH,EAAE,IAAI,EAAE;EACR,IAAI,OAAO,EAAE,EAAE;EACf,IAAI,GAAG,EAAE,EAAE;EACX,GAAG;EACH,CAAC;EACD,CAAC;;EC/0BM,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;EACpD,EAAE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;EACpD,IAAI,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;E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"} \ No newline at end of file diff --git a/dist/0.x/muigui.min.js b/dist/0.x/muigui.min.js index 4d5665f..4d0c8e6 100644 --- a/dist/0.x/muigui.min.js +++ b/dist/0.x/muigui.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).GUI=e()}(this,(function(){"use strict";var t={default:'\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #68C;\n --range-color: #888888;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #88AAFF;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n\n --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n width: 1.25em;\n height: var(--line-height);\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n content: "ⓧ"; /*"▼";*/\n}\n.muigui-closed>button>label::before {\n content: "⨁"; /*"▶";*/\n}\n.muigui-open>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 0.5s ease-out;\n max-height: 100vh;\n overflow: auto;\n opacity: 1;\n}\n\n.muigui-closed>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 1s;\n max-height: 0;\n opacity: 0;\n overflow: hidden;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-pop-down-bottom {\n\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: "+";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: "X";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n cursor: pointer;\n place-content: center center;\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: "";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: "✔";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 2px) / -2);\n width: calc(var(--line-height) - 2px);\n height: calc(var(--line-height) - 2px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn\'t work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n',themes:{default:"",float:"\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n"}};function e(t,e={},n=[]){const i=document.createElement(t);return function(t,e,n){for(const[n,i]of Object.entries(e))if("function"==typeof i&&n.startsWith("on")){const e=n.substring(2).toLowerCase();t.addEventListener(e,i,{passive:!1})}else if("object"==typeof i)for(const[e,o]of Object.entries(i))t[n][e]=o;else void 0===t[n]?t.setAttribute(n,i):t[n]=i;for(const e of n)t.appendChild(e)}(i,e,n),i}let n=0;function i(t,e){const n=t.indexOf(e);return n&&t.splice(n,1),t}function o(t,e,n){return Math.max(e,Math.min(n,t))}const r="undefined"!=typeof SharedArrayBuffer?function(t){return t&&t.buffer&&(t.buffer instanceof ArrayBuffer||t.buffer instanceof SharedArrayBuffer)}:function(t){return t&&t.buffer&&t.buffer instanceof ArrayBuffer},s=(t,e,n)=>Math.round(e(t)/n)/(1/n),a=(t,e)=>(t%e+e)%e;function l(t,e){for(const n in e)n in t&&(t[n]=e[n]);return t}const u=(t,e,n,i,o)=>(t-e)*(o-i)/(n-e)+i,c=({from:t,to:e})=>({to:n=>u(n,...t,...e),from:n=>[!0,u(n,...e,...t)]}),h=({from:t,to:e,step:n})=>({min:e[0],max:e[1],...n&&{step:n},converters:c({from:t,to:e})}),d={to:t=>t,from:t=>[!0,t]};function p(t,e,n,i,o){const{converters:{from:r}=d}=o,{min:s,max:a}=o,l=o.minRange||0,u=r(l)[1],c=t.add(e,n,{...o,min:s,max:a-l}).onChange((t=>{h.setValue(Math.min(a,Math.max(t+u,e[i])))})),h=t.add(e,i,{...o,min:s+l,max:a}).onChange((t=>{c.setValue(Math.max(s,Math.min(t-u,e[n])))}));return[c,h]}class m{domElement;#t;#e=[];constructor(t){this.domElement=t,this.#t=t}addElem(t){return this.#t.appendChild(t),t}removeElem(t){return this.#t.removeChild(t),t}pushSubElem(t){this.#t.appendChild(t),this.#t=t}popSubElem(){this.#t=this.#t.parentElement}add(t){return this.#e.push(t),this.addElem(t.domElement),t}remove(t){return this.removeElem(t.domElement),i(this.#e,t),t}pushSubView(t){this.pushSubElem(t.domElement)}popSubView(){this.popSubElem()}setOptions(t){for(const e of this.#e)e.setOptions(t)}updateDisplayIfNeeded(t,e){for(const n of this.#e)n.updateDisplayIfNeeded(t,e);return this}$(t){return this.domElement.querySelector(t)}}class g extends m{#n;#i;#o;constructor(t){super(e("div",{className:"muigui-controller"})),this.#n=[],this.#i=[],t&&this.domElement.classList.add(t)}get parent(){return this.#o}setParent(t){this.#o=t,this.enable(!this.disabled())}show(t=!0){return this.domElement.classList.toggle("muigui-hide",!t),this.domElement.classList.toggle("muigui-show",t),this}hide(){return this.show(!1)}disabled(){return!!this.domElement.closest(".muigui-disabled")}enable(t=!0){return this.domElement.classList.toggle("muigui-disabled",!t),["input","button","select","textarea"].forEach((t=>{this.domElement.querySelectorAll(t).forEach((t=>{const e=!!t.closest(".muigui-disabled");t.disabled=e}))})),this}disable(t=!0){return this.enable(!t)}onChange(t){return this.removeChange(t),this.#n.push(t),this}removeChange(t){return i(this.#n,t),this}onFinishChange(t){return this.removeFinishChange(t),this.#i.push(t),this}removeFinishChange(t){return i(this.#i,t),this}#r(t,e){for(const n of t)n.call(this,e)}emitChange(t,e,n){this.#r(this.#n,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitChange({object:e,property:n,value:t,controller:this}))}emitFinalChange(t,e,n){this.#r(this.#i,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitFinalChange({object:e,property:n,value:t,controller:this}))}updateDisplay(){}getColors(){const t=t=>t.replace(/-([a-z])/g,((t,e)=>e.toUpperCase())),n=e("div");this.domElement.appendChild(n);const i=Object.fromEntries(["color","bg-color","value-color","value-bg-color","hover-bg-color","menu-bg-color","menu-sep-color","disabled-color"].map((e=>{n.style.color=`var(--${e})`;const i=getComputedStyle(n);return[t(e),i.color]})));return n.remove(),i}}class f extends g{#s;#a;#l;#u={name:""};constructor(t,n,i={}){super("muigui-button",""),this.#s=t,this.#a=n,this.#l=this.addElem(e("button",{type:"button",onClick:()=>{this.#s[this.#a](this)}})),this.setOptions({name:n,...i})}setOptions(t){l(this.#u,t);const{name:e}=this.#u;this.#l.textContent=e}}function b(t,e){if(t.length!==e.length)return!1;for(let n=0;n{t.setValue(i.checked)},onChange:()=>{t.setFinalValue(i.checked)}});super(e("label",{},[i])),this.#b=i}updateDisplay(t){this.#b.checked=t}}const w=[],y=new Set;let k,E;function $(){k=void 0,E=!0;for(const t of w)y.has(t)||t();E=!1,y.size&&(E?C():(y.forEach((t=>{i(w,t)})),y.clear())),C()}function C(){!k&&w.length&&(k=requestAnimationFrame($))}let V=0;function I(){return"muigui-"+ ++V}class M extends m{constructor(t=""){super(e("div",{className:"muigui-value"})),t&&this.domElement.classList.add(t)}}class S extends g{#v;#x;constructor(t="",n=""){super("muigui-label-controller"),this.#v=I(),this.#x=e("label",{for:this.#v}),this.domElement.appendChild(this.#x),this.pushSubView(new M(t)),this.name(n)}get id(){return this.#v}name(t){return this.#x.title===this.#x.textContent&&(this.#x.title=t),this.#x.textContent=t,this}tooltip(t){this.#x.title=t}}class D extends S{#s;#a;#w;#y;#e;#k;constructor(t,e,n=""){super(n,e),this.#s=t,this.#a=e,this.#w=this.getValue(),this.#y=!1,this.#e=[]}get initialValue(){return this.#w}get object(){return this.#s}get property(){return this.#a}add(t){return this.#e.push(t),super.add(t),this.updateDisplay(),t}#E(t,e){let n=!1;if("object"==typeof t){const e=this.#s[this.#a];if(Array.isArray(t)||r(t))for(let i=0;i=0&&w.splice(e,1)}(this.#k)),this}}class N extends D{constructor(t,e){super(t,e,"muigui-checkbox");const n=this.id;this.add(new x(this,n)),this.updateDisplay()}}const F={to:t=>t,from:t=>[!0,t]},A={to:t=>t.toString(),from:t=>{const e=parseFloat(t);return[!Number.isNaN(e),e]}},U={radToDeg:c({to:[0,180],from:[0,Math.PI]})};function L(){let t=0;return function(e,n,i=5){t-=e.deltaY*n/i;const o=Math.floor(Math.abs(t)/n)*Math.sign(t)*n;return t-=o,o}}class O extends v{#$;#C;#V;#I;#u={step:.01,converters:A,min:Number.NEGATIVE_INFINITY,max:Number.POSITIVE_INFINITY};constructor(t,n){const i=t.setValue.bind(t),r=t.setFinalValue.bind(t),a=L();super(e("input",{type:"number",onInput:()=>this.#M(i,!0),onChange:()=>this.#M(r,!1),onWheel:e=>{e.preventDefault();const{min:n,max:i,step:r}=this.#u,l=a(e,r),u=parseFloat(this.domElement.value),c=o(s(u+l,(t=>t),r),n,i);t.setValue(c)}})),this.setOptions(n)}#M(t,e){const n=parseFloat(this.domElement.value),[i,r]=this.#C(n);let s;if(i&&!Number.isNaN(n)){const{min:n,max:i}=this.#u;s=r>=n&&r<=i,this.#I=e,t(o(r,n,i))}this.domElement.classList.toggle("muigui-invalid-value",!i||!s)}updateDisplay(t){this.#I||(this.domElement.value=s(t,this.#$,this.#V)),this.#I=!1}setOptions(t){l(this.#u,t);const{step:e,converters:{to:n,from:i}}=this.#u;return this.#$=n,this.#C=i,this.#V=e,this}}class j extends D{#S;#V;constructor(t,e,n={}){super(t,e,"muigui-checkbox"),this.#S=this.add(new O(this,n)),this.updateDisplay()}}class T extends v{#D;constructor(t,n){const i=[];super(e("select",{onChange:()=>{t.setFinalValue(this.#D[this.domElement.selectedIndex])}},n.map((([t,n])=>(i.push(n),e("option",{textContent:t})))))),this.#D=i}updateDisplay(t){const e=this.#D.indexOf(t);this.domElement.selectedIndex=e}}function H(t,e){return Array.isArray(t)?Array.isArray(t[0])?t:e?t.map(((t,e)=>[t,e])):t.map((t=>[t,t])):[...Object.entries(t)]}class z extends D{constructor(t,e,n){super(t,e,"muigui-select");const i="number"==typeof this.getValue(),{keyValues:o}=n,r=H(o,i);this.add(new T(this,r)),this.updateDisplay()}}class P extends v{#$;#C;#V;#I;#u={step:.01,min:0,max:1,converters:F};constructor(t,n){const i=L();super(e("input",{type:"range",onInput:()=>{this.#I=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#C(a);l&&t.setValue(u)},onChange:()=>{this.#I=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#C(a);l&&t.setFinalValue(u)},onWheel:e=>{e.preventDefault();const[n,r]=this.#C(parseFloat(this.domElement.value));if(!n)return;const{min:a,max:l,step:u}=this.#u,c=i(e,u),h=o(s(r+c,(t=>t),u),a,l);t.setValue(h)}})),this.setOptions(n)}updateDisplay(t){this.#I||(this.domElement.value=s(t,this.#$,this.#V)),this.#I=!1}setOptions(t){l(this.#u,t);const{step:e,min:n,max:i,converters:{to:o,from:r}}=this.#u;return this.#$=o,this.#C=r,this.#V=e,this.domElement.step=e,this.domElement.min=n,this.domElement.max=i,this}}class B extends D{constructor(t,e,n){super(t,e,"muigui-range"),this.add(new P(this,n)),this.add(new O(this,n))}}class G extends v{#$;#C;#I;#u={converters:F};constructor(t,n){const i=t.setValue.bind(t),o=t.setFinalValue.bind(t);super(e("input",{type:"text",onInput:()=>this.#M(i,!0),onChange:()=>this.#M(o,!1)})),this.setOptions(n)}#M(t,e){const[n,i]=this.#C(this.domElement.value);n&&(this.#I=e,t(i)),this.domElement.style.color=n?"":"var(--invalid-color)"}updateDisplay(t){this.#I||(this.domElement.value=this.#$(t),this.domElement.style.color=""),this.#I=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#$=e,this.#C=n,this}}class R extends D{constructor(t,e){super(t,e,"muigui-checkbox"),this.add(new G(this)),this.updateDisplay()}}const Y=(t,e,n)=>Math.max(e,Math.min(n,t)),K=(t,e,n)=>t+(e-t)*n,W=t=>t>=0?t%1:1-t%1,q=t=>+t.toFixed(0),J=t=>+t.toFixed(3),_=t=>parseInt(t.substring(1,3),16)<<16|parseInt(t.substring(3,5),16)<<8|parseInt(t.substring(5,7),16),X=t=>parseInt(t.substring(1,3),16)*2**24+65536*parseInt(t.substring(3,5),16)+256*parseInt(t.substring(5,7),16)+parseInt(t.substring(7,9),16),Z=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16)],Q=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,tt=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16),parseInt(t.substring(7,9),16)],et=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,nt=t=>Z(t).map((t=>J(t/255))),it=t=>Q(Array.from(t).map((t=>Math.round(Y(255*t,0,255))))),ot=t=>tt(t).map((t=>J(t/255))),rt=t=>et(Array.from(t).map((t=>Math.round(Y(255*t,0,255))))),st=t=>Y(Math.round(255*t),0,255).toString(16).padStart(2,"0"),at=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255}),lt=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255,a:parseInt(t.substring(7,9),16)/255}),ut=t=>`rgb(${Z(t).join(", ")})`,ct=/^\s*rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/,ht=t=>`rgba(${tt(t).map(((t,e)=>3===e?t/255:t)).join(", ")})`,dt=/^\s*rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+\.\d+|\d+)\s*\)\s*$/,pt=t=>{const e=yt(Z(t)).map((t=>q(t)));return`hsl(${e[0]}, ${e[1]}%, ${e[2]}%)`},mt=t=>{const e=kt(tt(t)).map(((t,e)=>3===e?J(t):q(t)));return`hsl(${e[0]} ${e[1]}% ${e[2]}% / ${e[3]})`},gt=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\)\s*$/,ft=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\/\s*(\d+\.\d+|\d+)\s*\)\s*$/,bt=(t,e)=>(t%e+e)%e;function vt([t,e,n]){t=bt(t,360),e=Y(e/100,0,1),n=Y(n/100,0,1);const i=e*Math.min(n,1-n);function o(e){const o=(e+t/30)%12;return n-i*Math.max(-1,Math.min(o-3,9-o,1))}return[o(0),o(8),o(4)].map((t=>Math.round(255*t)))}function xt([t,e,n]){const i=Math.max(t,e,n),o=Math.min(t,e,n),r=.5*(o+i),s=i-o;let a=0,l=0;if(0!==s)switch(l=0===r||1===r?0:(i-r)/Math.min(r,1-r),i){case t:a=(e-n)/s+(e{const[e,n,i]=xt(t.map((t=>t/255)));return[360*e,100*n,100*i]},kt=t=>{const[e,n,i,o]=wt(t.map((t=>t/255)));return[360*e,100*n,100*i,o]};function Et([t,e,n]){return e=Y(e,0,1),n=Y(n,0,1),[t,t+2/3,t+1/3].map((t=>K(1,Y(Math.abs(6*W(t)-3)-1,0,1),e)*n))}function $t([t,e,n,i]){return[...Et([t,e,n]),i]}const Ct=t=>Math.round(1e3*t)/1e3;function Vt([t,e,n]){const i=n>e?[n,e,-1,2/3]:[e,n,0,-1/3],o=i[0]>t?[i[0],i[1],i[3],t]:[t,i[1],i[2],i[0]],r=o[0]-Math.min(o[3],o[1]);return[Math.abs(o[2]+(o[3]-o[1])/(6*r+Number.EPSILON)),r/(o[0]+Number.EPSILON),o[0]].map(Ct)}const It=t=>t.endsWith("a")||t.startsWith("hex8"),Mt=[{re:/^#(?:[0-9a-f]){6}$/i,format:"hex6"},{re:/^(?:[0-9a-f]){6}$/i,format:"hex6-no-hash"},{re:/^#(?:[0-9a-f]){8}$/i,format:"hex8"},{re:/^(?:[0-9a-f]){8}$/i,format:"hex8-no-hash"},{re:/^#(?:[0-9a-f]){3}$/i,format:"hex3"},{re:/^(?:[0-9a-f]){3}$/i,format:"hex3-no-hash"},{re:ct,format:"css-rgb"},{re:gt,format:"css-hsl"},{re:dt,format:"css-rgba"},{re:ft,format:"css-hsla"}];function St(t){switch(typeof t){case"number":return console.warn('can not reliably guess format based on a number. You should pass in a format like {format: "uint32-rgb"} or {format: "uint32-rgb"}'),t<=16777215?"uint32-rgb":"uint32-rgba";case"string":{const e=function(t){for(const e of Mt)if(e.re.test(t))return e}(t.trim());if(e)return e.format;break}case"object":if(t instanceof Uint8Array||t instanceof Uint8ClampedArray){if(3===t.length)return"uint8-rgb";if(4===t.length)return"uint8-rgba"}else if(t instanceof Float32Array){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if(Array.isArray(t)){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if("r"in t&&"g"in t&&"b"in t)return"a"in t?"object-rgba":"object-rgb"}throw new Error(`unknown color format: ${t}`)}function Dt(t){return t.trim(t)}function Nt(t){return t.trim(t)}function Ft(t){return t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]?`#${t[1]}${t[3]}${t[5]}`:t}const At=/^(#|)([0-9a-f]{3})$/i;function Ut(t){const e=At.exec(t);if(e){const[,,t]=e;return"#"+`${(n=t)[0]}${n[0]}${n[1]}${n[1]}${n[2]}${n[2]}`}var n;return t}function Lt(t){return Ft(Dt(t))}const Ot=t=>{const e=ct.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),`rgb(${n.join(", ")})`]},jt=t=>{const e=dt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?parseFloat(t):parseInt(t)));return[!n.find((t=>t>255)),`rgba(${n.join(", ")})`]},Tt=t=>{const e=gt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]}, ${n[1]}%, ${n[2]}%)`]},Ht=t=>{const e=ft.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]} ${n[1]}% ${n[2]}% / ${n[3]})`]},zt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Pt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Bt=/^\s*(?:0x){0,1}([0-9a-z]{1,6})\s*$/i,Gt=/^\s*(?:0x){0,1}([0-9a-z]{1,8})\s*$/i,Rt=/^\s*#[a-f0-9]{6}\s*$|^\s*#[a-f0-9]{3}\s*$/i,Yt=/^\s*[a-f0-9]{6}\s*$/i,Kt=/^\s*#[a-f0-9]{8}\s*$/i,Wt=/^\s*[a-f0-9]{8}\s*$/i,qt={hex6:{color:{from:t=>[!0,t],to:Dt},text:{from:t=>[Rt.test(t),t.trim()],to:t=>t}},hex8:{color:{from:t=>[!0,t],to:Nt},text:{from:t=>[Kt.test(t),t.trim()],to:t=>t}},hex3:{color:{from:t=>[!0,Lt(t)],to:Ut},text:{from:t=>[Rt.test(t),Ft(t.trim())],to:t=>t}},"hex6-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${Dt(t)}`},text:{from:t=>[Yt.test(t),t.trim()],to:t=>t}},"hex8-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${Nt(t)}`},text:{from:t=>[Wt.test(t),t.trim()],to:t=>t}},"hex3-no-hash":{color:{from:t=>[!0,Lt(t).substring(1)],to:Ut},text:{from:t=>[Yt.test(t),Ft(t.trim())],to:t=>t}},"uint32-rgb":{color:{from:t=>[!0,_(t)],to:t=>`#${Math.round(t).toString(16).padStart(6,"0")}`},text:{from:t=>(t=>{const e=Bt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(6,"0")}`}},"uint32-rgba":{color:{from:t=>[!0,X(t)],to:t=>`#${Math.round(t).toString(16).padStart(8,"0")}`},text:{from:t=>(t=>{const e=Gt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(8,"0")}`}},"uint8-rgb":{color:{from:t=>[!0,Z(t)],to:Q},text:{from:t=>{const e=zt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"uint8-rgba":{color:{from:t=>[!0,tt(t)],to:et},text:{from:t=>{const e=Pt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"float-rgb":{color:{from:t=>[!0,nt(t)],to:it},text:{from:t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(3!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>J(t)))]},to:t=>Array.from(t).map((t=>J(t))).join(", ")}},"float-rgba":{color:{from:t=>[!0,ot(t)],to:rt},text:{from:t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(4!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>J(t)))]},to:t=>Array.from(t).map((t=>J(t))).join(", ")}},"object-rgb":{color:{from:t=>[!0,at(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b))throw new Error("not {r, g, b}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${J(t.r)}, g:${J(t.g)}, b:${J(t.b)}}`}},"object-rgba":{color:{from:t=>[!0,lt(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}${st(t.a)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b)||Number.isNaN(n.a))throw new Error("not {r, g, b, a}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${J(t.r)}, g:${J(t.g)}, b:${J(t.b)}}, a:${J(t.a)}}`}},"css-rgb":{color:{from:t=>[!0,ut(t)],to:t=>{const e=ct.exec(t);return Q([e[1],e[2],e[3]].map((t=>parseInt(t))))}},text:{from:Ot,to:t=>Ot(t)[1]}},"css-rgba":{color:{from:t=>[!0,ht(t)],to:t=>{const e=dt.exec(t);return et([e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?255*parseFloat(t)|0:parseInt(t))))}},text:{from:jt,to:t=>jt(t)[1]}},"css-hsl":{color:{from:t=>[!0,pt(t)],to:t=>{const e=gt.exec(t),n=vt([e[1],e[2],e[3]].map((t=>parseFloat(t))));return Q(n)}},text:{from:Tt,to:t=>Tt(t)[1]}},"css-hsla":{color:{from:t=>[!0,mt(t)],to:t=>{const e=ft.exec(t),n=function([t,e,n,i]){return[...vt([t,e,n]),255*i|0]}([e[1],e[2],e[3],e[4]].map((t=>parseFloat(t))));return et(n)}},text:{from:Ht,to:t=>Ht(t)[1]}}};class Jt extends m{constructor(t,n){super(e(t,{className:n}))}}class _t extends S{#N;constructor(){super("muigui-canvas"),this.#N=this.add(new Jt("canvas","muigui-canvas")).domElement}get canvas(){return this.#N}}class Xt extends v{#$;#C;#F;#I;#u={converters:F};constructor(t,n){const i=e("input",{type:"color",onInput:()=>{const[e,n]=this.#C(i.value);e&&(this.#I=!0,t.setValue(n))},onChange:()=>{const[e,n]=this.#C(i.value);e&&(this.#I=!0,t.setFinalValue(n))}});super(e("div",{},[i])),this.setOptions(n),this.#F=i}updateDisplay(t){this.#I||(this.#F.value=this.#$(t)),this.#I=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#$=e,this.#C=n,this}}class Zt extends D{#A;#S;constructor(t,e,n={}){super(t,e,"muigui-color");const i=n.format||St(this.getValue()),{color:o,text:r}=qt[i];this.#A=this.add(new Xt(this,{converters:o})),this.#S=this.add(new G(this,{converters:r})),this.updateDisplay()}setOptions(t){const{format:e}=t;if(e){const{color:t,text:n}=qt[e];this.#A.setOptions({converters:t}),this.#S.setOptions({converters:n})}return super.setOptions(t),this}}class Qt extends g{constructor(){super("muigui-divider")}}class te extends g{#U;#L;constructor(t){super(t),this.#U=[],this.#L=this}get children(){return this.#U}get controllers(){return this.#U.filter((t=>!(t instanceof te)))}get folders(){return this.#U.filter((t=>t instanceof te))}reset(t=!0){for(const e of this.#U)e instanceof te&&!t||e.reset(t);return this}updateDisplay(){for(const t of this.#U)t.updateDisplay();return this}remove(t){const e=this.#U.indexOf(t);if(e>=0){const t=this.#U.splice(e,1)[0];t.domElement.remove(),t.setParent(null)}return this}#O(t){return this.domElement.appendChild(t.domElement),this.#U.push(t),t.setParent(this),t}addController(t){return this.#L.#O(t)}pushContainer(t){return this.addController(t),this.#L=t,t}popContainer(){return this.#L=this.#L.parent,this}}class ee extends te{#j;constructor(t="Controls",n="muigui-menu"){super(n),this.#j=e("label"),this.addElem(e("button",{type:"button",onClick:()=>this.toggleOpen()},[this.#j])),this.pushContainer(new te),this.name(t),this.open()}open(t=!0){return this.domElement.classList.toggle("muigui-closed",!t),this.domElement.classList.toggle("muigui-open",t),this}close(){return this.open(!1)}name(t){return this.#j.textContent=t,this}title(t){return this.name(t)}toggleOpen(){return this.open(!this.domElement.classList.contains("muigui-open")),this}}class ne extends g{constructor(t){super("muigui-label"),this.text(t)}text(t){return this.domElement.textContent=t,this}}function ie(){}function oe(t,e,n){const i=t.getBoundingClientRect(),o=e.clientX-i.left,r=e.clientY-i.top,s=o/i.width,a=r/i.height,l=o-(n=n||[o,r])[0],u=r-n[1];return{x:o,y:r,nx:s,ny:a,dx:l,dy:u,ndx:l/i.width,ndy:u/i.width}}function re(t,{onDown:e=ie,onMove:n=ie,onUp:i=ie}){let o;const r=function(e){const i={type:"move",...oe(t,e,o)};n(i)},s=function(e){t.releasePointerCapture(e.pointerId),t.removeEventListener("pointermove",r),t.removeEventListener("pointerup",s),document.body.style.backgroundColor="",i("up")},a=function(n){t.addEventListener("pointermove",r),t.addEventListener("pointerup",s),t.setPointerCapture(n.pointerId);const i=oe(t,n);o=[i.x,i.y],e({type:"down",...i})};return t.addEventListener("pointerdown",a),function(){t.removeEventListener("pointerdown",a)}}function se(t){return t.querySelectorAll("[data-src]").forEach((e=>{const i="muigui-id-"+n++;e.id=i,t.querySelectorAll(`[data-target=${e.dataset.src}]`).forEach((t=>{t.setAttribute("fill",`url(#${i})`)}))})),t}class ae extends v{#$;#C;#T;#H;#z;#P;#B;#G;#R;#Y;#K;#W;#q;#J;#u={converters:F,alpha:!1};#_;#X;constructor(t,n){super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n',className:"muigui-no-scroll"})),this.#T=this.domElement.children[0],this.#z=this.domElement.children[1],this.#G=this.domElement.children[2],se(this.#T),se(this.#z),se(this.#G),this.#H=this.$(".muigui-color-chooser-circle"),this.#P=this.$("[data-src=muigui-color-chooser-hue]"),this.#B=this.$(".muigui-color-chooser-hue-cursor"),this.#R=this.$("[data-src=muigui-color-chooser-alpha]"),this.#Y=this.$(".muigui-color-chooser-alpha-cursor");const i=e=>{const n=o(e.nx,0,1),i=o(e.ny,0,1);this.#K[1]=n,this.#K[2]=1-i,this.#W=!0,this.#J=!0;const[r,s]=this.#C(this.#_(this.#K));r&&t.setValue(s)},r=e=>{const n=o(e.nx,0,1);this.#K[0]=n,this.#q=!0,this.#J=!0;const[i,r]=this.#C(this.#_(this.#K));i&&t.setValue(r)},s=e=>{const n=o(e.nx,0,1);this.#K[3]=n,this.#W=!0,this.#q=!0;const[i,r]=this.#C(this.#_(this.#K));i&&t.setValue(r)};re(this.#T,{onDown:i,onMove:i}),re(this.#z,{onDown:r,onMove:r}),re(this.#G,{onDown:s,onMove:s}),this.setOptions(n)}updateDisplay(t){this.#K||(this.#K=this.#X(this.#$(t)));{const[e,n,i,o=1]=this.#X(this.#$(t));this.#W||(this.#K[0]=n>.001&&i>.001?e:this.#K[0]),this.#q||(this.#K[1]=n,this.#K[2]=i),this.#J||(this.#K[3]=o)}{const[t,e,n,i]=this.#K,[o,r,s]=wt($t(this.#K));this.#W||this.#B.setAttribute("transform",`translate(${64*t}, 0)`),this.#P.children[0].setAttribute("stop-color",`hsl(${360*o} 0% 100% / ${i})`),this.#P.children[1].setAttribute("stop-color",`hsl(${360*o} 100% 50% / ${i})`),this.#J||this.#Y.setAttribute("transform",`translate(${64*i}, 0)`),this.#R.children[0].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 0)`),this.#R.children[1].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 1)`),this.#q||(this.#H.setAttribute("cx",""+64*e),this.#H.setAttribute("cy",""+48*(1-n)))}this.#W=!1,this.#q=!1,this.#J=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n},alpha:i}=this.#u;return this.#G.style.display=i?"":"none",this.#_=i?t=>rt($t(t)):t=>it(Et(t)),this.#X=i?t=>function([t,e,n,i]){return[...Vt([t,e,n]),i]}(ot(t)):t=>Vt(nt(t)),this.#$=e,this.#C=n,this}}class le extends D{#Z;#Q;#b;#tt;#u={open:!1};constructor(t,n,i={}){super(t,n,"muigui-pop-down-controller"),this.#Z=this.add(new Jt("div","muigui-pop-down-top"));const o=this.#Z.addElem(e("input",{type:"checkbox",onChange:()=>{this.#u.open=o.checked,this.updateDisplay()}}));this.#b=o,this.#Q=this.#Z.add(new Jt("div","muigui-pop-down-values")),this.#tt=this.add(new Jt("div","muigui-pop-down-bottom")),this.setOptions(i)}setKnobColor(t){this.#b&&(this.#b.style=`\n --range-color: ${t};\n --value-bg-color: ${t};\n `)}updateDisplay(){super.updateDisplay();const{open:t}=this.#u;this.domElement.children[1].classList.toggle("muigui-open",t),this.domElement.children[1].classList.toggle("muigui-closed",!t)}setOptions(t){l(this.#u,t),super.setOptions(t),this.updateDisplay()}addTop(t){return this.#Q.add(t)}addBottom(t){return this.#tt.add(t)}}class ue extends le{#A;#S;#$;#et;constructor(t,e,n={}){super(t,e,"muigui-color-chooser");const i=n.format||St(this.getValue()),{color:o,text:r}=qt[i];this.#$=o.to,this.#S=new G(this,{converters:r,alpha:It(i)}),this.#A=new ae(this,{converters:o,alpha:It(i)}),this.addTop(this.#S),this.addBottom(this.#A),this.#et=()=>{if(this.#$){const t=this.#$(this.getValue()),e=yt(Z(t));e[2]=(e[2]+50)%100;const n=Q(vt(e));this.setKnobColor(`${t.substring(0,7)}FF`,n)}},this.updateDisplay()}updateDisplay(){super.updateDisplay(),this.#et&&this.#et()}setOptions(t){return super.setOptions(t),this}}class ce extends ee{add(t,e,...n){const i=t instanceof g?t:function(t,e,...n){const[i]=n;if(Array.isArray(i))return new z(t,e,{keyValues:i});const o=typeof t[e];switch(o){case"number":if("number"==typeof n[0]&&"number"==typeof n[1]){const i=n[0],o=n[1],r=n[2];return new B(t,e,{min:i,max:o,...r&&{step:r}})}return 0===n.length?new j(t,e,...n):new B(t,e,...n);case"boolean":return new N(t,e,...n);case"function":return new f(t,e,...n);case"string":return new R(t,e,...n);case"undefined":throw new Error(`no property named ${e}`);default:throw new Error(`unhandled type ${o} for property ${e}`)}}(t,e,...n);return this.addController(i)}addCanvas(t){return this.addController(new _t(t))}addColor(t,e,n={}){const i=t[e];return It(n.format||St(i))?this.addController(new ue(t,e,n)):this.addController(new Zt(t,e,n))}addDivider(){return this.addController(new Qt)}addFolder(t){return this.addController(new ce(t))}addLabel(t){return this.addController(new ne(t))}}class he extends HTMLElement{constructor(){super(),this.shadow=this.attachShadow({mode:"open"})}}customElements.define("muigui-element",he);const de=new CSSStyleSheet;de.replaceSync(t.default);const pe=new CSSStyleSheet;function me(t){let e,n;function i(){if(e&&!n){const o=e;e=void 0,n=t.replace(o).then((()=>{n=void 0,i()}))}}return function(t){e=t,i()}}const ge=me(de),fe=me(pe);class be extends ce{static converters=U;static mapRange=u;static makeRangeConverters=c;static makeRangeOptions=h;static makeMinMaxPair=p;#nt=new CSSStyleSheet;constructor(t={}){super("Controls","muigui-root"),t instanceof HTMLElement&&(t={parent:t});const{autoPlace:n=!0,width:i,title:o="Controls"}=t;let{parent:r}=t;if(i&&(this.domElement.style.width=/^\d+$/.test(i)?`${i}px`:i),void 0===r&&n&&(r=document.body,this.domElement.classList.add("muigui-auto-place")),r){const t=e("muigui-element");t.shadowRoot.adoptedStyleSheets=[de,pe,this.#nt],t.shadow.appendChild(this.domElement),r.appendChild(t)}o&&this.title(o),this.domElement.classList.add("muigui","muigui-colors")}setStyle(t){this.#nt.replace(t)}static setBaseStyles(t){ge(t)}static getBaseStyleSheet(){return de}static setUserStyles(t){fe(t)}static getUserStyleSheet(){return pe}static setTheme(e){be.setBaseStyles(`${t.default}\n${t.themes[e]||""}`)}}function ve(){}const xe={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]};function we(t,{onDown:e=ve,onUp:n=ve}){const i=function(t){const i=t.shiftKey?10:1,[o,r]=(xe[t.key]||[0,0]).map((t=>t*i));("keydown"===t.type?e:n)({type:t.type.substring(3),dx:o,dy:r,event:t})};return t.addEventListener("keydown",i),t.addEventListener("keyup",i),function(){t.removeEventListener("keydown",i),t.removeEventListener("keyup",i)}}function ye(t,e=""){if(!t)throw new Error(e)}function ke(t,e,n,i,o,r){const s=Math.abs(n)*Math.cos(r),a=Math.abs(i)*Math.sin(r);return[t+Math.cos(o)*s-Math.sin(o)*a,e+Math.sin(o)*s+Math.cos(o)*a]}function Ee(t,e,n,i,o){ye(Math.abs(i-o)<=2*Math.PI),ye(i>=-Math.PI&&i<=2*Math.PI),ye(i<=o),ye(o>=-Math.PI&&o<=4*Math.PI);const{x1:r,y1:s,x2:a,y2:l,fa:u,fs:c}=function(t,e,n,i,o,r,s){const[a,l]=ke(t,e,n,i,o,r),[u,c]=ke(t,e,n,i,o,r+s);return{x1:a,y1:l,x2:u,y2:c,fa:Math.abs(s)>Math.PI?1:0,fs:s>0?1:0}}(t,e,n,n,0,i,o-i);return Math.abs(Math.abs(i-o)-2*Math.PI)>Number.EPSILON?`M${t} ${e} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l} L${t} ${e}`:`M${r} ${s} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l}`}const $e=t=>a(t+Math.PI,2*Math.PI)-Math.PI;class Ce extends v{#it;#ot;#rt;#st;#u={step:1,min:-180,max:180,dirMin:-Math.PI,dirMax:Math.PI,wrap:void 0,converters:F};constructor(t,n={}){const i=L();super(e("div",{className:"muigui-direction muigui-no-scroll",innerHTML:'\n\n \x3c!----\x3e\n \n \n \n \n \n \n\n',onWheel:e=>{e.preventDefault();const{min:n,max:r,step:l}=this.#u,u=i(e,l);let c=this.#rt+u;this.#st&&(c=a(c-n,r-n)+n);const h=o(s(c,(t=>t),l),n,r);t.setValue(h)}}));const r=e=>{const{min:n,max:i,step:r,dirMin:a,dirMax:l}=this.#u,u=2*e.nx-1,c=2*e.ny-1,h=Math.atan2(c,u),d=(a+l)/2,p=o(($e(h-d)-$e(a-d))/(l-a),0,1),m=s(n+(i-n)*p,(t=>t),r);t.setValue(m)};re(this.domElement,{onDown:r,onMove:r}),we(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),this.#it=this.$("#muigui-arrow"),this.#ot=this.$("#muigui-range"),this.setOptions(n)}updateDisplay(t){this.#rt=t;const{min:e,max:n}=this.#u,i=(t-e)/(n-e),o=(r=this.#u.dirMin,s=this.#u.dirMax,r+(s-r)*i);var r,s;this.#it.style.transform=`rotate(${o}rad)`}setOptions(t){l(this.#u,t);const{dirMin:e,dirMax:n,wrap:i}=this.#u;this.#st=void 0!==i?i:Math.abs(e-n)>=2*Math.PI-Number.EPSILON;const[o,r]=e(o.push(i),e("label",{},[e("input",{type:"radio",name:r,value:a,onChange:function(){this.checked&&t.setFinalValue(s.#D[this.value])}}),e("button",{type:"button",textContent:n,onClick:function(){this.previousElementSibling.click()}})]))))));const s=this;this.#D=o,this.cols(i)}updateDisplay(t){const e=this.#D.indexOf(t);for(let t=0;t{e({rect:t.getBoundingClientRect(),elem:t})})).observe(t)}function Me(t,e,n,i){Ie(t,(({rect:o})=>{const{width:r,height:s}=o;t.setAttribute("viewBox",`-${r*e} -${s*n} ${r} ${s}`),i({elem:t,rect:o})}))}function Se(t,e,n,i,o,r){const a=[];tt),n)),e=Math.min(e,o);for(let i=t;i<=e;i+=n)a.push(`M${i} 0 l0 ${r}`);return a.join(" ")}class De extends v{#at;#lt;#ut;#ct;#ht;#dt;#pt;#mt;#gt;#rt;#ft;#u={min:-100,max:100,step:1,unit:10,unitSize:10,ticksPerUnit:5,labelFn:t=>t,tickHeight:1,limits:!0,thicksColor:void 0,orientation:void 0};constructor(t,n){const i=L();let r;super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \x3c!----\x3e\n \x3c!----\x3e\n \n \n \n \n\n',className:"muigui-no-v-scroll",onWheel:e=>{e.preventDefault();const{min:n,max:r,step:a}=this.#u,l=i(e,a),u=o(s(this.#rt+l,(t=>t),a),n,r);t.setValue(u)}})),this.#at=this.$("svg"),this.#lt=this.$("#muigui-origin"),this.#ut=this.$("#muigui-ticks"),this.#ct=this.$("#muigui-thicks"),this.#ht=this.$("#muigui-numbers"),this.#dt=this.$("#muigui-left-grad"),this.#pt=this.$("#muigui-right-grad"),this.setOptions(n),re(this.domElement,{onDown:()=>{r=this.#rt},onMove:e=>{const{min:n,max:i,unitSize:a,unit:l,step:u}=this.#u,c=o(s(r-e.dx/a*l,(t=>t),u),n,i);t.setValue(c)}}),we(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),Me(this.#at,.5,0,(({rect:{width:t}})=>{this.#dt.setAttribute("x",-t/2),this.#pt.setAttribute("x",t/2-20),this.#ft=function(t){const e=t.innerHTML;t.innerHTML="- ";const n=t.querySelector("text").getComputedTextLength();return t.innerHTML=e,n}(this.#ht),this.#mt=t,this.#bt()}))}#bt(){if(!this.#mt||void 0===this.#rt)return;const{labelFn:t,limits:e,min:n,max:i,orientation:o,tickHeight:r,ticksPerUnit:a,unit:l,unitSize:u,thicksColor:c}=this.#u,h=Math.ceil(this.#mt/u),d=this.#rt/l,p=Math.round(d-h),m=p*u,g=(p+2*h)*u,f=e?n*u/l:m,b=e?i*u/l:g,v=""===t(1)?10:5;a>1&&this.#ut.setAttribute("d",Se(m,g,u/a,f,b,v*r)),this.#ct.style.stroke=c,this.#ct.setAttribute("d",Se(m,g,u,f,b,v)),this.#ht.innerHTML=function(t,e,n,i,o,r,a,l){const u=[];tt),n)),e=Math.min(e,a);const c=Math.max(0,-Math.log10(i));for(let r=t;r<=e;r+=n)u.push(`${h=r/n*i,l(h.toFixed(c))}`);var h;return u.join("\n")}(m,g,u,l,this.#ft,f,b,t),this.#lt.setAttribute("transform",`translate(${-this.#rt*u/l} 0)`),this.#at.classList.toggle("muigui-slider-up","up"===o)}updateDisplay(t){this.#rt=t,this.#bt()}setOptions(t){return l(this.#u,t),this}}class Ne extends v{#at;#it;#H;#rt=[];constructor(t){super(e("div",{innerHTML:'\n\n \n \n \n \n \n\n',className:"muigui-no-scroll"}));const n=e=>{const{width:n,height:i}=this.#at.getBoundingClientRect(),o=2*e.nx-1,r=2*e.ny-1;t.setValue([o*n*.5,r*i*.5])};re(this.domElement,{onDown:n,onMove:n}),this.#at=this.$("svg"),this.#it=this.$("#muigui-arrow"),this.#H=this.$("#muigui-circle"),Me(this.#at,.5,.5,(()=>this.#vt))}#vt(){const[t,e]=this.#rt;this.#it.setAttribute("d",`M0,0L${t},${e}`),this.#H.setAttribute("transform",`translate(${t}, ${e})`)}updateDisplay(t){this.#rt[0]=t[0],this.#rt[1]=t[1],this.#vt()}}return be.ColorChooser=ue,be.Direction=class extends le{#u;constructor(t,e,n){super(t,e,"muigui-direction"),this.#u=n,this.addTop(new O(this,F)),this.addBottom(new Ce(this,n)),this.updateDisplay()}},be.RadioGrid=class extends D{constructor(t,e,n){super(t,e,"muigui-radio-grid");const i="number"==typeof this.getValue(),{keyValues:o,cols:r=3}=n,s=H(o,i);this.add(new Ve(this,s,r)),this.updateDisplay()}},be.Range=B,be.Select=z,be.Slider=class extends D{constructor(t,e,n={}){super(t,e,"muigui-slider"),this.add(new De(this,n)),this.add(new O(this,n)),this.updateDisplay()}},be.TextNumber=j,be.Vec2=class extends le{constructor(t,e){super(t,e,"muigui-vec2");const n=t=>({setValue:e=>{const n=this.getValue();n[t]=e,this.setValue(n)},setFinalValue:e=>{const n=this.getValue();n[t]=e,this.setFinalValue(n)}});this.addTop(new O(n(0),{converters:{to:t=>t[0],from:A.from}})),this.addTop(new O(n(1),{converters:{to:t=>t[1],from:A.from}})),this.addBottom(new Ne(this)),this.updateDisplay()}},be})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).GUI=e()}(this,(function(){"use strict";var t={default:'\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #8BF;\n --range-color: #AAA;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: \n linear-gradient(\n rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #458; /*#88AAFF*/;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: linear-gradient(\n rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root {\n z-index: 1;\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n /* white-space: pre; why?? */\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n content: "X";\n color: rgba(0, 0, 0, 0);\n background-color: var(--range-color);\n border-radius: 0.2em;\n width: 1.25em;\n margin-right: 0.25em;\n height: 1.25em; /*var(--line-height);*/\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n background-image: var(--image-open);\n}\n.muigui-closed>button>label::before {\n background-image: var(--image-closed);\n}\n\n.muigui-open>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: auto;\n height: 100%;\n}\n.muigui-closed>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: hidden;\n min-height: 0;\n}\n.muigui-open>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: 0px;\n}\n.muigui-closed>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: -100%;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-closed .muigui-pop-down-bottom {\n max-height: 0;\n}\n\n.muigui-value .muigui-pop-down-bottom {\n margin: 0;\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n background-image: var(--image-checkerboard);\n background-size: 10px 10px;\n background-position: 0 0, 0 5px, 5px -5px, -5px 0px;\n\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: "+";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: "X";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n padding: 2px 0 2px 0;\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n background-image: var(--button-image);\n cursor: pointer;\n place-content: center center;\n height: var(--line-height);\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: "";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: "✔";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 6px) / -2);\n width: calc(var(--line-height) - 6px);\n height: calc(var(--line-height) - 6px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn\'t work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n',themes:{default:{include:["default"],css:"\n "},float:{include:["default"],css:"\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n"},form:{include:[],css:"\n .muigui {\n --width: 100%;\n --label-width: 45%;\n --number-width: 40%;\n }\n .muigui-root>button {\n display: none;\n }\n .muigui-controller {\n margin-top: 1em;\n }\n .muigui-label-controller {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n margin-top: 1em;\n }\n .muigui-label-controller:has(.muigui-checkbox) {\n flex-direction: row;\n }\n .muigui-value {\n display: flex;\n align-items: stretch;\n }\n .muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n }\n .muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n }\n .muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n }\n .muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n }\n "},none:{include:[],css:""}}};function e(t,e={},n=[]){const i=document.createElement(t);return function(t,e,n){for(const[n,i]of Object.entries(e))if("function"==typeof i&&n.startsWith("on")){const e=n.substring(2).toLowerCase();t.addEventListener(e,i,{passive:!1})}else if("object"==typeof i)for(const[e,o]of Object.entries(i))t[n][e]=o;else void 0===t[n]?t.setAttribute(n,i):t[n]=i;for(const e of n)t.appendChild(e)}(i,e,n),i}let n=0;function i(t,e){const n=t.indexOf(e);return n&&t.splice(n,1),t}function o(t,e,n){return Math.max(e,Math.min(n,t))}const r="undefined"!=typeof SharedArrayBuffer?function(t){return t&&t.buffer&&(t.buffer instanceof ArrayBuffer||t.buffer instanceof SharedArrayBuffer)}:function(t){return t&&t.buffer&&t.buffer instanceof ArrayBuffer},s=(t,e,n)=>Math.round(e(t)/n)/(1/n),a=(t,e)=>(t%e+e)%e;function l(t,e){for(const n in e)n in t&&(t[n]=e[n]);return t}const u=(t,e,n,i,o)=>(t-e)*(o-i)/(n-e)+i,c=({from:t,to:e})=>({to:n=>u(n,...t,...e),from:n=>[!0,u(n,...e,...t)]}),h=({from:t,to:e,step:n})=>({min:e[0],max:e[1],...n&&{step:n},converters:c({from:t,to:e})}),d={to:t=>t,from:t=>[!0,t]};function m(t,e,n,i,o){const{converters:{from:r}=d}=o,{min:s,max:a}=o,l=o.minRange||0,u=r(l)[1],c=t.add(e,n,{...o,min:s,max:a-l}).onChange((t=>{h.setValue(Math.min(a,Math.max(t+u,e[i])))})),h=t.add(e,i,{...o,min:s+l,max:a}).onChange((t=>{c.setValue(Math.max(s,Math.min(t-u,e[n])))}));return[c,h]}class p{domElement;#t;#e=[];constructor(t){this.domElement=t,this.#t=t}addElem(t){return this.#t.appendChild(t),t}removeElem(t){return this.#t.removeChild(t),t}pushSubElem(t){this.#t.appendChild(t),this.#t=t}popSubElem(){this.#t=this.#t.parentElement}add(t){return this.#e.push(t),this.addElem(t.domElement),t}remove(t){return this.removeElem(t.domElement),i(this.#e,t),t}pushSubView(t){this.pushSubElem(t.domElement)}popSubView(){this.popSubElem()}setOptions(t){for(const e of this.#e)e.setOptions(t)}updateDisplayIfNeeded(t,e){for(const n of this.#e)n.updateDisplayIfNeeded(t,e);return this}$(t){return this.domElement.querySelector(t)}}class g extends p{#n;#i;#o;constructor(t){super(e("div",{className:"muigui-controller"})),this.#n=[],this.#i=[],t&&this.domElement.classList.add(t)}get parent(){return this.#o}setParent(t){this.#o=t,this.enable(!this.disabled())}show(t=!0){return this.domElement.classList.toggle("muigui-hide",!t),this.domElement.classList.toggle("muigui-show",t),this}hide(){return this.show(!1)}disabled(){return!!this.domElement.closest(".muigui-disabled")}enable(t=!0){return this.domElement.classList.toggle("muigui-disabled",!t),["input","button","select","textarea"].forEach((t=>{this.domElement.querySelectorAll(t).forEach((t=>{const e=!!t.closest(".muigui-disabled");t.disabled=e}))})),this}disable(t=!0){return this.enable(!t)}onChange(t){return this.removeChange(t),this.#n.push(t),this}removeChange(t){return i(this.#n,t),this}onFinishChange(t){return this.removeFinishChange(t),this.#i.push(t),this}removeFinishChange(t){return i(this.#i,t),this}#r(t,e){for(const n of t)n.call(this,e)}emitChange(t,e,n){this.#r(this.#n,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitChange({object:e,property:n,value:t,controller:this}))}emitFinalChange(t,e,n){this.#r(this.#i,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitFinalChange({object:e,property:n,value:t,controller:this}))}updateDisplay(){}getColors(){const t=t=>t.replace(/-([a-z])/g,((t,e)=>e.toUpperCase())),n=e("div");this.domElement.appendChild(n);const i=Object.fromEntries(["color","bg-color","value-color","value-bg-color","hover-bg-color","menu-bg-color","menu-sep-color","disabled-color"].map((e=>{n.style.color=`var(--${e})`;const i=getComputedStyle(n);return[t(e),i.color]})));return n.remove(),i}}class b extends g{#s;#a;#l;#u={name:""};constructor(t,n,i={}){super("muigui-button",""),this.#s=t,this.#a=n,this.#l=this.addElem(e("button",{type:"button",onClick:()=>{this.#s[this.#a](this)}})),this.setOptions({name:n,...i})}name(t){this.#l.textContent=t}setOptions(t){l(this.#u,t);const{name:e}=this.#u;this.#l.textContent=e}}function f(t,e){if(t.length!==e.length)return!1;for(let n=0;n{t.setValue(i.checked)},onChange:()=>{t.setFinalValue(i.checked)}});super(e("label",{},[i])),this.#f=i}updateDisplay(t){this.#f.checked=t}}const w=[],y=new Set;let k,E;function I(){k=void 0,E=!0;for(const t of w)y.has(t)||t();E=!1,y.size&&(E?$():(y.forEach((t=>{i(w,t)})),y.clear())),$()}function $(){!k&&w.length&&(k=requestAnimationFrame(I))}let C=0;function M(){return"muigui-"+ ++C}class S extends p{constructor(t=""){super(e("div",{className:"muigui-value"})),t&&this.domElement.classList.add(t)}}class V extends g{#v;#x;constructor(t="",n=""){super("muigui-label-controller"),this.#v=M(),this.#x=e("label",{for:this.#v}),this.domElement.appendChild(this.#x),this.pushSubView(new S(t)),this.name(n)}get id(){return this.#v}name(t){return this.#x.title===this.#x.textContent&&(this.#x.title=t),this.#x.textContent=t,this}tooltip(t){this.#x.title=t}}class D extends V{#s;#a;#w;#y;#e;#k;constructor(t,e,n=""){super(n,e),this.#s=t,this.#a=e,this.#w=this.getValue(),this.#y=!1,this.#e=[]}get initialValue(){return this.#w}get object(){return this.#s}get property(){return this.#a}add(t){return this.#e.push(t),super.add(t),this.updateDisplay(),t}#E(t,e){let n=!1;if("object"==typeof t){const e=this.#s[this.#a];if(Array.isArray(t)||r(t))for(let i=0;i=0&&w.splice(e,1)}(this.#k)),this}}class N extends D{constructor(t,e){super(t,e,"muigui-checkbox");const n=this.id;this.add(new x(this,n)),this.updateDisplay()}}const A={to:t=>t,from:t=>[!0,t]},j={to:t=>t.toString(),from:t=>{const e=parseFloat(t);return[!Number.isNaN(e),e]}},U={radToDeg:c({to:[0,180],from:[0,Math.PI]})};function L(){let t=0;return function(e,n,i=5){t-=e.deltaY*n/i;const o=Math.floor(Math.abs(t)/n)*Math.sign(t)*n;return t-=o,o}}class F extends v{#I;#$;#C;#M;#u={step:.01,converters:j,min:Number.NEGATIVE_INFINITY,max:Number.POSITIVE_INFINITY};constructor(t,n){const i=t.setValue.bind(t),r=t.setFinalValue.bind(t),a=L();super(e("input",{type:"number",onInput:()=>{this.#S(i,!0)},onChange:()=>{this.#S(r,!1)},onWheel:e=>{e.preventDefault();const{min:n,max:i,step:r}=this.#u,l=a(e,r),u=parseFloat(this.domElement.value),c=o(s(u+l,(t=>t),r),n,i),[h,d]=this.#$(c);h&&t.setValue(d)}})),this.setOptions(n)}#S(t,e){const n=parseFloat(this.domElement.value),[i,r]=this.#$(n);let s;if(i&&!Number.isNaN(n)){const{min:n,max:i}=this.#u;s=r>=n&&r<=i,this.#M=e,t(o(r,n,i))}this.domElement.classList.toggle("muigui-invalid-value",!i||!s)}updateDisplay(t){this.#M||(this.domElement.value=s(t,this.#I,this.#C)),this.#M=!1}setOptions(t){l(this.#u,t);const{step:e,converters:{to:n,from:i}}=this.#u;return this.#I=n,this.#$=i,this.#C=e,this}}class P extends D{#V;#C;constructor(t,e,n={}){super(t,e,"muigui-text-number"),this.#V=this.add(new F(this,n)),this.updateDisplay()}}class O extends v{#D;constructor(t,n){const i=[];super(e("select",{onChange:()=>{t.setFinalValue(this.#D[this.domElement.selectedIndex])}},n.map((([t,n])=>(i.push(n),e("option",{textContent:t})))))),this.#D=i}updateDisplay(t){const e=this.#D.indexOf(t);this.domElement.selectedIndex=e}}function H(t,e){return Array.isArray(t)?Array.isArray(t[0])?t:e?t.map(((t,e)=>[t,e])):t.map((t=>[t,t])):[...Object.entries(t)]}class T extends D{constructor(t,e,n){super(t,e,"muigui-select");const i="number"==typeof this.getValue(),{keyValues:o}=n,r=H(o,i);this.add(new O(this,r)),this.updateDisplay()}}class z extends v{#I;#$;#C;#M;#u={step:.01,min:0,max:1,converters:A};constructor(t,n){const i=L();super(e("input",{type:"range",onInput:()=>{this.#M=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#$(a);l&&t.setValue(u)},onChange:()=>{this.#M=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#$(a);l&&t.setFinalValue(u)},onWheel:e=>{e.preventDefault();const[n,r]=this.#$(parseFloat(this.domElement.value));if(!n)return;const{min:a,max:l,step:u}=this.#u,c=i(e,u),h=o(s(r+c,(t=>t),u),a,l);t.setValue(h)}})),this.setOptions(n)}updateDisplay(t){this.#M||(this.domElement.value=s(t,this.#I,this.#C)),this.#M=!1}setOptions(t){l(this.#u,t);const{step:e,min:n,max:i,converters:{to:o,from:r}}=this.#u;return this.#I=o,this.#$=r,this.#C=e,this.domElement.step=e,this.domElement.min=n,this.domElement.max=i,this}}class W extends D{constructor(t,e,n){super(t,e,"muigui-range"),this.add(new z(this,n)),this.add(new F(this,n))}}class B extends v{#I;#$;#M;#u={converters:A};constructor(t,n){const i=t.setValue.bind(t),o=t.setFinalValue.bind(t);super(e("input",{type:"text",onInput:()=>{this.#S(i,!0)},onChange:()=>{this.#S(o,!1)}})),this.setOptions(n)}#S(t,e){const[n,i]=this.#$(this.domElement.value);n&&(this.#M=e,t(i)),this.domElement.style.color=n?"":"var(--invalid-color)"}updateDisplay(t){this.#M||(this.domElement.value=this.#I(t),this.domElement.style.color=""),this.#M=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#I=e,this.#$=n,this}}class G extends D{constructor(t,e){super(t,e,"muigui-text"),this.add(new B(this)),this.updateDisplay()}}const R=(t,e,n)=>Math.max(e,Math.min(n,t)),Z=(t,e,n)=>t+(e-t)*n,J=t=>t>=0?t%1:1-t%1,Y=t=>+t.toFixed(0),Q=t=>+t.toFixed(3),K=t=>parseInt(t.substring(1,3),16)<<16|parseInt(t.substring(3,5),16)<<8|parseInt(t.substring(5,7),16),_=t=>parseInt(t.substring(1,3),16)*2**24+65536*parseInt(t.substring(3,5),16)+256*parseInt(t.substring(5,7),16)+parseInt(t.substring(7,9),16),q=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16)],X=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,tt=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16),parseInt(t.substring(7,9),16)],et=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,nt=t=>q(t).map((t=>Q(t/255))),it=t=>X(Array.from(t).map((t=>Math.round(R(255*t,0,255))))),ot=t=>tt(t).map((t=>Q(t/255))),rt=t=>et(Array.from(t).map((t=>Math.round(R(255*t,0,255))))),st=t=>R(Math.round(255*t),0,255).toString(16).padStart(2,"0"),at=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255}),lt=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255,a:parseInt(t.substring(7,9),16)/255}),ut=t=>`rgb(${q(t).join(", ")})`,ct=/^\s*rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/,ht=t=>`rgba(${tt(t).map(((t,e)=>3===e?t/255:t)).join(", ")})`,dt=/^\s*rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+\.\d+|\d+)\s*\)\s*$/,mt=t=>{const e=yt(q(t)).map((t=>Y(t)));return`hsl(${e[0]}, ${e[1]}%, ${e[2]}%)`},pt=t=>{const e=kt(tt(t)).map(((t,e)=>3===e?Q(t):Y(t)));return`hsl(${e[0]} ${e[1]}% ${e[2]}% / ${e[3]})`},gt=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\)\s*$/,bt=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\/\s*(\d+\.\d+|\d+)\s*\)\s*$/,ft=(t,e)=>(t%e+e)%e;function vt([t,e,n]){t=ft(t,360),e=R(e/100,0,1),n=R(n/100,0,1);const i=e*Math.min(n,1-n);function o(e){const o=(e+t/30)%12;return n-i*Math.max(-1,Math.min(o-3,9-o,1))}return[o(0),o(8),o(4)].map((t=>Math.round(255*t)))}function xt([t,e,n]){const i=Math.max(t,e,n),o=Math.min(t,e,n),r=.5*(o+i),s=i-o;let a=0,l=0;if(0!==s)switch(l=0===r||1===r?0:(i-r)/Math.min(r,1-r),i){case t:a=(e-n)/s+(e{const[e,n,i]=xt(t.map((t=>t/255)));return[360*e,100*n,100*i]},kt=t=>{const[e,n,i,o]=wt(t.map((t=>t/255)));return[360*e,100*n,100*i,o]};function Et([t,e,n]){return e=R(e,0,1),n=R(n,0,1),[t,t+2/3,t+1/3].map((t=>Z(1,R(Math.abs(6*J(t)-3)-1,0,1),e)*n))}function It([t,e,n,i]){return[...Et([t,e,n]),i]}const $t=t=>Math.round(1e3*t)/1e3;function Ct([t,e,n]){const i=n>e?[n,e,-1,2/3]:[e,n,0,-1/3],o=i[0]>t?[i[0],i[1],i[3],t]:[t,i[1],i[2],i[0]],r=o[0]-Math.min(o[3],o[1]);return[Math.abs(o[2]+(o[3]-o[1])/(6*r+Number.EPSILON)),r/(o[0]+Number.EPSILON),o[0]].map($t)}function Mt([t,e,n,i]){return[...Ct([t,e,n]),i]}const St=t=>t.endsWith("a")||t.startsWith("hex8"),Vt=[{re:/^#(?:[0-9a-f]){6}$/i,format:"hex6"},{re:/^(?:[0-9a-f]){6}$/i,format:"hex6-no-hash"},{re:/^#(?:[0-9a-f]){8}$/i,format:"hex8"},{re:/^(?:[0-9a-f]){8}$/i,format:"hex8-no-hash"},{re:/^#(?:[0-9a-f]){3}$/i,format:"hex3"},{re:/^(?:[0-9a-f]){3}$/i,format:"hex3-no-hash"},{re:ct,format:"css-rgb"},{re:gt,format:"css-hsl"},{re:dt,format:"css-rgba"},{re:bt,format:"css-hsla"}];function Dt(t){switch(typeof t){case"number":return console.warn('can not reliably guess format based on a number. You should pass in a format like {format: "uint32-rgb"} or {format: "uint32-rgb"}'),t<=16777215?"uint32-rgb":"uint32-rgba";case"string":{const e=function(t){for(const e of Vt)if(e.re.test(t))return e}(t.trim());if(e)return e.format;break}case"object":if(t instanceof Uint8Array||t instanceof Uint8ClampedArray){if(3===t.length)return"uint8-rgb";if(4===t.length)return"uint8-rgba"}else if(t instanceof Float32Array){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if(Array.isArray(t)){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if("r"in t&&"g"in t&&"b"in t)return"a"in t?"object-rgba":"object-rgb"}throw new Error(`unknown color format: ${t}`)}function Nt(t){return t.trim(t)}function At(t){return t.trim(t)}function jt(t){return t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]?`#${t[1]}${t[3]}${t[5]}`:t}const Ut=/^(#|)([0-9a-f]{3})$/i;function Lt(t){const e=Ut.exec(t);if(e){const[,,t]=e;return"#"+`${(n=t)[0]}${n[0]}${n[1]}${n[1]}${n[2]}${n[2]}`}var n;return t}function Ft(t){return jt(Nt(t))}const Pt=t=>{const e=ct.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),`rgb(${n.join(", ")})`]},Ot=t=>{const e=dt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?parseFloat(t):parseInt(t)));return[!n.find((t=>t>255)),`rgba(${n.join(", ")})`]},Ht=t=>{const e=gt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]}, ${n[1]}%, ${n[2]}%)`]},Tt=t=>{const e=bt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]} ${n[1]}% ${n[2]}% / ${n[3]})`]},zt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Wt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Bt=t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(3!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>Q(t)))]},Gt=t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(4!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>Q(t)))]},Rt=/^\s*(?:0x){0,1}([0-9a-z]{1,6})\s*$/i,Zt=/^\s*(?:0x){0,1}([0-9a-z]{1,8})\s*$/i,Jt=/^\s*#[a-f0-9]{6}\s*$|^\s*#[a-f0-9]{3}\s*$/i,Yt=/^\s*[a-f0-9]{6}\s*$/i,Qt=/^\s*#[a-f0-9]{8}\s*$/i,Kt=/^\s*[a-f0-9]{8}\s*$/i,_t={hex6:{color:{from:t=>[!0,t],to:Nt},text:{from:t=>[Jt.test(t),t.trim()],to:t=>t}},hex8:{color:{from:t=>[!0,t],to:At},text:{from:t=>[Qt.test(t),t.trim()],to:t=>t}},hex3:{color:{from:t=>[!0,Ft(t)],to:Lt},text:{from:t=>[Jt.test(t),jt(t.trim())],to:t=>t}},"hex6-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${Nt(t)}`},text:{from:t=>[Yt.test(t),t.trim()],to:t=>t}},"hex8-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${At(t)}`},text:{from:t=>[Kt.test(t),t.trim()],to:t=>t}},"hex3-no-hash":{color:{from:t=>[!0,Ft(t).substring(1)],to:Lt},text:{from:t=>[Yt.test(t),jt(t.trim())],to:t=>t}},"uint32-rgb":{color:{from:t=>[!0,K(t)],to:t=>`#${Math.round(t).toString(16).padStart(6,"0")}`},text:{from:t=>(t=>{const e=Rt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(6,"0")}`}},"uint32-rgba":{color:{from:t=>[!0,_(t)],to:t=>`#${Math.round(t).toString(16).padStart(8,"0")}`},text:{from:t=>(t=>{const e=Zt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(8,"0")}`}},"uint8-rgb":{color:{from:t=>[!0,q(t)],to:X},text:{from:t=>{const e=zt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"uint8-rgba":{color:{from:t=>[!0,tt(t)],to:et},text:{from:t=>{const e=Wt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"float-rgb":{color:{from:t=>[!0,nt(t)],to:it},text:{from:Bt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"float-rgba":{color:{from:t=>[!0,ot(t)],to:rt},text:{from:Gt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"float-hsv":{color:{from:t=>[!0,Ct(nt(t))],to:t=>Et(it(t))},text:{from:Bt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"float-hsva":{color:{from:t=>[!0,Mt(nt(t))],to:t=>It(it(t))},text:{from:Gt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"object-rgb":{color:{from:t=>[!0,at(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b))throw new Error("not {r, g, b}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${Q(t.r)}, g:${Q(t.g)}, b:${Q(t.b)}}`}},"object-rgba":{color:{from:t=>[!0,lt(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}${st(t.a)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b)||Number.isNaN(n.a))throw new Error("not {r, g, b, a}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${Q(t.r)}, g:${Q(t.g)}, b:${Q(t.b)}}, a:${Q(t.a)}}`}},"css-rgb":{color:{from:t=>[!0,ut(t)],to:t=>{const e=ct.exec(t);return X([e[1],e[2],e[3]].map((t=>parseInt(t))))}},text:{from:Pt,to:t=>Pt(t)[1]}},"css-rgba":{color:{from:t=>[!0,ht(t)],to:t=>{const e=dt.exec(t);return et([e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?255*parseFloat(t)|0:parseInt(t))))}},text:{from:Ot,to:t=>Ot(t)[1]}},"css-hsl":{color:{from:t=>[!0,mt(t)],to:t=>{const e=gt.exec(t),n=vt([e[1],e[2],e[3]].map((t=>parseFloat(t))));return X(n)}},text:{from:Ht,to:t=>Ht(t)[1]}},"css-hsla":{color:{from:t=>[!0,pt(t)],to:t=>{const e=bt.exec(t),n=function([t,e,n,i]){return[...vt([t,e,n]),255*i|0]}([e[1],e[2],e[3],e[4]].map((t=>parseFloat(t))));return et(n)}},text:{from:Tt,to:t=>Tt(t)[1]}}};class qt extends p{constructor(t,n){super(e(t,{className:n}))}}class Xt extends V{#N;constructor(t){super("muigui-canvas",t),this.#N=this.add(new qt("canvas","muigui-canvas")).domElement}get canvas(){return this.#N}}class te extends v{#I;#$;#A;#M;#u={converters:A};constructor(t,n){const i=e("input",{type:"color",onInput:()=>{const[e,n]=this.#$(i.value);e&&(this.#M=!0,t.setValue(n))},onChange:()=>{const[e,n]=this.#$(i.value);e&&(this.#M=!0,t.setFinalValue(n))}});super(e("div",{},[i])),this.setOptions(n),this.#A=i}updateDisplay(t){this.#M||(this.#A.value=this.#I(t)),this.#M=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#I=e,this.#$=n,this}}class ee extends D{#j;#V;constructor(t,e,n={}){super(t,e,"muigui-color");const i=n.format||Dt(this.getValue()),{color:o,text:r}=_t[i];this.#j=this.add(new te(this,{converters:o})),this.#V=this.add(new B(this,{converters:r})),this.updateDisplay()}setOptions(t){const{format:e}=t;if(e){const{color:t,text:n}=_t[e];this.#j.setOptions({converters:t}),this.#V.setOptions({converters:n})}return super.setOptions(t),this}}class ne extends g{constructor(){super("muigui-divider")}}class ie extends g{#U;#L;constructor(t){super(t),this.#U=[],this.#L=this}get children(){return this.#U}get controllers(){return this.#U.filter((t=>!(t instanceof ie)))}get folders(){return this.#U.filter((t=>t instanceof ie))}reset(t=!0){for(const e of this.#U)e instanceof ie&&!t||e.reset(t);return this}updateDisplay(){for(const t of this.#U)t.updateDisplay();return this}remove(t){const e=this.#U.indexOf(t);if(e>=0){const t=this.#U.splice(e,1)[0];t.domElement.remove(),t.setParent(null)}return this}#F(t){return this.domElement.appendChild(t.domElement),this.#U.push(t),t.setParent(this),t}addController(t){return this.#L.#F(t)}pushContainer(t){return this.addController(t),this.#L=t,t}popContainer(){return this.#L=this.#L.parent,this}}class oe extends ie{#P;constructor(t="Controls",n="muigui-menu"){super(n),this.#P=e("label"),this.addElem(e("button",{type:"button",onClick:()=>this.toggleOpen()},[this.#P])),this.pushContainer(new ie("muigui-open-container")),this.pushContainer(new ie),this.name(t),this.open()}open(t=!0){return this.domElement.classList.toggle("muigui-closed",!t),this.domElement.classList.toggle("muigui-open",t),this}close(){return this.open(!1)}name(t){return this.#P.textContent=t,this}title(t){return this.name(t)}toggleOpen(){return this.open(!this.domElement.classList.contains("muigui-open")),this}}class re extends g{constructor(t){super("muigui-label"),this.text(t)}text(t){return this.domElement.textContent=t,this}}function se(){}function ae(t,e,n){const i=t.getBoundingClientRect(),o=e.clientX-i.left,r=e.clientY-i.top,s=o/i.width,a=r/i.height,l=o-(n=n||[o,r])[0],u=r-n[1];return{x:o,y:r,nx:s,ny:a,dx:l,dy:u,ndx:l/i.width,ndy:u/i.width}}function le(t,{onDown:e=se,onMove:n=se,onUp:i=se}){let o;const r=function(e){const i={type:"move",...ae(t,e,o)};n(i)},s=function(e){t.releasePointerCapture(e.pointerId),t.removeEventListener("pointermove",r),t.removeEventListener("pointerup",s),document.body.style.backgroundColor="",i("up")},a=function(n){t.addEventListener("pointermove",r),t.addEventListener("pointerup",s),t.setPointerCapture(n.pointerId);const i=ae(t,n);o=[i.x,i.y],e({type:"down",...i})};return t.addEventListener("pointerdown",a),function(){t.removeEventListener("pointerdown",a)}}function ue(t){return t.querySelectorAll("[data-src]").forEach((e=>{const i="muigui-id-"+n++;e.id=i,t.querySelectorAll(`[data-target=${e.dataset.src}]`).forEach((t=>{t.setAttribute("fill",`url(#${i})`)}))})),t}class ce extends v{#I;#$;#O;#H;#T;#z;#W;#B;#G;#R;#Z;#J;#Y;#Q;#u={converters:A,alpha:!1};#K;#_;constructor(t,n){super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n',className:"muigui-no-scroll"})),this.#O=this.domElement.children[0],this.#T=this.domElement.children[1],this.#B=this.domElement.children[2],ue(this.#O),ue(this.#T),ue(this.#B),this.#H=this.$(".muigui-color-chooser-circle"),this.#z=this.$("[data-src=muigui-color-chooser-hue]"),this.#W=this.$(".muigui-color-chooser-hue-cursor"),this.#G=this.$("[data-src=muigui-color-chooser-alpha]"),this.#R=this.$(".muigui-color-chooser-alpha-cursor");const i=e=>{const n=o(e.nx,0,1),i=o(e.ny,0,1);this.#Z[1]=n,this.#Z[2]=1-i,this.#J=!0,this.#Q=!0;const[r,s]=this.#$(this.#K(this.#Z));r&&t.setValue(s)},r=e=>{const n=o(e.nx,0,1);this.#Z[0]=n,this.#Y=!0,this.#Q=!0;const[i,r]=this.#$(this.#K(this.#Z));i&&t.setValue(r)},s=e=>{const n=o(e.nx,0,1);this.#Z[3]=n,this.#J=!0,this.#Y=!0;const[i,r]=this.#$(this.#K(this.#Z));i&&t.setValue(r)};le(this.#O,{onDown:i,onMove:i}),le(this.#T,{onDown:r,onMove:r}),le(this.#B,{onDown:s,onMove:s}),this.setOptions(n)}updateDisplay(t){this.#Z||(this.#Z=this.#_(this.#I(t)));{const[e,n,i,o=1]=this.#_(this.#I(t));this.#J||(this.#Z[0]=n>.001&&i>.001?e:this.#Z[0]),this.#Y||(this.#Z[1]=n,this.#Z[2]=i),this.#Q||(this.#Z[3]=o)}{const[t,e,n,i]=this.#Z,[o,r,s]=wt(It(this.#Z));this.#J||this.#W.setAttribute("transform",`translate(${64*t}, 0)`),this.#z.children[0].setAttribute("stop-color",`hsl(${360*o} 0% 100% / ${i})`),this.#z.children[1].setAttribute("stop-color",`hsl(${360*o} 100% 50% / ${i})`),this.#Q||this.#R.setAttribute("transform",`translate(${64*i}, 0)`),this.#G.children[0].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 0)`),this.#G.children[1].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 1)`),this.#Y||(this.#H.setAttribute("cx",""+64*e),this.#H.setAttribute("cy",""+48*(1-n)))}this.#J=!1,this.#Y=!1,this.#Q=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n},alpha:i}=this.#u;return this.#B.style.display=i?"":"none",this.#K=i?t=>rt(It(t)):t=>it(Et(t)),this.#_=i?t=>Mt(ot(t)):t=>Ct(nt(t)),this.#I=e,this.#$=n,this}}class he extends D{#q;#X;#f;#tt;#u={open:!1};constructor(t,n,i={}){super(t,n,"muigui-pop-down-controller"),this.#q=this.add(new qt("div","muigui-pop-down-top"));const o=this.#q.addElem(e("input",{type:"checkbox",onChange:()=>{this.#u.open=o.checked,this.updateDisplay()}}));this.#f=o,this.#X=this.#q.add(new qt("div","muigui-pop-down-values"));const r=new qt("div","muigui-pop-down-bottom muigui-open-container");this.#tt=new qt("div"),r.add(this.#tt),this.add(r),this.setOptions(i)}setKnobColor(t){this.#f&&(this.#f.style=`\n --range-color: ${t};\n --value-bg-color: ${t};\n `)}updateDisplay(){super.updateDisplay();const{open:t}=this.#u;this.domElement.children[1].classList.toggle("muigui-open",t),this.domElement.children[1].classList.toggle("muigui-closed",!t)}setOptions(t){l(this.#u,t),super.setOptions(t),this.updateDisplay()}addTop(t){return this.#X.add(t)}addBottom(t){return this.#tt.add(t)}}class de extends he{#j;#V;#I;constructor(t,e,n={}){super(t,e,"muigui-color-chooser");const i=n.format||Dt(this.getValue()),{color:o,text:r}=_t[i];this.#I=o.to,this.#V=new B(this,{converters:r,alpha:St(i)}),this.#j=new ce(this,{converters:o,alpha:St(i)}),this.addTop(this.#V),this.addBottom(this.#j),this.___setKnobHelper=!0,this.updateDisplay()}#et(){if(this.#I){const t=this.#I(this.getValue()),e=9===t.length?t.substring(7,9):"FF",n=yt(q(t));n[2]=(n[2]+50)%100;const i=X(vt(n));this.setKnobColor(`${t.substring(0,7)}${e}`,i)}}updateDisplay(){super.updateDisplay(),this.___setKnobHelper&&this.#et()}setOptions(t){return super.setOptions(t),this}}class me extends oe{add(t,e,...n){const i=t instanceof g?t:function(t,e,...n){const[i]=n;if(Array.isArray(i))return new T(t,e,{keyValues:i});if(i&&i.keyValues)return new T(t,e,{keyValues:i.keyValues});const o=typeof t[e];switch(o){case"number":if("number"==typeof n[0]&&"number"==typeof n[1]){const i=n[0],o=n[1],r=n[2];return new W(t,e,{min:i,max:o,...r&&{step:r}})}return 0===n.length?new P(t,e,...n):new W(t,e,...n);case"boolean":return new N(t,e,...n);case"function":return new b(t,e,...n);case"string":return new G(t,e,...n);case"undefined":throw new Error(`no property named ${e}`);default:throw new Error(`unhandled type ${o} for property ${e}`)}}(t,e,...n);return this.addController(i)}addCanvas(t){return this.addController(new Xt(t))}addColor(t,e,n={}){const i=t[e];return St(n.format||Dt(i))?this.addController(new de(t,e,n)):this.addController(new ee(t,e,n))}addDivider(){return this.addController(new ne)}addFolder(t){return this.addController(new me(t))}addLabel(t){return this.addController(new re(t))}addButton(t,e){const n={fn:e};return this.add(n,"fn").name(t)}}class pe extends HTMLElement{constructor(){super(),this.shadow=this.attachShadow({mode:"open"})}}customElements.define("muigui-element",pe);const ge=new CSSStyleSheet,be=new CSSStyleSheet;function fe(t){let e,n;function i(){if(e&&!n){const o=e;e=void 0,n=t.replace(o).then((()=>{n=void 0,i()}))}}return function(t){e=t,i()}}const ve=fe(ge),xe=fe(be);function we(e){const{include:n,css:i}=t.themes[e];return`${n.map((e=>t[e])).join("\n")} : css.default}\n${i||""}`}class ye extends me{static converters=U;static mapRange=u;static makeRangeConverters=c;static makeRangeOptions=h;static makeMinMaxPair=m;#nt=new CSSStyleSheet;constructor(n={}){super("Controls","muigui-root"),n instanceof HTMLElement&&(n={parent:n});const{autoPlace:i=!0,width:o,title:r="Controls"}=n;let{parent:s}=n;if(o&&(this.domElement.style.width=/^\d+$/.test(o)?`${o}px`:o),void 0===s&&i&&(s=document.body,this.domElement.classList.add("muigui-auto-place")),s){const t=e("muigui-element");t.shadowRoot.adoptedStyleSheets=[this.#nt,ge,be],t.shadow.appendChild(this.domElement),s.appendChild(t)}r&&this.title(r),this.#nt.replaceSync(t.default),this.domElement.classList.add("muigui","muigui-colors")}setStyle(t){this.#nt.replace(t)}static setBaseStyles(t){ve(t)}static getBaseStyleSheet(){return ge}static setUserStyles(t){xe(t)}static getUserStyleSheet(){return be}setTheme(t){this.setStyle(we(t))}static setTheme(t){ye.setBaseStyles(we(t))}}function ke(){}const Ee={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]};function Ie(t,{onDown:e=ke,onUp:n=ke}){const i=function(t){const i=t.shiftKey?10:1,[o,r]=(Ee[t.key]||[0,0]).map((t=>t*i));("keydown"===t.type?e:n)({type:t.type.substring(3),dx:o,dy:r,event:t})};return t.addEventListener("keydown",i),t.addEventListener("keyup",i),function(){t.removeEventListener("keydown",i),t.removeEventListener("keyup",i)}}function $e(t,e=""){if(!t)throw new Error(e)}function Ce(t,e,n,i,o,r){const s=Math.abs(n)*Math.cos(r),a=Math.abs(i)*Math.sin(r);return[t+Math.cos(o)*s-Math.sin(o)*a,e+Math.sin(o)*s+Math.cos(o)*a]}function Me(t,e,n,i,o){$e(Math.abs(i-o)<=2*Math.PI),$e(i>=-Math.PI&&i<=2*Math.PI),$e(i<=o),$e(o>=-Math.PI&&o<=4*Math.PI);const{x1:r,y1:s,x2:a,y2:l,fa:u,fs:c}=function(t,e,n,i,o,r,s){const[a,l]=Ce(t,e,n,i,o,r),[u,c]=Ce(t,e,n,i,o,r+s);return{x1:a,y1:l,x2:u,y2:c,fa:Math.abs(s)>Math.PI?1:0,fs:s>0?1:0}}(t,e,n,n,0,i,o-i);return Math.abs(Math.abs(i-o)-2*Math.PI)>Number.EPSILON?`M${t} ${e} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l} L${t} ${e}`:`M${r} ${s} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l}`}const Se=t=>a(t+Math.PI,2*Math.PI)-Math.PI;class Ve extends v{#it;#ot;#rt;#st;#u={step:1,min:-180,max:180,dirMin:-Math.PI,dirMax:Math.PI,wrap:void 0,converters:A};constructor(t,n={}){const i=L();super(e("div",{className:"muigui-direction muigui-no-scroll",innerHTML:'\n\n \x3c!----\x3e\n \n \n \n \n \n \n\n',onWheel:e=>{e.preventDefault();const{min:n,max:r,step:l}=this.#u,u=i(e,l);let c=this.#rt+u;this.#st&&(c=a(c-n,r-n)+n);const h=o(s(c,(t=>t),l),n,r);t.setValue(h)}}));const r=e=>{const{min:n,max:i,step:r,dirMin:a,dirMax:l}=this.#u,u=2*e.nx-1,c=2*e.ny-1,h=Math.atan2(c,u),d=(a+l)/2,m=o((Se(h-d)-Se(a-d))/(l-a),0,1),p=s(n+(i-n)*m,(t=>t),r);t.setValue(p)};le(this.domElement,{onDown:r,onMove:r}),Ie(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),this.#it=this.$("#muigui-arrow"),this.#ot=this.$("#muigui-range"),this.setOptions(n)}updateDisplay(t){this.#rt=t;const{min:e,max:n}=this.#u,i=(t-e)/(n-e),o=(r=this.#u.dirMin,s=this.#u.dirMax,r+(s-r)*i);var r,s;this.#it.style.transform=`rotate(${o}rad)`}setOptions(t){l(this.#u,t);const{dirMin:e,dirMax:n,wrap:i}=this.#u;this.#st=void 0!==i?i:Math.abs(e-n)>=2*Math.PI-Number.EPSILON;const[o,r]=e(o.push(i),e("label",{},[e("input",{type:"radio",name:r,value:a,onChange:function(){this.checked&&t.setFinalValue(s.#D[this.value])}}),e("button",{type:"button",textContent:n,onClick:function(){this.previousElementSibling.click()}})]))))));const s=this;this.#D=o,this.cols(i)}updateDisplay(t){const e=this.#D.indexOf(t);for(let t=0;t{e({rect:t.getBoundingClientRect(),elem:t})})).observe(t)}function Ae(t,e,n,i){Ne(t,(({rect:o})=>{const{width:r,height:s}=o;t.setAttribute("viewBox",`-${r*e} -${s*n} ${r} ${s}`),i({elem:t,rect:o})}))}function je(t,e,n,i,o,r){const a=[];tt),n)),e=Math.min(e,o);for(let i=t;i<=e;i+=n)a.push(`M${i} 0 l0 ${r}`);return a.join(" ")}class Ue extends v{#at;#lt;#ut;#ct;#ht;#dt;#mt;#pt;#gt;#rt;#bt;#u={min:-100,max:100,step:1,unit:10,unitSize:10,ticksPerUnit:5,labelFn:t=>t,tickHeight:1,limits:!0,thicksColor:void 0,orientation:void 0};constructor(t,n){const i=L();let r;super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \x3c!----\x3e\n \x3c!----\x3e\n \n \n \n \n\n',className:"muigui-no-v-scroll",onWheel:e=>{e.preventDefault();const{min:n,max:r,step:a}=this.#u,l=i(e,a),u=o(s(this.#rt+l,(t=>t),a),n,r);t.setValue(u)}})),this.#at=this.$("svg"),this.#lt=this.$("#muigui-origin"),this.#ut=this.$("#muigui-ticks"),this.#ct=this.$("#muigui-thicks"),this.#ht=this.$("#muigui-numbers"),this.#dt=this.$("#muigui-left-grad"),this.#mt=this.$("#muigui-right-grad"),this.setOptions(n),le(this.domElement,{onDown:()=>{r=this.#rt},onMove:e=>{const{min:n,max:i,unitSize:a,unit:l,step:u}=this.#u,c=o(s(r-e.dx/a*l,(t=>t),u),n,i);t.setValue(c)}}),Ie(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),Ae(this.#at,.5,0,(({rect:{width:t}})=>{this.#dt.setAttribute("x",-t/2),this.#mt.setAttribute("x",t/2-20),this.#bt=function(t){const e=t.innerHTML;t.innerHTML="- ";const n=t.querySelector("text").getComputedTextLength();return t.innerHTML=e,n}(this.#ht),this.#pt=t,this.#ft()}))}#ft(){if(!this.#pt||void 0===this.#rt)return;const{labelFn:t,limits:e,min:n,max:i,orientation:o,tickHeight:r,ticksPerUnit:a,unit:l,unitSize:u,thicksColor:c}=this.#u,h=Math.ceil(this.#pt/u),d=this.#rt/l,m=Math.round(d-h),p=m*u,g=(m+2*h)*u,b=e?n*u/l:p,f=e?i*u/l:g,v=""===t(1)?10:5;a>1&&this.#ut.setAttribute("d",je(p,g,u/a,b,f,v*r)),this.#ct.style.stroke=c,this.#ct.setAttribute("d",je(p,g,u,b,f,v)),this.#ht.innerHTML=function(t,e,n,i,o,r,a,l){const u=[];tt),n)),e=Math.min(e,a);const c=Math.max(0,-Math.log10(i));for(let r=t;r<=e;r+=n)u.push(`${h=r/n*i,l(h.toFixed(c))}`);var h;return u.join("\n")}(p,g,u,l,this.#bt,b,f,t),this.#lt.setAttribute("transform",`translate(${-this.#rt*u/l} 0)`),this.#at.classList.toggle("muigui-slider-up","up"===o)}updateDisplay(t){this.#rt=t,this.#ft()}setOptions(t){return l(this.#u,t),this}}class Le extends v{#at;#it;#H;#rt=[];constructor(t){super(e("div",{innerHTML:'\n\n \n \n \n \n \n\n',className:"muigui-no-scroll"}));const n=e=>{const{width:n,height:i}=this.#at.getBoundingClientRect(),o=2*e.nx-1,r=2*e.ny-1;t.setValue([o*n*.5,r*i*.5])};le(this.domElement,{onDown:n,onMove:n}),this.#at=this.$("svg"),this.#it=this.$("#muigui-arrow"),this.#H=this.$("#muigui-circle"),Ae(this.#at,.5,.5,(()=>this.#vt))}#vt(){const[t,e]=this.#rt;this.#it.setAttribute("d",`M0,0L${t},${e}`),this.#H.setAttribute("transform",`translate(${t}, ${e})`)}updateDisplay(t){this.#rt[0]=t[0],this.#rt[1]=t[1],this.#vt()}}return ye.ColorChooser=de,ye.Direction=class extends he{#u;constructor(t,e,n){super(t,e,"muigui-direction"),this.#u=n,this.addTop(new F(this,A)),this.addBottom(new Ve(this,n)),this.updateDisplay()}},ye.RadioGrid=class extends D{constructor(t,e,n){super(t,e,"muigui-radio-grid");const i="number"==typeof this.getValue(),{keyValues:o,cols:r=3}=n,s=H(o,i);this.add(new De(this,s,r)),this.updateDisplay()}},ye.Range=W,ye.Select=T,ye.Slider=class extends D{constructor(t,e,n={}){super(t,e,"muigui-slider"),this.add(new Ue(this,n)),this.add(new F(this,n)),this.updateDisplay()}},ye.TextNumber=P,ye.Vec2=class extends he{constructor(t,e){super(t,e,"muigui-vec2");const n=t=>({setValue:e=>{const n=this.getValue();n[t]=e,this.setValue(n)},setFinalValue:e=>{const n=this.getValue();n[t]=e,this.setFinalValue(n)}});this.addTop(new F(n(0),{converters:{to:t=>t[0],from:j.from}})),this.addTop(new F(n(1),{converters:{to:t=>t[1],from:j.from}})),this.addBottom(new Le(this)),this.updateDisplay()}},ye})); //# sourceMappingURL=muigui.min.js.map diff --git a/dist/0.x/muigui.min.js.map b/dist/0.x/muigui.min.js.map index 37cc366..2f8a95a 100644 --- a/dist/0.x/muigui.min.js.map +++ b/dist/0.x/muigui.min.js.map @@ -1 +1 @@ -{"version":3,"file":"muigui.min.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/muigui.js","../../src/controllers/create-controller.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/views/RadioGridView.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/views/Vec2View.js","../../src/umd.js","../../src/controllers/Direction.js","../../src/controllers/RadioGrid.js","../../src/controllers/Slider.js","../../src/controllers/Vec2.js"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #68C;\n --range-color: #888888;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #88AAFF;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n width: 1.25em;\n height: var(--line-height);\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n content: \"ⓧ\"; /*\"▼\";*/\n}\n.muigui-closed>button>label::before {\n content: \"⨁\"; /*\"▶\";*/\n}\n.muigui-open>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 0.5s ease-out;\n max-height: 100vh;\n overflow: auto;\n opacity: 1;\n}\n\n.muigui-closed>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 1s;\n max-height: 0;\n opacity: 0;\n overflow: hidden;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-pop-down-bottom {\n\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n cursor: pointer;\n place-content: center center;\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 2px) / -2);\n width: calc(var(--line-height) - 2px);\n height: calc(var(--line-height) - 2px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: '',\n float: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-checkbox');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor() {\n super('muigui-canvas');\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n this.#bottom = this.add(new ElementView('div', 'muigui-pop-down-bottom'));\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n #setKnobHelper;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.#setKnobHelper = () => {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}FF`, hex);\n }\n };\n this.updateDisplay();\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.#setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\nbaseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [baseStyleSheet, userStyleSheet, this.#localStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n static setTheme(name) {\n GUI.setBaseStyles(`${css.default}\\n${css.themes[name] || ''}`);\n }\n}\n\nexport default GUI;\n","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import GUI from './muigui.js';\n\nimport ColorChooser from './controllers/ColorChooser.js';\nimport Direction from './controllers/Direction.js';\nimport RadioGrid from './controllers/RadioGrid.js';\nimport Range from './controllers/Range.js';\nimport Select from './controllers/Select.js';\nimport Slider from './controllers/Slider.js';\nimport TextNumber from './controllers/TextNumber.js';\nimport Vec2 from './controllers/Vec2.js';\n\nGUI.ColorChooser = ColorChooser;\nGUI.Direction = Direction;\nGUI.RadioGrid = RadioGrid;\nGUI.Range = Range;\nGUI.Select = Select;\nGUI.Slider = Slider;\nGUI.TextNumber = TextNumber;\nGUI.Vec2 = Vec2;\n\nexport default GUI;","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n"],"names":["css","default","themes","float","createElem","tag","attrs","children","elem","document","createElement","key","value","Object","entries","startsWith","eventName","substring","toLowerCase","addEventListener","passive","k","v","undefined","setAttribute","child","appendChild","setElemProps","nextId","removeArrayElem","array","ndx","indexOf","splice","clamp","min","max","Math","isTypedArray","SharedArrayBuffer","a","buffer","ArrayBuffer","stepify","from","step","round","euclideanModulo","n","copyExistingProperties","dst","src","mapRange","inMin","inMax","outMin","outMax","makeRangeConverters","to","makeRangeOptions","converters","identity","makeMinMaxPair","gui","properties","minPropName","maxPropName","options","guiMinRange","minRange","valueMinRange","minGui","add","onChange","maxGui","setValue","View","domElement","childDestElem","views","constructor","this","addElem","removeElem","removeChild","pushSubElem","popSubElem","parentElement","view","push","remove","pushSubView","popSubView","setOptions","updateDisplayIfNeeded","newV","ignoreCache","$","selector","querySelector","Controller","changeFns","finishChangeFns","parent","className","super","classList","setParent","enable","disabled","show","toggle","hide","closest","forEach","querySelectorAll","disable","fn","removeChange","onFinishChange","removeFinishChange","callListeners","fns","call","emitChange","object","property","controller","emitFinalChange","updateDisplay","getColors","toCamelCase","s","replace","m","m1","toUpperCase","div","colors","fromEntries","map","style","color","getComputedStyle","Button","buttonElem","name","type","onClick","textContent","arraysEqual","b","length","i","EditView","oldV","updateCheck","checkArrayNeedsUpdate","needUpdate","copyArrayElementsFromTo","checkTypedArrayNeedsUpdate","once","checkObjectNeedsUpdate","checkValueNeedsUpdate","getUpdateCheckForType","Array","isArray","bind","CheckboxView","checkboxElem","setter","id","onInput","checked","setFinalValue","tasks","tasksToRemove","Set","requestId","processing","processTasks","task","has","size","queueProcessing","clear","requestAnimationFrame","makeId","ValueView","LabelController","nameElem","for","title","tooltip","tip","ValueController","initialValue","listening","updateFn","getValue","setValueImpl","isDifferent","keys","assign","reset","listen","set","removeTask","Checkbox","strToNumber","toString","parseFloat","Number","isNaN","radToDeg","PI","createWheelHelper","wheelAccum","e","wheelScale","deltaY","delta","floor","abs","sign","NumberView","skipUpdate","NEGATIVE_INFINITY","POSITIVE_INFINITY","wheelHelper","handleInput","onWheel","preventDefault","setFn","valid","inRange","TextNumber","textView","SelectView","values","keyValues","selectedIndex","convertToKeyValues","valueIsNumber","Select","keyValuesInput","RangeView","validV","Range","TextView","Text","lerp","t","fract","f0","toFixed","f3","hexToUint32RGB","parseInt","hexToUint32RGBA","hexToUint8RGB","uint8RGBToHex","padStart","join","hexToUint8RGBA","uint8RGBAToHex","hexToFloatRGB","floatRGBToHex","hexToFloatRGBA","floatRGBAToHex","scaleAndClamp","hexToObjectRGB","r","g","hexToObjectRGBA","hexToCssRGB","cssRGBRegex","hexToCssRGBA","cssRGBARegex","hexToCssHSL","hsl","rgbUint8ToHsl","hexToCssHSLA","hsla","rgbaUint8ToHsla","cssHSLRegex","cssHSLARegex","hslToRgbUint8","h","l","f","rgbFloatToHsl01","d","rgbaFloatToHsla01","rgb","rgba","hsv01ToRGBFloat","hue","sat","val","hsva01ToRGBAFloat","alpha","round3","rgbFloatToHSV01","p","q","EPSILON","hasAlpha","format","endsWith","cssStringFormats","re","guessFormat","console","warn","formatInfo","test","guessStringColorFormat","trim","Uint8Array","Uint8ClampedArray","Float32Array","Error","fixHex6","fixHex8","hex6ToHex3","hex6","hex3RE","hex3ToHex6","hex3","exec","m2","fixHex3","strToCssRGB","find","strToCssRGBA","strToCssHSL","strToCssHSLA","strTo3IntsRE","strTo4IntsRE","strToUint32RGBRegex","strToUint32RGBARegex","hex6RE","hexNoHash6RE","hex8RE","hexNoHash8RE","colorFormatConverters","text","hex8","strToUint32RGB","strToUint32RGBA","numbers","split","badNdx","findIndex","json","JSON","parse","hslaToRgbaUint8","ElementView","Canvas","canvasElem","canvas","ColorView","colorElem","Color","colorView","Divider","Container","controllers","childDestController","filter","c","folders","recursive","c0","addControllerImpl","addController","pushContainer","container","popContainer","Folder","labelElem","toggleOpen","open","close","contains","Label","noop","computeRelativePosition","event","start","rect","getBoundingClientRect","x","clientX","left","y","clientY","top","nx","width","ny","height","dx","dy","ndy","addTouchEvents","onDown","onMove","onUp","pointerMove","pointerUp","releasePointerCapture","pointerId","removeEventListener","body","backgroundColor","pointerDown","setPointerCapture","rel","connectFillTargets","srcElem","dataset","targetElem","ColorChooserView","satLevelElem","circleElem","hueUIElem","hueElem","hueCursorElem","alphaUIElem","alphaElem","alphaCursorElem","hsva","skipHueUpdate","skipSatLevelUpdate","skipAlphaUpdate","convertInternalToHex","convertHexToInternal","innerHTML","handleSatLevelChange","handleHueChange","handleAlphaChange","lum","display","rgbaFloatToHSVA01","PopDownController","valuesView","bottom","setKnobColor","bgCssColor","addTop","addBottom","ColorChooser","setKnobHelper","hex6Or8","hex","GUIFolder","args","arg1","createController","addCanvas","addColor","addDivider","addFolder","addLabel","MuiguiElement","HTMLElement","shadow","attachShadow","mode","customElements","define","baseStyleSheet","CSSStyleSheet","replaceSync","userStyleSheet","makeStyleSheetUpdater","styleSheet","newCss","newCssPromise","updateStyle","then","updateBaseStyle","updateUserStyle","GUI","static","localStyleSheet","autoPlace","muiguiElement","shadowRoot","adoptedStyleSheets","setStyle","setBaseStyles","keyDirections","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","addKeyboardEvents","keyDown","mult","shiftKey","assert","truthy","msg","getEllipsePointForAngle","cx","cy","rx","ry","phi","theta","cos","sin","arc","end","x1","y1","x2","y2","fa","fs","dTheta","getEndpointParameters","twoPiMod","DirectionView","arrowElem","rangeElem","lastV","wrap","dirMin","dirMax","tempV","handleTouch","atan2","center","angle","transform","RadioGridView","cols","that","previousElementSibling","click","gridTemplateColumns","onResize","callback","ResizeObserver","observe","onResizeSVGNoScale","hAnchor","vAnchor","createSVGTicks","SliderView","svgElem","originElem","ticksElem","thicksElem","numbersElem","leftGradElem","rightGradElem","minusSize","unit","unitSize","ticksPerUnit","labelFn","tickHeight","limits","thicksColor","orientation","startV","oldHTML","getComputedTextLength","computeSizeOfMinus","updateSlider","unitsAcross","ceil","centerUnitSpace","startUnitSpace","minUnitSpace","maxUnitSpace","stroke","texts","digits","log10","createSVGNumbers","Vec2View","onTouch","updateDisplayImpl","Direction","RadioGrid","Slider","Vec2","makeSetter"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"muigui.min.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/muigui.js","../../src/controllers/create-controller.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/views/RadioGridView.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/views/Vec2View.js","../../src/umd.js","../../src/controllers/Direction.js","../../src/controllers/RadioGrid.js","../../src/controllers/Slider.js","../../src/controllers/Vec2.js"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #8BF;\n --range-color: #AAA;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: \n linear-gradient(\n rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #458; /*#88AAFF*/;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: linear-gradient(\n rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root {\n z-index: 1;\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n /* white-space: pre; why?? */\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n content: \"X\";\n color: rgba(0, 0, 0, 0);\n background-color: var(--range-color);\n border-radius: 0.2em;\n width: 1.25em;\n margin-right: 0.25em;\n height: 1.25em; /*var(--line-height);*/\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n background-image: var(--image-open);\n}\n.muigui-closed>button>label::before {\n background-image: var(--image-closed);\n}\n\n.muigui-open>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: auto;\n height: 100%;\n}\n.muigui-closed>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: hidden;\n min-height: 0;\n}\n.muigui-open>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: 0px;\n}\n.muigui-closed>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: -100%;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-closed .muigui-pop-down-bottom {\n max-height: 0;\n}\n\n.muigui-value .muigui-pop-down-bottom {\n margin: 0;\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n background-image: var(--image-checkerboard);\n background-size: 10px 10px;\n background-position: 0 0, 0 5px, 5px -5px, -5px 0px;\n\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n padding: 2px 0 2px 0;\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n background-image: var(--button-image);\n cursor: pointer;\n place-content: center center;\n height: var(--line-height);\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 6px) / -2);\n width: calc(var(--line-height) - 6px);\n height: calc(var(--line-height) - 6px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: {\n include: ['default'],\n css: `\n `,\n },\n float: {\n include: ['default'],\n css: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n },\n form: {\n include: [],\n css: `\n .muigui {\n --width: 100%;\n --label-width: 45%;\n --number-width: 40%;\n }\n .muigui-root>button {\n display: none;\n }\n .muigui-controller {\n margin-top: 1em;\n }\n .muigui-label-controller {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n margin-top: 1em;\n }\n .muigui-label-controller:has(.muigui-checkbox) {\n flex-direction: row;\n }\n .muigui-value {\n display: flex;\n align-items: stretch;\n }\n .muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n }\n .muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n }\n .muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n }\n .muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n }\n `,\n },\n none: {\n include: [],\n css: '',\n },\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n name(name) {\n this.#buttonElem.textContent = name;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n const [valid, outV] = this.#from(newV);\n if (valid) {\n setter.setValue(outV);\n }\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-text-number');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-text');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsv': {\n color: {\n from: v => [true, rgbFloatToHSV01(hexToFloatRGB(v))],\n to: v => hsv01ToRGBFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsva': {\n color: {\n from: v => [true, rgbaFloatToHSVA01(hexToFloatRGB(v))],\n to: v => hsva01ToRGBAFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n //'float-hsl': {\n // color: {\n // from: v => [true, rgbFloatToHsl01(hexToFloatRGB(v))],\n // to: v => hsl01ToRGBFloat(floatRGBToHex(v)),\n // },\n // text: {\n // from: strTo3Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n //'float-hsla': {\n // color: {\n // from: v => [true, hexToFloatRGBA(v)],\n // to: floatRGBAToHex,\n // },\n // text: {\n // from: strTo4Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor(name) {\n super('muigui-canvas', name);\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container('muigui-open-container'));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n const container = new ElementView('div', 'muigui-pop-down-bottom muigui-open-container');\n this.#bottom = new ElementView('div');\n container.add(this.#bottom);\n this.add(container);\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.___setKnobHelper = true;\n this.updateDisplay();\n }\n #setKnobHelper() {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const alpha = hex6Or8.length === 9 ? hex6Or8.substring(7, 9) : 'FF';\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}${alpha}`, hex);\n }\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.___setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n addButton(name, fn) {\n const o = {fn};\n return this.add(o, 'fn').name(name);\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\n//baseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nfunction getTheme(name) {\n const { include, css: cssStr } = css.themes[name];\n return `${include.map(m => css[m]).join('\\n')} : css.default}\\n${cssStr || ''}`;\n}\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [this.#localStyleSheet, baseStyleSheet, userStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.#localStyleSheet.replaceSync(css.default);\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n setTheme(name) {\n this.setStyle(getTheme(name));\n }\n static setTheme(name) {\n GUI.setBaseStyles(getTheme(name));\n }\n}\n\nexport default GUI;\n","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n if (arg1 && arg1.keyValues) {\n return new Select(object, property, {keyValues: arg1.keyValues});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import GUI from './muigui.js';\n\nimport ColorChooser from './controllers/ColorChooser.js';\nimport Direction from './controllers/Direction.js';\nimport RadioGrid from './controllers/RadioGrid.js';\nimport Range from './controllers/Range.js';\nimport Select from './controllers/Select.js';\nimport Slider from './controllers/Slider.js';\nimport TextNumber from './controllers/TextNumber.js';\nimport Vec2 from './controllers/Vec2.js';\n\nGUI.ColorChooser = ColorChooser;\nGUI.Direction = Direction;\nGUI.RadioGrid = RadioGrid;\nGUI.Range = Range;\nGUI.Select = Select;\nGUI.Slider = Slider;\nGUI.TextNumber = TextNumber;\nGUI.Vec2 = Vec2;\n\nexport default GUI;","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n"],"names":["css","default","themes","include","float","form","none","createElem","tag","attrs","children","elem","document","createElement","key","value","Object","entries","startsWith","eventName","substring","toLowerCase","addEventListener","passive","k","v","undefined","setAttribute","child","appendChild","setElemProps","nextId","removeArrayElem","array","ndx","indexOf","splice","clamp","min","max","Math","isTypedArray","SharedArrayBuffer","a","buffer","ArrayBuffer","stepify","from","step","round","euclideanModulo","n","copyExistingProperties","dst","src","mapRange","inMin","inMax","outMin","outMax","makeRangeConverters","to","makeRangeOptions","converters","identity","makeMinMaxPair","gui","properties","minPropName","maxPropName","options","guiMinRange","minRange","valueMinRange","minGui","add","onChange","maxGui","setValue","View","domElement","childDestElem","views","constructor","this","addElem","removeElem","removeChild","pushSubElem","popSubElem","parentElement","view","push","remove","pushSubView","popSubView","setOptions","updateDisplayIfNeeded","newV","ignoreCache","$","selector","querySelector","Controller","changeFns","finishChangeFns","parent","className","super","classList","setParent","enable","disabled","show","toggle","hide","closest","forEach","querySelectorAll","disable","fn","removeChange","onFinishChange","removeFinishChange","callListeners","fns","call","emitChange","object","property","controller","emitFinalChange","updateDisplay","getColors","toCamelCase","s","replace","m","m1","toUpperCase","div","colors","fromEntries","map","style","color","getComputedStyle","Button","buttonElem","name","type","onClick","textContent","arraysEqual","b","length","i","EditView","oldV","updateCheck","checkArrayNeedsUpdate","needUpdate","copyArrayElementsFromTo","checkTypedArrayNeedsUpdate","once","checkObjectNeedsUpdate","checkValueNeedsUpdate","getUpdateCheckForType","Array","isArray","bind","CheckboxView","checkboxElem","setter","id","onInput","checked","setFinalValue","tasks","tasksToRemove","Set","requestId","processing","processTasks","task","has","size","queueProcessing","clear","requestAnimationFrame","makeId","ValueView","LabelController","nameElem","for","title","tooltip","tip","ValueController","initialValue","listening","updateFn","getValue","setValueImpl","isDifferent","keys","assign","reset","listen","set","removeTask","Checkbox","strToNumber","toString","parseFloat","Number","isNaN","radToDeg","PI","createWheelHelper","wheelAccum","e","wheelScale","deltaY","delta","floor","abs","sign","NumberView","skipUpdate","NEGATIVE_INFINITY","POSITIVE_INFINITY","wheelHelper","handleInput","onWheel","preventDefault","valid","outV","setFn","inRange","TextNumber","textView","SelectView","values","keyValues","selectedIndex","convertToKeyValues","valueIsNumber","Select","keyValuesInput","RangeView","validV","Range","TextView","Text","lerp","t","fract","f0","toFixed","f3","hexToUint32RGB","parseInt","hexToUint32RGBA","hexToUint8RGB","uint8RGBToHex","padStart","join","hexToUint8RGBA","uint8RGBAToHex","hexToFloatRGB","floatRGBToHex","hexToFloatRGBA","floatRGBAToHex","scaleAndClamp","hexToObjectRGB","r","g","hexToObjectRGBA","hexToCssRGB","cssRGBRegex","hexToCssRGBA","cssRGBARegex","hexToCssHSL","hsl","rgbUint8ToHsl","hexToCssHSLA","hsla","rgbaUint8ToHsla","cssHSLRegex","cssHSLARegex","hslToRgbUint8","h","l","f","rgbFloatToHsl01","d","rgbaFloatToHsla01","rgb","rgba","hsv01ToRGBFloat","hue","sat","val","hsva01ToRGBAFloat","alpha","round3","rgbFloatToHSV01","p","q","EPSILON","rgbaFloatToHSVA01","hasAlpha","format","endsWith","cssStringFormats","re","guessFormat","console","warn","formatInfo","test","guessStringColorFormat","trim","Uint8Array","Uint8ClampedArray","Float32Array","Error","fixHex6","fixHex8","hex6ToHex3","hex6","hex3RE","hex3ToHex6","hex3","exec","m2","fixHex3","strToCssRGB","find","strToCssRGBA","strToCssHSL","strToCssHSLA","strTo3IntsRE","strTo4IntsRE","strTo3Floats","numbers","split","badNdx","findIndex","strTo4Floats","strToUint32RGBRegex","strToUint32RGBARegex","hex6RE","hexNoHash6RE","hex8RE","hexNoHash8RE","colorFormatConverters","text","hex8","strToUint32RGB","strToUint32RGBA","json","JSON","parse","hslaToRgbaUint8","ElementView","Canvas","canvasElem","canvas","ColorView","colorElem","Color","colorView","Divider","Container","controllers","childDestController","filter","c","folders","recursive","c0","addControllerImpl","addController","pushContainer","container","popContainer","Folder","labelElem","toggleOpen","open","close","contains","Label","noop","computeRelativePosition","event","start","rect","getBoundingClientRect","x","clientX","left","y","clientY","top","nx","width","ny","height","dx","dy","ndy","addTouchEvents","onDown","onMove","onUp","pointerMove","pointerUp","releasePointerCapture","pointerId","removeEventListener","body","backgroundColor","pointerDown","setPointerCapture","rel","connectFillTargets","srcElem","dataset","targetElem","ColorChooserView","satLevelElem","circleElem","hueUIElem","hueElem","hueCursorElem","alphaUIElem","alphaElem","alphaCursorElem","hsva","skipHueUpdate","skipSatLevelUpdate","skipAlphaUpdate","convertInternalToHex","convertHexToInternal","innerHTML","handleSatLevelChange","handleHueChange","handleAlphaChange","lum","display","PopDownController","valuesView","bottom","setKnobColor","bgCssColor","addTop","addBottom","ColorChooser","___setKnobHelper","setKnobHelper","hex6Or8","hex","GUIFolder","args","arg1","createController","addCanvas","addColor","addDivider","addFolder","addLabel","addButton","o","MuiguiElement","HTMLElement","shadow","attachShadow","mode","customElements","define","baseStyleSheet","CSSStyleSheet","userStyleSheet","makeStyleSheetUpdater","styleSheet","newCss","newCssPromise","updateStyle","then","updateBaseStyle","updateUserStyle","getTheme","cssStr","GUI","static","localStyleSheet","autoPlace","muiguiElement","shadowRoot","adoptedStyleSheets","replaceSync","setStyle","setTheme","setBaseStyles","keyDirections","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","addKeyboardEvents","keyDown","mult","shiftKey","assert","truthy","msg","getEllipsePointForAngle","cx","cy","rx","ry","phi","theta","cos","sin","arc","end","x1","y1","x2","y2","fa","fs","dTheta","getEndpointParameters","twoPiMod","DirectionView","arrowElem","rangeElem","lastV","wrap","dirMin","dirMax","tempV","handleTouch","atan2","center","angle","transform","RadioGridView","cols","that","previousElementSibling","click","gridTemplateColumns","onResize","callback","ResizeObserver","observe","onResizeSVGNoScale","hAnchor","vAnchor","createSVGTicks","SliderView","svgElem","originElem","ticksElem","thicksElem","numbersElem","leftGradElem","rightGradElem","minusSize","unit","unitSize","ticksPerUnit","labelFn","tickHeight","limits","thicksColor","orientation","startV","oldHTML","getComputedTextLength","computeSizeOfMinus","updateSlider","unitsAcross","ceil","centerUnitSpace","startUnitSpace","minUnitSpace","maxUnitSpace","stroke","texts","digits","log10","createSVGNumbers","Vec2View","onTouch","updateDisplayImpl","Direction","RadioGrid","Slider","Vec2","makeSetter"],"mappings":"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"} \ No newline at end of file diff --git a/dist/0.x/muigui.module.js b/dist/0.x/muigui.module.js index db65852..0a72b8c 100644 --- a/dist/0.x/muigui.module.js +++ b/dist/0.x/muigui.module.js @@ -1,4 +1,4 @@ -/* muigui@0.0.12, license MIT */ +/* muigui@0.0.13, license MIT */ var css = { default: ` .muigui { @@ -11,16 +11,24 @@ var css = { --menu-bg-color: #f8f8f8; --menu-sep-color: #bbb; --hover-bg-color: #999; - --focus-color: #68C; - --range-color: #888888; + --focus-color: #8BF; + --range-color: #AAA; --invalid-color: #FF0000; --selected-color: rgb(255, 255, 255, 0.9); --button-bg-color: var(--value-bg-color); + --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==); + --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+); + --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=); + --range-left-color: var(--value-color); --range-right-color: var(--value-bg-color); --range-right-hover-color: var(--hover-bg-color); + --button-image: + linear-gradient( + rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2) + ); color: var(--color); background-color: var(--bg-color); @@ -37,7 +45,7 @@ var css = { --menu-bg-color: #080808; --menu-sep-color: #444444; --hover-bg-color: #666666; - --focus-color: #88AAFF; + --focus-color: #458; /*#88AAFF*/; --range-color: #888888; --invalid-color: #FF6666; --selected-color: rgba(255, 255, 255, 0.3); @@ -47,9 +55,15 @@ var css = { --range-left-color: var(--value-color); --range-right-color: var(--value-bg-color); --range-right-hover-color: var(--hover-bg-color); + --button-image: linear-gradient( + rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4) + ); color: var(--color); background-color: var(--bg-color); + + --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==); + --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+); } } @@ -58,7 +72,6 @@ var css = { --label-width: 45%; --number-width: 40%; - --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; --font-size: 11px; --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace; @@ -151,6 +164,9 @@ var css = { min-width: 0; min-height: var(--line-height); } +.muigui-root { + z-index: 1; +} .muigui-root, .muigui-menu { display: flex; @@ -175,8 +191,7 @@ var css = { color: var(--color); background-color: var(--menu-bg-color); min-height: var(--line-height); - padding-top: 0.2em; - padding-bottom: 0.2em; + padding: 0.2em; cursor: pointer; border-radius: var(--border-radius); } @@ -197,7 +212,7 @@ var css = { .muigui-controller>*:nth-child(1) { flex: 1 0 var(--label-width); min-width: 0; - white-space: pre; + /* white-space: pre; why?? */ } .muigui-controller>label:nth-child(1) { place-content: center start; @@ -239,32 +254,41 @@ var css = { /* fix! */ .muigui-open>button>label::before, .muigui-closed>button>label::before { + content: "X"; + color: rgba(0, 0, 0, 0); + background-color: var(--range-color); + border-radius: 0.2em; width: 1.25em; - height: var(--line-height); + margin-right: 0.25em; + height: 1.25em; /*var(--line-height);*/ display: inline-grid; place-content: center start; pointer-events: none; } .muigui-open>button>label::before { - content: "ⓧ"; /*"▼";*/ + background-image: var(--image-open); } .muigui-closed>button>label::before { - content: "⨁"; /*"▶";*/ + background-image: var(--image-closed); } -.muigui-open>*:nth-child(2) { - transition: max-height 0.2s ease-out, - opacity 0.5s ease-out; - max-height: 100vh; + +.muigui-open>.muigui-open-container { + transition: all 0.1s ease-out; overflow: auto; - opacity: 1; + height: 100%; } - -.muigui-closed>*:nth-child(2) { - transition: max-height 0.2s ease-out, - opacity 1s; - max-height: 0; - opacity: 0; +.muigui-closed>.muigui-open-container { + transition: all 0.1s ease-out; overflow: hidden; + min-height: 0; +} +.muigui-open>.muigui-open-container>* { + transition: all 0.1s ease-out; + margin-top: 0px; +} +.muigui-closed>.muigui-open-container>* { + transition: all 0.1s ease-out; + margin-top: -100%; } /* ---- popdown ---- */ @@ -276,8 +300,12 @@ var css = { .muigui-value>*:nth-child(1).muigui-pop-down-top { flex: 0; } -.muigui-pop-down-bottom { +.muigui-closed .muigui-pop-down-bottom { + max-height: 0; +} +.muigui-value .muigui-pop-down-bottom { + margin: 0; } .muigui-pop-down-values { @@ -299,6 +327,10 @@ var css = { width: auto; color: var(--value-color); background-color: var(--value-bg-color); + background-image: var(--image-checkerboard); + background-size: 10px 10px; + background-position: 0 0, 0 5px, 5px -5px, -5px 0px; + cursor: pointer; display: grid; @@ -390,14 +422,16 @@ var css = { .muigui-button { display: grid; - + padding: 2px 0 2px 0; } .muigui-button button { border: none; color: var(--value-color); background-color: var(--button-bg-color); + background-image: var(--button-image); cursor: pointer; place-content: center center; + height: var(--line-height); } /* ------ [ color ] ------ */ @@ -609,9 +643,9 @@ var css = { border-bottom: 1px solid rgba(0,0,0,0.2); border-right: 1px solid rgba(0,0,0,0.2); background-color: var(--range-color); - margin-top: calc((var(--line-height) - 2px) / -2); - width: calc(var(--line-height) - 2px); - height: calc(var(--line-height) - 2px); + margin-top: calc((var(--line-height) - 6px) / -2); + width: calc(var(--line-height) - 6px); + height: calc(var(--line-height) - 6px); } .muigui-range input[type=range]::-webkit-slider-runnable-track { @@ -695,8 +729,14 @@ var css = { `, themes: { - default: '', - float: ` + default: { + include: ['default'], + css: ` + `, + }, + float: { + include: ['default'], + css: ` :root { color-scheme: light dark, } @@ -753,6 +793,58 @@ themes: { --range-color: rgba(0, 0, 0, 0.125); } `, + }, + form: { + include: [], + css: ` + .muigui { + --width: 100%; + --label-width: 45%; + --number-width: 40%; + } + .muigui-root>button { + display: none; + } + .muigui-controller { + margin-top: 1em; + } + .muigui-label-controller { + display: flex; + flex-direction: column; + align-items: stretch; + margin-top: 1em; + } + .muigui-label-controller:has(.muigui-checkbox) { + flex-direction: row; + } + .muigui-value { + display: flex; + align-items: stretch; + } + .muigui-value>* { + flex: 1 1 auto; + min-width: 0; + } + .muigui-controller>*:nth-child(1) { + flex: 1 0 var(--label-width); + min-width: 0; + white-space: pre; + } + .muigui-controller>label:nth-child(1) { + place-content: center start; + display: inline-grid; + overflow: hidden; + } + .muigui-controller>*:nth-child(2) { + flex: 1 1 75%; + min-width: 0; + } + `, + }, + none: { + include: [], + css: '', + }, }, }; @@ -1114,6 +1206,9 @@ class Button extends Controller { })); this.setOptions({name: property, ...options}); } + name(name) { + this.#buttonElem.textContent = name; + } setOptions(options) { copyExistingProperties(this.#options, options); const {name} = this.#options; @@ -1505,15 +1600,22 @@ class NumberView extends EditView { const wheelHelper = createWheelHelper(); super(createElem('input', { type: 'number', - onInput: () => this.#handleInput(setValue, true), - onChange: () => this.#handleInput(setFinalValue, false), + onInput: () => { + this.#handleInput(setValue, true); + }, + onChange: () => { + this.#handleInput(setFinalValue, false); + }, onWheel: e => { e.preventDefault(); const {min, max, step} = this.#options; const delta = wheelHelper(e, step); const v = parseFloat(this.domElement.value); const newV = clamp$1(stepify(v + delta, v => v, step), min, max); - setter.setValue(newV); + const [valid, outV] = this.#from(newV); + if (valid) { + setter.setValue(outV); + } }, })); this.setOptions(options); @@ -1558,7 +1660,7 @@ class TextNumber extends ValueController { #step; constructor(object, property, options = {}) { - super(object, property, 'muigui-checkbox'); + super(object, property, 'muigui-text-number'); this.#textView = this.add(new NumberView(this, options)); this.updateDisplay(); } @@ -1716,8 +1818,12 @@ class TextView extends EditView { const setFinalValue = setter.setFinalValue.bind(setter); super(createElem('input', { type: 'text', - onInput: () => this.#handleInput(setValue, true), - onChange: () => this.#handleInput(setFinalValue, false), + onInput: () => { + this.#handleInput(setValue, true); + }, + onChange: () => { + this.#handleInput(setFinalValue, false); + }, })); this.setOptions(options); } @@ -1750,7 +1856,7 @@ class TextView extends EditView { class Text extends ValueController { constructor(object, property) { - super(object, property, 'muigui-checkbox'); + super(object, property, 'muigui-text'); this.add(new TextView(this)); this.updateDisplay(); } @@ -1775,6 +1881,9 @@ function createController(object, property, ...args) { if (Array.isArray(arg1)) { return new Select(object, property, {keyValues: arg1}); } + if (arg1 && arg1.keyValues) { + return new Select(object, property, {keyValues: arg1.keyValues}); + } const t = typeof object[property]; switch (t) { @@ -2386,6 +2495,50 @@ const colorFormatConverters = { to: v => Array.from(v).map(v => f3(v)).join(', '), }, }, + 'float-hsv': { + color: { + from: v => [true, rgbFloatToHSV01(hexToFloatRGB(v))], + to: v => hsv01ToRGBFloat(floatRGBToHex(v)), + }, + text: { + from: strTo3Floats, + // need Array.from because map of Float32Array makes a Float32Array + to: v => Array.from(v).map(v => f3(v)).join(', '), + }, + }, + 'float-hsva': { + color: { + from: v => [true, rgbaFloatToHSVA01(hexToFloatRGB(v))], + to: v => hsva01ToRGBAFloat(floatRGBToHex(v)), + }, + text: { + from: strTo4Floats, + // need Array.from because map of Float32Array makes a Float32Array + to: v => Array.from(v).map(v => f3(v)).join(', '), + }, + }, + //'float-hsl': { + // color: { + // from: v => [true, rgbFloatToHsl01(hexToFloatRGB(v))], + // to: v => hsl01ToRGBFloat(floatRGBToHex(v)), + // }, + // text: { + // from: strTo3Floats, + // // need Array.from because map of Float32Array makes a Float32Array + // to: v => Array.from(v).map(v => f3(v)).join(', '), + // }, + //}, + //'float-hsla': { + // color: { + // from: v => [true, hexToFloatRGBA(v)], + // to: floatRGBAToHex, + // }, + // text: { + // from: strTo4Floats, + // // need Array.from because map of Float32Array makes a Float32Array + // to: v => Array.from(v).map(v => f3(v)).join(', '), + // }, + //}, 'object-rgb': { color: { from: v => [true, hexToObjectRGB(v)], @@ -2458,8 +2611,8 @@ class ElementView extends View { class Canvas extends LabelController { #canvasElem; - constructor() { - super('muigui-canvas'); + constructor(name) { + super('muigui-canvas', name); this.#canvasElem = this.add( new ElementView('canvas', 'muigui-canvas'), ).domElement; @@ -2620,6 +2773,7 @@ class Folder extends Container { type: 'button', onClick: () => this.toggleOpen(), }, [this.#labelElem])); + this.pushContainer(new Container('muigui-open-container')); this.pushContainer(new Container()); this.name(name); this.open(); @@ -2968,7 +3122,10 @@ class PopDownController extends ValueController { })); this.#checkboxElem = checkboxElem; this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values')); - this.#bottom = this.add(new ElementView('div', 'muigui-pop-down-bottom')); + const container = new ElementView('div', 'muigui-pop-down-bottom muigui-open-container'); + this.#bottom = new ElementView('div'); + container.add(this.#bottom); + this.add(container); this.setOptions(options); } setKnobColor(bgCssColor/*, fgCssColor*/) { @@ -3004,7 +3161,6 @@ class ColorChooser extends PopDownController { #colorView; #textView; #to; - #setKnobHelper; constructor(object, property, options = {}) { super(object, property, 'muigui-color-chooser'); @@ -3016,20 +3172,22 @@ class ColorChooser extends PopDownController { this.addTop(this.#textView); this.addBottom(this.#colorView); // WTF! FIX! - this.#setKnobHelper = () => { - if (this.#to) { - const hex6Or8 = this.#to(this.getValue()); - const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8)); - hsl[2] = (hsl[2] + 50) % 100; - const hex = uint8RGBToHex(hslToRgbUint8(hsl)); - this.setKnobColor(`${hex6Or8.substring(0, 7)}FF`, hex); - } - }; + this.___setKnobHelper = true; this.updateDisplay(); } + #setKnobHelper() { + if (this.#to) { + const hex6Or8 = this.#to(this.getValue()); + const alpha = hex6Or8.length === 9 ? hex6Or8.substring(7, 9) : 'FF'; + const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8)); + hsl[2] = (hsl[2] + 50) % 100; + const hex = uint8RGBToHex(hslToRgbUint8(hsl)); + this.setKnobColor(`${hex6Or8.substring(0, 7)}${alpha}`, hex); + } + } updateDisplay() { super.updateDisplay(); - if (this.#setKnobHelper) { + if (this.___setKnobHelper) { this.#setKnobHelper(); } } @@ -3138,6 +3296,10 @@ class GUIFolder extends Folder { addLabel(text) { return this.addController(new Label(text)); } + addButton(name, fn) { + const o = {fn}; + return this.add(o, 'fn').name(name); + } } class MuiguiElement extends HTMLElement { @@ -3150,7 +3312,7 @@ class MuiguiElement extends HTMLElement { customElements.define('muigui-element', MuiguiElement); const baseStyleSheet = new CSSStyleSheet(); -baseStyleSheet.replaceSync(css.default); +//baseStyleSheet.replaceSync(css.default); const userStyleSheet = new CSSStyleSheet(); function makeStyleSheetUpdater(styleSheet) { @@ -3177,6 +3339,11 @@ function makeStyleSheetUpdater(styleSheet) { const updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet); const updateUserStyle = makeStyleSheetUpdater(userStyleSheet); +function getTheme(name) { + const { include, css: cssStr } = css.themes[name]; + return `${include.map(m => css[m]).join('\n')} : css.default}\n${cssStr || ''}`; +} + class GUI extends GUIFolder { static converters = converters; static mapRange = mapRange; @@ -3208,13 +3375,14 @@ class GUI extends GUIFolder { } if (parent) { const muiguiElement = createElem('muigui-element'); - muiguiElement.shadowRoot.adoptedStyleSheets = [baseStyleSheet, userStyleSheet, this.#localStyleSheet]; + muiguiElement.shadowRoot.adoptedStyleSheets = [this.#localStyleSheet, baseStyleSheet, userStyleSheet]; muiguiElement.shadow.appendChild(this.domElement); parent.appendChild(muiguiElement); } if (title) { this.title(title); } + this.#localStyleSheet.replaceSync(css.default); this.domElement.classList.add('muigui', 'muigui-colors'); } setStyle(css) { @@ -3232,8 +3400,11 @@ class GUI extends GUIFolder { static getUserStyleSheet() { return userStyleSheet; } + setTheme(name) { + this.setStyle(getTheme(name)); + } static setTheme(name) { - GUI.setBaseStyles(`${css.default}\n${css.themes[name] || ''}`); + GUI.setBaseStyles(getTheme(name)); } } @@ -3814,5 +3985,59 @@ class Vec2 extends PopDownController { } } -export { ColorChooser, Direction, RadioGrid, Range, Select, Slider, TextNumber, Vec2, GUI as default }; +const darkColors = { + main: '#ddd', +}; +const lightColors = { + main: '#333', +}; + +const darkMatcher = window.matchMedia('(prefers-color-scheme: dark)'); + +let colors; +let isDarkMode; + +function update() { + isDarkMode = darkMatcher.matches; + colors = isDarkMode ? darkColors : lightColors; +} +darkMatcher.addEventListener('change', update); +update(); + +function graph(canvas, data, { + min = -1, + max = 1, + interval = 16, + color, + }) { + const ctx = canvas.getContext('2d'); + + function render() { + const {width, height} = canvas; + ctx.clearRect(0, 0, width, height); + ctx.beginPath(); + const range = max - min; + for (let i = 0; i < data.length; ++i) { + const x = i * width / data.length; + const y = (data[i] - min) * height / range; + ctx.lineTo(x, y); + } + ctx.strokeStyle = color || colors.main; + ctx.stroke(); + } + setInterval(render, interval); +} + +function monitor(label, object, property, {interval = 200} = {}) { + setInterval(() => { + label.text(JSON.stringify(object[property], null, 2)); + }, interval); +} + +const helpers = { + graph, + monitor, +}; + +export { ColorChooser, Direction, RadioGrid, Range, Select, Slider, TextNumber, Vec2, GUI as default, helpers }; //# sourceMappingURL=muigui.module.js.map diff --git a/dist/0.x/muigui.module.js.map b/dist/0.x/muigui.module.js.map index 339fac6..175f67b 100644 --- a/dist/0.x/muigui.module.js.map +++ b/dist/0.x/muigui.module.js.map @@ -1 +1 @@ -{"version":3,"file":"muigui.module.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/controllers/create-controller.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/layout/Layout.js","../../src/layout/Column.js","../../src/layout/Frame.js","../../src/layout/Grid.js","../../src/layout/Row.js","../../src/muigui.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/controllers/Direction.js","../../src/views/RadioGridView.js","../../src/controllers/RadioGrid.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/controllers/Slider.js","../../src/views/Vec2View.js","../../src/controllers/Vec2.js"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #68C;\n --range-color: #888888;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #88AAFF;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n width: 1.25em;\n height: var(--line-height);\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n content: \"ⓧ\"; /*\"▼\";*/\n}\n.muigui-closed>button>label::before {\n content: \"⨁\"; /*\"▶\";*/\n}\n.muigui-open>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 0.5s ease-out;\n max-height: 100vh;\n overflow: auto;\n opacity: 1;\n}\n\n.muigui-closed>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 1s;\n max-height: 0;\n opacity: 0;\n overflow: hidden;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-pop-down-bottom {\n\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n cursor: pointer;\n place-content: center center;\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 2px) / -2);\n width: calc(var(--line-height) - 2px);\n height: calc(var(--line-height) - 2px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: '',\n float: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-checkbox');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor() {\n super('muigui-canvas');\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n this.#bottom = this.add(new ElementView('div', 'muigui-pop-down-bottom'));\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n #setKnobHelper;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.#setKnobHelper = () => {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}FF`, hex);\n }\n };\n this.updateDisplay();\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.#setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport View from '../views/View.js';\n\nfunction showCSS(ob) {\n if (ob.prototype.css) {\n showCSS(ob.prototype);\n }\n}\n\nexport default class Layout extends View {\n static css = 'bar';\n constructor(tag, className) {\n super(createElem(tag, {className}));\n\n showCSS(this);\n }\n}\n\n/*\nclass ValueController ?? {\n const row = this.add(new Row());\n const label = row.add(new Label());\n const div = row.add(new Div());\n const row = div.add(new Row());\n}\n*/\n\n/*\nclass MyCustomThing extends ValueController {\n constructor(object, property, options) {\n const topRow = this.add(new Row());\n const bottomRow = this.add(new Row());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n }\n}\n new Grid([\n [new\n ]\n */","import Layout from './Layout.js';\n\nexport default class Column extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Frame extends Layout {\n static css = 'foo';\n constructor() {\n super('div', 'muigui-frame');\n }\n static get foo() {\n return 'boo';\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Grid extends Layout {\n constructor() {\n super('div', 'muigui-grid');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Row extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\nbaseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [baseStyleSheet, userStyleSheet, this.#localStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n static setTheme(name) {\n GUI.setBaseStyles(`${css.default}\\n${css.themes[name] || ''}`);\n }\n}\n\nexport default GUI;\n","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n"],"names":["clamp","euclideanModulo","lerp","identity","noop","svg"],"mappings":";AAAA,UAAe;AACf,EAAE,OAAO,EAAE,CAAC;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,MAAM,EAAE;AACR,EAAE,OAAO,EAAE,EAAE;AACb,EAAE,KAAK,EAAE,CAAC;AACV;AACA;AACA;AACA;AACA;AACA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"} \ No newline at end of file +{"version":3,"file":"muigui.module.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/controllers/create-controller.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/layout/Layout.js","../../src/layout/Column.js","../../src/layout/Frame.js","../../src/layout/Grid.js","../../src/layout/Row.js","../../src/muigui.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/controllers/Direction.js","../../src/views/RadioGridView.js","../../src/controllers/RadioGrid.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/controllers/Slider.js","../../src/views/Vec2View.js","../../src/controllers/Vec2.js","../../src/libs/graph.js","../../src/libs/monitor.js","../../../src/esm.ts"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #8BF;\n --range-color: #AAA;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: \n linear-gradient(\n rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #458; /*#88AAFF*/;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: linear-gradient(\n rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root {\n z-index: 1;\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n /* white-space: pre; why?? */\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n content: \"X\";\n color: rgba(0, 0, 0, 0);\n background-color: var(--range-color);\n border-radius: 0.2em;\n width: 1.25em;\n margin-right: 0.25em;\n height: 1.25em; /*var(--line-height);*/\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n background-image: var(--image-open);\n}\n.muigui-closed>button>label::before {\n background-image: var(--image-closed);\n}\n\n.muigui-open>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: auto;\n height: 100%;\n}\n.muigui-closed>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: hidden;\n min-height: 0;\n}\n.muigui-open>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: 0px;\n}\n.muigui-closed>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: -100%;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-closed .muigui-pop-down-bottom {\n max-height: 0;\n}\n\n.muigui-value .muigui-pop-down-bottom {\n margin: 0;\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n background-image: var(--image-checkerboard);\n background-size: 10px 10px;\n background-position: 0 0, 0 5px, 5px -5px, -5px 0px;\n\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n padding: 2px 0 2px 0;\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n background-image: var(--button-image);\n cursor: pointer;\n place-content: center center;\n height: var(--line-height);\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 6px) / -2);\n width: calc(var(--line-height) - 6px);\n height: calc(var(--line-height) - 6px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: {\n include: ['default'],\n css: `\n `,\n },\n float: {\n include: ['default'],\n css: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n },\n form: {\n include: [],\n css: `\n .muigui {\n --width: 100%;\n --label-width: 45%;\n --number-width: 40%;\n }\n .muigui-root>button {\n display: none;\n }\n .muigui-controller {\n margin-top: 1em;\n }\n .muigui-label-controller {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n margin-top: 1em;\n }\n .muigui-label-controller:has(.muigui-checkbox) {\n flex-direction: row;\n }\n .muigui-value {\n display: flex;\n align-items: stretch;\n }\n .muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n }\n .muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n }\n .muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n }\n .muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n }\n `,\n },\n none: {\n include: [],\n css: '',\n },\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n name(name) {\n this.#buttonElem.textContent = name;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n const [valid, outV] = this.#from(newV);\n if (valid) {\n setter.setValue(outV);\n }\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-text-number');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-text');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n if (arg1 && arg1.keyValues) {\n return new Select(object, property, {keyValues: arg1.keyValues});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsv': {\n color: {\n from: v => [true, rgbFloatToHSV01(hexToFloatRGB(v))],\n to: v => hsv01ToRGBFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsva': {\n color: {\n from: v => [true, rgbaFloatToHSVA01(hexToFloatRGB(v))],\n to: v => hsva01ToRGBAFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n //'float-hsl': {\n // color: {\n // from: v => [true, rgbFloatToHsl01(hexToFloatRGB(v))],\n // to: v => hsl01ToRGBFloat(floatRGBToHex(v)),\n // },\n // text: {\n // from: strTo3Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n //'float-hsla': {\n // color: {\n // from: v => [true, hexToFloatRGBA(v)],\n // to: floatRGBAToHex,\n // },\n // text: {\n // from: strTo4Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor(name) {\n super('muigui-canvas', name);\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container('muigui-open-container'));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n const container = new ElementView('div', 'muigui-pop-down-bottom muigui-open-container');\n this.#bottom = new ElementView('div');\n container.add(this.#bottom);\n this.add(container);\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.___setKnobHelper = true;\n this.updateDisplay();\n }\n #setKnobHelper() {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const alpha = hex6Or8.length === 9 ? hex6Or8.substring(7, 9) : 'FF';\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}${alpha}`, hex);\n }\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.___setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport View from '../views/View.js';\n\nfunction showCSS(ob) {\n if (ob.prototype.css) {\n showCSS(ob.prototype);\n }\n}\n\nexport default class Layout extends View {\n static css = 'bar';\n constructor(tag, className) {\n super(createElem(tag, {className}));\n\n showCSS(this);\n }\n}\n\n/*\nclass ValueController ?? {\n const row = this.add(new Row());\n const label = row.add(new Label());\n const div = row.add(new Div());\n const row = div.add(new Row());\n}\n*/\n\n/*\nclass MyCustomThing extends ValueController {\n constructor(object, property, options) {\n const topRow = this.add(new Row());\n const bottomRow = this.add(new Row());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n topRow.add(new NumberView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n bottomRow.add(new DirectionView());\n }\n}\n new Grid([\n [new\n ]\n */","import Layout from './Layout.js';\n\nexport default class Column extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Frame extends Layout {\n static css = 'foo';\n constructor() {\n super('div', 'muigui-frame');\n }\n static get foo() {\n return 'boo';\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Grid extends Layout {\n constructor() {\n super('div', 'muigui-grid');\n }\n}\n","import Layout from './Layout.js';\n\nexport default class Row extends Layout {\n constructor() {\n super('div', 'muigui-row');\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n addButton(name, fn) {\n const o = {fn};\n return this.add(o, 'fn').name(name);\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\n//baseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nfunction getTheme(name) {\n const { include, css: cssStr } = css.themes[name];\n return `${include.map(m => css[m]).join('\\n')} : css.default}\\n${cssStr || ''}`;\n}\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [this.#localStyleSheet, baseStyleSheet, userStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.#localStyleSheet.replaceSync(css.default);\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n setTheme(name) {\n this.setStyle(getTheme(name));\n }\n static setTheme(name) {\n GUI.setBaseStyles(getTheme(name));\n }\n}\n\nexport default GUI;\n","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n","const darkColors = {\n main: '#ddd',\n};\nconst lightColors = {\n main: '#333',\n};\n\nconst darkMatcher = window.matchMedia('(prefers-color-scheme: dark)');\n\nlet colors;\nlet isDarkMode;\n\nfunction update() {\n isDarkMode = darkMatcher.matches;\n colors = isDarkMode ? darkColors : lightColors;\n}\ndarkMatcher.addEventListener('change', update);\nupdate();\n\nexport function graph(canvas, data, {\n min = -1,\n max = 1,\n interval = 16,\n color,\n }) {\n const ctx = canvas.getContext('2d');\n\n function render() {\n const {width, height} = canvas;\n ctx.clearRect(0, 0, width, height);\n ctx.beginPath();\n const range = max - min;\n for (let i = 0; i < data.length; ++i) {\n const x = i * width / data.length;\n const y = (data[i] - min) * height / range;\n ctx.lineTo(x, y);\n }\n ctx.strokeStyle = color || colors.main;\n ctx.stroke();\n }\n setInterval(render, interval);\n}","export function monitor(label, object, property, {interval = 200} = {}) {\n setInterval(() => {\n label.text(JSON.stringify(object[property], null, 2));\n }, interval);\n}\n","import GUI from './muigui.js';\n\nexport { default as ColorChooser } from './controllers/ColorChooser.js';\nexport { default as Direction } from './controllers/Direction.js';\nexport { default as RadioGrid } from './controllers/RadioGrid.js';\nexport { default as Range } from './controllers/Range.js';\nexport { default as Select } from './controllers/Select.js';\nexport { default as Slider } from './controllers/Slider.js';\nexport { default as TextNumber } from './controllers/TextNumber.js';\nexport { default as Vec2 } from './controllers/Vec2.js';\n\nimport {graph} from './libs/graph.js';\nimport {monitor} from './libs/monitor.js';\n\nexport const helpers = {\n graph,\n monitor,\n};\n\nexport default GUI;"],"names":["clamp","euclideanModulo","lerp","identity","noop","svg"],"mappings":";AAAA,UAAe;AACf,EAAE,OAAO,EAAE,CAAC;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,MAAM,EAAE;AACR,EAAE,OAAO,EAAE;AACX,IAAI,OAAO,EAAE,CAAC,SAAS,CAAC;AACxB,IAAI,GAAG,EAAE,CAAC;AACV,IAAI,CAAC;AACL,GAAG;AACH,EAAE,KAAK,EAAE;AACT,IAAI,OAAO,EAAE,CAAC,SAAS,CAAC;AACxB,IAAI,GAAG,EAAE,CAAC;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,GAAG;AACH,EAAE,IAAI,EAAE;AACR,IAAI,OAAO,EAAE,EAAE;AACf,IAAI,GAAG,EAAE,CAAC;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC;AACH,GAAG;AACH,EAAE,IAAI,EAAE;AACR,IAAI,OAAO,EAAE,EAAE;AACf,IAAI,GAAG,EAAE,EAAE;AACX,GAAG;AACH,CAAC;AACD,CAAC;;AC/0BM,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AACpD,EAAE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACpD,IAAI,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AAC7D,M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"} \ No newline at end of file diff --git a/dist/0.x/muigui.module.min.js b/dist/0.x/muigui.module.min.js index 6716365..c21420e 100644 --- a/dist/0.x/muigui.module.min.js +++ b/dist/0.x/muigui.module.min.js @@ -1,2 +1,2 @@ -var t={default:'\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #68C;\n --range-color: #888888;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #88AAFF;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n\n --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n width: 1.25em;\n height: var(--line-height);\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n content: "ⓧ"; /*"▼";*/\n}\n.muigui-closed>button>label::before {\n content: "⨁"; /*"▶";*/\n}\n.muigui-open>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 0.5s ease-out;\n max-height: 100vh;\n overflow: auto;\n opacity: 1;\n}\n\n.muigui-closed>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 1s;\n max-height: 0;\n opacity: 0;\n overflow: hidden;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-pop-down-bottom {\n\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: "+";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: "X";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n cursor: pointer;\n place-content: center center;\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: "";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: "✔";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 2px) / -2);\n width: calc(var(--line-height) - 2px);\n height: calc(var(--line-height) - 2px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn\'t work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n',themes:{default:"",float:"\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n"}};function e(t,e={},n=[]){const i=document.createElement(t);return function(t,e,n){for(const[n,i]of Object.entries(e))if("function"==typeof i&&n.startsWith("on")){const e=n.substring(2).toLowerCase();t.addEventListener(e,i,{passive:!1})}else if("object"==typeof i)for(const[e,o]of Object.entries(i))t[n][e]=o;else void 0===t[n]?t.setAttribute(n,i):t[n]=i;for(const e of n)t.appendChild(e)}(i,e,n),i}let n=0;function i(t,e){const n=t.indexOf(e);return n&&t.splice(n,1),t}function o(t,e,n){return Math.max(e,Math.min(n,t))}const r="undefined"!=typeof SharedArrayBuffer?function(t){return t&&t.buffer&&(t.buffer instanceof ArrayBuffer||t.buffer instanceof SharedArrayBuffer)}:function(t){return t&&t.buffer&&t.buffer instanceof ArrayBuffer},s=(t,e,n)=>Math.round(e(t)/n)/(1/n),a=(t,e)=>(t%e+e)%e;function l(t,e){for(const n in e)n in t&&(t[n]=e[n]);return t}const u=(t,e,n,i,o)=>(t-e)*(o-i)/(n-e)+i,c=({from:t,to:e})=>({to:n=>u(n,...t,...e),from:n=>[!0,u(n,...e,...t)]}),h=({from:t,to:e,step:n})=>({min:e[0],max:e[1],...n&&{step:n},converters:c({from:t,to:e})}),d={to:t=>t,from:t=>[!0,t]};function p(t,e,n,i,o){const{converters:{from:r}=d}=o,{min:s,max:a}=o,l=o.minRange||0,u=r(l)[1],c=t.add(e,n,{...o,min:s,max:a-l}).onChange((t=>{h.setValue(Math.min(a,Math.max(t+u,e[i])))})),h=t.add(e,i,{...o,min:s+l,max:a}).onChange((t=>{c.setValue(Math.max(s,Math.min(t-u,e[n])))}));return[c,h]}class m{domElement;#t;#e=[];constructor(t){this.domElement=t,this.#t=t}addElem(t){return this.#t.appendChild(t),t}removeElem(t){return this.#t.removeChild(t),t}pushSubElem(t){this.#t.appendChild(t),this.#t=t}popSubElem(){this.#t=this.#t.parentElement}add(t){return this.#e.push(t),this.addElem(t.domElement),t}remove(t){return this.removeElem(t.domElement),i(this.#e,t),t}pushSubView(t){this.pushSubElem(t.domElement)}popSubView(){this.popSubElem()}setOptions(t){for(const e of this.#e)e.setOptions(t)}updateDisplayIfNeeded(t,e){for(const n of this.#e)n.updateDisplayIfNeeded(t,e);return this}$(t){return this.domElement.querySelector(t)}}class g extends m{#n;#i;#o;constructor(t){super(e("div",{className:"muigui-controller"})),this.#n=[],this.#i=[],t&&this.domElement.classList.add(t)}get parent(){return this.#o}setParent(t){this.#o=t,this.enable(!this.disabled())}show(t=!0){return this.domElement.classList.toggle("muigui-hide",!t),this.domElement.classList.toggle("muigui-show",t),this}hide(){return this.show(!1)}disabled(){return!!this.domElement.closest(".muigui-disabled")}enable(t=!0){return this.domElement.classList.toggle("muigui-disabled",!t),["input","button","select","textarea"].forEach((t=>{this.domElement.querySelectorAll(t).forEach((t=>{const e=!!t.closest(".muigui-disabled");t.disabled=e}))})),this}disable(t=!0){return this.enable(!t)}onChange(t){return this.removeChange(t),this.#n.push(t),this}removeChange(t){return i(this.#n,t),this}onFinishChange(t){return this.removeFinishChange(t),this.#i.push(t),this}removeFinishChange(t){return i(this.#i,t),this}#r(t,e){for(const n of t)n.call(this,e)}emitChange(t,e,n){this.#r(this.#n,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitChange({object:e,property:n,value:t,controller:this}))}emitFinalChange(t,e,n){this.#r(this.#i,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitFinalChange({object:e,property:n,value:t,controller:this}))}updateDisplay(){}getColors(){const t=t=>t.replace(/-([a-z])/g,((t,e)=>e.toUpperCase())),n=e("div");this.domElement.appendChild(n);const i=Object.fromEntries(["color","bg-color","value-color","value-bg-color","hover-bg-color","menu-bg-color","menu-sep-color","disabled-color"].map((e=>{n.style.color=`var(--${e})`;const i=getComputedStyle(n);return[t(e),i.color]})));return n.remove(),i}}class f extends g{#s;#a;#l;#u={name:""};constructor(t,n,i={}){super("muigui-button",""),this.#s=t,this.#a=n,this.#l=this.addElem(e("button",{type:"button",onClick:()=>{this.#s[this.#a](this)}})),this.setOptions({name:n,...i})}setOptions(t){l(this.#u,t);const{name:e}=this.#u;this.#l.textContent=e}}function b(t,e){if(t.length!==e.length)return!1;for(let n=0;n{t.setValue(i.checked)},onChange:()=>{t.setFinalValue(i.checked)}});super(e("label",{},[i])),this.#b=i}updateDisplay(t){this.#b.checked=t}}const w=[],y=new Set;let k,E;function $(){k=void 0,E=!0;for(const t of w)y.has(t)||t();E=!1,y.size&&(E?C():(y.forEach((t=>{i(w,t)})),y.clear())),C()}function C(){!k&&w.length&&(k=requestAnimationFrame($))}let V=0;function I(){return"muigui-"+ ++V}class M extends m{constructor(t=""){super(e("div",{className:"muigui-value"})),t&&this.domElement.classList.add(t)}}class S extends g{#v;#x;constructor(t="",n=""){super("muigui-label-controller"),this.#v=I(),this.#x=e("label",{for:this.#v}),this.domElement.appendChild(this.#x),this.pushSubView(new M(t)),this.name(n)}get id(){return this.#v}name(t){return this.#x.title===this.#x.textContent&&(this.#x.title=t),this.#x.textContent=t,this}tooltip(t){this.#x.title=t}}class D extends S{#s;#a;#w;#y;#e;#k;constructor(t,e,n=""){super(n,e),this.#s=t,this.#a=e,this.#w=this.getValue(),this.#y=!1,this.#e=[]}get initialValue(){return this.#w}get object(){return this.#s}get property(){return this.#a}add(t){return this.#e.push(t),super.add(t),this.updateDisplay(),t}#E(t,e){let n=!1;if("object"==typeof t){const e=this.#s[this.#a];if(Array.isArray(t)||r(t))for(let i=0;i=0&&w.splice(e,1)}(this.#k)),this}}class N extends D{constructor(t,e){super(t,e,"muigui-checkbox");const n=this.id;this.add(new x(this,n)),this.updateDisplay()}}const F={to:t=>t,from:t=>[!0,t]},A={to:t=>t.toString(),from:t=>{const e=parseFloat(t);return[!Number.isNaN(e),e]}},U={radToDeg:c({to:[0,180],from:[0,Math.PI]})};function L(){let t=0;return function(e,n,i=5){t-=e.deltaY*n/i;const o=Math.floor(Math.abs(t)/n)*Math.sign(t)*n;return t-=o,o}}class O extends v{#$;#C;#V;#I;#u={step:.01,converters:A,min:Number.NEGATIVE_INFINITY,max:Number.POSITIVE_INFINITY};constructor(t,n){const i=t.setValue.bind(t),r=t.setFinalValue.bind(t),a=L();super(e("input",{type:"number",onInput:()=>this.#M(i,!0),onChange:()=>this.#M(r,!1),onWheel:e=>{e.preventDefault();const{min:n,max:i,step:r}=this.#u,l=a(e,r),u=parseFloat(this.domElement.value),c=o(s(u+l,(t=>t),r),n,i);t.setValue(c)}})),this.setOptions(n)}#M(t,e){const n=parseFloat(this.domElement.value),[i,r]=this.#C(n);let s;if(i&&!Number.isNaN(n)){const{min:n,max:i}=this.#u;s=r>=n&&r<=i,this.#I=e,t(o(r,n,i))}this.domElement.classList.toggle("muigui-invalid-value",!i||!s)}updateDisplay(t){this.#I||(this.domElement.value=s(t,this.#$,this.#V)),this.#I=!1}setOptions(t){l(this.#u,t);const{step:e,converters:{to:n,from:i}}=this.#u;return this.#$=n,this.#C=i,this.#V=e,this}}class j extends D{#S;#V;constructor(t,e,n={}){super(t,e,"muigui-checkbox"),this.#S=this.add(new O(this,n)),this.updateDisplay()}}class T extends v{#D;constructor(t,n){const i=[];super(e("select",{onChange:()=>{t.setFinalValue(this.#D[this.domElement.selectedIndex])}},n.map((([t,n])=>(i.push(n),e("option",{textContent:t})))))),this.#D=i}updateDisplay(t){const e=this.#D.indexOf(t);this.domElement.selectedIndex=e}}function H(t,e){return Array.isArray(t)?Array.isArray(t[0])?t:e?t.map(((t,e)=>[t,e])):t.map((t=>[t,t])):[...Object.entries(t)]}class z extends D{constructor(t,e,n){super(t,e,"muigui-select");const i="number"==typeof this.getValue(),{keyValues:o}=n,r=H(o,i);this.add(new T(this,r)),this.updateDisplay()}}class P extends v{#$;#C;#V;#I;#u={step:.01,min:0,max:1,converters:F};constructor(t,n){const i=L();super(e("input",{type:"range",onInput:()=>{this.#I=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#C(a);l&&t.setValue(u)},onChange:()=>{this.#I=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#C(a);l&&t.setFinalValue(u)},onWheel:e=>{e.preventDefault();const[n,r]=this.#C(parseFloat(this.domElement.value));if(!n)return;const{min:a,max:l,step:u}=this.#u,c=i(e,u),h=o(s(r+c,(t=>t),u),a,l);t.setValue(h)}})),this.setOptions(n)}updateDisplay(t){this.#I||(this.domElement.value=s(t,this.#$,this.#V)),this.#I=!1}setOptions(t){l(this.#u,t);const{step:e,min:n,max:i,converters:{to:o,from:r}}=this.#u;return this.#$=o,this.#C=r,this.#V=e,this.domElement.step=e,this.domElement.min=n,this.domElement.max=i,this}}class B extends D{constructor(t,e,n){super(t,e,"muigui-range"),this.add(new P(this,n)),this.add(new O(this,n))}}class G extends v{#$;#C;#I;#u={converters:F};constructor(t,n){const i=t.setValue.bind(t),o=t.setFinalValue.bind(t);super(e("input",{type:"text",onInput:()=>this.#M(i,!0),onChange:()=>this.#M(o,!1)})),this.setOptions(n)}#M(t,e){const[n,i]=this.#C(this.domElement.value);n&&(this.#I=e,t(i)),this.domElement.style.color=n?"":"var(--invalid-color)"}updateDisplay(t){this.#I||(this.domElement.value=this.#$(t),this.domElement.style.color=""),this.#I=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#$=e,this.#C=n,this}}class R extends D{constructor(t,e){super(t,e,"muigui-checkbox"),this.add(new G(this)),this.updateDisplay()}}const Y=(t,e,n)=>Math.max(e,Math.min(n,t)),K=(t,e,n)=>t+(e-t)*n,W=t=>t>=0?t%1:1-t%1,q=t=>+t.toFixed(0),J=t=>+t.toFixed(3),_=t=>parseInt(t.substring(1,3),16)<<16|parseInt(t.substring(3,5),16)<<8|parseInt(t.substring(5,7),16),X=t=>parseInt(t.substring(1,3),16)*2**24+65536*parseInt(t.substring(3,5),16)+256*parseInt(t.substring(5,7),16)+parseInt(t.substring(7,9),16),Z=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16)],Q=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,tt=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16),parseInt(t.substring(7,9),16)],et=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,nt=t=>Z(t).map((t=>J(t/255))),it=t=>Q(Array.from(t).map((t=>Math.round(Y(255*t,0,255))))),ot=t=>tt(t).map((t=>J(t/255))),rt=t=>et(Array.from(t).map((t=>Math.round(Y(255*t,0,255))))),st=t=>Y(Math.round(255*t),0,255).toString(16).padStart(2,"0"),at=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255}),lt=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255,a:parseInt(t.substring(7,9),16)/255}),ut=t=>`rgb(${Z(t).join(", ")})`,ct=/^\s*rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/,ht=t=>`rgba(${tt(t).map(((t,e)=>3===e?t/255:t)).join(", ")})`,dt=/^\s*rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+\.\d+|\d+)\s*\)\s*$/,pt=t=>{const e=yt(Z(t)).map((t=>q(t)));return`hsl(${e[0]}, ${e[1]}%, ${e[2]}%)`},mt=t=>{const e=kt(tt(t)).map(((t,e)=>3===e?J(t):q(t)));return`hsl(${e[0]} ${e[1]}% ${e[2]}% / ${e[3]})`},gt=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\)\s*$/,ft=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\/\s*(\d+\.\d+|\d+)\s*\)\s*$/,bt=(t,e)=>(t%e+e)%e;function vt([t,e,n]){t=bt(t,360),e=Y(e/100,0,1),n=Y(n/100,0,1);const i=e*Math.min(n,1-n);function o(e){const o=(e+t/30)%12;return n-i*Math.max(-1,Math.min(o-3,9-o,1))}return[o(0),o(8),o(4)].map((t=>Math.round(255*t)))}function xt([t,e,n]){const i=Math.max(t,e,n),o=Math.min(t,e,n),r=.5*(o+i),s=i-o;let a=0,l=0;if(0!==s)switch(l=0===r||1===r?0:(i-r)/Math.min(r,1-r),i){case t:a=(e-n)/s+(e{const[e,n,i]=xt(t.map((t=>t/255)));return[360*e,100*n,100*i]},kt=t=>{const[e,n,i,o]=wt(t.map((t=>t/255)));return[360*e,100*n,100*i,o]};function Et([t,e,n]){return e=Y(e,0,1),n=Y(n,0,1),[t,t+2/3,t+1/3].map((t=>K(1,Y(Math.abs(6*W(t)-3)-1,0,1),e)*n))}function $t([t,e,n,i]){return[...Et([t,e,n]),i]}const Ct=t=>Math.round(1e3*t)/1e3;function Vt([t,e,n]){const i=n>e?[n,e,-1,2/3]:[e,n,0,-1/3],o=i[0]>t?[i[0],i[1],i[3],t]:[t,i[1],i[2],i[0]],r=o[0]-Math.min(o[3],o[1]);return[Math.abs(o[2]+(o[3]-o[1])/(6*r+Number.EPSILON)),r/(o[0]+Number.EPSILON),o[0]].map(Ct)}const It=t=>t.endsWith("a")||t.startsWith("hex8"),Mt=[{re:/^#(?:[0-9a-f]){6}$/i,format:"hex6"},{re:/^(?:[0-9a-f]){6}$/i,format:"hex6-no-hash"},{re:/^#(?:[0-9a-f]){8}$/i,format:"hex8"},{re:/^(?:[0-9a-f]){8}$/i,format:"hex8-no-hash"},{re:/^#(?:[0-9a-f]){3}$/i,format:"hex3"},{re:/^(?:[0-9a-f]){3}$/i,format:"hex3-no-hash"},{re:ct,format:"css-rgb"},{re:gt,format:"css-hsl"},{re:dt,format:"css-rgba"},{re:ft,format:"css-hsla"}];function St(t){switch(typeof t){case"number":return console.warn('can not reliably guess format based on a number. You should pass in a format like {format: "uint32-rgb"} or {format: "uint32-rgb"}'),t<=16777215?"uint32-rgb":"uint32-rgba";case"string":{const e=function(t){for(const e of Mt)if(e.re.test(t))return e}(t.trim());if(e)return e.format;break}case"object":if(t instanceof Uint8Array||t instanceof Uint8ClampedArray){if(3===t.length)return"uint8-rgb";if(4===t.length)return"uint8-rgba"}else if(t instanceof Float32Array){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if(Array.isArray(t)){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if("r"in t&&"g"in t&&"b"in t)return"a"in t?"object-rgba":"object-rgb"}throw new Error(`unknown color format: ${t}`)}function Dt(t){return t.trim(t)}function Nt(t){return t.trim(t)}function Ft(t){return t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]?`#${t[1]}${t[3]}${t[5]}`:t}const At=/^(#|)([0-9a-f]{3})$/i;function Ut(t){const e=At.exec(t);if(e){const[,,t]=e;return"#"+`${(n=t)[0]}${n[0]}${n[1]}${n[1]}${n[2]}${n[2]}`}var n;return t}function Lt(t){return Ft(Dt(t))}const Ot=t=>{const e=ct.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),`rgb(${n.join(", ")})`]},jt=t=>{const e=dt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?parseFloat(t):parseInt(t)));return[!n.find((t=>t>255)),`rgba(${n.join(", ")})`]},Tt=t=>{const e=gt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]}, ${n[1]}%, ${n[2]}%)`]},Ht=t=>{const e=ft.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]} ${n[1]}% ${n[2]}% / ${n[3]})`]},zt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Pt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Bt=/^\s*(?:0x){0,1}([0-9a-z]{1,6})\s*$/i,Gt=/^\s*(?:0x){0,1}([0-9a-z]{1,8})\s*$/i,Rt=/^\s*#[a-f0-9]{6}\s*$|^\s*#[a-f0-9]{3}\s*$/i,Yt=/^\s*[a-f0-9]{6}\s*$/i,Kt=/^\s*#[a-f0-9]{8}\s*$/i,Wt=/^\s*[a-f0-9]{8}\s*$/i,qt={hex6:{color:{from:t=>[!0,t],to:Dt},text:{from:t=>[Rt.test(t),t.trim()],to:t=>t}},hex8:{color:{from:t=>[!0,t],to:Nt},text:{from:t=>[Kt.test(t),t.trim()],to:t=>t}},hex3:{color:{from:t=>[!0,Lt(t)],to:Ut},text:{from:t=>[Rt.test(t),Ft(t.trim())],to:t=>t}},"hex6-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${Dt(t)}`},text:{from:t=>[Yt.test(t),t.trim()],to:t=>t}},"hex8-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${Nt(t)}`},text:{from:t=>[Wt.test(t),t.trim()],to:t=>t}},"hex3-no-hash":{color:{from:t=>[!0,Lt(t).substring(1)],to:Ut},text:{from:t=>[Yt.test(t),Ft(t.trim())],to:t=>t}},"uint32-rgb":{color:{from:t=>[!0,_(t)],to:t=>`#${Math.round(t).toString(16).padStart(6,"0")}`},text:{from:t=>(t=>{const e=Bt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(6,"0")}`}},"uint32-rgba":{color:{from:t=>[!0,X(t)],to:t=>`#${Math.round(t).toString(16).padStart(8,"0")}`},text:{from:t=>(t=>{const e=Gt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(8,"0")}`}},"uint8-rgb":{color:{from:t=>[!0,Z(t)],to:Q},text:{from:t=>{const e=zt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"uint8-rgba":{color:{from:t=>[!0,tt(t)],to:et},text:{from:t=>{const e=Pt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"float-rgb":{color:{from:t=>[!0,nt(t)],to:it},text:{from:t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(3!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>J(t)))]},to:t=>Array.from(t).map((t=>J(t))).join(", ")}},"float-rgba":{color:{from:t=>[!0,ot(t)],to:rt},text:{from:t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(4!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>J(t)))]},to:t=>Array.from(t).map((t=>J(t))).join(", ")}},"object-rgb":{color:{from:t=>[!0,at(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b))throw new Error("not {r, g, b}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${J(t.r)}, g:${J(t.g)}, b:${J(t.b)}}`}},"object-rgba":{color:{from:t=>[!0,lt(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}${st(t.a)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b)||Number.isNaN(n.a))throw new Error("not {r, g, b, a}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${J(t.r)}, g:${J(t.g)}, b:${J(t.b)}}, a:${J(t.a)}}`}},"css-rgb":{color:{from:t=>[!0,ut(t)],to:t=>{const e=ct.exec(t);return Q([e[1],e[2],e[3]].map((t=>parseInt(t))))}},text:{from:Ot,to:t=>Ot(t)[1]}},"css-rgba":{color:{from:t=>[!0,ht(t)],to:t=>{const e=dt.exec(t);return et([e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?255*parseFloat(t)|0:parseInt(t))))}},text:{from:jt,to:t=>jt(t)[1]}},"css-hsl":{color:{from:t=>[!0,pt(t)],to:t=>{const e=gt.exec(t),n=vt([e[1],e[2],e[3]].map((t=>parseFloat(t))));return Q(n)}},text:{from:Tt,to:t=>Tt(t)[1]}},"css-hsla":{color:{from:t=>[!0,mt(t)],to:t=>{const e=ft.exec(t),n=function([t,e,n,i]){return[...vt([t,e,n]),255*i|0]}([e[1],e[2],e[3],e[4]].map((t=>parseFloat(t))));return et(n)}},text:{from:Ht,to:t=>Ht(t)[1]}}};class Jt extends m{constructor(t,n){super(e(t,{className:n}))}}class _t extends S{#N;constructor(){super("muigui-canvas"),this.#N=this.add(new Jt("canvas","muigui-canvas")).domElement}get canvas(){return this.#N}}class Xt extends v{#$;#C;#F;#I;#u={converters:F};constructor(t,n){const i=e("input",{type:"color",onInput:()=>{const[e,n]=this.#C(i.value);e&&(this.#I=!0,t.setValue(n))},onChange:()=>{const[e,n]=this.#C(i.value);e&&(this.#I=!0,t.setFinalValue(n))}});super(e("div",{},[i])),this.setOptions(n),this.#F=i}updateDisplay(t){this.#I||(this.#F.value=this.#$(t)),this.#I=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#$=e,this.#C=n,this}}class Zt extends D{#A;#S;constructor(t,e,n={}){super(t,e,"muigui-color");const i=n.format||St(this.getValue()),{color:o,text:r}=qt[i];this.#A=this.add(new Xt(this,{converters:o})),this.#S=this.add(new G(this,{converters:r})),this.updateDisplay()}setOptions(t){const{format:e}=t;if(e){const{color:t,text:n}=qt[e];this.#A.setOptions({converters:t}),this.#S.setOptions({converters:n})}return super.setOptions(t),this}}class Qt extends g{constructor(){super("muigui-divider")}}class te extends g{#U;#L;constructor(t){super(t),this.#U=[],this.#L=this}get children(){return this.#U}get controllers(){return this.#U.filter((t=>!(t instanceof te)))}get folders(){return this.#U.filter((t=>t instanceof te))}reset(t=!0){for(const e of this.#U)e instanceof te&&!t||e.reset(t);return this}updateDisplay(){for(const t of this.#U)t.updateDisplay();return this}remove(t){const e=this.#U.indexOf(t);if(e>=0){const t=this.#U.splice(e,1)[0];t.domElement.remove(),t.setParent(null)}return this}#O(t){return this.domElement.appendChild(t.domElement),this.#U.push(t),t.setParent(this),t}addController(t){return this.#L.#O(t)}pushContainer(t){return this.addController(t),this.#L=t,t}popContainer(){return this.#L=this.#L.parent,this}}class ee extends te{#j;constructor(t="Controls",n="muigui-menu"){super(n),this.#j=e("label"),this.addElem(e("button",{type:"button",onClick:()=>this.toggleOpen()},[this.#j])),this.pushContainer(new te),this.name(t),this.open()}open(t=!0){return this.domElement.classList.toggle("muigui-closed",!t),this.domElement.classList.toggle("muigui-open",t),this}close(){return this.open(!1)}name(t){return this.#j.textContent=t,this}title(t){return this.name(t)}toggleOpen(){return this.open(!this.domElement.classList.contains("muigui-open")),this}}class ne extends g{constructor(t){super("muigui-label"),this.text(t)}text(t){return this.domElement.textContent=t,this}}function ie(){}function oe(t,e,n){const i=t.getBoundingClientRect(),o=e.clientX-i.left,r=e.clientY-i.top,s=o/i.width,a=r/i.height,l=o-(n=n||[o,r])[0],u=r-n[1];return{x:o,y:r,nx:s,ny:a,dx:l,dy:u,ndx:l/i.width,ndy:u/i.width}}function re(t,{onDown:e=ie,onMove:n=ie,onUp:i=ie}){let o;const r=function(e){const i={type:"move",...oe(t,e,o)};n(i)},s=function(e){t.releasePointerCapture(e.pointerId),t.removeEventListener("pointermove",r),t.removeEventListener("pointerup",s),document.body.style.backgroundColor="",i("up")},a=function(n){t.addEventListener("pointermove",r),t.addEventListener("pointerup",s),t.setPointerCapture(n.pointerId);const i=oe(t,n);o=[i.x,i.y],e({type:"down",...i})};return t.addEventListener("pointerdown",a),function(){t.removeEventListener("pointerdown",a)}}function se(t){return t.querySelectorAll("[data-src]").forEach((e=>{const i="muigui-id-"+n++;e.id=i,t.querySelectorAll(`[data-target=${e.dataset.src}]`).forEach((t=>{t.setAttribute("fill",`url(#${i})`)}))})),t}class ae extends v{#$;#C;#T;#H;#z;#P;#B;#G;#R;#Y;#K;#W;#q;#J;#u={converters:F,alpha:!1};#_;#X;constructor(t,n){super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n',className:"muigui-no-scroll"})),this.#T=this.domElement.children[0],this.#z=this.domElement.children[1],this.#G=this.domElement.children[2],se(this.#T),se(this.#z),se(this.#G),this.#H=this.$(".muigui-color-chooser-circle"),this.#P=this.$("[data-src=muigui-color-chooser-hue]"),this.#B=this.$(".muigui-color-chooser-hue-cursor"),this.#R=this.$("[data-src=muigui-color-chooser-alpha]"),this.#Y=this.$(".muigui-color-chooser-alpha-cursor");const i=e=>{const n=o(e.nx,0,1),i=o(e.ny,0,1);this.#K[1]=n,this.#K[2]=1-i,this.#W=!0,this.#J=!0;const[r,s]=this.#C(this.#_(this.#K));r&&t.setValue(s)},r=e=>{const n=o(e.nx,0,1);this.#K[0]=n,this.#q=!0,this.#J=!0;const[i,r]=this.#C(this.#_(this.#K));i&&t.setValue(r)},s=e=>{const n=o(e.nx,0,1);this.#K[3]=n,this.#W=!0,this.#q=!0;const[i,r]=this.#C(this.#_(this.#K));i&&t.setValue(r)};re(this.#T,{onDown:i,onMove:i}),re(this.#z,{onDown:r,onMove:r}),re(this.#G,{onDown:s,onMove:s}),this.setOptions(n)}updateDisplay(t){this.#K||(this.#K=this.#X(this.#$(t)));{const[e,n,i,o=1]=this.#X(this.#$(t));this.#W||(this.#K[0]=n>.001&&i>.001?e:this.#K[0]),this.#q||(this.#K[1]=n,this.#K[2]=i),this.#J||(this.#K[3]=o)}{const[t,e,n,i]=this.#K,[o,r,s]=wt($t(this.#K));this.#W||this.#B.setAttribute("transform",`translate(${64*t}, 0)`),this.#P.children[0].setAttribute("stop-color",`hsl(${360*o} 0% 100% / ${i})`),this.#P.children[1].setAttribute("stop-color",`hsl(${360*o} 100% 50% / ${i})`),this.#J||this.#Y.setAttribute("transform",`translate(${64*i}, 0)`),this.#R.children[0].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 0)`),this.#R.children[1].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 1)`),this.#q||(this.#H.setAttribute("cx",""+64*e),this.#H.setAttribute("cy",""+48*(1-n)))}this.#W=!1,this.#q=!1,this.#J=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n},alpha:i}=this.#u;return this.#G.style.display=i?"":"none",this.#_=i?t=>rt($t(t)):t=>it(Et(t)),this.#X=i?t=>function([t,e,n,i]){return[...Vt([t,e,n]),i]}(ot(t)):t=>Vt(nt(t)),this.#$=e,this.#C=n,this}}class le extends D{#Z;#Q;#b;#tt;#u={open:!1};constructor(t,n,i={}){super(t,n,"muigui-pop-down-controller"),this.#Z=this.add(new Jt("div","muigui-pop-down-top"));const o=this.#Z.addElem(e("input",{type:"checkbox",onChange:()=>{this.#u.open=o.checked,this.updateDisplay()}}));this.#b=o,this.#Q=this.#Z.add(new Jt("div","muigui-pop-down-values")),this.#tt=this.add(new Jt("div","muigui-pop-down-bottom")),this.setOptions(i)}setKnobColor(t){this.#b&&(this.#b.style=`\n --range-color: ${t};\n --value-bg-color: ${t};\n `)}updateDisplay(){super.updateDisplay();const{open:t}=this.#u;this.domElement.children[1].classList.toggle("muigui-open",t),this.domElement.children[1].classList.toggle("muigui-closed",!t)}setOptions(t){l(this.#u,t),super.setOptions(t),this.updateDisplay()}addTop(t){return this.#Q.add(t)}addBottom(t){return this.#tt.add(t)}}class ue extends le{#A;#S;#$;#et;constructor(t,e,n={}){super(t,e,"muigui-color-chooser");const i=n.format||St(this.getValue()),{color:o,text:r}=qt[i];this.#$=o.to,this.#S=new G(this,{converters:r,alpha:It(i)}),this.#A=new ae(this,{converters:o,alpha:It(i)}),this.addTop(this.#S),this.addBottom(this.#A),this.#et=()=>{if(this.#$){const t=this.#$(this.getValue()),e=yt(Z(t));e[2]=(e[2]+50)%100;const n=Q(vt(e));this.setKnobColor(`${t.substring(0,7)}FF`,n)}},this.updateDisplay()}updateDisplay(){super.updateDisplay(),this.#et&&this.#et()}setOptions(t){return super.setOptions(t),this}}class ce extends ee{add(t,e,...n){const i=t instanceof g?t:function(t,e,...n){const[i]=n;if(Array.isArray(i))return new z(t,e,{keyValues:i});const o=typeof t[e];switch(o){case"number":if("number"==typeof n[0]&&"number"==typeof n[1]){const i=n[0],o=n[1],r=n[2];return new B(t,e,{min:i,max:o,...r&&{step:r}})}return 0===n.length?new j(t,e,...n):new B(t,e,...n);case"boolean":return new N(t,e,...n);case"function":return new f(t,e,...n);case"string":return new R(t,e,...n);case"undefined":throw new Error(`no property named ${e}`);default:throw new Error(`unhandled type ${o} for property ${e}`)}}(t,e,...n);return this.addController(i)}addCanvas(t){return this.addController(new _t(t))}addColor(t,e,n={}){const i=t[e];return It(n.format||St(i))?this.addController(new ue(t,e,n)):this.addController(new Zt(t,e,n))}addDivider(){return this.addController(new Qt)}addFolder(t){return this.addController(new ce(t))}addLabel(t){return this.addController(new ne(t))}}class he extends HTMLElement{constructor(){super(),this.shadow=this.attachShadow({mode:"open"})}}customElements.define("muigui-element",he);const de=new CSSStyleSheet;de.replaceSync(t.default);const pe=new CSSStyleSheet;function me(t){let e,n;function i(){if(e&&!n){const o=e;e=void 0,n=t.replace(o).then((()=>{n=void 0,i()}))}}return function(t){e=t,i()}}const ge=me(de),fe=me(pe);class be extends ce{static converters=U;static mapRange=u;static makeRangeConverters=c;static makeRangeOptions=h;static makeMinMaxPair=p;#nt=new CSSStyleSheet;constructor(t={}){super("Controls","muigui-root"),t instanceof HTMLElement&&(t={parent:t});const{autoPlace:n=!0,width:i,title:o="Controls"}=t;let{parent:r}=t;if(i&&(this.domElement.style.width=/^\d+$/.test(i)?`${i}px`:i),void 0===r&&n&&(r=document.body,this.domElement.classList.add("muigui-auto-place")),r){const t=e("muigui-element");t.shadowRoot.adoptedStyleSheets=[de,pe,this.#nt],t.shadow.appendChild(this.domElement),r.appendChild(t)}o&&this.title(o),this.domElement.classList.add("muigui","muigui-colors")}setStyle(t){this.#nt.replace(t)}static setBaseStyles(t){ge(t)}static getBaseStyleSheet(){return de}static setUserStyles(t){fe(t)}static getUserStyleSheet(){return pe}static setTheme(e){be.setBaseStyles(`${t.default}\n${t.themes[e]||""}`)}}function ve(){}const xe={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]};function we(t,{onDown:e=ve,onUp:n=ve}){const i=function(t){const i=t.shiftKey?10:1,[o,r]=(xe[t.key]||[0,0]).map((t=>t*i));("keydown"===t.type?e:n)({type:t.type.substring(3),dx:o,dy:r,event:t})};return t.addEventListener("keydown",i),t.addEventListener("keyup",i),function(){t.removeEventListener("keydown",i),t.removeEventListener("keyup",i)}}function ye(t,e=""){if(!t)throw new Error(e)}function ke(t,e,n,i,o,r){const s=Math.abs(n)*Math.cos(r),a=Math.abs(i)*Math.sin(r);return[t+Math.cos(o)*s-Math.sin(o)*a,e+Math.sin(o)*s+Math.cos(o)*a]}function Ee(t,e,n,i,o){ye(Math.abs(i-o)<=2*Math.PI),ye(i>=-Math.PI&&i<=2*Math.PI),ye(i<=o),ye(o>=-Math.PI&&o<=4*Math.PI);const{x1:r,y1:s,x2:a,y2:l,fa:u,fs:c}=function(t,e,n,i,o,r,s){const[a,l]=ke(t,e,n,i,o,r),[u,c]=ke(t,e,n,i,o,r+s);return{x1:a,y1:l,x2:u,y2:c,fa:Math.abs(s)>Math.PI?1:0,fs:s>0?1:0}}(t,e,n,n,0,i,o-i);return Math.abs(Math.abs(i-o)-2*Math.PI)>Number.EPSILON?`M${t} ${e} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l} L${t} ${e}`:`M${r} ${s} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l}`}const $e=t=>a(t+Math.PI,2*Math.PI)-Math.PI;class Ce extends v{#it;#ot;#rt;#st;#u={step:1,min:-180,max:180,dirMin:-Math.PI,dirMax:Math.PI,wrap:void 0,converters:F};constructor(t,n={}){const i=L();super(e("div",{className:"muigui-direction muigui-no-scroll",innerHTML:'\n\n \x3c!----\x3e\n \n \n \n \n \n \n\n',onWheel:e=>{e.preventDefault();const{min:n,max:r,step:l}=this.#u,u=i(e,l);let c=this.#rt+u;this.#st&&(c=a(c-n,r-n)+n);const h=o(s(c,(t=>t),l),n,r);t.setValue(h)}}));const r=e=>{const{min:n,max:i,step:r,dirMin:a,dirMax:l}=this.#u,u=2*e.nx-1,c=2*e.ny-1,h=Math.atan2(c,u),d=(a+l)/2,p=o(($e(h-d)-$e(a-d))/(l-a),0,1),m=s(n+(i-n)*p,(t=>t),r);t.setValue(m)};re(this.domElement,{onDown:r,onMove:r}),we(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),this.#it=this.$("#muigui-arrow"),this.#ot=this.$("#muigui-range"),this.setOptions(n)}updateDisplay(t){this.#rt=t;const{min:e,max:n}=this.#u,i=(t-e)/(n-e),o=(r=this.#u.dirMin,s=this.#u.dirMax,r+(s-r)*i);var r,s;this.#it.style.transform=`rotate(${o}rad)`}setOptions(t){l(this.#u,t);const{dirMin:e,dirMax:n,wrap:i}=this.#u;this.#st=void 0!==i?i:Math.abs(e-n)>=2*Math.PI-Number.EPSILON;const[o,r]=e(o.push(i),e("label",{},[e("input",{type:"radio",name:r,value:a,onChange:function(){this.checked&&t.setFinalValue(s.#D[this.value])}}),e("button",{type:"button",textContent:n,onClick:function(){this.previousElementSibling.click()}})]))))));const s=this;this.#D=o,this.cols(i)}updateDisplay(t){const e=this.#D.indexOf(t);for(let t=0;t{e({rect:t.getBoundingClientRect(),elem:t})})).observe(t)}function De(t,e,n,i){Se(t,(({rect:o})=>{const{width:r,height:s}=o;t.setAttribute("viewBox",`-${r*e} -${s*n} ${r} ${s}`),i({elem:t,rect:o})}))}function Ne(t,e,n,i,o,r){const a=[];tt),n)),e=Math.min(e,o);for(let i=t;i<=e;i+=n)a.push(`M${i} 0 l0 ${r}`);return a.join(" ")}class Fe extends v{#at;#lt;#ut;#ct;#ht;#dt;#pt;#mt;#gt;#rt;#ft;#u={min:-100,max:100,step:1,unit:10,unitSize:10,ticksPerUnit:5,labelFn:t=>t,tickHeight:1,limits:!0,thicksColor:void 0,orientation:void 0};constructor(t,n){const i=L();let r;super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \x3c!----\x3e\n \x3c!----\x3e\n \n \n \n \n\n',className:"muigui-no-v-scroll",onWheel:e=>{e.preventDefault();const{min:n,max:r,step:a}=this.#u,l=i(e,a),u=o(s(this.#rt+l,(t=>t),a),n,r);t.setValue(u)}})),this.#at=this.$("svg"),this.#lt=this.$("#muigui-origin"),this.#ut=this.$("#muigui-ticks"),this.#ct=this.$("#muigui-thicks"),this.#ht=this.$("#muigui-numbers"),this.#dt=this.$("#muigui-left-grad"),this.#pt=this.$("#muigui-right-grad"),this.setOptions(n),re(this.domElement,{onDown:()=>{r=this.#rt},onMove:e=>{const{min:n,max:i,unitSize:a,unit:l,step:u}=this.#u,c=o(s(r-e.dx/a*l,(t=>t),u),n,i);t.setValue(c)}}),we(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),De(this.#at,.5,0,(({rect:{width:t}})=>{this.#dt.setAttribute("x",-t/2),this.#pt.setAttribute("x",t/2-20),this.#ft=function(t){const e=t.innerHTML;t.innerHTML="- ";const n=t.querySelector("text").getComputedTextLength();return t.innerHTML=e,n}(this.#ht),this.#mt=t,this.#bt()}))}#bt(){if(!this.#mt||void 0===this.#rt)return;const{labelFn:t,limits:e,min:n,max:i,orientation:o,tickHeight:r,ticksPerUnit:a,unit:l,unitSize:u,thicksColor:c}=this.#u,h=Math.ceil(this.#mt/u),d=this.#rt/l,p=Math.round(d-h),m=p*u,g=(p+2*h)*u,f=e?n*u/l:m,b=e?i*u/l:g,v=""===t(1)?10:5;a>1&&this.#ut.setAttribute("d",Ne(m,g,u/a,f,b,v*r)),this.#ct.style.stroke=c,this.#ct.setAttribute("d",Ne(m,g,u,f,b,v)),this.#ht.innerHTML=function(t,e,n,i,o,r,a,l){const u=[];tt),n)),e=Math.min(e,a);const c=Math.max(0,-Math.log10(i));for(let r=t;r<=e;r+=n)u.push(`${h=r/n*i,l(h.toFixed(c))}`);var h;return u.join("\n")}(m,g,u,l,this.#ft,f,b,t),this.#lt.setAttribute("transform",`translate(${-this.#rt*u/l} 0)`),this.#at.classList.toggle("muigui-slider-up","up"===o)}updateDisplay(t){this.#rt=t,this.#bt()}setOptions(t){return l(this.#u,t),this}}class Ae extends D{constructor(t,e,n={}){super(t,e,"muigui-slider"),this.add(new Fe(this,n)),this.add(new O(this,n)),this.updateDisplay()}}class Ue extends v{#at;#it;#H;#rt=[];constructor(t){super(e("div",{innerHTML:'\n\n \n \n \n \n \n\n',className:"muigui-no-scroll"}));const n=e=>{const{width:n,height:i}=this.#at.getBoundingClientRect(),o=2*e.nx-1,r=2*e.ny-1;t.setValue([o*n*.5,r*i*.5])};re(this.domElement,{onDown:n,onMove:n}),this.#at=this.$("svg"),this.#it=this.$("#muigui-arrow"),this.#H=this.$("#muigui-circle"),De(this.#at,.5,.5,(()=>this.#vt))}#vt(){const[t,e]=this.#rt;this.#it.setAttribute("d",`M0,0L${t},${e}`),this.#H.setAttribute("transform",`translate(${t}, ${e})`)}updateDisplay(t){this.#rt[0]=t[0],this.#rt[1]=t[1],this.#vt()}}class Le extends le{constructor(t,e){super(t,e,"muigui-vec2");const n=t=>({setValue:e=>{const n=this.getValue();n[t]=e,this.setValue(n)},setFinalValue:e=>{const n=this.getValue();n[t]=e,this.setFinalValue(n)}});this.addTop(new O(n(0),{converters:{to:t=>t[0],from:A.from}})),this.addTop(new O(n(1),{converters:{to:t=>t[1],from:A.from}})),this.addBottom(new Ue(this)),this.updateDisplay()}}export{ue as ColorChooser,Ve as Direction,Me as RadioGrid,B as Range,z as Select,Ae as Slider,j as TextNumber,Le as Vec2,be as default}; +var t={default:'\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #8BF;\n --range-color: #AAA;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: \n linear-gradient(\n rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #458; /*#88AAFF*/;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: linear-gradient(\n rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root {\n z-index: 1;\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n /* white-space: pre; why?? */\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n content: "X";\n color: rgba(0, 0, 0, 0);\n background-color: var(--range-color);\n border-radius: 0.2em;\n width: 1.25em;\n margin-right: 0.25em;\n height: 1.25em; /*var(--line-height);*/\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n background-image: var(--image-open);\n}\n.muigui-closed>button>label::before {\n background-image: var(--image-closed);\n}\n\n.muigui-open>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: auto;\n height: 100%;\n}\n.muigui-closed>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: hidden;\n min-height: 0;\n}\n.muigui-open>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: 0px;\n}\n.muigui-closed>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: -100%;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-closed .muigui-pop-down-bottom {\n max-height: 0;\n}\n\n.muigui-value .muigui-pop-down-bottom {\n margin: 0;\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n background-image: var(--image-checkerboard);\n background-size: 10px 10px;\n background-position: 0 0, 0 5px, 5px -5px, -5px 0px;\n\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: "+";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: "X";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n padding: 2px 0 2px 0;\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n background-image: var(--button-image);\n cursor: pointer;\n place-content: center center;\n height: var(--line-height);\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: "";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: "✔";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 6px) / -2);\n width: calc(var(--line-height) - 6px);\n height: calc(var(--line-height) - 6px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn\'t work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n',themes:{default:{include:["default"],css:"\n "},float:{include:["default"],css:"\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n"},form:{include:[],css:"\n .muigui {\n --width: 100%;\n --label-width: 45%;\n --number-width: 40%;\n }\n .muigui-root>button {\n display: none;\n }\n .muigui-controller {\n margin-top: 1em;\n }\n .muigui-label-controller {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n margin-top: 1em;\n }\n .muigui-label-controller:has(.muigui-checkbox) {\n flex-direction: row;\n }\n .muigui-value {\n display: flex;\n align-items: stretch;\n }\n .muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n }\n .muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n }\n .muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n }\n .muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n }\n "},none:{include:[],css:""}}};function e(t,e={},n=[]){const i=document.createElement(t);return function(t,e,n){for(const[n,i]of Object.entries(e))if("function"==typeof i&&n.startsWith("on")){const e=n.substring(2).toLowerCase();t.addEventListener(e,i,{passive:!1})}else if("object"==typeof i)for(const[e,o]of Object.entries(i))t[n][e]=o;else void 0===t[n]?t.setAttribute(n,i):t[n]=i;for(const e of n)t.appendChild(e)}(i,e,n),i}let n=0;function i(t,e){const n=t.indexOf(e);return n&&t.splice(n,1),t}function o(t,e,n){return Math.max(e,Math.min(n,t))}const r="undefined"!=typeof SharedArrayBuffer?function(t){return t&&t.buffer&&(t.buffer instanceof ArrayBuffer||t.buffer instanceof SharedArrayBuffer)}:function(t){return t&&t.buffer&&t.buffer instanceof ArrayBuffer},s=(t,e,n)=>Math.round(e(t)/n)/(1/n),a=(t,e)=>(t%e+e)%e;function l(t,e){for(const n in e)n in t&&(t[n]=e[n]);return t}const u=(t,e,n,i,o)=>(t-e)*(o-i)/(n-e)+i,c=({from:t,to:e})=>({to:n=>u(n,...t,...e),from:n=>[!0,u(n,...e,...t)]}),h=({from:t,to:e,step:n})=>({min:e[0],max:e[1],...n&&{step:n},converters:c({from:t,to:e})}),d={to:t=>t,from:t=>[!0,t]};function m(t,e,n,i,o){const{converters:{from:r}=d}=o,{min:s,max:a}=o,l=o.minRange||0,u=r(l)[1],c=t.add(e,n,{...o,min:s,max:a-l}).onChange((t=>{h.setValue(Math.min(a,Math.max(t+u,e[i])))})),h=t.add(e,i,{...o,min:s+l,max:a}).onChange((t=>{c.setValue(Math.max(s,Math.min(t-u,e[n])))}));return[c,h]}class p{domElement;#t;#e=[];constructor(t){this.domElement=t,this.#t=t}addElem(t){return this.#t.appendChild(t),t}removeElem(t){return this.#t.removeChild(t),t}pushSubElem(t){this.#t.appendChild(t),this.#t=t}popSubElem(){this.#t=this.#t.parentElement}add(t){return this.#e.push(t),this.addElem(t.domElement),t}remove(t){return this.removeElem(t.domElement),i(this.#e,t),t}pushSubView(t){this.pushSubElem(t.domElement)}popSubView(){this.popSubElem()}setOptions(t){for(const e of this.#e)e.setOptions(t)}updateDisplayIfNeeded(t,e){for(const n of this.#e)n.updateDisplayIfNeeded(t,e);return this}$(t){return this.domElement.querySelector(t)}}class g extends p{#n;#i;#o;constructor(t){super(e("div",{className:"muigui-controller"})),this.#n=[],this.#i=[],t&&this.domElement.classList.add(t)}get parent(){return this.#o}setParent(t){this.#o=t,this.enable(!this.disabled())}show(t=!0){return this.domElement.classList.toggle("muigui-hide",!t),this.domElement.classList.toggle("muigui-show",t),this}hide(){return this.show(!1)}disabled(){return!!this.domElement.closest(".muigui-disabled")}enable(t=!0){return this.domElement.classList.toggle("muigui-disabled",!t),["input","button","select","textarea"].forEach((t=>{this.domElement.querySelectorAll(t).forEach((t=>{const e=!!t.closest(".muigui-disabled");t.disabled=e}))})),this}disable(t=!0){return this.enable(!t)}onChange(t){return this.removeChange(t),this.#n.push(t),this}removeChange(t){return i(this.#n,t),this}onFinishChange(t){return this.removeFinishChange(t),this.#i.push(t),this}removeFinishChange(t){return i(this.#i,t),this}#r(t,e){for(const n of t)n.call(this,e)}emitChange(t,e,n){this.#r(this.#n,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitChange({object:e,property:n,value:t,controller:this}))}emitFinalChange(t,e,n){this.#r(this.#i,t),this.#o&&(void 0===e?this.#o.emitChange(t):this.#o.emitFinalChange({object:e,property:n,value:t,controller:this}))}updateDisplay(){}getColors(){const t=t=>t.replace(/-([a-z])/g,((t,e)=>e.toUpperCase())),n=e("div");this.domElement.appendChild(n);const i=Object.fromEntries(["color","bg-color","value-color","value-bg-color","hover-bg-color","menu-bg-color","menu-sep-color","disabled-color"].map((e=>{n.style.color=`var(--${e})`;const i=getComputedStyle(n);return[t(e),i.color]})));return n.remove(),i}}class b extends g{#s;#a;#l;#u={name:""};constructor(t,n,i={}){super("muigui-button",""),this.#s=t,this.#a=n,this.#l=this.addElem(e("button",{type:"button",onClick:()=>{this.#s[this.#a](this)}})),this.setOptions({name:n,...i})}name(t){this.#l.textContent=t}setOptions(t){l(this.#u,t);const{name:e}=this.#u;this.#l.textContent=e}}function f(t,e){if(t.length!==e.length)return!1;for(let n=0;n{t.setValue(i.checked)},onChange:()=>{t.setFinalValue(i.checked)}});super(e("label",{},[i])),this.#f=i}updateDisplay(t){this.#f.checked=t}}const w=[],y=new Set;let k,E;function I(){k=void 0,E=!0;for(const t of w)y.has(t)||t();E=!1,y.size&&(E?$():(y.forEach((t=>{i(w,t)})),y.clear())),$()}function $(){!k&&w.length&&(k=requestAnimationFrame(I))}let C=0;function M(){return"muigui-"+ ++C}class S extends p{constructor(t=""){super(e("div",{className:"muigui-value"})),t&&this.domElement.classList.add(t)}}class V extends g{#v;#x;constructor(t="",n=""){super("muigui-label-controller"),this.#v=M(),this.#x=e("label",{for:this.#v}),this.domElement.appendChild(this.#x),this.pushSubView(new S(t)),this.name(n)}get id(){return this.#v}name(t){return this.#x.title===this.#x.textContent&&(this.#x.title=t),this.#x.textContent=t,this}tooltip(t){this.#x.title=t}}class D extends V{#s;#a;#w;#y;#e;#k;constructor(t,e,n=""){super(n,e),this.#s=t,this.#a=e,this.#w=this.getValue(),this.#y=!1,this.#e=[]}get initialValue(){return this.#w}get object(){return this.#s}get property(){return this.#a}add(t){return this.#e.push(t),super.add(t),this.updateDisplay(),t}#E(t,e){let n=!1;if("object"==typeof t){const e=this.#s[this.#a];if(Array.isArray(t)||r(t))for(let i=0;i=0&&w.splice(e,1)}(this.#k)),this}}class N extends D{constructor(t,e){super(t,e,"muigui-checkbox");const n=this.id;this.add(new x(this,n)),this.updateDisplay()}}const A={to:t=>t,from:t=>[!0,t]},j={to:t=>t.toString(),from:t=>{const e=parseFloat(t);return[!Number.isNaN(e),e]}},U={radToDeg:c({to:[0,180],from:[0,Math.PI]})};function L(){let t=0;return function(e,n,i=5){t-=e.deltaY*n/i;const o=Math.floor(Math.abs(t)/n)*Math.sign(t)*n;return t-=o,o}}class F extends v{#I;#$;#C;#M;#u={step:.01,converters:j,min:Number.NEGATIVE_INFINITY,max:Number.POSITIVE_INFINITY};constructor(t,n){const i=t.setValue.bind(t),r=t.setFinalValue.bind(t),a=L();super(e("input",{type:"number",onInput:()=>{this.#S(i,!0)},onChange:()=>{this.#S(r,!1)},onWheel:e=>{e.preventDefault();const{min:n,max:i,step:r}=this.#u,l=a(e,r),u=parseFloat(this.domElement.value),c=o(s(u+l,(t=>t),r),n,i),[h,d]=this.#$(c);h&&t.setValue(d)}})),this.setOptions(n)}#S(t,e){const n=parseFloat(this.domElement.value),[i,r]=this.#$(n);let s;if(i&&!Number.isNaN(n)){const{min:n,max:i}=this.#u;s=r>=n&&r<=i,this.#M=e,t(o(r,n,i))}this.domElement.classList.toggle("muigui-invalid-value",!i||!s)}updateDisplay(t){this.#M||(this.domElement.value=s(t,this.#I,this.#C)),this.#M=!1}setOptions(t){l(this.#u,t);const{step:e,converters:{to:n,from:i}}=this.#u;return this.#I=n,this.#$=i,this.#C=e,this}}class P extends D{#V;#C;constructor(t,e,n={}){super(t,e,"muigui-text-number"),this.#V=this.add(new F(this,n)),this.updateDisplay()}}class O extends v{#D;constructor(t,n){const i=[];super(e("select",{onChange:()=>{t.setFinalValue(this.#D[this.domElement.selectedIndex])}},n.map((([t,n])=>(i.push(n),e("option",{textContent:t})))))),this.#D=i}updateDisplay(t){const e=this.#D.indexOf(t);this.domElement.selectedIndex=e}}function H(t,e){return Array.isArray(t)?Array.isArray(t[0])?t:e?t.map(((t,e)=>[t,e])):t.map((t=>[t,t])):[...Object.entries(t)]}class z extends D{constructor(t,e,n){super(t,e,"muigui-select");const i="number"==typeof this.getValue(),{keyValues:o}=n,r=H(o,i);this.add(new O(this,r)),this.updateDisplay()}}class T extends v{#I;#$;#C;#M;#u={step:.01,min:0,max:1,converters:A};constructor(t,n){const i=L();super(e("input",{type:"range",onInput:()=>{this.#M=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#$(a);l&&t.setValue(u)},onChange:()=>{this.#M=!0;const{min:e,max:n,step:i}=this.#u,r=parseFloat(this.domElement.value),a=o(s(r,(t=>t),i),e,n),[l,u]=this.#$(a);l&&t.setFinalValue(u)},onWheel:e=>{e.preventDefault();const[n,r]=this.#$(parseFloat(this.domElement.value));if(!n)return;const{min:a,max:l,step:u}=this.#u,c=i(e,u),h=o(s(r+c,(t=>t),u),a,l);t.setValue(h)}})),this.setOptions(n)}updateDisplay(t){this.#M||(this.domElement.value=s(t,this.#I,this.#C)),this.#M=!1}setOptions(t){l(this.#u,t);const{step:e,min:n,max:i,converters:{to:o,from:r}}=this.#u;return this.#I=o,this.#$=r,this.#C=e,this.domElement.step=e,this.domElement.min=n,this.domElement.max=i,this}}class W extends D{constructor(t,e,n){super(t,e,"muigui-range"),this.add(new T(this,n)),this.add(new F(this,n))}}class B extends v{#I;#$;#M;#u={converters:A};constructor(t,n){const i=t.setValue.bind(t),o=t.setFinalValue.bind(t);super(e("input",{type:"text",onInput:()=>{this.#S(i,!0)},onChange:()=>{this.#S(o,!1)}})),this.setOptions(n)}#S(t,e){const[n,i]=this.#$(this.domElement.value);n&&(this.#M=e,t(i)),this.domElement.style.color=n?"":"var(--invalid-color)"}updateDisplay(t){this.#M||(this.domElement.value=this.#I(t),this.domElement.style.color=""),this.#M=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#I=e,this.#$=n,this}}class G extends D{constructor(t,e){super(t,e,"muigui-text"),this.add(new B(this)),this.updateDisplay()}}const R=(t,e,n)=>Math.max(e,Math.min(n,t)),Z=(t,e,n)=>t+(e-t)*n,J=t=>t>=0?t%1:1-t%1,Y=t=>+t.toFixed(0),Q=t=>+t.toFixed(3),K=t=>parseInt(t.substring(1,3),16)<<16|parseInt(t.substring(3,5),16)<<8|parseInt(t.substring(5,7),16),_=t=>parseInt(t.substring(1,3),16)*2**24+65536*parseInt(t.substring(3,5),16)+256*parseInt(t.substring(5,7),16)+parseInt(t.substring(7,9),16),q=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16)],X=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,tt=t=>[parseInt(t.substring(1,3),16),parseInt(t.substring(3,5),16),parseInt(t.substring(5,7),16),parseInt(t.substring(7,9),16)],et=t=>`#${Array.from(t).map((t=>t.toString(16).padStart(2,"0"))).join("")}`,nt=t=>q(t).map((t=>Q(t/255))),it=t=>X(Array.from(t).map((t=>Math.round(R(255*t,0,255))))),ot=t=>tt(t).map((t=>Q(t/255))),rt=t=>et(Array.from(t).map((t=>Math.round(R(255*t,0,255))))),st=t=>R(Math.round(255*t),0,255).toString(16).padStart(2,"0"),at=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255}),lt=t=>({r:parseInt(t.substring(1,3),16)/255,g:parseInt(t.substring(3,5),16)/255,b:parseInt(t.substring(5,7),16)/255,a:parseInt(t.substring(7,9),16)/255}),ut=t=>`rgb(${q(t).join(", ")})`,ct=/^\s*rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/,ht=t=>`rgba(${tt(t).map(((t,e)=>3===e?t/255:t)).join(", ")})`,dt=/^\s*rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+\.\d+|\d+)\s*\)\s*$/,mt=t=>{const e=yt(q(t)).map((t=>Y(t)));return`hsl(${e[0]}, ${e[1]}%, ${e[2]}%)`},pt=t=>{const e=kt(tt(t)).map(((t,e)=>3===e?Q(t):Y(t)));return`hsl(${e[0]} ${e[1]}% ${e[2]}% / ${e[3]})`},gt=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\)\s*$/,bt=/^\s*hsl\(\s*(\d+)(?:deg|)\s*(?:,|)\s*(\d+)%\s*(?:,|)\s*(\d+)%\s*\/\s*(\d+\.\d+|\d+)\s*\)\s*$/,ft=(t,e)=>(t%e+e)%e;function vt([t,e,n]){t=ft(t,360),e=R(e/100,0,1),n=R(n/100,0,1);const i=e*Math.min(n,1-n);function o(e){const o=(e+t/30)%12;return n-i*Math.max(-1,Math.min(o-3,9-o,1))}return[o(0),o(8),o(4)].map((t=>Math.round(255*t)))}function xt([t,e,n]){const i=Math.max(t,e,n),o=Math.min(t,e,n),r=.5*(o+i),s=i-o;let a=0,l=0;if(0!==s)switch(l=0===r||1===r?0:(i-r)/Math.min(r,1-r),i){case t:a=(e-n)/s+(e{const[e,n,i]=xt(t.map((t=>t/255)));return[360*e,100*n,100*i]},kt=t=>{const[e,n,i,o]=wt(t.map((t=>t/255)));return[360*e,100*n,100*i,o]};function Et([t,e,n]){return e=R(e,0,1),n=R(n,0,1),[t,t+2/3,t+1/3].map((t=>Z(1,R(Math.abs(6*J(t)-3)-1,0,1),e)*n))}function It([t,e,n,i]){return[...Et([t,e,n]),i]}const $t=t=>Math.round(1e3*t)/1e3;function Ct([t,e,n]){const i=n>e?[n,e,-1,2/3]:[e,n,0,-1/3],o=i[0]>t?[i[0],i[1],i[3],t]:[t,i[1],i[2],i[0]],r=o[0]-Math.min(o[3],o[1]);return[Math.abs(o[2]+(o[3]-o[1])/(6*r+Number.EPSILON)),r/(o[0]+Number.EPSILON),o[0]].map($t)}function Mt([t,e,n,i]){return[...Ct([t,e,n]),i]}const St=t=>t.endsWith("a")||t.startsWith("hex8"),Vt=[{re:/^#(?:[0-9a-f]){6}$/i,format:"hex6"},{re:/^(?:[0-9a-f]){6}$/i,format:"hex6-no-hash"},{re:/^#(?:[0-9a-f]){8}$/i,format:"hex8"},{re:/^(?:[0-9a-f]){8}$/i,format:"hex8-no-hash"},{re:/^#(?:[0-9a-f]){3}$/i,format:"hex3"},{re:/^(?:[0-9a-f]){3}$/i,format:"hex3-no-hash"},{re:ct,format:"css-rgb"},{re:gt,format:"css-hsl"},{re:dt,format:"css-rgba"},{re:bt,format:"css-hsla"}];function Dt(t){switch(typeof t){case"number":return console.warn('can not reliably guess format based on a number. You should pass in a format like {format: "uint32-rgb"} or {format: "uint32-rgb"}'),t<=16777215?"uint32-rgb":"uint32-rgba";case"string":{const e=function(t){for(const e of Vt)if(e.re.test(t))return e}(t.trim());if(e)return e.format;break}case"object":if(t instanceof Uint8Array||t instanceof Uint8ClampedArray){if(3===t.length)return"uint8-rgb";if(4===t.length)return"uint8-rgba"}else if(t instanceof Float32Array){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if(Array.isArray(t)){if(3===t.length)return"float-rgb";if(4===t.length)return"float-rgba"}else if("r"in t&&"g"in t&&"b"in t)return"a"in t?"object-rgba":"object-rgb"}throw new Error(`unknown color format: ${t}`)}function Nt(t){return t.trim(t)}function At(t){return t.trim(t)}function jt(t){return t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]?`#${t[1]}${t[3]}${t[5]}`:t}const Ut=/^(#|)([0-9a-f]{3})$/i;function Lt(t){const e=Ut.exec(t);if(e){const[,,t]=e;return"#"+`${(n=t)[0]}${n[0]}${n[1]}${n[1]}${n[2]}${n[2]}`}var n;return t}function Ft(t){return jt(Nt(t))}const Pt=t=>{const e=ct.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),`rgb(${n.join(", ")})`]},Ot=t=>{const e=dt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?parseFloat(t):parseInt(t)));return[!n.find((t=>t>255)),`rgba(${n.join(", ")})`]},Ht=t=>{const e=gt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]}, ${n[1]}%, ${n[2]}%)`]},zt=t=>{const e=bt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseFloat(t)));return[!n.find((t=>Number.isNaN(t))),`hsl(${n[0]} ${n[1]}% ${n[2]}% / ${n[3]})`]},Tt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Wt=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*$/,Bt=t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(3!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>Q(t)))]},Gt=t=>{const e=t.split(",").map((t=>t.trim())),n=e.map((t=>parseFloat(t)));if(4!==n.length)return[!1];const i=e.findIndex((t=>isNaN(t)));return[i<0,n.map((t=>Q(t)))]},Rt=/^\s*(?:0x){0,1}([0-9a-z]{1,6})\s*$/i,Zt=/^\s*(?:0x){0,1}([0-9a-z]{1,8})\s*$/i,Jt=/^\s*#[a-f0-9]{6}\s*$|^\s*#[a-f0-9]{3}\s*$/i,Yt=/^\s*[a-f0-9]{6}\s*$/i,Qt=/^\s*#[a-f0-9]{8}\s*$/i,Kt=/^\s*[a-f0-9]{8}\s*$/i,_t={hex6:{color:{from:t=>[!0,t],to:Nt},text:{from:t=>[Jt.test(t),t.trim()],to:t=>t}},hex8:{color:{from:t=>[!0,t],to:At},text:{from:t=>[Qt.test(t),t.trim()],to:t=>t}},hex3:{color:{from:t=>[!0,Ft(t)],to:Lt},text:{from:t=>[Jt.test(t),jt(t.trim())],to:t=>t}},"hex6-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${Nt(t)}`},text:{from:t=>[Yt.test(t),t.trim()],to:t=>t}},"hex8-no-hash":{color:{from:t=>[!0,t.substring(1)],to:t=>`#${At(t)}`},text:{from:t=>[Kt.test(t),t.trim()],to:t=>t}},"hex3-no-hash":{color:{from:t=>[!0,Ft(t).substring(1)],to:Lt},text:{from:t=>[Yt.test(t),jt(t.trim())],to:t=>t}},"uint32-rgb":{color:{from:t=>[!0,K(t)],to:t=>`#${Math.round(t).toString(16).padStart(6,"0")}`},text:{from:t=>(t=>{const e=Rt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(6,"0")}`}},"uint32-rgba":{color:{from:t=>[!0,_(t)],to:t=>`#${Math.round(t).toString(16).padStart(8,"0")}`},text:{from:t=>(t=>{const e=Zt.exec(t);return e?[!0,parseInt(e[1],16)]:[!1]})(t),to:t=>`0x${t.toString(16).padStart(8,"0")}`}},"uint8-rgb":{color:{from:t=>[!0,q(t)],to:X},text:{from:t=>{const e=Tt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"uint8-rgba":{color:{from:t=>[!0,tt(t)],to:et},text:{from:t=>{const e=Wt.exec(t);if(!e)return[!1];const n=[e[1],e[2],e[3],e[4]].map((t=>parseInt(t)));return[!n.find((t=>t>255)),n]},to:t=>t.join(", ")}},"float-rgb":{color:{from:t=>[!0,nt(t)],to:it},text:{from:Bt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"float-rgba":{color:{from:t=>[!0,ot(t)],to:rt},text:{from:Gt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"float-hsv":{color:{from:t=>[!0,Ct(nt(t))],to:t=>Et(it(t))},text:{from:Bt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"float-hsva":{color:{from:t=>[!0,Mt(nt(t))],to:t=>It(it(t))},text:{from:Gt,to:t=>Array.from(t).map((t=>Q(t))).join(", ")}},"object-rgb":{color:{from:t=>[!0,at(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b))throw new Error("not {r, g, b}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${Q(t.r)}, g:${Q(t.g)}, b:${Q(t.b)}}`}},"object-rgba":{color:{from:t=>[!0,lt(t)],to:t=>`#${st(t.r)}${st(t.g)}${st(t.b)}${st(t.a)}`},text:{from:t=>{try{const e=t.replace(/([a-z])/g,'"$1"'),n=JSON.parse(e);if(Number.isNaN(n.r)||Number.isNaN(n.g)||Number.isNaN(n.b)||Number.isNaN(n.a))throw new Error("not {r, g, b, a}");return[!0,n]}catch(t){return[!1]}},to:t=>`{r:${Q(t.r)}, g:${Q(t.g)}, b:${Q(t.b)}}, a:${Q(t.a)}}`}},"css-rgb":{color:{from:t=>[!0,ut(t)],to:t=>{const e=ct.exec(t);return X([e[1],e[2],e[3]].map((t=>parseInt(t))))}},text:{from:Pt,to:t=>Pt(t)[1]}},"css-rgba":{color:{from:t=>[!0,ht(t)],to:t=>{const e=dt.exec(t);return et([e[1],e[2],e[3],e[4]].map(((t,e)=>3===e?255*parseFloat(t)|0:parseInt(t))))}},text:{from:Ot,to:t=>Ot(t)[1]}},"css-hsl":{color:{from:t=>[!0,mt(t)],to:t=>{const e=gt.exec(t),n=vt([e[1],e[2],e[3]].map((t=>parseFloat(t))));return X(n)}},text:{from:Ht,to:t=>Ht(t)[1]}},"css-hsla":{color:{from:t=>[!0,pt(t)],to:t=>{const e=bt.exec(t),n=function([t,e,n,i]){return[...vt([t,e,n]),255*i|0]}([e[1],e[2],e[3],e[4]].map((t=>parseFloat(t))));return et(n)}},text:{from:zt,to:t=>zt(t)[1]}}};class qt extends p{constructor(t,n){super(e(t,{className:n}))}}class Xt extends V{#N;constructor(t){super("muigui-canvas",t),this.#N=this.add(new qt("canvas","muigui-canvas")).domElement}get canvas(){return this.#N}}class te extends v{#I;#$;#A;#M;#u={converters:A};constructor(t,n){const i=e("input",{type:"color",onInput:()=>{const[e,n]=this.#$(i.value);e&&(this.#M=!0,t.setValue(n))},onChange:()=>{const[e,n]=this.#$(i.value);e&&(this.#M=!0,t.setFinalValue(n))}});super(e("div",{},[i])),this.setOptions(n),this.#A=i}updateDisplay(t){this.#M||(this.#A.value=this.#I(t)),this.#M=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n}}=this.#u;return this.#I=e,this.#$=n,this}}class ee extends D{#j;#V;constructor(t,e,n={}){super(t,e,"muigui-color");const i=n.format||Dt(this.getValue()),{color:o,text:r}=_t[i];this.#j=this.add(new te(this,{converters:o})),this.#V=this.add(new B(this,{converters:r})),this.updateDisplay()}setOptions(t){const{format:e}=t;if(e){const{color:t,text:n}=_t[e];this.#j.setOptions({converters:t}),this.#V.setOptions({converters:n})}return super.setOptions(t),this}}class ne extends g{constructor(){super("muigui-divider")}}class ie extends g{#U;#L;constructor(t){super(t),this.#U=[],this.#L=this}get children(){return this.#U}get controllers(){return this.#U.filter((t=>!(t instanceof ie)))}get folders(){return this.#U.filter((t=>t instanceof ie))}reset(t=!0){for(const e of this.#U)e instanceof ie&&!t||e.reset(t);return this}updateDisplay(){for(const t of this.#U)t.updateDisplay();return this}remove(t){const e=this.#U.indexOf(t);if(e>=0){const t=this.#U.splice(e,1)[0];t.domElement.remove(),t.setParent(null)}return this}#F(t){return this.domElement.appendChild(t.domElement),this.#U.push(t),t.setParent(this),t}addController(t){return this.#L.#F(t)}pushContainer(t){return this.addController(t),this.#L=t,t}popContainer(){return this.#L=this.#L.parent,this}}class oe extends ie{#P;constructor(t="Controls",n="muigui-menu"){super(n),this.#P=e("label"),this.addElem(e("button",{type:"button",onClick:()=>this.toggleOpen()},[this.#P])),this.pushContainer(new ie("muigui-open-container")),this.pushContainer(new ie),this.name(t),this.open()}open(t=!0){return this.domElement.classList.toggle("muigui-closed",!t),this.domElement.classList.toggle("muigui-open",t),this}close(){return this.open(!1)}name(t){return this.#P.textContent=t,this}title(t){return this.name(t)}toggleOpen(){return this.open(!this.domElement.classList.contains("muigui-open")),this}}class re extends g{constructor(t){super("muigui-label"),this.text(t)}text(t){return this.domElement.textContent=t,this}}function se(){}function ae(t,e,n){const i=t.getBoundingClientRect(),o=e.clientX-i.left,r=e.clientY-i.top,s=o/i.width,a=r/i.height,l=o-(n=n||[o,r])[0],u=r-n[1];return{x:o,y:r,nx:s,ny:a,dx:l,dy:u,ndx:l/i.width,ndy:u/i.width}}function le(t,{onDown:e=se,onMove:n=se,onUp:i=se}){let o;const r=function(e){const i={type:"move",...ae(t,e,o)};n(i)},s=function(e){t.releasePointerCapture(e.pointerId),t.removeEventListener("pointermove",r),t.removeEventListener("pointerup",s),document.body.style.backgroundColor="",i("up")},a=function(n){t.addEventListener("pointermove",r),t.addEventListener("pointerup",s),t.setPointerCapture(n.pointerId);const i=ae(t,n);o=[i.x,i.y],e({type:"down",...i})};return t.addEventListener("pointerdown",a),function(){t.removeEventListener("pointerdown",a)}}function ue(t){return t.querySelectorAll("[data-src]").forEach((e=>{const i="muigui-id-"+n++;e.id=i,t.querySelectorAll(`[data-target=${e.dataset.src}]`).forEach((t=>{t.setAttribute("fill",`url(#${i})`)}))})),t}class ce extends v{#I;#$;#O;#H;#z;#T;#W;#B;#G;#R;#Z;#J;#Y;#Q;#u={converters:A,alpha:!1};#K;#_;constructor(t,n){super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n',className:"muigui-no-scroll"})),this.#O=this.domElement.children[0],this.#z=this.domElement.children[1],this.#B=this.domElement.children[2],ue(this.#O),ue(this.#z),ue(this.#B),this.#H=this.$(".muigui-color-chooser-circle"),this.#T=this.$("[data-src=muigui-color-chooser-hue]"),this.#W=this.$(".muigui-color-chooser-hue-cursor"),this.#G=this.$("[data-src=muigui-color-chooser-alpha]"),this.#R=this.$(".muigui-color-chooser-alpha-cursor");const i=e=>{const n=o(e.nx,0,1),i=o(e.ny,0,1);this.#Z[1]=n,this.#Z[2]=1-i,this.#J=!0,this.#Q=!0;const[r,s]=this.#$(this.#K(this.#Z));r&&t.setValue(s)},r=e=>{const n=o(e.nx,0,1);this.#Z[0]=n,this.#Y=!0,this.#Q=!0;const[i,r]=this.#$(this.#K(this.#Z));i&&t.setValue(r)},s=e=>{const n=o(e.nx,0,1);this.#Z[3]=n,this.#J=!0,this.#Y=!0;const[i,r]=this.#$(this.#K(this.#Z));i&&t.setValue(r)};le(this.#O,{onDown:i,onMove:i}),le(this.#z,{onDown:r,onMove:r}),le(this.#B,{onDown:s,onMove:s}),this.setOptions(n)}updateDisplay(t){this.#Z||(this.#Z=this.#_(this.#I(t)));{const[e,n,i,o=1]=this.#_(this.#I(t));this.#J||(this.#Z[0]=n>.001&&i>.001?e:this.#Z[0]),this.#Y||(this.#Z[1]=n,this.#Z[2]=i),this.#Q||(this.#Z[3]=o)}{const[t,e,n,i]=this.#Z,[o,r,s]=wt(It(this.#Z));this.#J||this.#W.setAttribute("transform",`translate(${64*t}, 0)`),this.#T.children[0].setAttribute("stop-color",`hsl(${360*o} 0% 100% / ${i})`),this.#T.children[1].setAttribute("stop-color",`hsl(${360*o} 100% 50% / ${i})`),this.#Q||this.#R.setAttribute("transform",`translate(${64*i}, 0)`),this.#G.children[0].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 0)`),this.#G.children[1].setAttribute("stop-color",`hsl(${360*o} ${100*r}% ${100*s}% / 1)`),this.#Y||(this.#H.setAttribute("cx",""+64*e),this.#H.setAttribute("cy",""+48*(1-n)))}this.#J=!1,this.#Y=!1,this.#Q=!1}setOptions(t){l(this.#u,t);const{converters:{to:e,from:n},alpha:i}=this.#u;return this.#B.style.display=i?"":"none",this.#K=i?t=>rt(It(t)):t=>it(Et(t)),this.#_=i?t=>Mt(ot(t)):t=>Ct(nt(t)),this.#I=e,this.#$=n,this}}class he extends D{#q;#X;#f;#tt;#u={open:!1};constructor(t,n,i={}){super(t,n,"muigui-pop-down-controller"),this.#q=this.add(new qt("div","muigui-pop-down-top"));const o=this.#q.addElem(e("input",{type:"checkbox",onChange:()=>{this.#u.open=o.checked,this.updateDisplay()}}));this.#f=o,this.#X=this.#q.add(new qt("div","muigui-pop-down-values"));const r=new qt("div","muigui-pop-down-bottom muigui-open-container");this.#tt=new qt("div"),r.add(this.#tt),this.add(r),this.setOptions(i)}setKnobColor(t){this.#f&&(this.#f.style=`\n --range-color: ${t};\n --value-bg-color: ${t};\n `)}updateDisplay(){super.updateDisplay();const{open:t}=this.#u;this.domElement.children[1].classList.toggle("muigui-open",t),this.domElement.children[1].classList.toggle("muigui-closed",!t)}setOptions(t){l(this.#u,t),super.setOptions(t),this.updateDisplay()}addTop(t){return this.#X.add(t)}addBottom(t){return this.#tt.add(t)}}class de extends he{#j;#V;#I;constructor(t,e,n={}){super(t,e,"muigui-color-chooser");const i=n.format||Dt(this.getValue()),{color:o,text:r}=_t[i];this.#I=o.to,this.#V=new B(this,{converters:r,alpha:St(i)}),this.#j=new ce(this,{converters:o,alpha:St(i)}),this.addTop(this.#V),this.addBottom(this.#j),this.___setKnobHelper=!0,this.updateDisplay()}#et(){if(this.#I){const t=this.#I(this.getValue()),e=9===t.length?t.substring(7,9):"FF",n=yt(q(t));n[2]=(n[2]+50)%100;const i=X(vt(n));this.setKnobColor(`${t.substring(0,7)}${e}`,i)}}updateDisplay(){super.updateDisplay(),this.___setKnobHelper&&this.#et()}setOptions(t){return super.setOptions(t),this}}class me extends oe{add(t,e,...n){const i=t instanceof g?t:function(t,e,...n){const[i]=n;if(Array.isArray(i))return new z(t,e,{keyValues:i});if(i&&i.keyValues)return new z(t,e,{keyValues:i.keyValues});const o=typeof t[e];switch(o){case"number":if("number"==typeof n[0]&&"number"==typeof n[1]){const i=n[0],o=n[1],r=n[2];return new W(t,e,{min:i,max:o,...r&&{step:r}})}return 0===n.length?new P(t,e,...n):new W(t,e,...n);case"boolean":return new N(t,e,...n);case"function":return new b(t,e,...n);case"string":return new G(t,e,...n);case"undefined":throw new Error(`no property named ${e}`);default:throw new Error(`unhandled type ${o} for property ${e}`)}}(t,e,...n);return this.addController(i)}addCanvas(t){return this.addController(new Xt(t))}addColor(t,e,n={}){const i=t[e];return St(n.format||Dt(i))?this.addController(new de(t,e,n)):this.addController(new ee(t,e,n))}addDivider(){return this.addController(new ne)}addFolder(t){return this.addController(new me(t))}addLabel(t){return this.addController(new re(t))}addButton(t,e){const n={fn:e};return this.add(n,"fn").name(t)}}class pe extends HTMLElement{constructor(){super(),this.shadow=this.attachShadow({mode:"open"})}}customElements.define("muigui-element",pe);const ge=new CSSStyleSheet,be=new CSSStyleSheet;function fe(t){let e,n;function i(){if(e&&!n){const o=e;e=void 0,n=t.replace(o).then((()=>{n=void 0,i()}))}}return function(t){e=t,i()}}const ve=fe(ge),xe=fe(be);function we(e){const{include:n,css:i}=t.themes[e];return`${n.map((e=>t[e])).join("\n")} : css.default}\n${i||""}`}class ye extends me{static converters=U;static mapRange=u;static makeRangeConverters=c;static makeRangeOptions=h;static makeMinMaxPair=m;#nt=new CSSStyleSheet;constructor(n={}){super("Controls","muigui-root"),n instanceof HTMLElement&&(n={parent:n});const{autoPlace:i=!0,width:o,title:r="Controls"}=n;let{parent:s}=n;if(o&&(this.domElement.style.width=/^\d+$/.test(o)?`${o}px`:o),void 0===s&&i&&(s=document.body,this.domElement.classList.add("muigui-auto-place")),s){const t=e("muigui-element");t.shadowRoot.adoptedStyleSheets=[this.#nt,ge,be],t.shadow.appendChild(this.domElement),s.appendChild(t)}r&&this.title(r),this.#nt.replaceSync(t.default),this.domElement.classList.add("muigui","muigui-colors")}setStyle(t){this.#nt.replace(t)}static setBaseStyles(t){ve(t)}static getBaseStyleSheet(){return ge}static setUserStyles(t){xe(t)}static getUserStyleSheet(){return be}setTheme(t){this.setStyle(we(t))}static setTheme(t){ye.setBaseStyles(we(t))}}function ke(){}const Ee={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]};function Ie(t,{onDown:e=ke,onUp:n=ke}){const i=function(t){const i=t.shiftKey?10:1,[o,r]=(Ee[t.key]||[0,0]).map((t=>t*i));("keydown"===t.type?e:n)({type:t.type.substring(3),dx:o,dy:r,event:t})};return t.addEventListener("keydown",i),t.addEventListener("keyup",i),function(){t.removeEventListener("keydown",i),t.removeEventListener("keyup",i)}}function $e(t,e=""){if(!t)throw new Error(e)}function Ce(t,e,n,i,o,r){const s=Math.abs(n)*Math.cos(r),a=Math.abs(i)*Math.sin(r);return[t+Math.cos(o)*s-Math.sin(o)*a,e+Math.sin(o)*s+Math.cos(o)*a]}function Me(t,e,n,i,o){$e(Math.abs(i-o)<=2*Math.PI),$e(i>=-Math.PI&&i<=2*Math.PI),$e(i<=o),$e(o>=-Math.PI&&o<=4*Math.PI);const{x1:r,y1:s,x2:a,y2:l,fa:u,fs:c}=function(t,e,n,i,o,r,s){const[a,l]=Ce(t,e,n,i,o,r),[u,c]=Ce(t,e,n,i,o,r+s);return{x1:a,y1:l,x2:u,y2:c,fa:Math.abs(s)>Math.PI?1:0,fs:s>0?1:0}}(t,e,n,n,0,i,o-i);return Math.abs(Math.abs(i-o)-2*Math.PI)>Number.EPSILON?`M${t} ${e} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l} L${t} ${e}`:`M${r} ${s} L${r} ${s} A ${n} ${n} 0 ${u} ${c} ${a} ${l}`}const Se=t=>a(t+Math.PI,2*Math.PI)-Math.PI;class Ve extends v{#it;#ot;#rt;#st;#u={step:1,min:-180,max:180,dirMin:-Math.PI,dirMax:Math.PI,wrap:void 0,converters:A};constructor(t,n={}){const i=L();super(e("div",{className:"muigui-direction muigui-no-scroll",innerHTML:'\n\n \x3c!----\x3e\n \n \n \n \n \n \n\n',onWheel:e=>{e.preventDefault();const{min:n,max:r,step:l}=this.#u,u=i(e,l);let c=this.#rt+u;this.#st&&(c=a(c-n,r-n)+n);const h=o(s(c,(t=>t),l),n,r);t.setValue(h)}}));const r=e=>{const{min:n,max:i,step:r,dirMin:a,dirMax:l}=this.#u,u=2*e.nx-1,c=2*e.ny-1,h=Math.atan2(c,u),d=(a+l)/2,m=o((Se(h-d)-Se(a-d))/(l-a),0,1),p=s(n+(i-n)*m,(t=>t),r);t.setValue(p)};le(this.domElement,{onDown:r,onMove:r}),Ie(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),this.#it=this.$("#muigui-arrow"),this.#ot=this.$("#muigui-range"),this.setOptions(n)}updateDisplay(t){this.#rt=t;const{min:e,max:n}=this.#u,i=(t-e)/(n-e),o=(r=this.#u.dirMin,s=this.#u.dirMax,r+(s-r)*i);var r,s;this.#it.style.transform=`rotate(${o}rad)`}setOptions(t){l(this.#u,t);const{dirMin:e,dirMax:n,wrap:i}=this.#u;this.#st=void 0!==i?i:Math.abs(e-n)>=2*Math.PI-Number.EPSILON;const[o,r]=e(o.push(i),e("label",{},[e("input",{type:"radio",name:r,value:a,onChange:function(){this.checked&&t.setFinalValue(s.#D[this.value])}}),e("button",{type:"button",textContent:n,onClick:function(){this.previousElementSibling.click()}})]))))));const s=this;this.#D=o,this.cols(i)}updateDisplay(t){const e=this.#D.indexOf(t);for(let t=0;t{e({rect:t.getBoundingClientRect(),elem:t})})).observe(t)}function Ue(t,e,n,i){je(t,(({rect:o})=>{const{width:r,height:s}=o;t.setAttribute("viewBox",`-${r*e} -${s*n} ${r} ${s}`),i({elem:t,rect:o})}))}function Le(t,e,n,i,o,r){const a=[];tt),n)),e=Math.min(e,o);for(let i=t;i<=e;i+=n)a.push(`M${i} 0 l0 ${r}`);return a.join(" ")}class Fe extends v{#at;#lt;#ut;#ct;#ht;#dt;#mt;#pt;#gt;#rt;#bt;#u={min:-100,max:100,step:1,unit:10,unitSize:10,ticksPerUnit:5,labelFn:t=>t,tickHeight:1,limits:!0,thicksColor:void 0,orientation:void 0};constructor(t,n){const i=L();let r;super(e("div",{innerHTML:'\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \x3c!----\x3e\n \x3c!----\x3e\n \n \n \n \n\n',className:"muigui-no-v-scroll",onWheel:e=>{e.preventDefault();const{min:n,max:r,step:a}=this.#u,l=i(e,a),u=o(s(this.#rt+l,(t=>t),a),n,r);t.setValue(u)}})),this.#at=this.$("svg"),this.#lt=this.$("#muigui-origin"),this.#ut=this.$("#muigui-ticks"),this.#ct=this.$("#muigui-thicks"),this.#ht=this.$("#muigui-numbers"),this.#dt=this.$("#muigui-left-grad"),this.#mt=this.$("#muigui-right-grad"),this.setOptions(n),le(this.domElement,{onDown:()=>{r=this.#rt},onMove:e=>{const{min:n,max:i,unitSize:a,unit:l,step:u}=this.#u,c=o(s(r-e.dx/a*l,(t=>t),u),n,i);t.setValue(c)}}),Ie(this.domElement,{onDown:e=>{const{min:n,max:i,step:r}=this.#u,a=o(s(this.#rt+e.dx*r,(t=>t),r),n,i);t.setValue(a)}}),Ue(this.#at,.5,0,(({rect:{width:t}})=>{this.#dt.setAttribute("x",-t/2),this.#mt.setAttribute("x",t/2-20),this.#bt=function(t){const e=t.innerHTML;t.innerHTML="- ";const n=t.querySelector("text").getComputedTextLength();return t.innerHTML=e,n}(this.#ht),this.#pt=t,this.#ft()}))}#ft(){if(!this.#pt||void 0===this.#rt)return;const{labelFn:t,limits:e,min:n,max:i,orientation:o,tickHeight:r,ticksPerUnit:a,unit:l,unitSize:u,thicksColor:c}=this.#u,h=Math.ceil(this.#pt/u),d=this.#rt/l,m=Math.round(d-h),p=m*u,g=(m+2*h)*u,b=e?n*u/l:p,f=e?i*u/l:g,v=""===t(1)?10:5;a>1&&this.#ut.setAttribute("d",Le(p,g,u/a,b,f,v*r)),this.#ct.style.stroke=c,this.#ct.setAttribute("d",Le(p,g,u,b,f,v)),this.#ht.innerHTML=function(t,e,n,i,o,r,a,l){const u=[];tt),n)),e=Math.min(e,a);const c=Math.max(0,-Math.log10(i));for(let r=t;r<=e;r+=n)u.push(`${h=r/n*i,l(h.toFixed(c))}`);var h;return u.join("\n")}(p,g,u,l,this.#bt,b,f,t),this.#lt.setAttribute("transform",`translate(${-this.#rt*u/l} 0)`),this.#at.classList.toggle("muigui-slider-up","up"===o)}updateDisplay(t){this.#rt=t,this.#ft()}setOptions(t){return l(this.#u,t),this}}class Pe extends D{constructor(t,e,n={}){super(t,e,"muigui-slider"),this.add(new Fe(this,n)),this.add(new F(this,n)),this.updateDisplay()}}class Oe extends v{#at;#it;#H;#rt=[];constructor(t){super(e("div",{innerHTML:'\n\n \n \n \n \n \n\n',className:"muigui-no-scroll"}));const n=e=>{const{width:n,height:i}=this.#at.getBoundingClientRect(),o=2*e.nx-1,r=2*e.ny-1;t.setValue([o*n*.5,r*i*.5])};le(this.domElement,{onDown:n,onMove:n}),this.#at=this.$("svg"),this.#it=this.$("#muigui-arrow"),this.#H=this.$("#muigui-circle"),Ue(this.#at,.5,.5,(()=>this.#vt))}#vt(){const[t,e]=this.#rt;this.#it.setAttribute("d",`M0,0L${t},${e}`),this.#H.setAttribute("transform",`translate(${t}, ${e})`)}updateDisplay(t){this.#rt[0]=t[0],this.#rt[1]=t[1],this.#vt()}}class He extends he{constructor(t,e){super(t,e,"muigui-vec2");const n=t=>({setValue:e=>{const n=this.getValue();n[t]=e,this.setValue(n)},setFinalValue:e=>{const n=this.getValue();n[t]=e,this.setFinalValue(n)}});this.addTop(new F(n(0),{converters:{to:t=>t[0],from:j.from}})),this.addTop(new F(n(1),{converters:{to:t=>t[1],from:j.from}})),this.addBottom(new Oe(this)),this.updateDisplay()}}const ze={main:"#ddd"},Te={main:"#333"},We=window.matchMedia("(prefers-color-scheme: dark)");let Be,Ge;function Re(){Ge=We.matches,Be=Ge?ze:Te}We.addEventListener("change",Re),Re();const Ze={graph:function(t,e,{min:n=-1,max:i=1,interval:o=16,color:r}){const s=t.getContext("2d");setInterval((function(){const{width:o,height:a}=t;s.clearRect(0,0,o,a),s.beginPath();const l=i-n;for(let t=0;t{t.text(JSON.stringify(e[n],null,2))}),i)}};export{de as ColorChooser,De as Direction,Ae as RadioGrid,W as Range,z as Select,Pe as Slider,P as TextNumber,He as Vec2,ye as default,Ze as helpers}; //# sourceMappingURL=muigui.module.min.js.map diff --git a/dist/0.x/muigui.module.min.js.map b/dist/0.x/muigui.module.min.js.map index 3feaea2..7a3e54f 100644 --- a/dist/0.x/muigui.module.min.js.map +++ b/dist/0.x/muigui.module.min.js.map @@ -1 +1 @@ -{"version":3,"file":"muigui.module.min.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/muigui.js","../../src/controllers/create-controller.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/controllers/Direction.js","../../src/views/RadioGridView.js","../../src/controllers/RadioGrid.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/controllers/Slider.js","../../src/views/Vec2View.js","../../src/controllers/Vec2.js"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #68C;\n --range-color: #888888;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #88AAFF;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n\n color: var(--color);\n background-color: var(--bg-color);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n width: 1.25em;\n height: var(--line-height);\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n content: \"ⓧ\"; /*\"▼\";*/\n}\n.muigui-closed>button>label::before {\n content: \"⨁\"; /*\"▶\";*/\n}\n.muigui-open>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 0.5s ease-out;\n max-height: 100vh;\n overflow: auto;\n opacity: 1;\n}\n\n.muigui-closed>*:nth-child(2) {\n transition: max-height 0.2s ease-out,\n opacity 1s;\n max-height: 0;\n opacity: 0;\n overflow: hidden;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-pop-down-bottom {\n\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n cursor: pointer;\n place-content: center center;\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 2px) / -2);\n width: calc(var(--line-height) - 2px);\n height: calc(var(--line-height) - 2px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: '',\n float: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-checkbox');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => this.#handleInput(setValue, true),\n onChange: () => this.#handleInput(setFinalValue, false),\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor() {\n super('muigui-canvas');\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n this.#bottom = this.add(new ElementView('div', 'muigui-pop-down-bottom'));\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n #setKnobHelper;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.#setKnobHelper = () => {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}FF`, hex);\n }\n };\n this.updateDisplay();\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.#setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\nbaseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [baseStyleSheet, userStyleSheet, this.#localStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n static setTheme(name) {\n GUI.setBaseStyles(`${css.default}\\n${css.themes[name] || ''}`);\n }\n}\n\nexport default GUI;\n","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n"],"names":["css","default","themes","float","createElem","tag","attrs","children","elem","document","createElement","key","value","Object","entries","startsWith","eventName","substring","toLowerCase","addEventListener","passive","k","v","undefined","setAttribute","child","appendChild","setElemProps","nextId","removeArrayElem","array","ndx","indexOf","splice","clamp","min","max","Math","isTypedArray","SharedArrayBuffer","a","buffer","ArrayBuffer","stepify","from","step","round","euclideanModulo","n","copyExistingProperties","dst","src","mapRange","inMin","inMax","outMin","outMax","makeRangeConverters","to","makeRangeOptions","converters","identity","makeMinMaxPair","gui","properties","minPropName","maxPropName","options","guiMinRange","minRange","valueMinRange","minGui","add","onChange","maxGui","setValue","View","domElement","childDestElem","views","constructor","this","addElem","removeElem","removeChild","pushSubElem","popSubElem","parentElement","view","push","remove","pushSubView","popSubView","setOptions","updateDisplayIfNeeded","newV","ignoreCache","$","selector","querySelector","Controller","changeFns","finishChangeFns","parent","className","super","classList","setParent","enable","disabled","show","toggle","hide","closest","forEach","querySelectorAll","disable","fn","removeChange","onFinishChange","removeFinishChange","callListeners","fns","call","emitChange","object","property","controller","emitFinalChange","updateDisplay","getColors","toCamelCase","s","replace","m","m1","toUpperCase","div","colors","fromEntries","map","style","color","getComputedStyle","Button","buttonElem","name","type","onClick","textContent","arraysEqual","b","length","i","EditView","oldV","updateCheck","checkArrayNeedsUpdate","needUpdate","copyArrayElementsFromTo","checkTypedArrayNeedsUpdate","once","checkObjectNeedsUpdate","checkValueNeedsUpdate","getUpdateCheckForType","Array","isArray","bind","CheckboxView","checkboxElem","setter","id","onInput","checked","setFinalValue","tasks","tasksToRemove","Set","requestId","processing","processTasks","task","has","size","queueProcessing","clear","requestAnimationFrame","makeId","ValueView","LabelController","nameElem","for","title","tooltip","tip","ValueController","initialValue","listening","updateFn","getValue","setValueImpl","isDifferent","keys","assign","reset","listen","set","removeTask","Checkbox","strToNumber","toString","parseFloat","Number","isNaN","radToDeg","PI","createWheelHelper","wheelAccum","e","wheelScale","deltaY","delta","floor","abs","sign","NumberView","skipUpdate","NEGATIVE_INFINITY","POSITIVE_INFINITY","wheelHelper","handleInput","onWheel","preventDefault","setFn","valid","inRange","TextNumber","textView","SelectView","values","keyValues","selectedIndex","convertToKeyValues","valueIsNumber","Select","keyValuesInput","RangeView","validV","Range","TextView","Text","lerp","t","fract","f0","toFixed","f3","hexToUint32RGB","parseInt","hexToUint32RGBA","hexToUint8RGB","uint8RGBToHex","padStart","join","hexToUint8RGBA","uint8RGBAToHex","hexToFloatRGB","floatRGBToHex","hexToFloatRGBA","floatRGBAToHex","scaleAndClamp","hexToObjectRGB","r","g","hexToObjectRGBA","hexToCssRGB","cssRGBRegex","hexToCssRGBA","cssRGBARegex","hexToCssHSL","hsl","rgbUint8ToHsl","hexToCssHSLA","hsla","rgbaUint8ToHsla","cssHSLRegex","cssHSLARegex","hslToRgbUint8","h","l","f","rgbFloatToHsl01","d","rgbaFloatToHsla01","rgb","rgba","hsv01ToRGBFloat","hue","sat","val","hsva01ToRGBAFloat","alpha","round3","rgbFloatToHSV01","p","q","EPSILON","hasAlpha","format","endsWith","cssStringFormats","re","guessFormat","console","warn","formatInfo","test","guessStringColorFormat","trim","Uint8Array","Uint8ClampedArray","Float32Array","Error","fixHex6","fixHex8","hex6ToHex3","hex6","hex3RE","hex3ToHex6","hex3","exec","m2","fixHex3","strToCssRGB","find","strToCssRGBA","strToCssHSL","strToCssHSLA","strTo3IntsRE","strTo4IntsRE","strToUint32RGBRegex","strToUint32RGBARegex","hex6RE","hexNoHash6RE","hex8RE","hexNoHash8RE","colorFormatConverters","text","hex8","strToUint32RGB","strToUint32RGBA","numbers","split","badNdx","findIndex","json","JSON","parse","hslaToRgbaUint8","ElementView","Canvas","canvasElem","canvas","ColorView","colorElem","Color","colorView","Divider","Container","controllers","childDestController","filter","c","folders","recursive","c0","addControllerImpl","addController","pushContainer","container","popContainer","Folder","labelElem","toggleOpen","open","close","contains","Label","noop","computeRelativePosition","event","start","rect","getBoundingClientRect","x","clientX","left","y","clientY","top","nx","width","ny","height","dx","dy","ndy","addTouchEvents","onDown","onMove","onUp","pointerMove","pointerUp","releasePointerCapture","pointerId","removeEventListener","body","backgroundColor","pointerDown","setPointerCapture","rel","connectFillTargets","srcElem","dataset","targetElem","ColorChooserView","satLevelElem","circleElem","hueUIElem","hueElem","hueCursorElem","alphaUIElem","alphaElem","alphaCursorElem","hsva","skipHueUpdate","skipSatLevelUpdate","skipAlphaUpdate","convertInternalToHex","convertHexToInternal","innerHTML","handleSatLevelChange","handleHueChange","handleAlphaChange","lum","display","rgbaFloatToHSVA01","PopDownController","valuesView","bottom","setKnobColor","bgCssColor","addTop","addBottom","ColorChooser","setKnobHelper","hex6Or8","hex","GUIFolder","args","arg1","createController","addCanvas","addColor","addDivider","addFolder","addLabel","MuiguiElement","HTMLElement","shadow","attachShadow","mode","customElements","define","baseStyleSheet","CSSStyleSheet","replaceSync","userStyleSheet","makeStyleSheetUpdater","styleSheet","newCss","newCssPromise","updateStyle","then","updateBaseStyle","updateUserStyle","GUI","static","localStyleSheet","autoPlace","muiguiElement","shadowRoot","adoptedStyleSheets","setStyle","setBaseStyles","keyDirections","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","addKeyboardEvents","keyDown","mult","shiftKey","assert","truthy","msg","getEllipsePointForAngle","cx","cy","rx","ry","phi","theta","cos","sin","arc","end","x1","y1","x2","y2","fa","fs","dTheta","getEndpointParameters","twoPiMod","DirectionView","arrowElem","rangeElem","lastV","wrap","dirMin","dirMax","tempV","handleTouch","atan2","center","angle","transform","Direction","RadioGridView","cols","that","previousElementSibling","click","gridTemplateColumns","RadioGrid","onResize","callback","ResizeObserver","observe","onResizeSVGNoScale","hAnchor","vAnchor","createSVGTicks","SliderView","svgElem","originElem","ticksElem","thicksElem","numbersElem","leftGradElem","rightGradElem","minusSize","unit","unitSize","ticksPerUnit","labelFn","tickHeight","limits","thicksColor","orientation","startV","oldHTML","getComputedTextLength","computeSizeOfMinus","updateSlider","unitsAcross","ceil","centerUnitSpace","startUnitSpace","minUnitSpace","maxUnitSpace","stroke","texts","digits","log10","createSVGNumbers","Slider","Vec2View","onTouch","updateDisplayImpl","Vec2","makeSetter"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"muigui.module.min.js","sources":["../../src/styles/muigui.css.js","../../src/libs/elem.js","../../src/libs/utils.js","../../../src/views/View.ts","../../src/controllers/Controller.js","../../src/controllers/Button.js","../../src/views/EditView.js","../../src/views/CheckboxView.js","../../src/libs/taskrunner.js","../../src/libs/ids.js","../../src/views/ValueView.js","../../src/controllers/LabelController.js","../../src/controllers/ValueController.js","../../src/controllers/Checkbox.js","../../src/libs/conversions.js","../../src/libs/wheel.js","../../src/views/NumberView.js","../../src/controllers/TextNumber.js","../../src/views/SelectView.js","../../src/libs/key-values.js","../../src/controllers/Select.js","../../src/views/RangeView.js","../../src/controllers/Range.js","../../src/views/TextView.js","../../src/controllers/Text.js","../../src/libs/color-utils.js","../../src/views/ElementView.js","../../src/controllers/Canvas.js","../../src/views/ColorView.js","../../src/controllers/Color.js","../../src/controllers/Divider.js","../../src/controllers/Container.js","../../src/controllers/Folder.js","../../src/controllers/Label.js","../../src/libs/touch.js","../../src/views/ColorChooserView.js","../../src/controllers/PopDownController.js","../../src/controllers/ColorChooser.js","../../src/muigui.js","../../src/controllers/create-controller.js","../../src/libs/keyboard.js","../../src/libs/assert.js","../../src/libs/svg.js","../../src/views/DirectionView.js","../../src/controllers/Direction.js","../../src/views/RadioGridView.js","../../src/controllers/RadioGrid.js","../../src/libs/resize-helpers.js","../../src/views/SliderView.js","../../src/controllers/Slider.js","../../src/views/Vec2View.js","../../src/controllers/Vec2.js","../../src/libs/graph.js","../../../src/esm.ts","../../src/libs/monitor.js"],"sourcesContent":["export default {\n default: `\n.muigui {\n --bg-color: #ddd;\n --color: #222;\n --contrast-color: #eee;\n --value-color: #145 ;\n --value-bg-color: #eeee;\n --disabled-color: #999;\n --menu-bg-color: #f8f8f8;\n --menu-sep-color: #bbb;\n --hover-bg-color: #999;\n --focus-color: #8BF;\n --range-color: #AAA;\n --invalid-color: #FF0000;\n --selected-color: rgb(255, 255, 255, 0.9);\n\n --button-bg-color: var(--value-bg-color);\n\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: \n linear-gradient(\n rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n}\n\n@media (prefers-color-scheme: dark) {\n .muigui {\n --bg-color: #222222;\n --color: #dddddd;\n --contrast-color: #000;\n --value-color: #43e5f7;\n --value-bg-color: #444444;\n --disabled-color: #666666;\n --menu-bg-color: #080808;\n --menu-sep-color: #444444;\n --hover-bg-color: #666666;\n --focus-color: #458; /*#88AAFF*/;\n --range-color: #888888;\n --invalid-color: #FF6666;\n --selected-color: rgba(255, 255, 255, 0.3);\n\n --button-bg-color: var(--value-bg-color);\n\n --range-left-color: var(--value-color);\n --range-right-color: var(--value-bg-color); \n --range-right-hover-color: var(--hover-bg-color);\n --button-image: linear-gradient(\n rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)\n );\n\n color: var(--color);\n background-color: var(--bg-color);\n\n --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==);\n --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+);\n }\n}\n\n.muigui {\n --width: 250px;\n --label-width: 45%;\n --number-width: 40%;\n\n --font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n --font-size: 11px;\n --font-family-mono: Menlo, Monaco, Consolas, \"Droid Sans Mono\", monospace;\n --font-size-mono: 11px;\n\n --line-height: 1.7em;\n --border-radius: 0px;\n\n width: var(--width);\n font-family: var(--font-family);\n font-size: var(--font-size);\n box-sizing: border-box;\n line-height: 100%;\n}\n.muigui * {\n box-sizing: inherit;\n}\n\n.muigui-no-scroll {\n touch-action: none;\n}\n.muigui-no-h-scroll {\n touch-action: pan-y;\n}\n.muigui-no-v-scroll {\n touch-action: pan-x;\n}\n\n.muigui-invalid-value {\n background-color: red !important;\n color: white !important;\n}\n\n.muigui-grid {\n display: grid;\n}\n.muigui-rows {\n display: flex;\n flex-direction: column;\n\n min-height: 20px;\n border: 2px solid red;\n}\n.muigui-columns {\n display: flex;\n flex-direction: row;\n\n height: 20px;\n border: 2px solid green;\n}\n.muigui-rows>*,\n.muigui-columns>* {\n flex: 1 1 auto;\n align-items: stretch;\n min-height: 0;\n min-width: 0;\n}\n\n.muigui-row {\n border: 2px solid yellow;\n min-height: 10px\n}\n.muigui-column {\n border: 2px solid lightgreen;\n}\n\n/* -------- */\n\n.muigui-show { /* */ }\n.muigui-hide { \n display: none !important;\n}\n.muigui-disabled {\n pointer-events: none;\n --color: var(--disabled-color) !important;\n --value-color: var(--disabled-color) !important;\n --range-left-color: var(--disabled-color) !important;\n}\n\n.muigui canvas,\n.muigui svg {\n display: block;\n border-radius: var(--border-radius);\n}\n.muigui canvas {\n background-color: var(--value-bg-color);\n}\n\n.muigui-controller {\n min-width: 0;\n min-height: var(--line-height);\n}\n.muigui-root {\n z-index: 1;\n}\n.muigui-root,\n.muigui-menu {\n display: flex;\n flex-direction: column;\n position: relative;\n user-select: none;\n height: fit-content;\n margin: 0;\n padding-bottom: 0.1em;\n border-radius: var(--border-radius);\n}\n.muigui-menu {\n border-bottom: 1px solid var(--menu-sep-color);\n}\n\n.muigui-root>button:nth-child(1),\n.muigui-menu>button:nth-child(1) {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n position: relative;\n text-align: left;\n color: var(--color);\n background-color: var(--menu-bg-color);\n min-height: var(--line-height);\n padding: 0.2em;\n cursor: pointer;\n border-radius: var(--border-radius);\n}\n.muigui-root>div:nth-child(2),\n.muigui-menu>div:nth-child(2) {\n flex: 1 1 auto;\n}\n\n.muigui-controller {\n margin-left: 0.2em;\n margin-right: 0.2em;\n}\n.muigui-root.muigui-controller,\n.muigui-menu.muigui-controller {\n margin-left: 0;\n margin-right: 0;\n}\n.muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n /* white-space: pre; why?? */\n}\n.muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n}\n.muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n}\n\n/* -----------------------------------------\n a label controller is [[label][value]]\n*/\n\n.muigui-label-controller {\n display: flex;\n margin: 0.4em 0 0.4em 0;\n word-wrap: initial;\n align-items: stretch;\n}\n\n.muigui-value {\n display: flex;\n align-items: stretch;\n}\n.muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n.muigui-value>*:nth-child(1) {\n flex: 1 1 calc(100% - var(--number-width));\n}\n.muigui-value>*:nth-child(2) {\n flex: 1 1 var(--number-width);\n margin-left: 0.2em;\n}\n\n/* fix! */\n.muigui-open>button>label::before,\n.muigui-closed>button>label::before {\n content: \"X\";\n color: rgba(0, 0, 0, 0);\n background-color: var(--range-color);\n border-radius: 0.2em;\n width: 1.25em;\n margin-right: 0.25em;\n height: 1.25em; /*var(--line-height);*/\n display: inline-grid;\n place-content: center start;\n pointer-events: none;\n}\n.muigui-open>button>label::before {\n background-image: var(--image-open);\n}\n.muigui-closed>button>label::before {\n background-image: var(--image-closed);\n}\n\n.muigui-open>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: auto;\n height: 100%;\n}\n.muigui-closed>.muigui-open-container {\n transition: all 0.1s ease-out;\n overflow: hidden;\n min-height: 0;\n}\n.muigui-open>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: 0px;\n}\n.muigui-closed>.muigui-open-container>* {\n transition: all 0.1s ease-out;\n margin-top: -100%;\n}\n\n/* ---- popdown ---- */\n\n.muigui-pop-down-top {\n display: flex;\n}\n/* fix? */\n.muigui-value>*:nth-child(1).muigui-pop-down-top {\n flex: 0;\n}\n.muigui-closed .muigui-pop-down-bottom {\n max-height: 0;\n}\n\n.muigui-value .muigui-pop-down-bottom {\n margin: 0;\n}\n\n.muigui-pop-down-values {\n min-width: 0;\n display: flex;\n}\n.muigui-pop-down-values>* {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.muigui-value.muigui-pop-down-controller {\n flex-direction: column;\n}\n\n.muigui-pop-down-top input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n background-image: var(--image-checkerboard);\n background-size: 10px 10px;\n background-position: 0 0, 0 5px, 5px -5px, -5px 0px;\n\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-pop-down-top input[type=checkbox]::before {\n content: \"+\";\n display: grid;\n place-content: center;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n color: var(--value-bg-color);\n width: calc(var(--line-height) - 4px);\n height: calc(var(--line-height) - 4px);\n}\n\n.muigui-pop-down-top input[type=checkbox]:checked::before {\n content: \"X\";\n}\n\n\n/* ---- select ---- */\n\n.muigui select,\n.muigui option,\n.muigui input,\n.muigui button {\n color: var(--value-color);\n background-color: var(--value-bg-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n border: none;\n margin: 0;\n border-radius: var(--border-radius);\n}\n.muigui select {\n appearance: none;\n margin: 0;\n margin-left: 0; /*?*/\n overflow: hidden; /* Safari */\n}\n\n.muigui select:focus,\n.muigui input:focus,\n.muigui button:focus {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui select:hover,\n.muigui option:hover,\n.muigui input:hover,\n.muigui button:hover {\n background-color: var(--hover-bg-color); \n}\n\n/* ------ [ label ] ------ */\n\n.muigui-label {\n border-top: 1px solid var(--menu-sep-color);\n border-bottom: 1px solid var(--menu-sep-color);\n padding-top: 0.4em;\n padding-bottom: 0.3em;\n place-content: center start;\n background-color: var(--menu-bg-color);\n white-space: pre;\n border-radius: var(--border-radius);\n}\n\n/* ------ [ divider] ------ */\n\n.muigui-divider {\n min-height: 6px;\n border-top: 2px solid var(--menu-sep-color);\n margin-top: 6px;\n}\n\n/* ------ [ button ] ------ */\n\n.muigui-button {\n display: grid;\n padding: 2px 0 2px 0;\n}\n.muigui-button button {\n border: none;\n color: var(--value-color);\n background-color: var(--button-bg-color);\n background-image: var(--button-image);\n cursor: pointer;\n place-content: center center;\n height: var(--line-height);\n}\n\n/* ------ [ color ] ------ */\n\n.muigui-color>div {\n overflow: hidden;\n position: relative;\n margin-left: 0;\n margin-right: 0; /* why? */\n max-width: var(--line-height);\n border-radius: var(--border-radius);\n}\n\n.muigui-color>div:focus-within {\n outline: 1px solid var(--focus-color);\n}\n\n.muigui-color input[type=color] {\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n position: absolute;\n width: 200%;\n left: -10px;\n top: -10px;\n height: 200%;\n}\n.muigui-disabled canvas,\n.muigui-disabled svg,\n.muigui-disabled img,\n.muigui-disabled .muigui-color input[type=color] {\n opacity: 0.2;\n}\n\n/* ------ [ checkbox ] ------ */\n\n.muigui-checkbox>label:nth-child(2) {\n display: grid;\n place-content: center start;\n margin: 0;\n}\n\n.muigui-checkbox input[type=checkbox] {\n -webkit-appearance: none;\n appearance: none;\n width: auto;\n color: var(--value-color);\n background-color: var(--value-bg-color);\n cursor: pointer;\n\n display: grid;\n place-content: center;\n margin: 0;\n font: inherit;\n color: currentColor;\n width: 1.7em;\n height: 1.7em;\n transform: translateY(-0.075em);\n}\n\n.muigui-checkbox input[type=checkbox]::before {\n content: \"\";\n color: var(--value-color);\n display: grid;\n place-content: center;\n}\n\n.muigui-checkbox input[type=checkbox]:checked::before {\n content: \"✔\";\n}\n\n.muigui input[type=number]::-webkit-inner-spin-button, \n.muigui input[type=number]::-webkit-outer-spin-button { \n -webkit-appearance: none;\n appearance: none;\n margin: 0; \n}\n.muigui input[type=number] {\n -moz-appearance: textfield;\n}\n\n/* ------ [ radio grid ] ------ */\n\n.muigui-radio-grid>div {\n display: grid;\n gap: 2px;\n}\n\n.muigui-radio-grid input {\n appearance: none;\n display: none;\n}\n\n.muigui-radio-grid button {\n color: var(--color);\n width: 100%;\n text-align: left;\n}\n\n.muigui-radio-grid input:checked + button {\n color: var(--value-color);\n background-color: var(--selected-color);\n}\n\n/* ------ [ color-chooser ] ------ */\n\n.muigui-color-chooser-cursor {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n.muigui-color-chooser-circle {\n stroke-width: 1px;\n stroke: white;\n fill: none;\n}\n\n\n/* ------ [ vec2 ] ------ */\n\n.muigui-vec2 svg {\n background-color: var(--value-bg-color);\n}\n\n.muigui-vec2-axis {\n stroke: 1px;\n stroke: var(--focus-color);\n}\n\n.muigui-vec2-line {\n stroke-width: 1px;\n stroke: var(--value-color);\n fill: var(--value-color);\n}\n\n/* ------ [ direction ] ------ */\n\n.muigui-direction svg {\n background-color: rgba(0,0,0,0.2);\n}\n\n.muigui-direction:focus-within svg {\n outline: none;\n}\n.muigui-direction-range {\n fill: var(--value-bg-color);\n}\n.muigui-direction svg:focus {\n outline: none;\n}\n.muigui-direction svg:focus .muigui-direction-range {\n stroke-width: 0.5px;\n stroke: var(--focus-color);\n}\n\n.muigui-direction-arrow {\n fill: var(--value-color);\n}\n\n/* ------ [ slider ] ------ */\n\n.muigui-slider>div {\n display: flex;\n align-items: stretch;\n height: var(--line-height);\n}\n.muigui-slider svg {\n flex: 1 1 auto;\n}\n.muigui-slider .muigui-slider-up #muigui-orientation {\n transform: scale(1, -1) translateY(-100%);\n}\n\n.muigui-slider .muigui-slider-up #muigui-number-orientation {\n transform: scale(1,-1);\n}\n\n.muigui-ticks {\n stroke: var(--range-color);\n}\n.muigui-thicks {\n stroke: var(--color);\n stroke-width: 2px;\n}\n.muigui-svg-text {\n fill: var(--color);\n font-size: 7px;\n}\n.muigui-mark {\n fill: var(--value-color);\n}\n\n/* ------ [ range ] ------ */\n\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: calc(var(--border-radius) + 2px);\n border-left: 1px solid rgba(255,255,255,0.3);\n border-top: 1px solid rgba(255,255,255,0.3);\n border-bottom: 1px solid rgba(0,0,0,0.2);\n border-right: 1px solid rgba(0,0,0,0.2);\n background-color: var(--range-color);\n margin-top: calc((var(--line-height) - 6px) / -2);\n width: calc(var(--line-height) - 6px);\n height: calc(var(--line-height) - 6px);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n border: 1px solid var(--menu-sep-color);\n height: 2px;\n}\n\n\n/* dat.gui style - doesn't work on Safari iOS */\n\n/*\n.muigui-range input[type=range] {\n cursor: ew-resize;\n overflow: hidden;\n}\n\n.muigui-range input[type=range] {\n -webkit-appearance: none;\n appearance: none;\n background-color: var(--range-right-color);\n margin: 0;\n}\n.muigui-range input[type=range]:hover {\n background-color: var(--range-right-hover-color);\n}\n\n.muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n appearance: none;\n height: max-content;\n color: var(--range-left-color);\n margin-top: -1px;\n}\n\n.muigui-range input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 0px;\n height: max-content;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n}\n*/\n\n/* FF */\n/*\n.muigui-range input[type=range]::-moz-slider-progress {\n background-color: var(--range-left-color); \n}\n.muigui-range input[type=range]::-moz-slider-thumb {\n height: max-content;\n width: 0;\n border: none;\n box-shadow: -1000px 0 0 1000px var(--range-left-color);\n box-sizing: border-box;\n}\n*/\n\n.muigui-checkered-background {\n background-color: #404040;\n background-image:\n linear-gradient(45deg, #808080 25%, transparent 25%),\n linear-gradient(-45deg, #808080 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #808080 75%),\n linear-gradient(-45deg, transparent 75%, #808080 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n}\n\n/* ---------------------------------------------------------- */\n\n/* needs to be at bottom to take precedence */\n.muigui-auto-place {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 100001;\n}\n\n`,\nthemes: {\n default: {\n include: ['default'],\n css: `\n `,\n },\n float: {\n include: ['default'],\n css: `\n :root {\n color-scheme: light dark,\n }\n\n .muigui {\n --width: 400px;\n --bg-color: initial;\n --label-width: 25%;\n --number-width: 20%;\n }\n\n input,\n .muigui-label-controller>label {\n text-shadow:\n -1px -1px 0 var(--contrast-color),\n 1px -1px 0 var(--contrast-color),\n -1px 1px 0 var(--contrast-color),\n 1px 1px 0 var(--contrast-color);\n }\n\n .muigui-controller > label:nth-child(1) {\n place-content: center end;\n margin-right: 1em;\n }\n\n .muigui-value > :nth-child(2) {\n margin-left: 1em;\n }\n\n .muigui-root>*:nth-child(1) {\n display: none;\n }\n\n .muigui-range input[type=range]::-webkit-slider-thumb {\n border-radius: 1em;\n }\n\n .muigui-range input[type=range]::-webkit-slider-runnable-track {\n -webkit-appearance: initial;\n appearance: none;\n border: 1px solid rgba(0, 0, 0, 0.25);\n height: 2px;\n }\n\n .muigui-colors {\n --value-color: var(--color );\n --value-bg-color: rgba(0, 0, 0, 0.1);\n --disabled-color: #cccccc;\n --menu-bg-color: rgba(0, 0, 0, 0.1);\n --menu-sep-color: #bbbbbb;\n --hover-bg-color: rgba(0, 0, 0, 0);\n --invalid-color: #FF0000;\n --selected-color: rgba(0, 0, 0, 0.3);\n --range-color: rgba(0, 0, 0, 0.125);\n }\n`,\n },\n form: {\n include: [],\n css: `\n .muigui {\n --width: 100%;\n --label-width: 45%;\n --number-width: 40%;\n }\n .muigui-root>button {\n display: none;\n }\n .muigui-controller {\n margin-top: 1em;\n }\n .muigui-label-controller {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n margin-top: 1em;\n }\n .muigui-label-controller:has(.muigui-checkbox) {\n flex-direction: row;\n }\n .muigui-value {\n display: flex;\n align-items: stretch;\n }\n .muigui-value>* {\n flex: 1 1 auto;\n min-width: 0;\n }\n .muigui-controller>*:nth-child(1) {\n flex: 1 0 var(--label-width);\n min-width: 0;\n white-space: pre;\n }\n .muigui-controller>label:nth-child(1) {\n place-content: center start;\n display: inline-grid;\n overflow: hidden;\n }\n .muigui-controller>*:nth-child(2) {\n flex: 1 1 75%;\n min-width: 0;\n }\n `,\n },\n none: {\n include: [],\n css: '',\n },\n},\n};\n","export function setElemProps(elem, attrs, children) {\n for (const [key, value] of Object.entries(attrs)) {\n if (typeof value === 'function' && key.startsWith('on')) {\n const eventName = key.substring(2).toLowerCase();\n elem.addEventListener(eventName, value, {passive: false});\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n elem[key][k] = v;\n }\n } else if (elem[key] === undefined) {\n elem.setAttribute(key, value);\n } else {\n elem[key] = value;\n }\n }\n for (const child of children) {\n elem.appendChild(child);\n }\n return elem;\n}\n\nexport function createElem(tag, attrs = {}, children = []) {\n const elem = document.createElement(tag);\n setElemProps(elem, attrs, children);\n return elem;\n}\n\nexport function addElem(tag, parent, attrs = {}, children = []) {\n const elem = createElem(tag, attrs, children);\n parent.appendChild(elem);\n return elem;\n}\n\nlet nextId = 0;\nexport function getNewId() {\n return `muigui-id-${nextId++}`;\n}\n","export function removeArrayElem(array, value) {\n const ndx = array.indexOf(value);\n if (ndx) {\n array.splice(ndx, 1);\n }\n return array;\n}\n\n/**\n * Converts an camelCase or snake_case id to \"camel case\" or \"snake case\"\n * @param {string} id\n */\nconst underscoreRE = /_/g;\nconst upperLowerRE = /([A-Z])([a-z])/g;\nexport function idToLabel(id) {\n return id.replace(underscoreRE, ' ')\n .replace(upperLowerRE, (m, m1, m2) => `${m1.toLowerCase()} ${m2}`);\n}\n\nexport function clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n}\n\nexport const isTypedArray = typeof SharedArrayBuffer !== 'undefined'\n ? function isArrayBufferOrSharedArrayBuffer(a) {\n return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n }\n : function isArrayBuffer(a) {\n return a && a.buffer && a.buffer instanceof ArrayBuffer;\n };\n\nexport const isArrayOrTypedArray = v => Array.isArray(v) || isTypedArray(v);\n\n// Yea, I know this should be `Math.round(v / step) * step\n// but try step = 0.1, newV = 19.95\n//\n// I get\n// Math.round(19.95 / 0.1) * 0.1\n// 19.900000000000002\n// vs\n// Math.round(19.95 / 0.1) / (1 / 0.1)\n// 19.9\n//\nexport const stepify = (v, from, step) => Math.round(from(v) / step) / (1 / step);\n\nexport const euclideanModulo = (v, n) => ((v % n) + n) % n;\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport function copyExistingProperties(dst, src) {\n for (const key in src) {\n if (key in dst) {\n dst[key] = src[key];\n }\n }\n return dst;\n}\n\nexport const mapRange = (v, inMin, inMax, outMin, outMax) => (v - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n\nexport const makeRangeConverters = ({from, to}) => {\n return {\n to: v => mapRange(v, ...from, ...to),\n from: v => [true, mapRange(v, ...to, ...from)],\n };\n};\n\nexport const makeRangeOptions = ({from, to, step}) => {\n return {\n min: to[0],\n max: to[1],\n ...(step && {step}),\n converters: makeRangeConverters({from, to}),\n };\n};\n\n// TODO: remove an use one in conversions. Move makeRangeConverters there?\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\nexport function makeMinMaxPair(gui, properties, minPropName, maxPropName, options) {\n const { converters: { from } = identity } = options;\n const { min, max } = options;\n const guiMinRange = options.minRange || 0;\n const valueMinRange = from(guiMinRange)[1];\n const minGui = gui\n .add(properties, minPropName, {\n ...options,\n min,\n max: max - guiMinRange,\n })\n .onChange(v => {\n maxGui.setValue(Math.min(max, Math.max(v + valueMinRange, properties[maxPropName])));\n });\n const maxGui = gui\n .add(properties, maxPropName, {\n ...options,\n min: min + guiMinRange,\n max,\n })\n .onChange(v => {\n minGui.setValue(Math.max(min, Math.min(v - valueMinRange, properties[minPropName])));\n });\n return [ minGui, maxGui ];\n}\n\n","import { removeArrayElem } from '../libs/utils.js';\n\nexport default class View {\n domElement: HTMLElement;\n\n #childDestElem: HTMLElement;\n #views: View[] = [];\n\n constructor(elem: HTMLElement) {\n this.domElement = elem;\n this.#childDestElem = elem;\n }\n addElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n return elem;\n }\n removeElem(elem: HTMLElement) {\n this.#childDestElem.removeChild(elem);\n return elem;\n }\n pushSubElem(elem: HTMLElement) {\n this.#childDestElem.appendChild(elem);\n this.#childDestElem = elem;\n }\n popSubElem() {\n this.#childDestElem = this.#childDestElem.parentElement!;\n }\n add(view: View) {\n this.#views.push(view);\n this.addElem(view.domElement);\n return view;\n }\n remove(view: View) {\n this.removeElem(view.domElement);\n removeArrayElem(this.#views, view);\n return view;\n }\n pushSubView(view: View) {\n this.pushSubElem(view.domElement);\n }\n popSubView() {\n this.popSubElem();\n }\n setOptions(options: any) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n }\n updateDisplayIfNeeded(newV: any, ignoreCache?: boolean) {\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n $(selector: string) {\n return this.domElement.querySelector(selector);\n }\n}","import { createElem } from '../libs/elem.js';\nimport { removeArrayElem } from '../libs/utils.js';\nimport View from '../views/View.js';\n\nexport default class Controller extends View {\n #changeFns;\n #finishChangeFns;\n #parent;\n\n constructor(className) {\n super(createElem('div', {className: 'muigui-controller'}));\n this.#changeFns = [];\n this.#finishChangeFns = [];\n // we need the specialization to come last so it takes precedence.\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n get parent() {\n return this.#parent;\n }\n setParent(parent) {\n this.#parent = parent;\n this.enable(!this.disabled());\n }\n show(show = true) {\n this.domElement.classList.toggle('muigui-hide', !show);\n this.domElement.classList.toggle('muigui-show', show);\n return this;\n }\n hide() {\n return this.show(false);\n }\n disabled() {\n return !!this.domElement.closest('.muigui-disabled');\n }\n\n enable(enable = true) {\n this.domElement.classList.toggle('muigui-disabled', !enable);\n\n // If disabled we need to set the attribute 'disabled=true' to all\n // input/select/button/textarea's below\n //\n // If enabled we need to set the attribute 'disabled=false' to all below\n // until we hit a disabled controller.\n //\n // ATM the problem is we can find the input/select/button/textarea elements\n // but we can't easily find which controller they belong do.\n // But we don't need to? We can just check up if it or parent has\n // '.muigui-disabled'\n ['input', 'button', 'select', 'textarea'].forEach(tag => {\n this.domElement.querySelectorAll(tag).forEach(elem => {\n const disabled = !!elem.closest('.muigui-disabled');\n elem.disabled = disabled;\n });\n });\n\n return this;\n }\n disable(disable = true) {\n return this.enable(!disable);\n }\n onChange(fn) {\n this.removeChange(fn);\n this.#changeFns.push(fn);\n return this;\n }\n removeChange(fn) {\n removeArrayElem(this.#changeFns, fn);\n return this;\n }\n onFinishChange(fn) {\n this.removeFinishChange(fn);\n this.#finishChangeFns.push(fn);\n return this;\n }\n removeFinishChange(fn) {\n removeArrayElem(this.#finishChangeFns, fn);\n return this;\n }\n #callListeners(fns, newV) {\n for (const fn of fns) {\n fn.call(this, newV);\n }\n }\n emitChange(value, object, property) {\n this.#callListeners(this.#changeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n emitFinalChange(value, object, property) {\n this.#callListeners(this.#finishChangeFns, value);\n if (this.#parent) {\n if (object === undefined) {\n this.#parent.emitChange(value);\n } else {\n this.#parent.emitFinalChange({\n object,\n property,\n value,\n controller: this,\n });\n }\n }\n }\n updateDisplay() {\n // placeholder. override\n }\n getColors() {\n const toCamelCase = s => s.replace(/-([a-z])/g, (m, m1) => m1.toUpperCase());\n const keys = [\n 'color',\n 'bg-color',\n 'value-color',\n 'value-bg-color',\n 'hover-bg-color',\n 'menu-bg-color',\n 'menu-sep-color',\n 'disabled-color',\n ];\n const div = createElem('div');\n this.domElement.appendChild(div);\n const colors = Object.fromEntries(keys.map(key => {\n div.style.color = `var(--${key})`;\n const s = getComputedStyle(div);\n return [toCamelCase(key), s.color];\n }));\n div.remove();\n return colors;\n }\n}\n","import {\n createElem,\n} from '../libs/elem.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport Controller from './Controller.js';\n\nexport default class Button extends Controller {\n #object;\n #property;\n #buttonElem;\n #options = {\n name: '',\n };\n\n constructor(object, property, options = {}) {\n super('muigui-button', '');\n this.#object = object;\n this.#property = property;\n\n this.#buttonElem = this.addElem(\n createElem('button', {\n type: 'button',\n onClick: () => {\n this.#object[this.#property](this);\n },\n }));\n this.setOptions({name: property, ...options});\n }\n name(name) {\n this.#buttonElem.textContent = name;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n }\n}","import { isTypedArray } from '../libs/utils.js';\nimport View from './View.js';\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction copyArrayElementsFromTo(src, dst) {\n dst.length = src.length;\n for (let i = 0; i < src.length; ++i) {\n dst[i] = src[i];\n }\n}\n\nexport default class EditView extends View {\n #oldV;\n #updateCheck;\n\n #checkArrayNeedsUpdate(newV) {\n // It's an array, we need to compare all elements\n // Example, vec2, [r,g,b], ...\n const needUpdate = !arraysEqual(newV, this.#oldV);\n if (needUpdate) {\n copyArrayElementsFromTo(newV, this.#oldV);\n }\n return needUpdate;\n }\n\n #checkTypedArrayNeedsUpdate() {\n let once = true;\n return function checkTypedArrayNeedsUpdateImpl(newV) {\n // It's a typedarray, we need to compare all elements\n // Example: Float32Array([r, g, b])\n let needUpdate = once;\n once = false;\n if (!needUpdate) {\n needUpdate = !arraysEqual(newV, this.#oldV);\n }\n return needUpdate;\n };\n }\n\n #checkObjectNeedsUpdate(newV) {\n let needUpdate = false;\n for (const key in newV) {\n if (newV[key] !== this.#oldV[key]) {\n needUpdate = true;\n this.#oldV[key] = newV[key];\n }\n }\n return needUpdate;\n }\n\n #checkValueNeedsUpdate(newV) {\n const needUpdate = newV !== this.#oldV;\n this.#oldV = newV;\n return needUpdate;\n }\n\n #getUpdateCheckForType(newV) {\n if (Array.isArray(newV)) {\n this.#oldV = [];\n return this.#checkArrayNeedsUpdate.bind(this);\n } else if (isTypedArray(newV)) {\n this.#oldV = new newV.constructor(newV);\n return this.#checkTypedArrayNeedsUpdate(this);\n } else if (typeof newV === 'object') {\n this.#oldV = {};\n return this.#checkObjectNeedsUpdate.bind(this);\n } else {\n return this.#checkValueNeedsUpdate.bind(this);\n }\n }\n\n // The point of this is updating DOM elements\n // is slow but if we've called `listen` then\n // every frame we're going to try to update\n // things with the current value so if nothing\n // has changed then skip it.\n updateDisplayIfNeeded(newV, ignoreCache) {\n this.#updateCheck = this.#updateCheck || this.#getUpdateCheckForType(newV);\n // Note: We call #updateCheck first because it updates\n // the cache\n if (this.#updateCheck(newV) || ignoreCache) {\n this.updateDisplay(newV);\n }\n }\n setOptions(/*options*/) {\n // override this\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class CheckboxView extends EditView {\n #checkboxElem;\n constructor(setter, id) {\n const checkboxElem = createElem('input', {\n type: 'checkbox',\n id,\n onInput: () => {\n setter.setValue(checkboxElem.checked);\n },\n onChange: () => {\n setter.setFinalValue(checkboxElem.checked);\n },\n });\n super(createElem('label', {}, [checkboxElem]));\n this.#checkboxElem = checkboxElem;\n }\n updateDisplay(v) {\n this.#checkboxElem.checked = v;\n }\n}\n","import { removeArrayElem } from './utils.js';\n\nconst tasks = [];\nconst tasksToRemove = new Set();\n\nlet requestId;\nlet processing;\n\nfunction removeTasks() {\n if (!tasksToRemove.size) {\n return;\n }\n\n if (processing) {\n queueProcessing();\n return;\n }\n\n tasksToRemove.forEach(task => {\n removeArrayElem(tasks, task);\n });\n tasksToRemove.clear();\n}\n\nfunction processTasks() {\n requestId = undefined;\n processing = true;\n for (const task of tasks) {\n if (!tasksToRemove.has(task)) {\n task();\n }\n }\n processing = false;\n removeTasks();\n queueProcessing();\n}\n\nfunction queueProcessing() {\n if (!requestId && tasks.length) {\n requestId = requestAnimationFrame(processTasks);\n }\n}\n\nexport function addTask(fn) {\n tasks.push(fn);\n queueProcessing();\n}\n\nexport function removeTask(fn) {\n tasksToRemove.set(fn);\n\n const ndx = tasks.indexOf(fn);\n if (ndx >= 0) {\n tasks.splice(ndx, 1);\n }\n}","let id = 0;\n\nexport function makeId() {\n return `muigui-${++id}`;\n}\n","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ValueView extends View {\n constructor(className = '') {\n super(createElem('div', {className: 'muigui-value'}));\n if (className) {\n this.domElement.classList.add(className);\n }\n }\n}","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport ValueView from '../views/ValueView.js';\nimport Controller from './Controller.js';\n\nexport default class LabelController extends Controller {\n #id;\n #nameElem;\n\n constructor(className = '', name = '') {\n super('muigui-label-controller');\n this.#id = makeId();\n this.#nameElem = createElem('label', {for: this.#id});\n this.domElement.appendChild(this.#nameElem);\n this.pushSubView(new ValueView(className));\n this.name(name);\n }\n get id() {\n return this.#id;\n }\n name(name) {\n if (this.#nameElem.title === this.#nameElem.textContent) {\n this.#nameElem.title = name;\n }\n this.#nameElem.textContent = name;\n return this;\n }\n tooltip(tip) {\n this.#nameElem.title = tip;\n }\n}\n\n","import {addTask, removeTask} from '../libs/taskrunner.js';\nimport { isTypedArray } from '../libs/utils.js';\nimport LabelController from './LabelController.js';\n\nexport default class ValueController extends LabelController {\n #object;\n #property;\n #initialValue;\n #listening;\n #views;\n #updateFn;\n\n constructor(object, property, className = '') {\n super(className, property);\n this.#object = object;\n this.#property = property;\n this.#initialValue = this.getValue();\n this.#listening = false;\n this.#views = [];\n }\n get initialValue() {\n return this.#initialValue;\n }\n get object() {\n return this.#object;\n }\n get property() {\n return this.#property;\n }\n add(view) {\n this.#views.push(view);\n super.add(view);\n this.updateDisplay();\n return view;\n }\n #setValueImpl(v, ignoreCache) {\n let isDifferent = false;\n if (typeof v === 'object') {\n const dst = this.#object[this.#property];\n // don't replace objects, just their values.\n if (Array.isArray(v) || isTypedArray(v)) {\n for (let i = 0; i < v.length; ++i) {\n isDifferent ||= dst[i] !== v[i];\n dst[i] = v[i];\n }\n } else {\n for (const key of Object.keys(v)) {\n isDifferent ||= dst[key] !== v[key];\n }\n Object.assign(dst, v);\n }\n } else {\n isDifferent = this.#object[this.#property] !== v;\n this.#object[this.#property] = v;\n }\n this.updateDisplay(ignoreCache);\n if (isDifferent) {\n this.emitChange(this.getValue(), this.#object, this.#property);\n }\n return isDifferent;\n }\n setValue(v) {\n this.#setValueImpl(v);\n }\n setFinalValue(v) {\n const isDifferent = this.#setValueImpl(v, true);\n if (isDifferent) {\n this.emitFinalChange(this.getValue(), this.#object, this.#property);\n }\n return this;\n }\n updateDisplay(ignoreCache) {\n const newV = this.getValue();\n for (const view of this.#views) {\n view.updateDisplayIfNeeded(newV, ignoreCache);\n }\n return this;\n }\n setOptions(options) {\n for (const view of this.#views) {\n view.setOptions(options);\n }\n this.updateDisplay();\n return this;\n }\n getValue() {\n return this.#object[this.#property];\n }\n value(v) {\n this.setValue(v);\n return this;\n }\n reset() {\n this.setValue(this.#initialValue);\n return this;\n }\n listen(listen = true) {\n if (!this.#updateFn) {\n this.#updateFn = this.updateDisplay.bind(this);\n }\n if (listen) {\n if (!this.#listening) {\n this.#listening = true;\n addTask(this.#updateFn);\n }\n } else {\n if (this.#listening) {\n this.#listening = false;\n removeTask(this.#updateFn);\n }\n }\n return this;\n }\n}\n\n","import CheckboxView from '../views/CheckboxView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Checkbox extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-checkbox');\n const id = this.id;\n this.add(new CheckboxView(this, id));\n this.updateDisplay();\n }\n}","import {\n makeRangeConverters,\n} from './utils.js';\n\nexport const identity = {\n to: v => v,\n from: v => [true, v],\n};\n\n// from: from string to value\n// to: from value to string\nexport const strToNumber = {\n to: v => v.toString(),\n from: v => {\n const newV = parseFloat(v);\n return [!Number.isNaN(newV), newV];\n },\n};\n\nexport const converters = {\n radToDeg: makeRangeConverters({to: [0, 180], from: [0, Math.PI]}),\n};\n","export function createWheelHelper() {\n let wheelAccum = 0;\n return function (e, step, wheelScale = 5) {\n wheelAccum -= e.deltaY * step / wheelScale;\n const wheelSteps = Math.floor(Math.abs(wheelAccum) / step) * Math.sign(wheelAccum);\n const delta = wheelSteps * step;\n wheelAccum -= delta;\n return delta;\n };\n}\n","import { createElem } from '../libs/elem.js';\nimport { strToNumber } from '../libs/conversions.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nexport default class NumberView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n converters: strToNumber,\n min: Number.NEGATIVE_INFINITY,\n max: Number.POSITIVE_INFINITY,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'number',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n const [valid, outV] = this.#from(newV);\n if (valid) {\n setter.setValue(outV);\n }\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const v = parseFloat(this.domElement.value);\n const [valid, newV] = this.#from(v);\n let inRange;\n if (valid && !Number.isNaN(v)) {\n const {min, max} = this.#options;\n inRange = newV >= min && newV <= max;\n this.#skipUpdate = skipUpdate;\n setFn(clamp(newV, min, max));\n }\n this.domElement.classList.toggle('muigui-invalid-value', !valid || !inRange);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n return this;\n }\n}\n","\nimport NumberView from '../views/NumberView.js';\nimport ValueController from './ValueController.js';\n\n// Wanted to name this `Number` but it conflicts with\n// JavaScript `Number`. It most likely wouldn't be\n// an issue? But users might `import {Number} ...` and\n// things would break.\nexport default class TextNumber extends ValueController {\n #textView;\n #step;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-text-number');\n this.#textView = this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport EditView from './EditView.js';\n\nexport default class SelectView extends EditView {\n #values;\n\n constructor(setter, keyValues) {\n const values = [];\n super(createElem('select', {\n onChange: () => {\n setter.setFinalValue(this.#values[this.domElement.selectedIndex]);\n },\n }, keyValues.map(([key, value]) => {\n values.push(value);\n return createElem('option', {textContent: key});\n })));\n this.#values = values;\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n this.domElement.selectedIndex = ndx;\n }\n}\n","\n// 4 cases\n// (a) keyValues is array of arrays, each sub array is key value\n// (b) keyValues is array and value is number then keys = array contents, value = index\n// (c) keyValues is array and value is not number, key = array contents, value = array contents\n// (d) keyValues is object then key->value\nexport function convertToKeyValues(keyValues, valueIsNumber) {\n if (Array.isArray(keyValues)) {\n if (Array.isArray(keyValues[0])) {\n // (a) keyValues is array of arrays, each sub array is key value\n return keyValues;\n } else {\n if (valueIsNumber) {\n // (b) keyValues is array and value is number then keys = array contents, value = index\n return keyValues.map((v, ndx) => [v, ndx]);\n } else {\n // (c) keyValues is array and value is not number, key = array contents, value = array contents\n return keyValues.map(v => [v, v]);\n }\n }\n } else {\n // (d)\n return [...Object.entries(keyValues)];\n }\n}\n","import SelectView from '../views/SelectView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class Select extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-select');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {keyValues: keyValuesInput} = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new SelectView(this, keyValues));\n this.updateDisplay();\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport EditView from './EditView.js';\n\nexport default class RangeView extends EditView {\n #to;\n #from;\n #step;\n #skipUpdate;\n #options = {\n step: 0.01,\n min: 0,\n max: 1,\n converters: identity,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('input', {\n type: 'range',\n onInput: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setValue(validV);\n }\n },\n onChange: () => {\n this.#skipUpdate = true;\n const {min, max, step} = this.#options;\n const v = parseFloat(this.domElement.value);\n const newV = clamp(stepify(v, v => v, step), min, max);\n const [valid, validV] = this.#from(newV);\n if (valid) {\n setter.setFinalValue(validV);\n }\n },\n onWheel: e => {\n e.preventDefault();\n const [valid, v] = this.#from(parseFloat(this.domElement.value));\n if (!valid) {\n return;\n }\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(v + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.setOptions(options);\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = stepify(v, this.#to, this.#step);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n step,\n min,\n max,\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n this.#step = step;\n this.domElement.step = step;\n this.domElement.min = min;\n this.domElement.max = max;\n return this;\n }\n}","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport RangeView from '../views/RangeView.js';\n\nexport default class Range extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-range');\n this.add(new RangeView(this, options));\n this.add(new NumberView(this, options));\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class TextView extends EditView {\n #to;\n #from;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const setValue = setter.setValue.bind(setter);\n const setFinalValue = setter.setFinalValue.bind(setter);\n super(createElem('input', {\n type: 'text',\n onInput: () => {\n this.#handleInput(setValue, true);\n },\n onChange: () => {\n this.#handleInput(setFinalValue, false);\n },\n }));\n this.setOptions(options);\n }\n #handleInput(setFn, skipUpdate) {\n const [valid, newV] = this.#from(this.domElement.value);\n if (valid) {\n this.#skipUpdate = skipUpdate;\n setFn(newV);\n }\n this.domElement.style.color = valid ? '' : 'var(--invalid-color)';\n\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.domElement.value = this.#to(v);\n this.domElement.style.color = '';\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {\n converters: {to, from},\n } = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import TextView from '../views/TextView.js';\nimport ValueController from './ValueController.js';\n\nexport default class Text extends ValueController {\n constructor(object, property) {\n super(object, property, 'muigui-text');\n this.add(new TextView(this));\n this.updateDisplay();\n }\n}","const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\nconst lerp = (a, b, t) => a + (b - a) * t;\nconst fract = v => v >= 0 ? v % 1 : 1 - (v % 1);\n\nconst f0 = v => +v.toFixed(0); // converts to string (eg 1.2 => \"1\"), then converts back to number (eg, \"1.200\" => 1.2)\nconst f3 = v => +v.toFixed(3); // converts to string (eg 1.2 => \"1.200\"), then converts back to number (eg, \"1.200\" => 1.2)\n\nconst hexToUint32RGB = v => (parseInt(v.substring(1, 3), 16) << 16) |\n (parseInt(v.substring(3, 5), 16) << 8 ) |\n (parseInt(v.substring(5, 7), 16) );\nconst uint32RGBToHex = v => `#${(Math.round(v)).toString(16).padStart(6, '0')}`;\nconst hexToUint32RGBA = v => (parseInt(v.substring(1, 3), 16) * 2 ** 24) +\n (parseInt(v.substring(3, 5), 16) * 2 ** 16) +\n (parseInt(v.substring(5, 7), 16) * 2 ** 8) +\n (parseInt(v.substring(7, 9), 16) );\nconst uint32RGBAToHex = v => `#${(Math.round(v)).toString(16).padStart(8, '0')}`;\n\nexport const hexToUint8RGB = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n];\nexport const uint8RGBToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToUint8RGBA = v => [\n parseInt(v.substring(1, 3), 16),\n parseInt(v.substring(3, 5), 16),\n parseInt(v.substring(5, 7), 16),\n parseInt(v.substring(7, 9), 16),\n];\nexport const uint8RGBAToHex = v => `#${Array.from(v).map(v => v.toString(16).padStart(2, '0')).join('')}`;\n\nexport const hexToFloatRGB = v => hexToUint8RGB(v).map(v => f3(v / 255));\nexport const floatRGBToHex = v => uint8RGBToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nexport const hexToFloatRGBA = v => hexToUint8RGBA(v).map(v => f3(v / 255));\nexport const floatRGBAToHex = v => uint8RGBAToHex(Array.from(v).map(v => Math.round(clamp(v * 255, 0, 255))));\n\nconst scaleAndClamp = v => clamp(Math.round(v * 255), 0, 255).toString(16).padStart(2, '0');\n\nconst hexToObjectRGB = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n});\nconst objectRGBToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}`;\nconst hexToObjectRGBA = v => ({\n r: parseInt(v.substring(1, 3), 16) / 255,\n g: parseInt(v.substring(3, 5), 16) / 255,\n b: parseInt(v.substring(5, 7), 16) / 255,\n a: parseInt(v.substring(7, 9), 16) / 255,\n});\nconst objectRGBAToHex = v => `#${scaleAndClamp(v.r)}${scaleAndClamp(v.g)}${scaleAndClamp(v.b)}${scaleAndClamp(v.a)}`;\n\nconst hexToCssRGB = v => `rgb(${hexToUint8RGB(v).join(', ')})`;\nconst cssRGBRegex = /^\\s*rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/;\nconst cssRGBToHex = v => {\n const m = cssRGBRegex.exec(v);\n return uint8RGBToHex([m[1], m[2], m[3]].map(v => parseInt(v)));\n};\nconst hexToCssRGBA = v => `rgba(${hexToUint8RGBA(v).map((v, i) => i === 3 ? v / 255 : v).join(', ')})`;\nconst cssRGBARegex = /^\\s*rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\nconst cssRGBAToHex = v => {\n const m = cssRGBARegex.exec(v);\n return uint8RGBAToHex([m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? (parseFloat(v) * 255 | 0) : parseInt(v)));\n};\n\nconst hexToCssHSL = v => {\n const hsl = rgbUint8ToHsl(hexToUint8RGB(v)).map(v => f0(v));\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;\n};\nconst hexToCssHSLA = v => {\n const hsla = rgbaUint8ToHsla(hexToUint8RGBA(v)).map((v, i) => i === 3 ? f3(v) : f0(v));\n return `hsl(${hsla[0]} ${hsla[1]}% ${hsla[2]}% / ${hsla[3]})`;\n};\nconst cssHSLRegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\)\\s*$/;\nconst cssHSLARegex = /^\\s*hsl\\(\\s*(\\d+)(?:deg|)\\s*(?:,|)\\s*(\\d+)%\\s*(?:,|)\\s*(\\d+)%\\s*\\/\\s*(\\d+\\.\\d+|\\d+)\\s*\\)\\s*$/;\n\nconst hex3DigitTo6Digit = v => `${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\nconst cssHSLToHex = v => {\n const m = cssHSLRegex.exec(v);\n const rgb = hslToRgbUint8([m[1], m[2], m[3]].map(v => parseFloat(v)));\n return uint8RGBToHex(rgb);\n};\nconst cssHSLAToHex = v => {\n const m = cssHSLARegex.exec(v);\n const rgba = hslaToRgbaUint8([m[1], m[2], m[3], m[4]].map(v => parseFloat(v)));\n return uint8RGBAToHex(rgba);\n};\n\nconst euclideanModulo = (v, n) => ((v % n) + n) % n;\n\nexport function hslToRgbUint8([h, s, l]) {\n h = euclideanModulo(h, 360);\n s = clamp(s / 100, 0, 1);\n l = clamp(l / 100, 0, 1);\n\n const a = s * Math.min(l, 1 - l);\n\n function f(n) {\n const k = (n + h / 30) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n }\n\n return [f(0), f(8), f(4)].map(v => Math.round(v * 255));\n}\n\nexport function hslaToRgbaUint8([h, s, l, a]) {\n const rgb = hslToRgbUint8([h, s, l]);\n return [...rgb, a * 255 | 0];\n}\n\nexport function rgbFloatToHsl01([r, g, b]) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (min + max) * 0.5;\n const d = max - min;\n let h = 0;\n let s = 0;\n\n if (d !== 0) {\n s = (l === 0 || l === 1)\n ? 0\n : (max - l) / Math.min(l, 1 - l);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4;\n }\n }\n\n return [h / 6, s, l];\n}\n\nexport function rgbaFloatToHsla01([r, g, b, a]) {\n const hsl = rgbFloatToHsl01([r, g, b]);\n return [...hsl, a];\n}\n\nexport const rgbUint8ToHsl = (rgb) => {\n const [h, s, l] = rgbFloatToHsl01(rgb.map(v => v / 255));\n return [h * 360, s * 100, l * 100];\n};\n\nexport const rgbaUint8ToHsla = (rgba) => {\n const [h, s, l, a] = rgbaFloatToHsla01(rgba.map(v => v / 255));\n return [h * 360, s * 100, l * 100, a];\n};\n\nexport function hsv01ToRGBFloat([hue, sat, val]) {\n sat = clamp(sat, 0, 1);\n val = clamp(val, 0, 1);\n return [hue, hue + 2 / 3, hue + 1 / 3].map(\n v => lerp(1, clamp(Math.abs(fract(v) * 6 - 3.0) - 1, 0, 1), sat) * val\n );\n}\n\nexport function hsva01ToRGBAFloat([hue, sat, val, alpha]) {\n const rgb = hsv01ToRGBFloat([hue, sat, val]);\n return [...rgb, alpha];\n}\n\nconst round3 = v => Math.round(v * 1000) / 1000;\n\nexport function rgbFloatToHSV01([r, g, b]) {\n const p = b > g\n ? [b, g, -1, 2 / 3]\n : [g, b, 0, -1 / 3];\n const q = p[0] > r\n ? [p[0], p[1], p[3], r]\n : [r, p[1], p[2], p[0]];\n const d = q[0] - Math.min(q[3], q[1]);\n return [\n Math.abs(q[2] + (q[3] - q[1]) / (6 * d + Number.EPSILON)),\n d / (q[0] + Number.EPSILON),\n q[0],\n ].map(round3);\n}\n\nexport function rgbaFloatToHSVA01([r, g, b, a]) {\n const hsv = rgbFloatToHSV01([r, g, b]);\n return [...hsv, a];\n}\n\n// window.hsv01ToRGBFloat = hsv01ToRGBFloat;\n// window.rgbFloatToHSV01 = rgbFloatToHSV01;\n\n// Yea, meh!\nexport const hasAlpha = format => format.endsWith('a') || format.startsWith('hex8');\n\nconst cssStringFormats = [\n { re: /^#(?:[0-9a-f]){6}$/i, format: 'hex6' },\n { re: /^(?:[0-9a-f]){6}$/i, format: 'hex6-no-hash' },\n { re: /^#(?:[0-9a-f]){8}$/i, format: 'hex8' },\n { re: /^(?:[0-9a-f]){8}$/i, format: 'hex8-no-hash' },\n { re: /^#(?:[0-9a-f]){3}$/i, format: 'hex3' },\n { re: /^(?:[0-9a-f]){3}$/i, format: 'hex3-no-hash' },\n { re: cssRGBRegex, format: 'css-rgb' },\n { re: cssHSLRegex, format: 'css-hsl' },\n { re: cssRGBARegex, format: 'css-rgba' },\n { re: cssHSLARegex, format: 'css-hsla' },\n];\n\nfunction guessStringColorFormat(v) {\n for (const formatInfo of cssStringFormats) {\n if (formatInfo.re.test(v)) {\n return formatInfo;\n }\n }\n return undefined;\n}\n\nexport function guessFormat(v) {\n switch (typeof v) {\n case 'number':\n console.warn('can not reliably guess format based on a number. You should pass in a format like {format: \"uint32-rgb\"} or {format: \"uint32-rgb\"}');\n return v <= 0xFFFFFF ? 'uint32-rgb' : 'uint32-rgba';\n case 'string': {\n const formatInfo = guessStringColorFormat(v.trim());\n if (formatInfo) {\n return formatInfo.format;\n }\n break;\n }\n case 'object':\n if (v instanceof Uint8Array || v instanceof Uint8ClampedArray) {\n if (v.length === 3) {\n return 'uint8-rgb';\n } else if (v.length === 4) {\n return 'uint8-rgba';\n }\n } else if (v instanceof Float32Array) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else if (Array.isArray(v)) {\n if (v.length === 3) {\n return 'float-rgb';\n } else if (v.length === 4) {\n return 'float-rgba';\n }\n } else {\n if ('r' in v && 'g' in v && 'b' in v) {\n if ('a' in v) {\n return 'object-rgba';\n } else {\n return 'object-rgb';\n }\n }\n }\n }\n throw new Error(`unknown color format: ${v}`);\n}\n\nfunction fixHex6(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction fixHex8(v) {\n return v.trim(v);\n //const formatInfo = guessStringColorFormat(v.trim());\n //const fix = formatInfo ? formatInfo.fix : v => v;\n //return fix(v.trim());\n}\n\nfunction hex6ToHex3(hex6) {\n return (hex6[1] === hex6[2] &&\n hex6[3] === hex6[4] &&\n hex6[5] === hex6[6])\n ? `#${hex6[1]}${hex6[3]}${hex6[5]}`\n : hex6;\n}\n\nconst hex3RE = /^(#|)([0-9a-f]{3})$/i;\nfunction hex3ToHex6(hex3) {\n const m = hex3RE.exec(hex3);\n if (m) {\n const [, , m2] = m;\n return `#${hex3DigitTo6Digit(m2)}`;\n }\n return hex3;\n}\n\nfunction fixHex3(v) {\n return hex6ToHex3(fixHex6(v));\n}\n\nconst strToRGBObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgb = JSON.parse(json);\n if (Number.isNaN(rgb.r) || Number.isNaN(rgb.g) || Number.isNaN(rgb.b)) {\n throw new Error('not {r, g, b}');\n }\n return [true, rgb];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToRGBAObject = (s) => {\n try {\n const json = s.replace(/([a-z])/g, '\"$1\"');\n const rgba = JSON.parse(json);\n if (Number.isNaN(rgba.r) || Number.isNaN(rgba.g) || Number.isNaN(rgba.b) || Number.isNaN(rgba.a)) {\n throw new Error('not {r, g, b, a}');\n }\n return [true, rgba];\n } catch (e) {\n return [false];\n }\n};\n\nconst strToCssRGB = s => {\n const m = cssRGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgb(${v.join(', ')})`];\n};\n\nconst strToCssRGBA = s => {\n const m = cssRGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map((v, i) => i === 3 ? parseFloat(v) : parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, `rgba(${v.join(', ')})`];\n};\n\nconst strToCssHSL = s => {\n const m = cssHSLRegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]}, ${v[1]}%, ${v[2]}%)`];\n};\n\nconst strToCssHSLA = s => {\n const m = cssHSLARegex.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseFloat(v));\n const outOfRange = v.find(v => Number.isNaN(v));\n return [!outOfRange, `hsl(${v[0]} ${v[1]}% ${v[2]}% / ${v[3]})`];\n};\n\nconst rgbObjectToStr = rgb => {\n return `{r:${f3(rgb.r)}, g:${f3(rgb.g)}, b:${f3(rgb.b)}}`;\n};\nconst rgbaObjectToStr = rgba => {\n return `{r:${f3(rgba.r)}, g:${f3(rgba.g)}, b:${f3(rgba.b)}}, a:${f3(rgba.a)}}`;\n};\n\nconst strTo3IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo3Ints = s => {\n const m = strTo3IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo4IntsRE = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$/;\nconst strTo4Ints = s => {\n const m = strTo4IntsRE.exec(s);\n if (!m) {\n return [false];\n }\n const v = [m[1], m[2], m[3], m[4]].map(v => parseInt(v));\n const outOfRange = v.find(v => v > 255);\n return [!outOfRange, v];\n};\n\nconst strTo3Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 3) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strTo4Floats = s => {\n const numbers = s.split(',').map(s => s.trim());\n const v = numbers.map(v => parseFloat(v));\n if (v.length !== 4) {\n return [false];\n }\n // Note: using isNaN not Number.isNaN\n const badNdx = numbers.findIndex(v => isNaN(v));\n return [badNdx < 0, v.map(v => f3(v))];\n};\n\nconst strToUint32RGBRegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,6})\\s*$/i;\nconst strToUint32RGB = s => {\n const m = strToUint32RGBRegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst strToUint32RGBARegex = /^\\s*(?:0x){0,1}([0-9a-z]{1,8})\\s*$/i;\nconst strToUint32RGBA = s => {\n const m = strToUint32RGBARegex.exec(s);\n if (!m) {\n return [false];\n }\n return [true, parseInt(m[1], 16)];\n};\n\nconst hex6RE = /^\\s*#[a-f0-9]{6}\\s*$|^\\s*#[a-f0-9]{3}\\s*$/i;\nconst hexNoHash6RE = /^\\s*[a-f0-9]{6}\\s*$/i;\nconst hex8RE = /^\\s*#[a-f0-9]{8}\\s*$/i;\nconst hexNoHash8RE = /^\\s*[a-f0-9]{8}\\s*$/i;\n\n// For each format converter\n//\n// fromHex/toHex convert from/to '#RRGGBB'\n//\n// fromHex converts from the string '#RRBBGG' to the format\n// (eg: for uint32-rgb, '#123456' becomes 0x123456)\n//\n// toHex converts from the format to '#RRGGBB'\n// (eg: for uint8-rgb, [16, 33, 50] becomes '#102132')\n//\n//\n// fromStr/toStr convert from/to what's in the input[type=text] element\n//\n// toStr converts from the format to its string representation\n// (eg, for object-rgb, {r: 1, g: 0.5, b:0} becomes \"{r: 1, g: 0.5, b:0}\")\n// ^object ^string\n//\n// fromStr converts its string representation to its format\n// (eg, for object-rgb) \"{r: 1, g: 0.5, b:0}\" becomes {r: 1, g: 0.5, b:0})\n// ^string ^object\n// fromString returns an array which is [valid, v]\n// where valid is true if the string was a valid and v is the converted\n// format if v is true.\n//\n// Note: toStr should convert to \"ideal\" form (whatever that is).\n// (eg, for css-rgb\n// \"{ r: 0.10000, g: 001, b: 0}\" becomes \"{r: 0.1, g: 1, b: 0}\"\n// notice that css-rgb is a string to a string\n// )\nexport const colorFormatConverters = {\n 'hex6': {\n color: {\n from: v => [true, v],\n to: fixHex6,\n },\n text: {\n from: v => [hex6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8': {\n color: {\n from: v => [true, v],\n to: fixHex8,\n },\n text: {\n from: v => [hex8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3': {\n color: {\n from: v => [true, fixHex3(v)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hex6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'hex6-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex6(v)}`,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex8-no-hash': {\n color: {\n from: v => [true, v.substring(1)],\n to: v => `#${fixHex8(v)}`,\n },\n text: {\n from: v => [hexNoHash8RE.test(v), v.trim()],\n to: v => v,\n },\n },\n 'hex3-no-hash': {\n color: {\n from: v => [true, fixHex3(v).substring(1)],\n to: hex3ToHex6,\n },\n text: {\n from: v => [hexNoHash6RE.test(v), hex6ToHex3(v.trim())],\n to: v => v,\n },\n },\n 'uint32-rgb': {\n color: {\n from: v => [true, hexToUint32RGB(v)],\n to: uint32RGBToHex,\n },\n text: {\n from: v => strToUint32RGB(v),\n to: v => `0x${v.toString(16).padStart(6, '0')}`,\n },\n },\n 'uint32-rgba': {\n color: {\n from: v => [true, hexToUint32RGBA(v)],\n to: uint32RGBAToHex,\n },\n text: {\n from: v => strToUint32RGBA(v),\n to: v => `0x${v.toString(16).padStart(8, '0')}`,\n },\n },\n 'uint8-rgb': {\n color: {\n from: v => [true, hexToUint8RGB(v)],\n to: uint8RGBToHex,\n },\n text: {\n from: strTo3Ints,\n to: v => v.join(', '),\n },\n },\n 'uint8-rgba': {\n color: {\n from: v => [true, hexToUint8RGBA(v)],\n to: uint8RGBAToHex,\n },\n text: {\n from: strTo4Ints,\n to: v => v.join(', '),\n },\n },\n 'float-rgb': {\n color: {\n from: v => [true, hexToFloatRGB(v)],\n to: floatRGBToHex,\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-rgba': {\n color: {\n from: v => [true, hexToFloatRGBA(v)],\n to: floatRGBAToHex,\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsv': {\n color: {\n from: v => [true, rgbFloatToHSV01(hexToFloatRGB(v))],\n to: v => hsv01ToRGBFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo3Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n 'float-hsva': {\n color: {\n from: v => [true, rgbaFloatToHSVA01(hexToFloatRGB(v))],\n to: v => hsva01ToRGBAFloat(floatRGBToHex(v)),\n },\n text: {\n from: strTo4Floats,\n // need Array.from because map of Float32Array makes a Float32Array\n to: v => Array.from(v).map(v => f3(v)).join(', '),\n },\n },\n //'float-hsl': {\n // color: {\n // from: v => [true, rgbFloatToHsl01(hexToFloatRGB(v))],\n // to: v => hsl01ToRGBFloat(floatRGBToHex(v)),\n // },\n // text: {\n // from: strTo3Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n //'float-hsla': {\n // color: {\n // from: v => [true, hexToFloatRGBA(v)],\n // to: floatRGBAToHex,\n // },\n // text: {\n // from: strTo4Floats,\n // // need Array.from because map of Float32Array makes a Float32Array\n // to: v => Array.from(v).map(v => f3(v)).join(', '),\n // },\n //},\n 'object-rgb': {\n color: {\n from: v => [true, hexToObjectRGB(v)],\n to: objectRGBToHex,\n },\n text: {\n from: strToRGBObject,\n to: rgbObjectToStr,\n },\n },\n 'object-rgba': {\n color: {\n from: v => [true, hexToObjectRGBA(v)],\n to: objectRGBAToHex,\n },\n text: {\n from: strToRGBAObject,\n to: rgbaObjectToStr,\n },\n },\n 'css-rgb': {\n color: {\n from: v => [true, hexToCssRGB(v)],\n to: cssRGBToHex,\n },\n text: {\n from: strToCssRGB,\n to: v => strToCssRGB(v)[1],\n },\n },\n 'css-rgba': {\n color: {\n from: v => [true, hexToCssRGBA(v)],\n to: cssRGBAToHex,\n },\n text: {\n from: strToCssRGBA,\n to: v => strToCssRGBA(v)[1],\n },\n },\n 'css-hsl': {\n color: {\n from: v => [true, hexToCssHSL(v)],\n to: cssHSLToHex,\n },\n text: {\n from: strToCssHSL,\n to: v => strToCssHSL(v)[1],\n },\n },\n 'css-hsla': {\n color: {\n from: v => [true, hexToCssHSLA(v)],\n to: cssHSLAToHex,\n },\n text: {\n from: strToCssHSLA,\n to: v => strToCssHSLA(v)[1],\n },\n },\n};","import { createElem } from '../libs/elem.js';\nimport View from './View.js';\n\nexport default class ElementView extends View {\n constructor(tag, className) {\n super(createElem(tag, {className}));\n }\n}","import ElementView from '../views/ElementView.js';\nimport LabelController from './LabelController.js';\n\n// TODO: remove this? Should just be user side\nexport default class Canvas extends LabelController {\n #canvasElem;\n\n constructor(name) {\n super('muigui-canvas', name);\n this.#canvasElem = this.add(\n new ElementView('canvas', 'muigui-canvas'),\n ).domElement;\n }\n get canvas() {\n return this.#canvasElem;\n }\n}","import { createElem } from '../libs/elem.js';\nimport { identity } from '../libs/conversions.js';\nimport EditView from './EditView.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nexport default class ColorView extends EditView {\n #to;\n #from;\n #colorElem;\n #skipUpdate;\n #options = {\n converters: identity,\n };\n\n constructor(setter, options) {\n const colorElem = createElem('input', {\n type: 'color',\n onInput: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setValue(newV);\n }\n },\n onChange: () => {\n const [valid, newV] = this.#from(colorElem.value);\n if (valid) {\n this.#skipUpdate = true;\n setter.setFinalValue(newV);\n }\n },\n });\n super(createElem('div', {}, [colorElem]));\n this.setOptions(options);\n this.#colorElem = colorElem;\n }\n updateDisplay(v) {\n if (!this.#skipUpdate) {\n this.#colorElem.value = this.#to(v);\n }\n this.#skipUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}} = this.#options;\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import {\n colorFormatConverters,\n guessFormat,\n} from '../libs/color-utils.js';\nimport ValueController from './ValueController.js';\nimport TextView from '../views/TextView.js';\nimport ColorView from '../views/ColorView.js';\n\nexport default class Color extends ValueController {\n #colorView;\n #textView;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#colorView = this.add(new ColorView(this, {converters: color}));\n this.#textView = this.add(new TextView(this, {converters: text}));\n this.updateDisplay();\n }\n setOptions(options) {\n const {format} = options;\n if (format) {\n const {color, text} = colorFormatConverters[format];\n this.#colorView.setOptions({converters: color});\n this.#textView.setOptions({converters: text});\n }\n super.setOptions(options);\n return this;\n }\n}","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addController({className: 'muigui-divider')};\nexport default class Divider extends Controller {\n constructor() {\n super('muigui-divider');\n }\n}","import Controller from './Controller.js';\n\nexport default class Container extends Controller {\n #controllers;\n #childDestController;\n\n constructor(className) {\n super(className);\n this.#controllers = [];\n this.#childDestController = this;\n }\n get children() {\n return this.#controllers; // should we return a copy?\n }\n get controllers() {\n return this.#controllers.filter(c => !(c instanceof Container));\n }\n get folders() {\n return this.#controllers.filter(c => c instanceof Container);\n }\n reset(recursive = true) {\n for (const controller of this.#controllers) {\n if (!(controller instanceof Container) || recursive) {\n controller.reset(recursive);\n }\n }\n return this;\n }\n updateDisplay() {\n for (const controller of this.#controllers) {\n controller.updateDisplay();\n }\n return this;\n }\n remove(controller) {\n const ndx = this.#controllers.indexOf(controller);\n if (ndx >= 0) {\n const c = this.#controllers.splice(ndx, 1);\n const c0 = c[0];\n const elem = c0.domElement;\n elem.remove();\n c0.setParent(null);\n }\n return this;\n }\n #addControllerImpl(controller) {\n this.domElement.appendChild(controller.domElement);\n this.#controllers.push(controller);\n controller.setParent(this);\n return controller;\n }\n addController(controller) {\n return this.#childDestController.#addControllerImpl(controller);\n }\n pushContainer(container) {\n this.addController(container);\n this.#childDestController = container;\n return container;\n }\n popContainer() {\n this.#childDestController = this.#childDestController.parent;\n return this;\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport Container from './Container.js';\n\nexport default class Folder extends Container {\n #labelElem;\n\n constructor(name = 'Controls', className = 'muigui-menu') {\n super(className);\n this.#labelElem = createElem('label');\n this.addElem(createElem('button', {\n type: 'button',\n onClick: () => this.toggleOpen(),\n }, [this.#labelElem]));\n this.pushContainer(new Container('muigui-open-container'));\n this.pushContainer(new Container());\n this.name(name);\n this.open();\n }\n open(open = true) {\n this.domElement.classList.toggle('muigui-closed', !open);\n this.domElement.classList.toggle('muigui-open', open);\n return this;\n }\n close() {\n return this.open(false);\n }\n name(name) {\n this.#labelElem.textContent = name;\n return this;\n }\n title(title) {\n return this.name(title);\n }\n toggleOpen() {\n this.open(!this.domElement.classList.contains('muigui-open'));\n return this;\n }\n}\n","import Controller from './Controller.js';\n\n// This feels like it should be something else like\n// gui.addDividing = new Controller()\nexport default class Label extends Controller {\n constructor(text) {\n super('muigui-label');\n this.text(text);\n }\n text(text) {\n this.domElement.textContent = text;\n return this;\n }\n}","function noop() {\n}\n\nexport function computeRelativePosition(elem, event, start) {\n const rect = elem.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const nx = x / rect.width;\n const ny = y / rect.height;\n start = start || [x, y];\n const dx = x - start[0];\n const dy = y - start[1];\n const ndx = dx / rect.width;\n const ndy = dy / rect.width;\n return {x, y, nx, ny, dx, dy, ndx, ndy};\n}\n\nexport function addTouchEvents(elem, {onDown = noop, onMove = noop, onUp = noop}) {\n let start;\n const pointerMove = function (event) {\n const e = {\n type: 'move',\n ...computeRelativePosition(elem, event, start),\n };\n onMove(e);\n };\n\n const pointerUp = function (event) {\n elem.releasePointerCapture(event.pointerId);\n elem.removeEventListener('pointermove', pointerMove);\n elem.removeEventListener('pointerup', pointerUp);\n\n document.body.style.backgroundColor = '';\n\n onUp('up');\n };\n\n const pointerDown = function (event) {\n elem.addEventListener('pointermove', pointerMove);\n elem.addEventListener('pointerup', pointerUp);\n elem.setPointerCapture(event.pointerId);\n\n const rel = computeRelativePosition(elem, event);\n start = [rel.x, rel.y];\n onDown({\n type: 'down',\n ...rel,\n });\n };\n\n elem.addEventListener('pointerdown', pointerDown);\n\n return function () {\n elem.removeEventListener('pointerdown', pointerDown);\n };\n}","import { createElem, getNewId } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { identity } from '../libs/conversions.js';\nimport { clamp } from '../libs/utils.js';\nimport EditView from './EditView.js';\nimport {\n hexToFloatRGB,\n hexToFloatRGBA,\n hsv01ToRGBFloat,\n hsva01ToRGBAFloat,\n rgbFloatToHSV01,\n rgbaFloatToHSVA01,\n floatRGBToHex,\n floatRGBAToHex,\n rgbaFloatToHsla01,\n} from '../libs/color-utils.js';\nimport { copyExistingProperties } from '../libs/utils.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n\n`;\n\nfunction connectFillTargets(elem) {\n elem.querySelectorAll('[data-src]').forEach(srcElem => {\n const id = getNewId();\n srcElem.id = id;\n elem.querySelectorAll(`[data-target=${srcElem.dataset.src}]`).forEach(targetElem => {\n targetElem.setAttribute('fill', `url(#${id})`);\n });\n });\n return elem;\n}\n\n// Was originally going to make alpha an option. Issue is\n// hard coded conversions?\nexport default class ColorChooserView extends EditView {\n #to;\n #from;\n #satLevelElem;\n #circleElem;\n #hueUIElem;\n #hueElem;\n #hueCursorElem;\n #alphaUIElem;\n #alphaElem;\n #alphaCursorElem;\n #hsva;\n #skipHueUpdate;\n #skipSatLevelUpdate;\n #skipAlphaUpdate;\n #options = {\n converters: identity,\n alpha: false,\n };\n #convertInternalToHex;\n #convertHexToInternal;\n\n constructor(setter, options) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n this.#satLevelElem = this.domElement.children[0];\n this.#hueUIElem = this.domElement.children[1];\n this.#alphaUIElem = this.domElement.children[2];\n connectFillTargets(this.#satLevelElem);\n connectFillTargets(this.#hueUIElem);\n connectFillTargets(this.#alphaUIElem);\n this.#circleElem = this.$('.muigui-color-chooser-circle');\n this.#hueElem = this.$('[data-src=muigui-color-chooser-hue]');\n this.#hueCursorElem = this.$('.muigui-color-chooser-hue-cursor');\n this.#alphaElem = this.$('[data-src=muigui-color-chooser-alpha]');\n this.#alphaCursorElem = this.$('.muigui-color-chooser-alpha-cursor');\n\n const handleSatLevelChange = (e) => {\n const s = clamp(e.nx, 0, 1);\n const v = clamp(e.ny, 0, 1);\n this.#hsva[1] = s;\n this.#hsva[2] = (1 - v);\n this.#skipHueUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleHueChange = (e) => {\n const h = clamp(e.nx, 0, 1);\n this.#hsva[0] = h;\n this.#skipSatLevelUpdate = true;\n this.#skipAlphaUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n const handleAlphaChange = (e) => {\n const a = clamp(e.nx, 0, 1);\n this.#hsva[3] = a;\n this.#skipHueUpdate = true;\n this.#skipSatLevelUpdate = true;\n const [valid, newV] = this.#from(this.#convertInternalToHex(this.#hsva));\n if (valid) {\n setter.setValue(newV);\n }\n };\n\n addTouchEvents(this.#satLevelElem, {\n onDown: handleSatLevelChange,\n onMove: handleSatLevelChange,\n });\n addTouchEvents(this.#hueUIElem, {\n onDown: handleHueChange,\n onMove: handleHueChange,\n });\n addTouchEvents(this.#alphaUIElem, {\n onDown: handleAlphaChange,\n onMove: handleAlphaChange,\n });\n this.setOptions(options);\n }\n updateDisplay(newV) {\n if (!this.#hsva) {\n this.#hsva = this.#convertHexToInternal(this.#to(newV));\n }\n {\n const [h, s, v, a = 1] = this.#convertHexToInternal(this.#to(newV));\n // Don't copy the hue if it was un-computable.\n if (!this.#skipHueUpdate) {\n this.#hsva[0] = s > 0.001 && v > 0.001 ? h : this.#hsva[0];\n }\n if (!this.#skipSatLevelUpdate) {\n this.#hsva[1] = s;\n this.#hsva[2] = v;\n }\n if (!this.#skipAlphaUpdate) {\n this.#hsva[3] = a;\n }\n }\n {\n const [h, s, v, a] = this.#hsva;\n const [hue, sat, lum] = rgbaFloatToHsla01(hsva01ToRGBAFloat(this.#hsva));\n\n if (!this.#skipHueUpdate) {\n this.#hueCursorElem.setAttribute('transform', `translate(${h * 64}, 0)`);\n }\n this.#hueElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} 0% 100% / ${a})`);\n this.#hueElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} 100% 50% / ${a})`);\n if (!this.#skipAlphaUpdate) {\n this.#alphaCursorElem.setAttribute('transform', `translate(${a * 64}, 0)`);\n }\n this.#alphaElem.children[0].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 0)`);\n this.#alphaElem.children[1].setAttribute('stop-color', `hsl(${hue * 360} ${sat * 100}% ${lum * 100}% / 1)`);\n\n if (!this.#skipSatLevelUpdate) {\n this.#circleElem.setAttribute('cx', `${s * 64}`);\n this.#circleElem.setAttribute('cy', `${(1 - v) * 48}`);\n }\n }\n this.#skipHueUpdate = false;\n this.#skipSatLevelUpdate = false;\n this.#skipAlphaUpdate = false;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {converters: {to, from}, alpha} = this.#options;\n this.#alphaUIElem.style.display = alpha ? '' : 'none';\n this.#convertInternalToHex = alpha\n ? v => floatRGBAToHex(hsva01ToRGBAFloat(v))\n : v => floatRGBToHex(hsv01ToRGBFloat(v));\n this.#convertHexToInternal = alpha\n ? v => rgbaFloatToHSVA01(hexToFloatRGBA(v))\n : v => rgbFloatToHSV01(hexToFloatRGB(v));\n this.#to = to;\n this.#from = from;\n return this;\n }\n}\n","import ElementView from '../views/ElementView.js';\nimport ValueController from './ValueController.js';\nimport { copyExistingProperties } from '../libs/utils.js';\nimport { createElem } from '../libs/elem.js';\n/*\n\nholder = new TabHolder\ntab = holder.add(new Tab(\"name\"))\ntab.add(...)\n\n\npc = new PopdownController\ntop = pc.add(new Row())\ntop.add(new Button());\nvalues = topRow.add(new Div())\nbottom = pc.add(new Row());\n\n\n\npc = new PopdownController\npc.addTop\npc.addTop\n\npc.addBottom\n\n\n*/\n\nexport default class PopDownController extends ValueController {\n #top;\n #valuesView;\n #checkboxElem;\n #bottom;\n #options = {\n open: false,\n };\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-pop-down-controller');\n /*\n [ValueView\n [[B][values]] upper row\n [[ visual ]] lower row\n ]\n */\n this.#top = this.add(new ElementView('div', 'muigui-pop-down-top'));\n// this.#top.add(new CheckboxView(makeSetter(this.#options, 'open')));\n const checkboxElem = this.#top.addElem(createElem('input', {\n type: 'checkbox',\n onChange: () => {\n this.#options.open = checkboxElem.checked;\n this.updateDisplay();\n },\n }));\n this.#checkboxElem = checkboxElem;\n this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values'));\n const container = new ElementView('div', 'muigui-pop-down-bottom muigui-open-container');\n this.#bottom = new ElementView('div');\n container.add(this.#bottom);\n this.add(container);\n this.setOptions(options);\n }\n setKnobColor(bgCssColor/*, fgCssColor*/) {\n if (this.#checkboxElem) {\n this.#checkboxElem.style = `\n --range-color: ${bgCssColor};\n --value-bg-color: ${bgCssColor};\n `;\n }\n }\n updateDisplay() {\n super.updateDisplay();\n const {open} = this.#options;\n this.domElement.children[1].classList.toggle('muigui-open', open);\n this.domElement.children[1].classList.toggle('muigui-closed', !open);\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n super.setOptions(options);\n this.updateDisplay();\n }\n addTop(view) {\n return this.#valuesView.add(view);\n }\n addBottom(view) {\n return this.#bottom.add(view);\n }\n}","/* eslint-disable no-underscore-dangle */\nimport {\n colorFormatConverters,\n guessFormat,\n hasAlpha,\n hexToUint8RGB,\n hslToRgbUint8,\n rgbUint8ToHsl,\n uint8RGBToHex,\n} from '../libs/color-utils.js';\nimport ColorChooserView from '../views/ColorChooserView.js';\nimport TextView from '../views/TextView.js';\nimport PopDownController from './PopDownController.js';\n\nexport default class ColorChooser extends PopDownController {\n #colorView;\n #textView;\n #to;\n\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-color-chooser');\n const format = options.format || guessFormat(this.getValue());\n const {color, text} = colorFormatConverters[format];\n this.#to = color.to;\n this.#textView = new TextView(this, {converters: text, alpha: hasAlpha(format)});\n this.#colorView = new ColorChooserView(this, {converters: color, alpha: hasAlpha(format)});\n this.addTop(this.#textView);\n this.addBottom(this.#colorView);\n // WTF! FIX!\n this.___setKnobHelper = true;\n this.updateDisplay();\n }\n #setKnobHelper() {\n if (this.#to) {\n const hex6Or8 = this.#to(this.getValue());\n const alpha = hex6Or8.length === 9 ? hex6Or8.substring(7, 9) : 'FF';\n const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8));\n hsl[2] = (hsl[2] + 50) % 100;\n const hex = uint8RGBToHex(hslToRgbUint8(hsl));\n this.setKnobColor(`${hex6Or8.substring(0, 7)}${alpha}`, hex);\n }\n }\n updateDisplay() {\n super.updateDisplay();\n if (this.___setKnobHelper) {\n this.#setKnobHelper();\n }\n }\n setOptions(options) {\n super.setOptions(options);\n return this;\n }\n}\n","import css from './styles/muigui.css.js';\nimport {createElem} from './libs/elem.js';\nimport {createController} from './controllers/create-controller.js';\nimport {\n mapRange,\n makeRangeConverters,\n makeRangeOptions,\n makeMinMaxPair,\n} from './libs/utils.js';\nimport {\n converters\n} from './libs/conversions.js';\nimport {\n hasAlpha,\n guessFormat,\n} from './libs/color-utils.js';\nimport Canvas from './controllers/Canvas.js';\nimport Color from './controllers/Color.js';\nimport Divider from './controllers/Divider.js';\nimport Folder from './controllers/Folder.js';\nimport Label from './controllers/Label.js';\nimport Controller from './controllers/Controller.js';\nimport ColorChooser from './controllers/ColorChooser.js';\n\nimport Column from './layout/Column.js';\nimport Frame from './layout/Frame.js';\nimport Grid from './layout/Grid.js';\nimport Row from './layout/Row.js';\n\nexport {\n Column,\n Frame,\n Grid,\n Row,\n};\n\nexport class GUIFolder extends Folder {\n add(object, property, ...args) {\n const controller = object instanceof Controller\n ? object\n : createController(object, property, ...args);\n return this.addController(controller);\n }\n addCanvas(name) {\n return this.addController(new Canvas(name));\n }\n addColor(object, property, options = {}) {\n const value = object[property];\n if (hasAlpha(options.format || guessFormat(value))) {\n return this.addController(new ColorChooser(object, property, options));\n } else {\n return this.addController(new Color(object, property, options));\n }\n }\n addDivider() {\n return this.addController(new Divider());\n }\n addFolder(name) {\n return this.addController(new GUIFolder(name));\n }\n addLabel(text) {\n return this.addController(new Label(text));\n }\n addButton(name, fn) {\n const o = {fn};\n return this.add(o, 'fn').name(name);\n }\n}\n\nclass MuiguiElement extends HTMLElement {\n constructor() {\n super();\n this.shadow = this.attachShadow({mode: 'open'});\n }\n}\n\ncustomElements.define('muigui-element', MuiguiElement);\n\nconst baseStyleSheet = new CSSStyleSheet();\n//baseStyleSheet.replaceSync(css.default);\nconst userStyleSheet = new CSSStyleSheet();\n\nfunction makeStyleSheetUpdater(styleSheet) {\n let newCss;\n let newCssPromise;\n\n function updateStyle() {\n if (newCss && !newCssPromise) {\n const s = newCss;\n newCss = undefined;\n newCssPromise = styleSheet.replace(s).then(() => {\n newCssPromise = undefined;\n updateStyle();\n });\n }\n }\n\n return function updateStyleSheet(css) {\n newCss = css;\n updateStyle();\n };\n}\n\nconst updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet);\nconst updateUserStyle = makeStyleSheetUpdater(userStyleSheet);\n\nfunction getTheme(name) {\n const { include, css: cssStr } = css.themes[name];\n return `${include.map(m => css[m]).join('\\n')} : css.default}\\n${cssStr || ''}`;\n}\n\nexport class GUI extends GUIFolder {\n static converters = converters;\n static mapRange = mapRange;\n static makeRangeConverters = makeRangeConverters;\n static makeRangeOptions = makeRangeOptions;\n static makeMinMaxPair = makeMinMaxPair;\n #localStyleSheet = new CSSStyleSheet();\n\n constructor(options = {}) {\n super('Controls', 'muigui-root');\n if (options instanceof HTMLElement) {\n options = {parent: options};\n }\n const {\n autoPlace = true,\n width,\n title = 'Controls',\n } = options;\n let {\n parent,\n } = options;\n\n if (width) {\n this.domElement.style.width = /^\\d+$/.test(width) ? `${width}px` : width;\n }\n if (parent === undefined && autoPlace) {\n parent = document.body;\n this.domElement.classList.add('muigui-auto-place');\n }\n if (parent) {\n const muiguiElement = createElem('muigui-element');\n muiguiElement.shadowRoot.adoptedStyleSheets = [this.#localStyleSheet, baseStyleSheet, userStyleSheet];\n muiguiElement.shadow.appendChild(this.domElement);\n parent.appendChild(muiguiElement);\n }\n if (title) {\n this.title(title);\n }\n this.#localStyleSheet.replaceSync(css.default);\n this.domElement.classList.add('muigui', 'muigui-colors');\n }\n setStyle(css) {\n this.#localStyleSheet.replace(css);\n }\n static setBaseStyles(css) {\n updateBaseStyle(css);\n }\n static getBaseStyleSheet() {\n return baseStyleSheet;\n }\n static setUserStyles(css) {\n updateUserStyle(css);\n }\n static getUserStyleSheet() {\n return userStyleSheet;\n }\n setTheme(name) {\n this.setStyle(getTheme(name));\n }\n static setTheme(name) {\n GUI.setBaseStyles(getTheme(name));\n }\n}\n\nexport default GUI;\n","import Button from './Button.js';\nimport Checkbox from './Checkbox.js';\nimport TextNumber from './TextNumber.js';\nimport Select from './Select.js';\nimport Range from './Range.js';\nimport Text from './Text.js';\n\n// const isConversion = o => typeof o.to === 'function' && typeof o.from === 'function';\n\n/**\n * possible inputs\n * add(o, p, min: number, max: number)\n * add(o, p, min: number, max: number, step: number)\n * add(o, p, array: [value])\n * add(o, p, array: [[key, value]])\n *\n * @param {*} object\n * @param {string} property\n * @param {...any} args\n * @returns {Controller}\n */\nexport function createController(object, property, ...args) {\n const [arg1] = args;\n if (Array.isArray(arg1)) {\n return new Select(object, property, {keyValues: arg1});\n }\n if (arg1 && arg1.keyValues) {\n return new Select(object, property, {keyValues: arg1.keyValues});\n }\n\n const t = typeof object[property];\n switch (t) {\n case 'number':\n if (typeof args[0] === 'number' && typeof args[1] === 'number') {\n const min = args[0];\n const max = args[1];\n const step = args[2];\n return new Range(object, property, {min, max, ...(step && {step})});\n }\n return args.length === 0\n ? new TextNumber(object, property, ...args)\n : new Range(object, property, ...args);\n case 'boolean':\n return new Checkbox(object, property, ...args);\n case 'function':\n return new Button(object, property, ...args);\n case 'string':\n return new Text(object, property, ...args);\n case 'undefined':\n throw new Error(`no property named ${property}`);\n default:\n throw new Error(`unhandled type ${t} for property ${property}`);\n }\n}","function noop() {\n}\n\nconst keyDirections = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n};\n\n// This probably needs to be global\nexport function addKeyboardEvents(elem, {onDown = noop, onUp = noop}) {\n const keyDown = function (event) {\n const mult = event.shiftKey ? 10 : 1;\n const [dx, dy] = (keyDirections[event.key] || [0, 0]).map(v => v * mult);\n const fn = event.type === 'keydown' ? onDown : onUp;\n fn({\n type: event.type.substring(3),\n dx,\n dy,\n event,\n });\n };\n\n elem.addEventListener('keydown', keyDown);\n elem.addEventListener('keyup', keyDown);\n\n return function () {\n elem.removeEventListener('keydown', keyDown);\n elem.removeEventListener('keyup', keyDown);\n };\n}","export function assert(truthy, msg = '') {\n if (!truthy) {\n throw new Error(msg);\n }\n}","import { assert } from '../libs/assert.js';\n\nfunction getEllipsePointForAngle(cx, cy, rx, ry, phi, theta) {\n const m = Math.abs(rx) * Math.cos(theta);\n const n = Math.abs(ry) * Math.sin(theta);\n\n return [\n cx + Math.cos(phi) * m - Math.sin(phi) * n,\n cy + Math.sin(phi) * m + Math.cos(phi) * n,\n ];\n}\n\nfunction getEndpointParameters(cx, cy, rx, ry, phi, theta, dTheta) {\n const [x1, y1] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta);\n const [x2, y2] = getEllipsePointForAngle(cx, cy, rx, ry, phi, theta + dTheta);\n\n const fa = Math.abs(dTheta) > Math.PI ? 1 : 0;\n const fs = dTheta > 0 ? 1 : 0;\n\n return { x1, y1, x2, y2, fa, fs };\n}\n\nexport function arc(cx, cy, r, start, end) {\n assert(Math.abs(start - end) <= Math.PI * 2);\n assert(start >= -Math.PI && start <= Math.PI * 2);\n assert(start <= end);\n assert(end >= -Math.PI && end <= Math.PI * 4);\n\n const { x1, y1, x2, y2, fa, fs } = getEndpointParameters(cx, cy, r, r, 0, start, end - start);\n return Math.abs(Math.abs(start - end) - Math.PI * 2) > Number.EPSILON\n ? `M${cx} ${cy} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2} L${cx} ${cy}`\n : `M${x1} ${y1} L${x1} ${y1} A ${r} ${r} 0 ${fa} ${fs} ${x2} ${y2}`;\n}\n","import { identity } from '../libs/conversions.js';\nimport { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { arc } from '../libs/svg.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { clamp, copyExistingProperties, euclideanModulo, lerp, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n\n`;\n\nconst twoPiMod = v => euclideanModulo(v + Math.PI, Math.PI * 2) - Math.PI;\n\nexport default class DirectionView extends EditView {\n #arrowElem;\n #rangeElem;\n #lastV;\n #wrap;\n #options = {\n step: 1,\n min: -180,\n max: 180,\n\n /*\n --------\n / -π/2 \\\n / | \\\n |<- -π * |\n | * 0 ->| zero is down the positive X axis\n |<- +π * |\n \\ | /\n \\ π/2 /\n --------\n */\n dirMin: -Math.PI,\n dirMax: Math.PI,\n //dirMin: Math.PI * 0.5,\n //dirMax: Math.PI * 2.5,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 7:30 to 10:30\n //dirMax: -Math.PI * 0.75,\n //dirMin: -Math.PI * 0.75, // test 10:30 to 1:30\n //dirMax: -Math.PI * 0.25,\n //dirMin: Math.PI * 0.25, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.75,\n //dirMin: Math.PI * 0.75, // test 4:30 to 7:30\n //dirMax: Math.PI * 0.25,\n wrap: undefined,\n converters: identity,\n };\n\n constructor(setter, options = {}) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n className: 'muigui-direction muigui-no-scroll',\n innerHTML: svg,\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n let tempV = this.#lastV + delta;\n if (this.#wrap) {\n tempV = euclideanModulo(tempV - min, max - min) + min;\n }\n const newV = clamp(stepify(tempV, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n const handleTouch = (e) => {\n const {min, max, step, dirMin, dirMax} = this.#options;\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n const a = Math.atan2(ny, nx);\n\n const center = (dirMin + dirMax) / 2;\n\n const centeredAngle = twoPiMod(a - center);\n const centeredStart = twoPiMod(dirMin - center);\n const diff = dirMax - dirMin;\n\n const n = clamp((centeredAngle - centeredStart) / (diff), 0, 1);\n const newV = stepify(min + (max - min) * n, v => v, step);\n setter.setValue(newV);\n };\n addTouchEvents(this.domElement, {\n onDown: handleTouch,\n onMove: handleTouch,\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n this.#arrowElem = this.$('#muigui-arrow');\n this.#rangeElem = this.$('#muigui-range');\n this.setOptions(options);\n }\n updateDisplay(v) {\n this.#lastV = v;\n const {min, max} = this.#options;\n const n = (v - min) / (max - min);\n const angle = lerp(this.#options.dirMin, this.#options.dirMax, n);\n this.#arrowElem.style.transform = `rotate(${angle}rad)`;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {dirMin, dirMax, wrap} = this.#options;\n this.#wrap = wrap !== undefined\n ? wrap\n : Math.abs(dirMin - dirMax) >= Math.PI * 2 - Number.EPSILON;\n const [min, max] = dirMin < dirMax ? [dirMin, dirMax] : [dirMax , dirMin];\n this.#rangeElem.setAttribute('d', arc(0, 0, 28.87, min, max));\n }\n}\n","import { identity } from '../libs/conversions.js';\nimport DirectionView from '../views/DirectionView.js';\nimport NumberView from '../views/NumberView.js';\n// import ValueController from './ValueController.js';\nimport PopDownController from './PopDownController.js';\n\n\n// deg2rad\n// where is 0\n// range (0, 360), (-180, +180), (0,0) Really this is a range\n\nexport default class Direction extends PopDownController {\n #options;\n constructor(object, property, options) {\n super(object, property, 'muigui-direction');\nthis.#options = options; // FIX\n this.addTop(new NumberView(this,\nidentity));\n this.addBottom(new DirectionView(this, options));\n this.updateDisplay();\n }\n}\n\n","import { createElem } from '../libs/elem.js';\nimport { makeId } from '../libs/ids.js';\nimport EditView from './EditView.js';\n\nexport default class RadioGridView extends EditView {\n #values;\n\n constructor(setter, keyValues, cols = 3) {\n const values = [];\n const name = makeId();\n super(createElem('div', {}, keyValues.map(([key, value], ndx) => {\n values.push(value);\n return createElem('label', {}, [\n createElem('input', {\n type: 'radio',\n name,\n value: ndx,\n onChange: function () {\n if (this.checked) {\n setter.setFinalValue(that.#values[this.value]);\n }\n },\n }),\n createElem('button', {\n type: 'button',\n textContent: key,\n onClick: function () {\n this.previousElementSibling.click();\n },\n }),\n ]);\n })));\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.#values = values;\n this.cols(cols);\n }\n updateDisplay(v) {\n const ndx = this.#values.indexOf(v);\n for (let i = 0; i < this.domElement.children.length; ++i) {\n this.domElement.children[i].children[0].checked = i === ndx;\n }\n }\n cols(cols) {\n this.domElement.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;\n }\n}\n","import RadioGridView from '../views/RadioGridView.js';\nimport ValueController from './ValueController.js';\nimport { convertToKeyValues } from '../libs/key-values.js';\n\nexport default class RadioGrid extends ValueController {\n constructor(object, property, options) {\n super(object, property, 'muigui-radio-grid');\n const valueIsNumber = typeof this.getValue() === 'number';\n const {\n keyValues: keyValuesInput,\n cols = 3,\n } = options;\n const keyValues = convertToKeyValues(keyValuesInput, valueIsNumber);\n this.add(new RadioGridView(this, keyValues, cols));\n this.updateDisplay();\n }\n}","export function onResize(elem, callback) {\n new ResizeObserver(() => {\n callback({rect: elem.getBoundingClientRect(), elem});\n }).observe(elem);\n}\n\nexport function onResizeSVGNoScale(elem, hAnchor, vAnchor, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.setAttribute('viewBox', `-${width * hAnchor} -${height * vAnchor} ${width} ${height}`);\n callback({elem, rect});\n });\n}\n\nexport function onResizeCanvas(elem, callback) {\n onResize(elem, ({rect}) => {\n const {width, height} = rect;\n elem.width = width;\n elem.height = height;\n callback({elem, rect});\n });\n}\n","import { createElem } from '../libs/elem.js';\nimport { addKeyboardEvents } from '../libs/keyboard.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { createWheelHelper } from '../libs/wheel.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport { clamp, copyExistingProperties, stepify } from '../libs/utils.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n\nfunction createSVGTicks(start, end, step, min, max, height) {\n const p = [];\n if (start < min) {\n start += stepify(min - start, v => v, step);\n }\n end = Math.min(end, max);\n for (let i = start; i <= end; i += step) {\n p.push(`M${i} 0 l0 ${height}`);\n }\n return p.join(' ');\n}\n\nfunction createSVGNumbers(start, end, unitSize, unit, minusSize, min, max, labelFn) {\n const texts = [];\n if (start < min) {\n start += stepify(min - start, v => v, unitSize);\n }\n end = Math.min(end, max);\n const digits = Math.max(0, -Math.log10(unit));\n const f = v => labelFn(v.toFixed(digits));\n for (let i = start; i <= end; i += unitSize) {\n texts.push(`= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '- ';\n const text = elem.querySelector('text');\n const size = text.getComputedTextLength();\n elem.innerHTML = oldHTML;\n return size;\n}\n\nexport default class SliderView extends EditView {\n #svgElem;\n #originElem;\n #ticksElem;\n #thicksElem;\n #numbersElem;\n #leftGradElem;\n #rightGradElem;\n #width;\n #height;\n #lastV;\n #minusSize;\n #options = {\n min: -100,\n max: 100,\n step: 1,\n unit: 10,\n unitSize: 10,\n ticksPerUnit: 5,\n labelFn: v => v,\n tickHeight: 1,\n limits: true,\n thicksColor: undefined,\n orientation: undefined,\n };\n\n constructor(setter, options) {\n const wheelHelper = createWheelHelper();\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-v-scroll',\n onWheel: e => {\n e.preventDefault();\n const {min, max, step} = this.#options;\n const delta = wheelHelper(e, step);\n const newV = clamp(stepify(this.#lastV + delta, v => v, step), min, max);\n setter.setValue(newV);\n },\n }));\n this.#svgElem = this.$('svg');\n this.#originElem = this.$('#muigui-origin');\n this.#ticksElem = this.$('#muigui-ticks');\n this.#thicksElem = this.$('#muigui-thicks');\n this.#numbersElem = this.$('#muigui-numbers');\n this.#leftGradElem = this.$('#muigui-left-grad');\n this.#rightGradElem = this.$('#muigui-right-grad');\n this.setOptions(options);\n let startV;\n addTouchEvents(this.domElement, {\n onDown: () => {\n startV = this.#lastV;\n },\n onMove: (e) => {\n const {min, max, unitSize, unit, step} = this.#options;\n const newV = clamp(stepify(startV - e.dx / unitSize * unit, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n addKeyboardEvents(this.domElement, {\n onDown: (e) => {\n const {min, max, step} = this.#options;\n const newV = clamp(stepify(this.#lastV + e.dx * step, v => v, step), min, max);\n setter.setValue(newV);\n },\n });\n onResizeSVGNoScale(this.#svgElem, 0.5, 0, ({rect: {width}}) => {\n this.#leftGradElem.setAttribute('x', -width / 2);\n this.#rightGradElem.setAttribute('x', width / 2 - 20);\n this.#minusSize = computeSizeOfMinus(this.#numbersElem);\n this.#width = width;\n this.#updateSlider();\n });\n }\n // |--------V--------|\n // . . | . . . | . . . |\n //\n #updateSlider() {\n // There's no size if ResizeObserver has not fired yet.\n if (!this.#width || this.#lastV === undefined) {\n return;\n }\n const {\n labelFn,\n limits,\n min,\n max,\n orientation,\n tickHeight,\n ticksPerUnit,\n unit,\n unitSize,\n thicksColor,\n } = this.#options;\n const unitsAcross = Math.ceil(this.#width / unitSize);\n const center = this.#lastV;\n const centerUnitSpace = center / unit;\n const startUnitSpace = Math.round(centerUnitSpace - unitsAcross);\n const endUnitSpace = startUnitSpace + unitsAcross * 2;\n const start = startUnitSpace * unitSize;\n const end = endUnitSpace * unitSize;\n const minUnitSpace = limits ? min * unitSize / unit : start;\n const maxUnitSpace = limits ? max * unitSize / unit : end;\n const height = labelFn(1) === '' ? 10 : 5;\n if (ticksPerUnit > 1) {\n this.#ticksElem.setAttribute('d', createSVGTicks(start, end, unitSize / ticksPerUnit, minUnitSpace, maxUnitSpace, height * tickHeight));\n }\n this.#thicksElem.style.stroke = thicksColor; //setAttribute('stroke', thicksColor);\n this.#thicksElem.setAttribute('d', createSVGTicks(start, end, unitSize, minUnitSpace, maxUnitSpace, height));\n this.#numbersElem.innerHTML = createSVGNumbers(start, end, unitSize, unit, this.#minusSize, minUnitSpace, maxUnitSpace, labelFn);\n this.#originElem.setAttribute('transform', `translate(${-this.#lastV * unitSize / unit} 0)`);\n this.#svgElem.classList.toggle('muigui-slider-up', orientation === 'up');\n }\n updateDisplay(v) {\n this.#lastV = v;\n this.#updateSlider();\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n return this;\n }\n}\n","import ValueController from './ValueController.js';\nimport NumberView from '../views/NumberView.js';\nimport SliderView from '../views/SliderView.js';\n\nexport default class Slider extends ValueController {\n constructor(object, property, options = {}) {\n super(object, property, 'muigui-slider');\n this.add(new SliderView(this, options));\n this.add(new NumberView(this, options));\n this.updateDisplay();\n }\n}\n","import { createElem } from '../libs/elem.js';\nimport { addTouchEvents } from '../libs/touch.js';\nimport { onResizeSVGNoScale } from '../libs/resize-helpers.js';\nimport EditView from './EditView.js';\n\nconst svg = `\n\n \n \n \n \n \n\n`;\n\nexport default class Vec2View extends EditView {\n #svgElem;\n #arrowElem;\n #circleElem;\n #lastV = [];\n\n constructor(setter) {\n super(createElem('div', {\n innerHTML: svg,\n className: 'muigui-no-scroll',\n }));\n const onTouch = (e) => {\n const {width, height} = this.#svgElem.getBoundingClientRect();\n const nx = e.nx * 2 - 1;\n const ny = e.ny * 2 - 1;\n setter.setValue([nx * width * 0.5, ny * height * 0.5]);\n };\n addTouchEvents(this.domElement, {\n onDown: onTouch,\n onMove: onTouch,\n });\n this.#svgElem = this.$('svg');\n this.#arrowElem = this.$('#muigui-arrow');\n this.#circleElem = this.$('#muigui-circle');\n onResizeSVGNoScale(this.#svgElem, 0.5, 0.5, () => this.#updateDisplayImpl);\n }\n #updateDisplayImpl() {\n const [x, y] = this.#lastV;\n this.#arrowElem.setAttribute('d', `M0,0L${x},${y}`);\n this.#circleElem.setAttribute('transform', `translate(${x}, ${y})`);\n }\n updateDisplay(v) {\n this.#lastV[0] = v[0];\n this.#lastV[1] = v[1];\n this.#updateDisplayImpl();\n }\n}\n","import NumberView from '../views/NumberView.js';\nimport Vec2View from '../views/Vec2View.js';\nimport PopDownController from './PopDownController.js';\nimport { strToNumber } from '../libs/conversions.js';\n\n// TODO: zoom with wheel and pinch?\n// TODO: grid?\n// // options\n// scale:\n// range: number (both x and y + /)\n// range: array (min, max)\n// xRange:\n// deg/rad/turn\n\nexport default class Vec2 extends PopDownController {\n constructor(object, property) {\n super(object, property, 'muigui-vec2');\n\n const makeSetter = (ndx) => {\n return {\n setValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setValue(newV);\n },\n setFinalValue: (v) => {\n const newV = this.getValue();\n newV[ndx] = v;\n this.setFinalValue(newV);\n },\n };\n };\n\n this.addTop(new NumberView(makeSetter(0), {\n converters: {\n to: v => v[0],\n from: strToNumber.from,\n },\n }));\n this.addTop(new NumberView(makeSetter(1), {\n converters: {\n to: v => v[1],\n from: strToNumber.from,\n },\n }));\n this.addBottom(new Vec2View(this));\n this.updateDisplay();\n }\n}\n","const darkColors = {\n main: '#ddd',\n};\nconst lightColors = {\n main: '#333',\n};\n\nconst darkMatcher = window.matchMedia('(prefers-color-scheme: dark)');\n\nlet colors;\nlet isDarkMode;\n\nfunction update() {\n isDarkMode = darkMatcher.matches;\n colors = isDarkMode ? darkColors : lightColors;\n}\ndarkMatcher.addEventListener('change', update);\nupdate();\n\nexport function graph(canvas, data, {\n min = -1,\n max = 1,\n interval = 16,\n color,\n }) {\n const ctx = canvas.getContext('2d');\n\n function render() {\n const {width, height} = canvas;\n ctx.clearRect(0, 0, width, height);\n ctx.beginPath();\n const range = max - min;\n for (let i = 0; i < data.length; ++i) {\n const x = i * width / data.length;\n const y = (data[i] - min) * height / range;\n ctx.lineTo(x, y);\n }\n ctx.strokeStyle = color || colors.main;\n ctx.stroke();\n }\n setInterval(render, interval);\n}","import GUI from './muigui.js';\n\nexport { default as ColorChooser } from './controllers/ColorChooser.js';\nexport { default as Direction } from './controllers/Direction.js';\nexport { default as RadioGrid } from './controllers/RadioGrid.js';\nexport { default as Range } from './controllers/Range.js';\nexport { default as Select } from './controllers/Select.js';\nexport { default as Slider } from './controllers/Slider.js';\nexport { default as TextNumber } from './controllers/TextNumber.js';\nexport { default as Vec2 } from './controllers/Vec2.js';\n\nimport {graph} from './libs/graph.js';\nimport {monitor} from './libs/monitor.js';\n\nexport const helpers = {\n graph,\n monitor,\n};\n\nexport default GUI;","export function monitor(label, object, property, {interval = 200} = {}) {\n setInterval(() => {\n label.text(JSON.stringify(object[property], null, 2));\n }, interval);\n}\n"],"names":["css","default","themes","include","float","form","none","createElem","tag","attrs","children","elem","document","createElement","key","value","Object","entries","startsWith","eventName","substring","toLowerCase","addEventListener","passive","k","v","undefined","setAttribute","child","appendChild","setElemProps","nextId","removeArrayElem","array","ndx","indexOf","splice","clamp","min","max","Math","isTypedArray","SharedArrayBuffer","a","buffer","ArrayBuffer","stepify","from","step","round","euclideanModulo","n","copyExistingProperties","dst","src","mapRange","inMin","inMax","outMin","outMax","makeRangeConverters","to","makeRangeOptions","converters","identity","makeMinMaxPair","gui","properties","minPropName","maxPropName","options","guiMinRange","minRange","valueMinRange","minGui","add","onChange","maxGui","setValue","View","domElement","childDestElem","views","constructor","this","addElem","removeElem","removeChild","pushSubElem","popSubElem","parentElement","view","push","remove","pushSubView","popSubView","setOptions","updateDisplayIfNeeded","newV","ignoreCache","$","selector","querySelector","Controller","changeFns","finishChangeFns","parent","className","super","classList","setParent","enable","disabled","show","toggle","hide","closest","forEach","querySelectorAll","disable","fn","removeChange","onFinishChange","removeFinishChange","callListeners","fns","call","emitChange","object","property","controller","emitFinalChange","updateDisplay","getColors","toCamelCase","s","replace","m","m1","toUpperCase","div","colors","fromEntries","map","style","color","getComputedStyle","Button","buttonElem","name","type","onClick","textContent","arraysEqual","b","length","i","EditView","oldV","updateCheck","checkArrayNeedsUpdate","needUpdate","copyArrayElementsFromTo","checkTypedArrayNeedsUpdate","once","checkObjectNeedsUpdate","checkValueNeedsUpdate","getUpdateCheckForType","Array","isArray","bind","CheckboxView","checkboxElem","setter","id","onInput","checked","setFinalValue","tasks","tasksToRemove","Set","requestId","processing","processTasks","task","has","size","queueProcessing","clear","requestAnimationFrame","makeId","ValueView","LabelController","nameElem","for","title","tooltip","tip","ValueController","initialValue","listening","updateFn","getValue","setValueImpl","isDifferent","keys","assign","reset","listen","set","removeTask","Checkbox","strToNumber","toString","parseFloat","Number","isNaN","radToDeg","PI","createWheelHelper","wheelAccum","e","wheelScale","deltaY","delta","floor","abs","sign","NumberView","skipUpdate","NEGATIVE_INFINITY","POSITIVE_INFINITY","wheelHelper","handleInput","onWheel","preventDefault","valid","outV","setFn","inRange","TextNumber","textView","SelectView","values","keyValues","selectedIndex","convertToKeyValues","valueIsNumber","Select","keyValuesInput","RangeView","validV","Range","TextView","Text","lerp","t","fract","f0","toFixed","f3","hexToUint32RGB","parseInt","hexToUint32RGBA","hexToUint8RGB","uint8RGBToHex","padStart","join","hexToUint8RGBA","uint8RGBAToHex","hexToFloatRGB","floatRGBToHex","hexToFloatRGBA","floatRGBAToHex","scaleAndClamp","hexToObjectRGB","r","g","hexToObjectRGBA","hexToCssRGB","cssRGBRegex","hexToCssRGBA","cssRGBARegex","hexToCssHSL","hsl","rgbUint8ToHsl","hexToCssHSLA","hsla","rgbaUint8ToHsla","cssHSLRegex","cssHSLARegex","hslToRgbUint8","h","l","f","rgbFloatToHsl01","d","rgbaFloatToHsla01","rgb","rgba","hsv01ToRGBFloat","hue","sat","val","hsva01ToRGBAFloat","alpha","round3","rgbFloatToHSV01","p","q","EPSILON","rgbaFloatToHSVA01","hasAlpha","format","endsWith","cssStringFormats","re","guessFormat","console","warn","formatInfo","test","guessStringColorFormat","trim","Uint8Array","Uint8ClampedArray","Float32Array","Error","fixHex6","fixHex8","hex6ToHex3","hex6","hex3RE","hex3ToHex6","hex3","exec","m2","fixHex3","strToCssRGB","find","strToCssRGBA","strToCssHSL","strToCssHSLA","strTo3IntsRE","strTo4IntsRE","strTo3Floats","numbers","split","badNdx","findIndex","strTo4Floats","strToUint32RGBRegex","strToUint32RGBARegex","hex6RE","hexNoHash6RE","hex8RE","hexNoHash8RE","colorFormatConverters","text","hex8","strToUint32RGB","strToUint32RGBA","json","JSON","parse","hslaToRgbaUint8","ElementView","Canvas","canvasElem","canvas","ColorView","colorElem","Color","colorView","Divider","Container","controllers","childDestController","filter","c","folders","recursive","c0","addControllerImpl","addController","pushContainer","container","popContainer","Folder","labelElem","toggleOpen","open","close","contains","Label","noop","computeRelativePosition","event","start","rect","getBoundingClientRect","x","clientX","left","y","clientY","top","nx","width","ny","height","dx","dy","ndy","addTouchEvents","onDown","onMove","onUp","pointerMove","pointerUp","releasePointerCapture","pointerId","removeEventListener","body","backgroundColor","pointerDown","setPointerCapture","rel","connectFillTargets","srcElem","dataset","targetElem","ColorChooserView","satLevelElem","circleElem","hueUIElem","hueElem","hueCursorElem","alphaUIElem","alphaElem","alphaCursorElem","hsva","skipHueUpdate","skipSatLevelUpdate","skipAlphaUpdate","convertInternalToHex","convertHexToInternal","innerHTML","handleSatLevelChange","handleHueChange","handleAlphaChange","lum","display","PopDownController","valuesView","bottom","setKnobColor","bgCssColor","addTop","addBottom","ColorChooser","___setKnobHelper","setKnobHelper","hex6Or8","hex","GUIFolder","args","arg1","createController","addCanvas","addColor","addDivider","addFolder","addLabel","addButton","o","MuiguiElement","HTMLElement","shadow","attachShadow","mode","customElements","define","baseStyleSheet","CSSStyleSheet","userStyleSheet","makeStyleSheetUpdater","styleSheet","newCss","newCssPromise","updateStyle","then","updateBaseStyle","updateUserStyle","getTheme","cssStr","GUI","static","localStyleSheet","autoPlace","muiguiElement","shadowRoot","adoptedStyleSheets","replaceSync","setStyle","setTheme","setBaseStyles","keyDirections","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","addKeyboardEvents","keyDown","mult","shiftKey","assert","truthy","msg","getEllipsePointForAngle","cx","cy","rx","ry","phi","theta","cos","sin","arc","end","x1","y1","x2","y2","fa","fs","dTheta","getEndpointParameters","twoPiMod","DirectionView","arrowElem","rangeElem","lastV","wrap","dirMin","dirMax","tempV","handleTouch","atan2","center","angle","transform","Direction","RadioGridView","cols","that","previousElementSibling","click","gridTemplateColumns","RadioGrid","onResize","callback","ResizeObserver","observe","onResizeSVGNoScale","hAnchor","vAnchor","createSVGTicks","SliderView","svgElem","originElem","ticksElem","thicksElem","numbersElem","leftGradElem","rightGradElem","minusSize","unit","unitSize","ticksPerUnit","labelFn","tickHeight","limits","thicksColor","orientation","startV","oldHTML","getComputedTextLength","computeSizeOfMinus","updateSlider","unitsAcross","ceil","centerUnitSpace","startUnitSpace","minUnitSpace","maxUnitSpace","stroke","texts","digits","log10","createSVGNumbers","Slider","Vec2View","onTouch","updateDisplayImpl","Vec2","makeSetter","darkColors","main","lightColors","darkMatcher","window","matchMedia","isDarkMode","update","matches","helpers","graph","data","interval","ctx","getContext","setInterval","clearRect","beginPath","range","lineTo","strokeStyle","monitor","label","stringify"],"mappings":"AAAA,IAAeA,EAAA,CACbC,QAAS,yshBAwtBXC,OAAQ,CACND,QAAS,CACPE,QAAS,CAAC,WACVH,IAAK,UAGPI,MAAO,CACLD,QAAS,CAAC,WACVH,IAAK,+xCA0DPK,KAAM,CACJF,QAAS,GACTH,IAAK,28BA6CPM,KAAM,CACJH,QAAS,GACTH,IAAK,MCvzBF,SAASO,EAAWC,EAAKC,EAAQ,CAAA,EAAIC,EAAW,IACrD,MAAMC,EAAOC,SAASC,cAAcL,GAEpC,OAxBK,SAAsBG,EAAMF,EAAOC,GACxC,IAAK,MAAOI,EAAKC,KAAUC,OAAOC,QAAQR,GACxC,GAAqB,mBAAVM,GAAwBD,EAAII,WAAW,MAAO,CACvD,MAAMC,EAAYL,EAAIM,UAAU,GAAGC,cACnCV,EAAKW,iBAAiBH,EAAWJ,EAAO,CAACQ,SAAS,GACxD,MAAW,GAAqB,iBAAVR,EAChB,IAAK,MAAOS,EAAGC,KAAMT,OAAOC,QAAQF,GAClCJ,EAAKG,GAAKU,GAAKC,YAEMC,IAAdf,EAAKG,GACdH,EAAKgB,aAAab,EAAKC,GAEvBJ,EAAKG,GAAOC,EAGhB,IAAK,MAAMa,KAASlB,EAClBC,EAAKkB,YAAYD,EAGrB,CAIEE,CAAanB,EAAMF,EAAOC,GACnBC,CACT,CAQA,IAAIoB,EAAS,ECjCN,SAASC,EAAgBC,EAAOlB,GACrC,MAAMmB,EAAMD,EAAME,QAAQpB,GAI1B,OAHImB,GACFD,EAAMG,OAAOF,EAAK,GAEbD,CACT,CAaO,SAASI,EAAMZ,EAAGa,EAAKC,GAC5B,OAAOC,KAAKD,IAAID,EAAKE,KAAKF,IAAIC,EAAKd,GACrC,CAEO,MAAMgB,EAA4C,oBAAtBC,kBAC/B,SAA0CC,GAC1C,OAAOA,GAAKA,EAAEC,SAAWD,EAAEC,kBAAkBC,aAAeF,EAAEC,kBAAkBF,kBACjF,EACC,SAAuBC,GACvB,OAAOA,GAAKA,EAAEC,QAAUD,EAAEC,kBAAkBC,WAChD,EAcaC,EAAU,CAACrB,EAAGsB,EAAMC,IAASR,KAAKS,MAAMF,EAAKtB,GAAKuB,IAAS,EAAIA,GAE/DE,EAAkB,CAACzB,EAAG0B,KAAQ1B,EAAI0B,EAAKA,GAAKA,EAElD,SAASC,EAAuBC,EAAKC,GAC1C,IAAK,MAAMxC,KAAOwC,EACZxC,KAAOuC,IACTA,EAAIvC,GAAOwC,EAAIxC,IAGnB,OAAOuC,CACT,CAEO,MAAME,EAAW,CAAC9B,EAAG+B,EAAOC,EAAOC,EAAQC,KAAYlC,EAAI+B,IAAUG,EAASD,IAAWD,EAAQD,GAASE,EAEpGE,EAAsB,EAAEb,OAAMc,SAClC,CACLA,GAAIpC,GAAK8B,EAAS9B,KAAMsB,KAASc,GACjCd,KAAMtB,GAAK,EAAC,EAAM8B,EAAS9B,KAAMoC,KAAOd,MAI/Be,EAAmB,EAAEf,OAAMc,KAAIb,WACnC,CACLV,IAAKuB,EAAG,GACRtB,IAAKsB,EAAG,MACJb,GAAQ,CAACA,QACbe,WAAYH,EAAoB,CAACb,OAAMc,SAK9BG,EAAW,CACtBH,GAAIpC,GAAKA,EACTsB,KAAMtB,GAAK,EAAC,EAAMA,IAEb,SAASwC,EAAeC,EAAKC,EAAYC,EAAaC,EAAaC,GACxE,MAAQP,YAAYhB,KAAEA,GAASiB,GAAaM,GACtChC,IAAEA,EAAGC,IAAEA,GAAQ+B,EACfC,EAAcD,EAAQE,UAAY,EAClCC,EAAgB1B,EAAKwB,GAAa,GAClCG,EAASR,EACZS,IAAIR,EAAYC,EAAa,IACzBE,EACHhC,MACAC,IAAKA,EAAMgC,IAEZK,UAASnD,IACRoD,EAAOC,SAAStC,KAAKF,IAAIC,EAAKC,KAAKD,IAAId,EAAIgD,EAAeN,EAAWE,KAAe,IAElFQ,EAASX,EACZS,IAAIR,EAAYE,EAAa,IACzBC,EACHhC,IAAKA,EAAMiC,EACXhC,QAEDqC,UAASnD,IACRiD,EAAOI,SAAStC,KAAKD,IAAID,EAAKE,KAAKF,IAAIb,EAAIgD,EAAeN,EAAWC,KAAe,IAExF,MAAO,CAAEM,EAAQG,EACnB,CCrGc,MAAOE,EACnBC,WAEAC,GACAC,GAAiB,GAEjBC,YAAYxE,GACVyE,KAAKJ,WAAarE,EAClByE,MAAKH,EAAiBtE,CACvB,CACD0E,QAAQ1E,GAEN,OADAyE,MAAKH,EAAepD,YAAYlB,GACzBA,CACR,CACD2E,WAAW3E,GAET,OADAyE,MAAKH,EAAeM,YAAY5E,GACzBA,CACR,CACD6E,YAAY7E,GACVyE,MAAKH,EAAepD,YAAYlB,GAChCyE,MAAKH,EAAiBtE,CACvB,CACD8E,aACEL,MAAKH,EAAiBG,MAAKH,EAAeS,aAC3C,CACDf,IAAIgB,GAGF,OAFAP,MAAKF,EAAOU,KAAKD,GACjBP,KAAKC,QAAQM,EAAKX,YACXW,CACR,CACDE,OAAOF,GAGL,OAFAP,KAAKE,WAAWK,EAAKX,YACrBhD,EAAgBoD,MAAKF,EAAQS,GACtBA,CACR,CACDG,YAAYH,GACVP,KAAKI,YAAYG,EAAKX,WACvB,CACDe,aACEX,KAAKK,YACN,CACDO,WAAW1B,GACT,IAAK,MAAMqB,KAAQP,MAAKF,EACtBS,EAAKK,WAAW1B,EAEnB,CACD2B,sBAAsBC,EAAWC,GAC/B,IAAK,MAAMR,KAAQP,MAAKF,EACtBS,EAAKM,sBAAsBC,EAAMC,GAEnC,OAAOf,IACR,CACDgB,EAAEC,GACA,OAAOjB,KAAKJ,WAAWsB,cAAcD,EACtC,ECpDY,MAAME,UAAmBxB,EACtCyB,GACAC,GACAC,GAEAvB,YAAYwB,GACVC,MAAMrG,EAAW,MAAO,CAACoG,UAAW,uBACpCvB,MAAKoB,EAAa,GAClBpB,MAAKqB,EAAmB,GAEpBE,GACFvB,KAAKJ,WAAW6B,UAAUlC,IAAIgC,EAEjC,CACGD,aACF,OAAOtB,MAAKsB,CACb,CACDI,UAAUJ,GACRtB,MAAKsB,EAAUA,EACftB,KAAK2B,QAAQ3B,KAAK4B,WACnB,CACDC,KAAKA,GAAO,GAGV,OAFA7B,KAAKJ,WAAW6B,UAAUK,OAAO,eAAgBD,GACjD7B,KAAKJ,WAAW6B,UAAUK,OAAO,cAAeD,GACzC7B,IACR,CACD+B,OACE,OAAO/B,KAAK6B,MAAK,EAClB,CACDD,WACE,QAAS5B,KAAKJ,WAAWoC,QAAQ,mBAClC,CAEDL,OAAOA,GAAS,GAoBd,OAnBA3B,KAAKJ,WAAW6B,UAAUK,OAAO,mBAAoBH,GAYrD,CAAC,QAAS,SAAU,SAAU,YAAYM,SAAQ7G,IAChD4E,KAAKJ,WAAWsC,iBAAiB9G,GAAK6G,SAAQ1G,IAC5C,MAAMqG,IAAarG,EAAKyG,QAAQ,oBAChCzG,EAAKqG,SAAWA,CAAQ,GACxB,IAGG5B,IACR,CACDmC,QAAQA,GAAU,GAChB,OAAOnC,KAAK2B,QAAQQ,EACrB,CACD3C,SAAS4C,GAGP,OAFApC,KAAKqC,aAAaD,GAClBpC,MAAKoB,EAAWZ,KAAK4B,GACdpC,IACR,CACDqC,aAAaD,GAEX,OADAxF,EAAgBoD,MAAKoB,EAAYgB,GAC1BpC,IACR,CACDsC,eAAeF,GAGb,OAFApC,KAAKuC,mBAAmBH,GACxBpC,MAAKqB,EAAiBb,KAAK4B,GACpBpC,IACR,CACDuC,mBAAmBH,GAEjB,OADAxF,EAAgBoD,MAAKqB,EAAkBe,GAChCpC,IACR,CACDwC,GAAeC,EAAK3B,GAClB,IAAK,MAAMsB,KAAMK,EACfL,EAAGM,KAAK1C,KAAMc,EAEjB,CACD6B,WAAWhH,EAAOiH,EAAQC,GACxB7C,MAAKwC,EAAexC,MAAKoB,EAAYzF,GACjCqE,MAAKsB,SACQhF,IAAXsG,EACF5C,MAAKsB,EAAQqB,WAAWhH,GAExBqE,MAAKsB,EAAQqB,WAAW,CACtBC,SACAC,WACAlH,QACAmH,WAAY9C,OAInB,CACD+C,gBAAgBpH,EAAOiH,EAAQC,GAC7B7C,MAAKwC,EAAexC,MAAKqB,EAAkB1F,GACvCqE,MAAKsB,SACQhF,IAAXsG,EACF5C,MAAKsB,EAAQqB,WAAWhH,GAExBqE,MAAKsB,EAAQyB,gBAAgB,CAC3BH,SACAC,WACAlH,QACAmH,WAAY9C,OAInB,CACDgD,gBAEC,CACDC,YACE,MAAMC,EAAcC,GAAKA,EAAEC,QAAQ,aAAa,CAACC,EAAGC,IAAOA,EAAGC,gBAWxDC,EAAMrI,EAAW,OACvB6E,KAAKJ,WAAWnD,YAAY+G,GAC5B,MAAMC,EAAS7H,OAAO8H,YAZT,CACX,QACA,WACA,cACA,iBACA,iBACA,gBACA,iBACA,kBAIqCC,KAAIjI,IACzC8H,EAAII,MAAMC,MAAQ,SAASnI,KAC3B,MAAMyH,EAAIW,iBAAiBN,GAC3B,MAAO,CAACN,EAAYxH,GAAMyH,EAAEU,MAAM,KAGpC,OADAL,EAAI/C,SACGgD,CACR,ECrIY,MAAMM,UAAe5C,EAClCyB,GACAC,GACAmB,GACA9E,GAAW,CACT+E,KAAM,IAGRlE,YAAY6C,EAAQC,EAAU3D,EAAU,CAAA,GACtCsC,MAAM,gBAAiB,IACvBxB,MAAK4C,EAAUA,EACf5C,MAAK6C,EAAYA,EAEjB7C,MAAKgE,EAAchE,KAAKC,QACpB9E,EAAW,SAAU,CACnB+I,KAAM,SACNC,QAAS,KACPnE,MAAK4C,EAAQ5C,MAAK6C,GAAW7C,KAAK,KAG1CA,KAAKY,WAAW,CAACqD,KAAMpB,KAAa3D,GACrC,CACD+E,KAAKA,GACHjE,MAAKgE,EAAYI,YAAcH,CAChC,CACDrD,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtC,MAAM+E,KAACA,GAAQjE,MAAKd,EACpBc,MAAKgE,EAAYI,YAAcH,CAChC,EChCH,SAASI,EAAY9G,EAAG+G,GACtB,GAAI/G,EAAEgH,SAAWD,EAAEC,OACjB,OAAO,EAET,IAAK,IAAIC,EAAI,EAAGA,EAAIjH,EAAEgH,SAAUC,EAC9B,GAAIjH,EAAEiH,KAAOF,EAAEE,GACb,OAAO,EAGX,OAAO,CACT,CASe,MAAMC,UAAiB9E,EACpC+E,GACAC,GAEAC,GAAuB9D,GAGrB,MAAM+D,GAAcR,EAAYvD,EAAMd,MAAK0E,GAI3C,OAHIG,GAfR,SAAiC3G,EAAKD,GACpCA,EAAIsG,OAASrG,EAAIqG,OACjB,IAAK,IAAIC,EAAI,EAAGA,EAAItG,EAAIqG,SAAUC,EAChCvG,EAAIuG,GAAKtG,EAAIsG,EAEjB,CAWMM,CAAwBhE,EAAMd,MAAK0E,GAE9BG,CACR,CAEDE,KACE,IAAIC,GAAO,EACX,OAAO,SAAwClE,GAG7C,IAAI+D,EAAaG,EAKjB,OAJAA,GAAO,EACFH,IACHA,GAAcR,EAAYvD,EAAMd,MAAK0E,IAEhCG,CACb,CACG,CAEDI,GAAwBnE,GACtB,IAAI+D,GAAa,EACjB,IAAK,MAAMnJ,KAAOoF,EACZA,EAAKpF,KAASsE,MAAK0E,EAAMhJ,KAC3BmJ,GAAa,EACb7E,MAAK0E,EAAMhJ,GAAOoF,EAAKpF,IAG3B,OAAOmJ,CACR,CAEDK,GAAuBpE,GACrB,MAAM+D,EAAa/D,IAASd,MAAK0E,EAEjC,OADA1E,MAAK0E,EAAQ5D,EACN+D,CACR,CAEDM,GAAuBrE,GACrB,OAAIsE,MAAMC,QAAQvE,IAChBd,MAAK0E,EAAQ,GACN1E,MAAK4E,EAAuBU,KAAKtF,OAC/B3C,EAAayD,IACtBd,MAAK0E,EAAQ,IAAI5D,EAAKf,YAAYe,GAC3Bd,MAAK+E,EAA4B/E,OACf,iBAATc,GAChBd,MAAK0E,EAAQ,GACN1E,MAAKiF,EAAwBK,KAAKtF,OAElCA,MAAKkF,EAAuBI,KAAKtF,KAE3C,CAODa,sBAAsBC,EAAMC,GAC1Bf,MAAK2E,EAAe3E,MAAK2E,GAAgB3E,MAAKmF,EAAuBrE,IAGjEd,MAAK2E,EAAa7D,IAASC,IAC7Bf,KAAKgD,cAAclC,EAEtB,CACDF,aAEE,OAAOZ,IACR,EC/FY,MAAMuF,UAAqBd,EACxCe,GACAzF,YAAY0F,EAAQC,GAClB,MAAMF,EAAerK,EAAW,QAAS,CACvC+I,KAAM,WACNwB,KACAC,QAAS,KACPF,EAAO/F,SAAS8F,EAAaI,QAAQ,EAEvCpG,SAAU,KACRiG,EAAOI,cAAcL,EAAaI,QAAQ,IAG9CpE,MAAMrG,EAAW,QAAS,CAAE,EAAE,CAACqK,KAC/BxF,MAAKwF,EAAgBA,CACtB,CACDxC,cAAc3G,GACZ2D,MAAKwF,EAAcI,QAAUvJ,CAC9B,ECnBH,MAAMyJ,EAAQ,GACRC,EAAgB,IAAIC,IAE1B,IAAIC,EACAC,EAkBJ,SAASC,IACPF,OAAY3J,EACZ4J,GAAa,EACb,IAAK,MAAME,KAAQN,EACZC,EAAcM,IAAID,IACrBA,IAGJF,GAAa,EAvBRH,EAAcO,OAIfJ,EACFK,KAIFR,EAAc9D,SAAQmE,IACpBxJ,EAAgBkJ,EAAOM,EAAK,IAE9BL,EAAcS,UAadD,GACF,CAEA,SAASA,KACFN,GAAaH,EAAMvB,SACtB0B,EAAYQ,sBAAsBN,GAEtC,CCzCA,IAAIT,EAAK,EAEF,SAASgB,IACd,MAAO,aAAYhB,CACrB,CCDe,MAAMiB,UAAkBhH,EACrCI,YAAYwB,EAAY,IACtBC,MAAMrG,EAAW,MAAO,CAACoG,UAAW,kBAChCA,GACFvB,KAAKJ,WAAW6B,UAAUlC,IAAIgC,EAEjC,ECJY,MAAMqF,UAAwBzF,EAC3CuE,GACAmB,GAEA9G,YAAYwB,EAAY,GAAI0C,EAAO,IACjCzC,MAAM,2BACNxB,MAAK0F,EAAMgB,IACX1G,MAAK6G,EAAY1L,EAAW,QAAS,CAAC2L,IAAK9G,MAAK0F,IAChD1F,KAAKJ,WAAWnD,YAAYuD,MAAK6G,GACjC7G,KAAKU,YAAY,IAAIiG,EAAUpF,IAC/BvB,KAAKiE,KAAKA,EACX,CACGyB,SACF,OAAO1F,MAAK0F,CACb,CACDzB,KAAKA,GAKH,OAJIjE,MAAK6G,EAAUE,QAAU/G,MAAK6G,EAAUzC,cAC1CpE,MAAK6G,EAAUE,MAAQ9C,GAEzBjE,MAAK6G,EAAUzC,YAAcH,EACtBjE,IACR,CACDgH,QAAQC,GACNjH,MAAK6G,EAAUE,MAAQE,CACxB,ECzBY,MAAMC,UAAwBN,EAC3ChE,GACAC,GACAsE,GACAC,GACAtH,GACAuH,GAEAtH,YAAY6C,EAAQC,EAAUtB,EAAY,IACxCC,MAAMD,EAAWsB,GACjB7C,MAAK4C,EAAUA,EACf5C,MAAK6C,EAAYA,EACjB7C,MAAKmH,EAAgBnH,KAAKsH,WAC1BtH,MAAKoH,GAAa,EAClBpH,MAAKF,EAAS,EACf,CACGqH,mBACF,OAAOnH,MAAKmH,CACb,CACGvE,aACF,OAAO5C,MAAK4C,CACb,CACGC,eACF,OAAO7C,MAAK6C,CACb,CACDtD,IAAIgB,GAIF,OAHAP,MAAKF,EAAOU,KAAKD,GACjBiB,MAAMjC,IAAIgB,GACVP,KAAKgD,gBACEzC,CACR,CACDgH,GAAclL,EAAG0E,GACf,IAAIyG,GAAc,EAClB,GAAiB,iBAANnL,EAAgB,CACzB,MAAM4B,EAAM+B,MAAK4C,EAAQ5C,MAAK6C,GAE9B,GAAIuC,MAAMC,QAAQhJ,IAAMgB,EAAahB,GACnC,IAAK,IAAImI,EAAI,EAAGA,EAAInI,EAAEkI,SAAUC,EAC9BgD,IAAgBvJ,EAAIuG,KAAOnI,EAAEmI,GAC7BvG,EAAIuG,GAAKnI,EAAEmI,OAER,CACL,IAAK,MAAM9I,KAAOE,OAAO6L,KAAKpL,GAC5BmL,IAAgBvJ,EAAIvC,KAASW,EAAEX,GAEjCE,OAAO8L,OAAOzJ,EAAK5B,EACpB,CACP,MACMmL,EAAcxH,MAAK4C,EAAQ5C,MAAK6C,KAAexG,EAC/C2D,MAAK4C,EAAQ5C,MAAK6C,GAAaxG,EAMjC,OAJA2D,KAAKgD,cAAcjC,GACfyG,GACFxH,KAAK2C,WAAW3C,KAAKsH,WAAYtH,MAAK4C,EAAS5C,MAAK6C,GAE/C2E,CACR,CACD9H,SAASrD,GACP2D,MAAKuH,EAAclL,EACpB,CACDwJ,cAAcxJ,GAKZ,OAJoB2D,MAAKuH,EAAclL,GAAG,IAExC2D,KAAK+C,gBAAgB/C,KAAKsH,WAAYtH,MAAK4C,EAAS5C,MAAK6C,GAEpD7C,IACR,CACDgD,cAAcjC,GACZ,MAAMD,EAAOd,KAAKsH,WAClB,IAAK,MAAM/G,KAAQP,MAAKF,EACtBS,EAAKM,sBAAsBC,EAAMC,GAEnC,OAAOf,IACR,CACDY,WAAW1B,GACT,IAAK,MAAMqB,KAAQP,MAAKF,EACtBS,EAAKK,WAAW1B,GAGlB,OADAc,KAAKgD,gBACEhD,IACR,CACDsH,WACE,OAAOtH,MAAK4C,EAAQ5C,MAAK6C,EAC1B,CACDlH,MAAMU,GAEJ,OADA2D,KAAKN,SAASrD,GACP2D,IACR,CACD2H,QAEE,OADA3H,KAAKN,SAASM,MAAKmH,GACZnH,IACR,CACD4H,OAAOA,GAAS,GJrDX,IAAiBxF,EIoEpB,OAdKpC,MAAKqH,IACRrH,MAAKqH,EAAYrH,KAAKgD,cAAcsC,KAAKtF,OAEvC4H,EACG5H,MAAKoH,IACRpH,MAAKoH,GAAa,EJ3DFhF,EI4DRpC,MAAKqH,EJ3DnBvB,EAAMtF,KAAK4B,GACXmE,KI6DQvG,MAAKoH,IACPpH,MAAKoH,GAAa,EJ3DnB,SAAoBhF,GACzB2D,EAAc8B,IAAIzF,GAElB,MAAMtF,EAAMgJ,EAAM/I,QAAQqF,GACtBtF,GAAO,GACTgJ,EAAM9I,OAAOF,EAAK,EAEtB,CIqDQgL,CAAW9H,MAAKqH,IAGbrH,IACR,EC7GY,MAAM+H,UAAiBb,EACpCnH,YAAY6C,EAAQC,GAClBrB,MAAMoB,EAAQC,EAAU,mBACxB,MAAM6C,EAAK1F,KAAK0F,GAChB1F,KAAKT,IAAI,IAAIgG,EAAavF,KAAM0F,IAChC1F,KAAKgD,eACN,ECLI,MAAMpE,EAAW,CACtBH,GAAIpC,GAAKA,EACTsB,KAAMtB,GAAK,EAAC,EAAMA,IAKP2L,EAAc,CACzBvJ,GAAIpC,GAAKA,EAAE4L,WACXtK,KAAMtB,IACJ,MAAMyE,EAAOoH,WAAW7L,GACxB,MAAO,EAAE8L,OAAOC,MAAMtH,GAAOA,EAAK,GAIzBnC,EAAa,CACxB0J,SAAU7J,EAAoB,CAACC,GAAI,CAAC,EAAG,KAAMd,KAAM,CAAC,EAAGP,KAAKkL,OCpBvD,SAASC,IACd,IAAIC,EAAa,EACjB,OAAO,SAAUC,EAAG7K,EAAM8K,EAAa,GACrCF,GAAcC,EAAEE,OAAS/K,EAAO8K,EAChC,MACME,EADaxL,KAAKyL,MAAMzL,KAAK0L,IAAIN,GAAc5K,GAAQR,KAAK2L,KAAKP,GAC5C5K,EAE3B,OADA4K,GAAcI,EACPA,CACX,CACA,CCHe,MAAMI,UAAmBvE,EACtChG,GACAd,GACAC,GACAqL,GACA/J,GAAW,CACTtB,KAAM,IACNe,WAAYqJ,EACZ9K,IAAKiL,OAAOe,kBACZ/L,IAAKgL,OAAOgB,mBAGdpJ,YAAY0F,EAAQvG,GAClB,MAAMQ,EAAW+F,EAAO/F,SAAS4F,KAAKG,GAChCI,EAAgBJ,EAAOI,cAAcP,KAAKG,GAC1C2D,EAAcb,IACpB/G,MAAMrG,EAAW,QAAS,CACxB+I,KAAM,SACNyB,QAAS,KACP3F,MAAKqJ,EAAa3J,GAAU,EAAK,EAEnCF,SAAU,KACRQ,MAAKqJ,EAAaxD,GAAe,EAAM,EAEzCyD,QAASb,IACPA,EAAEc,iBACF,MAAMrM,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB0J,EAAQQ,EAAYX,EAAG7K,GACvBvB,EAAI6L,WAAWlI,KAAKJ,WAAWjE,OAC/BmF,EAAO7D,EAAMS,EAAQrB,EAAIuM,GAAOvM,GAAKA,GAAGuB,GAAOV,EAAKC,IACnDqM,EAAOC,GAAQzJ,MAAKrC,EAAMmD,GAC7B0I,GACF/D,EAAO/F,SAAS+J,EACjB,KAGLzJ,KAAKY,WAAW1B,EACjB,CACDmK,GAAaK,EAAOT,GAClB,MAAM5M,EAAI6L,WAAWlI,KAAKJ,WAAWjE,QAC9B6N,EAAO1I,GAAQd,MAAKrC,EAAMtB,GACjC,IAAIsN,EACJ,GAAIH,IAAUrB,OAAOC,MAAM/L,GAAI,CAC7B,MAAMa,IAACA,EAAGC,IAAEA,GAAO6C,MAAKd,EACxByK,EAAU7I,GAAQ5D,GAAO4D,GAAQ3D,EACjC6C,MAAKiJ,EAAcA,EACnBS,EAAMzM,EAAM6D,EAAM5D,EAAKC,GACxB,CACD6C,KAAKJ,WAAW6B,UAAUK,OAAO,wBAAyB0H,IAAUG,EACrE,CACD3G,cAAc3G,GACP2D,MAAKiJ,IACRjJ,KAAKJ,WAAWjE,MAAQ+B,EAAQrB,EAAG2D,MAAKvB,EAAKuB,MAAKpC,IAEpDoC,MAAKiJ,GAAc,CACpB,CACDrI,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtC,MAAMtB,KACJA,EACAe,YAAYF,GAACA,EAAEd,KAAEA,IACfqC,MAAKd,EAIT,OAHAc,MAAKvB,EAAMA,EACXuB,MAAKrC,EAAQA,EACbqC,MAAKpC,EAAQA,EACNoC,IACR,EChEY,MAAM4J,UAAmB1C,EACtC2C,GACAjM,GAEAmC,YAAY6C,EAAQC,EAAU3D,EAAU,CAAA,GACtCsC,MAAMoB,EAAQC,EAAU,sBACxB7C,MAAK6J,EAAY7J,KAAKT,IAAI,IAAIyJ,EAAWhJ,KAAMd,IAC/Cc,KAAKgD,eACN,ECbY,MAAM8G,UAAmBrF,EACtCsF,GAEAhK,YAAY0F,EAAQuE,GAClB,MAAMD,EAAS,GACfvI,MAAMrG,EAAW,SAAU,CACzBqE,SAAU,KACRiG,EAAOI,cAAc7F,MAAK+J,EAAQ/J,KAAKJ,WAAWqK,eAAe,GAElED,EAAUrG,KAAI,EAAEjI,EAAKC,MACtBoO,EAAOvJ,KAAK7E,GACLR,EAAW,SAAU,CAACiJ,YAAa1I,SAE5CsE,MAAK+J,EAAUA,CAChB,CACD/G,cAAc3G,GACZ,MAAMS,EAAMkD,MAAK+J,EAAQhN,QAAQV,GACjC2D,KAAKJ,WAAWqK,cAAgBnN,CACjC,ECfI,SAASoN,EAAmBF,EAAWG,GAC5C,OAAI/E,MAAMC,QAAQ2E,GACZ5E,MAAMC,QAAQ2E,EAAU,IAEnBA,EAEHG,EAEKH,EAAUrG,KAAI,CAACtH,EAAGS,IAAQ,CAACT,EAAGS,KAG9BkN,EAAUrG,KAAItH,GAAK,CAACA,EAAGA,KAK3B,IAAIT,OAAOC,QAAQmO,GAE9B,CCpBe,MAAMI,UAAelD,EAClCnH,YAAY6C,EAAQC,EAAU3D,GAC5BsC,MAAMoB,EAAQC,EAAU,iBACxB,MAAMsH,EAA2C,iBAApBnK,KAAKsH,YAC3B0C,UAAWK,GAAkBnL,EAC9B8K,EAAYE,EAAmBG,EAAgBF,GACrDnK,KAAKT,IAAI,IAAIuK,EAAW9J,KAAMgK,IAC9BhK,KAAKgD,eACN,ECNY,MAAMsH,UAAkB7F,EACrChG,GACAd,GACAC,GACAqL,GACA/J,GAAW,CACTtB,KAAM,IACNV,IAAK,EACLC,IAAK,EACLwB,WAAYC,GAGdmB,YAAY0F,EAAQvG,GAClB,MAAMkK,EAAcb,IACpB/G,MAAMrG,EAAW,QAAS,CACxB+I,KAAM,QACNyB,QAAS,KACP3F,MAAKiJ,GAAc,EACnB,MAAM/L,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB7C,EAAI6L,WAAWlI,KAAKJ,WAAWjE,OAC/BmF,EAAO7D,EAAMS,EAAQrB,GAAGA,GAAKA,GAAGuB,GAAOV,EAAKC,IAC3CqM,EAAOe,GAAUvK,MAAKrC,EAAMmD,GAC/B0I,GACF/D,EAAO/F,SAAS6K,EACjB,EAEH/K,SAAU,KACRQ,MAAKiJ,GAAc,EACnB,MAAM/L,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB7C,EAAI6L,WAAWlI,KAAKJ,WAAWjE,OAC/BmF,EAAO7D,EAAMS,EAAQrB,GAAGA,GAAKA,GAAGuB,GAAOV,EAAKC,IAC3CqM,EAAOe,GAAUvK,MAAKrC,EAAMmD,GAC/B0I,GACF/D,EAAOI,cAAc0E,EACtB,EAEHjB,QAASb,IACPA,EAAEc,iBACF,MAAOC,EAAOnN,GAAK2D,MAAKrC,EAAMuK,WAAWlI,KAAKJ,WAAWjE,QACzD,IAAK6N,EACH,OAEF,MAAMtM,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB0J,EAAQQ,EAAYX,EAAG7K,GACvBkD,EAAO7D,EAAMS,EAAQrB,EAAIuM,GAAOvM,GAAKA,GAAGuB,GAAOV,EAAKC,GAC1DsI,EAAO/F,SAASoB,EAAK,KAGzBd,KAAKY,WAAW1B,EACjB,CACD8D,cAAc3G,GACP2D,MAAKiJ,IACRjJ,KAAKJ,WAAWjE,MAAQ+B,EAAQrB,EAAG2D,MAAKvB,EAAKuB,MAAKpC,IAEpDoC,MAAKiJ,GAAc,CACpB,CACDrI,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtC,MAAMtB,KACJA,EAAIV,IACJA,EAAGC,IACHA,EACAwB,YAAYF,GAACA,EAAEd,KAAEA,IACfqC,MAAKd,EAOT,OANAc,MAAKvB,EAAMA,EACXuB,MAAKrC,EAAQA,EACbqC,MAAKpC,EAAQA,EACboC,KAAKJ,WAAWhC,KAAOA,EACvBoC,KAAKJ,WAAW1C,IAAMA,EACtB8C,KAAKJ,WAAWzC,IAAMA,EACf6C,IACR,ECzEY,MAAMwK,UAActD,EACjCnH,YAAY6C,EAAQC,EAAU3D,GAC5BsC,MAAMoB,EAAQC,EAAU,gBACxB7C,KAAKT,IAAI,IAAI+K,EAAUtK,KAAMd,IAC7Bc,KAAKT,IAAI,IAAIyJ,EAAWhJ,KAAMd,GAC/B,ECJY,MAAMuL,UAAiBhG,EACpChG,GACAd,GACAsL,GACA/J,GAAW,CACTP,WAAYC,GAGdmB,YAAY0F,EAAQvG,GAClB,MAAMQ,EAAW+F,EAAO/F,SAAS4F,KAAKG,GAChCI,EAAgBJ,EAAOI,cAAcP,KAAKG,GAChDjE,MAAMrG,EAAW,QAAS,CACxB+I,KAAM,OACNyB,QAAS,KACP3F,MAAKqJ,EAAa3J,GAAU,EAAK,EAEnCF,SAAU,KACRQ,MAAKqJ,EAAaxD,GAAe,EAAM,KAG3C7F,KAAKY,WAAW1B,EACjB,CACDmK,GAAaK,EAAOT,GAClB,MAAOO,EAAO1I,GAAQd,MAAKrC,EAAMqC,KAAKJ,WAAWjE,OAC7C6N,IACFxJ,MAAKiJ,EAAcA,EACnBS,EAAM5I,IAERd,KAAKJ,WAAWgE,MAAMC,MAAQ2F,EAAQ,GAAK,sBAE5C,CACDxG,cAAc3G,GACP2D,MAAKiJ,IACRjJ,KAAKJ,WAAWjE,MAAQqE,MAAKvB,EAAIpC,GACjC2D,KAAKJ,WAAWgE,MAAMC,MAAQ,IAEhC7D,MAAKiJ,GAAc,CACpB,CACDrI,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtC,MACEP,YAAYF,GAACA,EAAEd,KAAEA,IACfqC,MAAKd,EAGT,OAFAc,MAAKvB,EAAMA,EACXuB,MAAKrC,EAAQA,EACNqC,IACR,EChDY,MAAM0K,UAAaxD,EAChCnH,YAAY6C,EAAQC,GAClBrB,MAAMoB,EAAQC,EAAU,eACxB7C,KAAKT,IAAI,IAAIkL,EAASzK,OACtBA,KAAKgD,eACN,ECRH,MAAM/F,EAAQ,CAACZ,EAAGa,EAAKC,IAAQC,KAAKD,IAAID,EAAKE,KAAKF,IAAIC,EAAKd,IACrDsO,EAAO,CAACpN,EAAG+G,EAAGsG,IAAMrN,GAAK+G,EAAI/G,GAAKqN,EAClCC,EAAQxO,GAAKA,GAAK,EAAIA,EAAI,EAAI,EAAKA,EAAI,EAEvCyO,EAAKzO,IAAMA,EAAE0O,QAAQ,GACrBC,EAAK3O,IAAMA,EAAE0O,QAAQ,GAErBE,EAAiB5O,GAAM6O,SAAS7O,EAAEL,UAAU,EAAG,GAAI,KAAO,GACnCkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,KAAO,EACnCkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAEnDmP,EAAkB9O,GAAM6O,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,GAAK,GACL,MAAlCkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IACM,IAAlCkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAC5BkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAG7CoP,EAAgB/O,GAAK,CAC9B6O,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAC5BkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAC5BkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,KAEnBqP,EAAgBhP,GAAK,IAAI+I,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAKA,EAAE4L,SAAS,IAAIqD,SAAS,EAAG,OAAMC,KAAK,MAEtFC,GAAiBnP,GAAK,CAC/B6O,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAC5BkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAC5BkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAC5BkP,SAAS7O,EAAEL,UAAU,EAAG,GAAI,KAEnByP,GAAiBpP,GAAK,IAAI+I,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAKA,EAAE4L,SAAS,IAAIqD,SAAS,EAAG,OAAMC,KAAK,MAEvFG,GAAgBrP,GAAK+O,EAAc/O,GAAGsH,KAAItH,GAAK2O,EAAG3O,EAAI,OACtDsP,GAAgBtP,GAAKgP,EAAcjG,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAKe,KAAKS,MAAMZ,EAAU,IAAJZ,EAAS,EAAG,SAEvFuP,GAAiBvP,GAAKmP,GAAenP,GAAGsH,KAAItH,GAAK2O,EAAG3O,EAAI,OACxDwP,GAAiBxP,GAAKoP,GAAerG,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAKe,KAAKS,MAAMZ,EAAU,IAAJZ,EAAS,EAAG,SAEhGyP,GAAgBzP,GAAKY,EAAMG,KAAKS,MAAU,IAAJxB,GAAU,EAAG,KAAK4L,SAAS,IAAIqD,SAAS,EAAG,KAEjFS,GAAiB1P,IAAM,CAC3B2P,EAAGd,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,IACrCiQ,EAAGf,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,IACrCsI,EAAG4G,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,MAGjCkQ,GAAkB7P,IAAM,CAC5B2P,EAAGd,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,IACrCiQ,EAAGf,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,IACrCsI,EAAG4G,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,IACrCuB,EAAG2N,SAAS7O,EAAEL,UAAU,EAAG,GAAI,IAAM,MAIjCmQ,GAAc9P,GAAK,OAAO+O,EAAc/O,GAAGkP,KAAK,SAChDa,GAAc,qDAKdC,GAAehQ,GAAK,QAAQmP,GAAenP,GAAGsH,KAAI,CAACtH,EAAGmI,IAAY,IAANA,EAAUnI,EAAI,IAAMA,IAAGkP,KAAK,SACxFe,GAAe,2EAMfC,GAAclQ,IAClB,MAAMmQ,EAAMC,GAAcrB,EAAc/O,IAAIsH,KAAItH,GAAKyO,EAAGzO,KACxD,MAAO,OAAOmQ,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAM,EAE3CE,GAAerQ,IACnB,MAAMsQ,EAAOC,GAAgBpB,GAAenP,IAAIsH,KAAI,CAACtH,EAAGmI,IAAY,IAANA,EAAUwG,EAAG3O,GAAKyO,EAAGzO,KACnF,MAAO,OAAOsQ,EAAK,MAAMA,EAAK,OAAOA,EAAK,SAASA,EAAK,KAAK,EAEzDE,GAAc,yEACdC,GAAe,+FAcfhP,GAAkB,CAACzB,EAAG0B,KAAQ1B,EAAI0B,EAAKA,GAAKA,EAE3C,SAASgP,IAAeC,EAAG7J,EAAG8J,IACnCD,EAAIlP,GAAgBkP,EAAG,KACvB7J,EAAIlG,EAAMkG,EAAI,IAAK,EAAG,GACtB8J,EAAIhQ,EAAMgQ,EAAI,IAAK,EAAG,GAEtB,MAAM1P,EAAI4F,EAAI/F,KAAKF,IAAI+P,EAAG,EAAIA,GAE9B,SAASC,EAAEnP,GACT,MAAM3B,GAAK2B,EAAIiP,EAAI,IAAM,GACzB,OAAOC,EAAI1P,EAAIH,KAAKD,KAAK,EAAGC,KAAKF,IAAId,EAAI,EAAG,EAAIA,EAAG,GACpD,CAED,MAAO,CAAC8Q,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIvJ,KAAItH,GAAKe,KAAKS,MAAU,IAAJxB,IAChD,CAOO,SAAS8Q,IAAiBnB,EAAGC,EAAG3H,IACrC,MAAMnH,EAAMC,KAAKD,IAAI6O,EAAGC,EAAG3H,GACrBpH,EAAME,KAAKF,IAAI8O,EAAGC,EAAG3H,GACrB2I,EAAkB,IAAb/P,EAAMC,GACXiQ,EAAIjQ,EAAMD,EAChB,IAAI8P,EAAI,EACJ7J,EAAI,EAER,GAAU,IAANiK,EAKF,OAJAjK,EAAW,IAAN8J,GAAiB,IAANA,EACV,GACC9P,EAAM8P,GAAK7P,KAAKF,IAAI+P,EAAG,EAAIA,GAE1B9P,GACN,KAAK6O,EAAGgB,GAAKf,EAAI3H,GAAK8I,GAAKnB,EAAI3H,EAAI,EAAI,GAAI,MAC3C,KAAK2H,EAAGe,GAAK1I,EAAI0H,GAAKoB,EAAI,EAAG,MAC7B,KAAK9I,EAAG0I,GAAKhB,EAAIC,GAAKmB,EAAI,EAI9B,MAAO,CAACJ,EAAI,EAAG7J,EAAG8J,EACpB,CAEO,SAASI,IAAmBrB,EAAGC,EAAG3H,EAAG/G,IAE3C,MAAO,IADM4P,GAAgB,CAACnB,EAAGC,EAAG3H,IACpB/G,EACjB,CAEO,MAAMkP,GAAiBa,IAC5B,MAAON,EAAG7J,EAAG8J,GAAKE,GAAgBG,EAAI3J,KAAItH,GAAKA,EAAI,OACnD,MAAO,CAAK,IAAJ2Q,EAAa,IAAJ7J,EAAa,IAAJ8J,EAAQ,EAGvBL,GAAmBW,IAC9B,MAAOP,EAAG7J,EAAG8J,EAAG1P,GAAK8P,GAAkBE,EAAK5J,KAAItH,GAAKA,EAAI,OACzD,MAAO,CAAK,IAAJ2Q,EAAa,IAAJ7J,EAAa,IAAJ8J,EAAS1P,EAAE,EAGhC,SAASiQ,IAAiBC,EAAKC,EAAKC,IAGzC,OAFAD,EAAMzQ,EAAMyQ,EAAK,EAAG,GACpBC,EAAM1Q,EAAM0Q,EAAK,EAAG,GACb,CAACF,EAAKA,EAAM,EAAI,EAAGA,EAAM,EAAI,GAAG9J,KACnCtH,GAAKsO,EAAK,EAAG1N,EAAMG,KAAK0L,IAAe,EAAX+B,EAAMxO,GAAS,GAAO,EAAG,EAAG,GAAIqR,GAAOC,GAEzE,CAEO,SAASC,IAAmBH,EAAKC,EAAKC,EAAKE,IAEhD,MAAO,IADKL,GAAgB,CAACC,EAAKC,EAAKC,IACvBE,EAClB,CAEA,MAAMC,GAASzR,GAAKe,KAAKS,MAAU,IAAJxB,GAAY,IAEpC,SAAS0R,IAAiB/B,EAAGC,EAAG3H,IACrC,MAAM0J,EAAI1J,EAAI2H,EACR,CAAC3H,EAAG2H,GAAI,EAAG,EAAI,GACf,CAACA,EAAG3H,EAAG,GAAI,EAAI,GACf2J,EAAID,EAAE,GAAKhC,EACX,CAACgC,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIhC,GACnB,CAACA,EAAGgC,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAClBZ,EAAIa,EAAE,GAAK7Q,KAAKF,IAAI+Q,EAAE,GAAIA,EAAE,IAClC,MAAO,CACL7Q,KAAK0L,IAAImF,EAAE,IAAMA,EAAE,GAAKA,EAAE,KAAO,EAAIb,EAAIjF,OAAO+F,UAChDd,GAAKa,EAAE,GAAK9F,OAAO+F,SACnBD,EAAE,IACFtK,IAAImK,GACR,CAEO,SAASK,IAAmBnC,EAAGC,EAAG3H,EAAG/G,IAE1C,MAAO,IADKwQ,GAAgB,CAAC/B,EAAGC,EAAG3H,IACnB/G,EAClB,CAMO,MAAM6Q,GAAWC,GAAUA,EAAOC,SAAS,MAAQD,EAAOvS,WAAW,QAEtEyS,GAAmB,CACvB,CAAEC,GAAI,sBAAuBH,OAAQ,QACrC,CAAEG,GAAI,qBAAsBH,OAAQ,gBACpC,CAAEG,GAAI,sBAAuBH,OAAQ,QACrC,CAAEG,GAAI,qBAAsBH,OAAQ,gBACpC,CAAEG,GAAI,sBAAuBH,OAAQ,QACrC,CAAEG,GAAI,qBAAsBH,OAAQ,gBACpC,CAAEG,GAAIpC,GAAaiC,OAAQ,WAC3B,CAAEG,GAAI3B,GAAawB,OAAQ,WAC3B,CAAEG,GAAIlC,GAAc+B,OAAQ,YAC5B,CAAEG,GAAI1B,GAAcuB,OAAQ,aAYvB,SAASI,GAAYpS,GAC1B,cAAeA,GACb,IAAK,SAEH,OADAqS,QAAQC,KAAK,sIACNtS,GAAK,SAAW,aAAe,cACxC,IAAK,SAAU,CACb,MAAMuS,EAfZ,SAAgCvS,GAC9B,IAAK,MAAMuS,KAAcL,GACvB,GAAIK,EAAWJ,GAAGK,KAAKxS,GACrB,OAAOuS,CAIb,CAQyBE,CAAuBzS,EAAE0S,QAC5C,GAAIH,EACF,OAAOA,EAAWP,OAEpB,KACD,CACD,IAAK,SACH,GAAIhS,aAAa2S,YAAc3S,aAAa4S,kBAAmB,CAC7D,GAAiB,IAAb5S,EAAEkI,OACJ,MAAO,YACF,GAAiB,IAAblI,EAAEkI,OACX,MAAO,YAEjB,MAAa,GAAIlI,aAAa6S,aAAc,CACpC,GAAiB,IAAb7S,EAAEkI,OACJ,MAAO,YACF,GAAiB,IAAblI,EAAEkI,OACX,MAAO,YAEV,MAAM,GAAIa,MAAMC,QAAQhJ,GAAI,CAC3B,GAAiB,IAAbA,EAAEkI,OACJ,MAAO,YACF,GAAiB,IAAblI,EAAEkI,OACX,MAAO,YAEjB,MACQ,GAAI,MAAOlI,GAAK,MAAOA,GAAK,MAAOA,EACjC,MAAI,MAAOA,EACF,cAEA,aAKjB,MAAM,IAAI8S,MAAM,yBAAyB9S,IAC3C,CAEA,SAAS+S,GAAQ/S,GACf,OAAOA,EAAE0S,KAAK1S,EAIhB,CAEA,SAASgT,GAAQhT,GACf,OAAOA,EAAE0S,KAAK1S,EAIhB,CAEA,SAASiT,GAAWC,GAClB,OAAQA,EAAK,KAAOA,EAAK,IACjBA,EAAK,KAAOA,EAAK,IACjBA,EAAK,KAAOA,EAAK,GACnB,IAAIA,EAAK,KAAKA,EAAK,KAAKA,EAAK,KAC7BA,CACR,CAEA,MAAMC,GAAS,uBACf,SAASC,GAAWC,GAClB,MAAMrM,EAAImM,GAAOG,KAAKD,GACtB,GAAIrM,EAAG,CACL,MAAW,CAAA,CAAAuM,GAAMvM,EACjB,MAAO,IA9MoB,IAALhH,EA8MOuT,GA9MG,KAAKvT,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,IA+MpE,CA/MuBA,MAgNxB,OAAOqT,CACT,CAEA,SAASG,GAAQxT,GACf,OAAOiT,GAAWF,GAAQ/S,GAC5B,CAEA,MA0BMyT,GAAc3M,IAClB,MAAME,EAAI+I,GAAYuD,KAAKxM,GAC3B,IAAKE,EACH,MAAO,EAAC,GAEV,MAAMhH,EAAI,CAACgH,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6O,SAAS7O,KAE/C,MAAO,EADYA,EAAE0T,MAAK1T,GAAKA,EAAI,MACd,OAAOA,EAAEkP,KAAK,SAAS,EAGxCyE,GAAe7M,IACnB,MAAME,EAAIiJ,GAAaqD,KAAKxM,GAC5B,IAAKE,EACH,MAAO,EAAC,GAEV,MAAMhH,EAAI,CAACgH,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAI,CAACtH,EAAGmI,IAAY,IAANA,EAAU0D,WAAW7L,GAAK6O,SAAS7O,KAEpF,MAAO,EADYA,EAAE0T,MAAK1T,GAAKA,EAAI,MACd,QAAQA,EAAEkP,KAAK,SAAS,EAGzC0E,GAAc9M,IAClB,MAAME,EAAIwJ,GAAY8C,KAAKxM,GAC3B,IAAKE,EACH,MAAO,EAAC,GAEV,MAAMhH,EAAI,CAACgH,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6L,WAAW7L,KAEjD,MAAO,EADYA,EAAE0T,MAAK1T,GAAK8L,OAAOC,MAAM/L,KACvB,OAAOA,EAAE,OAAOA,EAAE,QAAQA,EAAE,OAAO,EAGpD6T,GAAe/M,IACnB,MAAME,EAAIyJ,GAAa6C,KAAKxM,GAC5B,IAAKE,EACH,MAAO,EAAC,GAEV,MAAMhH,EAAI,CAACgH,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6L,WAAW7L,KAEvD,MAAO,EADYA,EAAE0T,MAAK1T,GAAK8L,OAAOC,MAAM/L,KACvB,OAAOA,EAAE,MAAMA,EAAE,OAAOA,EAAE,SAASA,EAAE,MAAM,EAU5D8T,GAAe,wCAWfC,GAAe,wCAWfC,GAAelN,IACnB,MAAMmN,EAAUnN,EAAEoN,MAAM,KAAK5M,KAAIR,GAAKA,EAAE4L,SAClC1S,EAAIiU,EAAQ3M,KAAItH,GAAK6L,WAAW7L,KACtC,GAAiB,IAAbA,EAAEkI,OACJ,MAAO,EAAC,GAGV,MAAMiM,EAASF,EAAQG,WAAUpU,GAAK+L,MAAM/L,KAC5C,MAAO,CAACmU,EAAS,EAAGnU,EAAEsH,KAAItH,GAAK2O,EAAG3O,KAAI,EAGlCqU,GAAevN,IACnB,MAAMmN,EAAUnN,EAAEoN,MAAM,KAAK5M,KAAIR,GAAKA,EAAE4L,SAClC1S,EAAIiU,EAAQ3M,KAAItH,GAAK6L,WAAW7L,KACtC,GAAiB,IAAbA,EAAEkI,OACJ,MAAO,EAAC,GAGV,MAAMiM,EAASF,EAAQG,WAAUpU,GAAK+L,MAAM/L,KAC5C,MAAO,CAACmU,EAAS,EAAGnU,EAAEsH,KAAItH,GAAK2O,EAAG3O,KAAI,EAGlCsU,GAAsB,sCAStBC,GAAuB,sCASvBC,GAAS,6CACTC,GAAe,uBACfC,GAAS,wBACTC,GAAe,uBA+BRC,GAAwB,CACnC1B,KAAQ,CACN1L,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMA,GAClBoC,GAAI2Q,IAEN8B,KAAM,CACJvT,KAAMtB,GAAK,CAACwU,GAAOhC,KAAKxS,GAAIA,EAAE0S,QAC9BtQ,GAAIpC,GAAKA,IAGb8U,KAAQ,CACNtN,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMA,GAClBoC,GAAI4Q,IAEN6B,KAAM,CACJvT,KAAMtB,GAAK,CAAC0U,GAAOlC,KAAKxS,GAAIA,EAAE0S,QAC9BtQ,GAAIpC,GAAKA,IAGbqT,KAAQ,CACN7L,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMwT,GAAQxT,IAC1BoC,GAAIgR,IAENyB,KAAM,CACJvT,KAAMtB,GAAK,CAACwU,GAAOhC,KAAKxS,GAAIiT,GAAWjT,EAAE0S,SACzCtQ,GAAIpC,GAAKA,IAGb,eAAgB,CACdwH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMA,EAAEL,UAAU,IAC9ByC,GAAIpC,GAAK,IAAI+S,GAAQ/S,MAEvB6U,KAAM,CACJvT,KAAMtB,GAAK,CAACyU,GAAajC,KAAKxS,GAAIA,EAAE0S,QACpCtQ,GAAIpC,GAAKA,IAGb,eAAgB,CACdwH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMA,EAAEL,UAAU,IAC9ByC,GAAIpC,GAAK,IAAIgT,GAAQhT,MAEvB6U,KAAM,CACJvT,KAAMtB,GAAK,CAAC2U,GAAanC,KAAKxS,GAAIA,EAAE0S,QACpCtQ,GAAIpC,GAAKA,IAGb,eAAgB,CACdwH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMwT,GAAQxT,GAAGL,UAAU,IACvCyC,GAAIgR,IAENyB,KAAM,CACJvT,KAAMtB,GAAK,CAACyU,GAAajC,KAAKxS,GAAIiT,GAAWjT,EAAE0S,SAC/CtQ,GAAIpC,GAAKA,IAGb,aAAc,CACZwH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM4O,EAAe5O,IACjCoC,GApgBiBpC,GAAK,IAAKe,KAAKS,MAAMxB,GAAI4L,SAAS,IAAIqD,SAAS,EAAG,QAsgBrE4F,KAAM,CACJvT,KAAMtB,GAtHW8G,KACrB,MAAME,EAAIsN,GAAoBhB,KAAKxM,GACnC,OAAKE,EAGE,EAAC,EAAM6H,SAAS7H,EAAE,GAAI,KAFpB,EAAC,EAEuB,EAiHlB+N,CAAe/U,GAC1BoC,GAAIpC,GAAK,KAAKA,EAAE4L,SAAS,IAAIqD,SAAS,EAAG,SAG7C,cAAe,CACbzH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM8O,EAAgB9O,IAClCoC,GAzgBkBpC,GAAK,IAAKe,KAAKS,MAAMxB,GAAI4L,SAAS,IAAIqD,SAAS,EAAG,QA2gBtE4F,KAAM,CACJvT,KAAMtB,GAvHY8G,KACtB,MAAME,EAAIuN,GAAqBjB,KAAKxM,GACpC,OAAKE,EAGE,EAAC,EAAM6H,SAAS7H,EAAE,GAAI,KAFpB,EAAC,EAEuB,EAkHlBgO,CAAgBhV,GAC3BoC,GAAIpC,GAAK,KAAKA,EAAE4L,SAAS,IAAIqD,SAAS,EAAG,SAG7C,YAAa,CACXzH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM+O,EAAc/O,IAChCoC,GAAI4M,GAEN6F,KAAM,CACJvT,KAtLawF,IACjB,MAAME,EAAI8M,GAAaR,KAAKxM,GAC5B,IAAKE,EACH,MAAO,EAAC,GAEV,MAAMhH,EAAI,CAACgH,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6O,SAAS7O,KAE/C,MAAO,EADYA,EAAE0T,MAAK1T,GAAKA,EAAI,MACdA,EAAE,EAgLnBoC,GAAIpC,GAAKA,EAAEkP,KAAK,QAGpB,aAAc,CACZ1H,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMmP,GAAenP,IACjCoC,GAAIgN,IAENyF,KAAM,CACJvT,KArLawF,IACjB,MAAME,EAAI+M,GAAaT,KAAKxM,GAC5B,IAAKE,EACH,MAAO,EAAC,GAEV,MAAMhH,EAAI,CAACgH,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6O,SAAS7O,KAErD,MAAO,EADYA,EAAE0T,MAAK1T,GAAKA,EAAI,MACdA,EAAE,EA+KnBoC,GAAIpC,GAAKA,EAAEkP,KAAK,QAGpB,YAAa,CACX1H,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMqP,GAAcrP,IAChCoC,GAAIkN,IAENuF,KAAM,CACJvT,KAAM0S,GAEN5R,GAAIpC,GAAK+I,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAK2O,EAAG3O,KAAIkP,KAAK,QAGhD,aAAc,CACZ1H,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMuP,GAAevP,IACjCoC,GAAIoN,IAENqF,KAAM,CACJvT,KAAM+S,GAENjS,GAAIpC,GAAK+I,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAK2O,EAAG3O,KAAIkP,KAAK,QAGhD,YAAa,CACX1H,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM0R,GAAgBrC,GAAcrP,KAChDoC,GAAIpC,GAAKmR,GAAgB7B,GAActP,KAEzC6U,KAAM,CACJvT,KAAM0S,GAEN5R,GAAIpC,GAAK+I,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAK2O,EAAG3O,KAAIkP,KAAK,QAGhD,aAAc,CACZ1H,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM8R,GAAkBzC,GAAcrP,KAClDoC,GAAIpC,GAAKuR,GAAkBjC,GAActP,KAE3C6U,KAAM,CACJvT,KAAM+S,GAENjS,GAAIpC,GAAK+I,MAAMzH,KAAKtB,GAAGsH,KAAItH,GAAK2O,EAAG3O,KAAIkP,KAAK,QAyBhD,aAAc,CACZ1H,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM0P,GAAe1P,IACjCoC,GA3kBiBpC,GAAK,IAAIyP,GAAczP,EAAE2P,KAAKF,GAAczP,EAAE4P,KAAKH,GAAczP,EAAEiI,MA6kBtF4M,KAAM,CACJvT,KAtVkBwF,IACtB,IACE,MAAMmO,EAAOnO,EAAEC,QAAQ,WAAY,QAC7BkK,EAAMiE,KAAKC,MAAMF,GACvB,GAAInJ,OAAOC,MAAMkF,EAAItB,IAAM7D,OAAOC,MAAMkF,EAAIrB,IAAM9D,OAAOC,MAAMkF,EAAIhJ,GACjE,MAAM,IAAI6K,MAAM,iBAElB,MAAO,EAAC,EAAM7B,EACf,CAAC,MAAO7E,GACP,MAAO,EAAC,EACT,GA6UGhK,GArRiB6O,GACd,MAAMtC,EAAGsC,EAAItB,SAAShB,EAAGsC,EAAIrB,SAASjB,EAAGsC,EAAIhJ,QAuRpD,cAAe,CACbT,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM6P,GAAgB7P,IAClCoC,GA9kBkBpC,GAAK,IAAIyP,GAAczP,EAAE2P,KAAKF,GAAczP,EAAE4P,KAAKH,GAAczP,EAAEiI,KAAKwH,GAAczP,EAAEkB,MAglB5G2T,KAAM,CACJvT,KAnVmBwF,IACvB,IACE,MAAMmO,EAAOnO,EAAEC,QAAQ,WAAY,QAC7BmK,EAAOgE,KAAKC,MAAMF,GACxB,GAAInJ,OAAOC,MAAMmF,EAAKvB,IAAM7D,OAAOC,MAAMmF,EAAKtB,IAAM9D,OAAOC,MAAMmF,EAAKjJ,IAAM6D,OAAOC,MAAMmF,EAAKhQ,GAC5F,MAAM,IAAI4R,MAAM,oBAElB,MAAO,EAAC,EAAM5B,EACf,CAAC,MAAO9E,GACP,MAAO,EAAC,EACT,GA0UGhK,GA5RkB8O,GACf,MAAMvC,EAAGuC,EAAKvB,SAAShB,EAAGuC,EAAKtB,SAASjB,EAAGuC,EAAKjJ,UAAU0G,EAAGuC,EAAKhQ,QA8RzE,UAAW,CACTsG,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAM8P,GAAY9P,IAC9BoC,GAplBcpC,IAClB,MAAMgH,EAAI+I,GAAYuD,KAAKtT,GAC3B,OAAOgP,EAAc,CAAChI,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6O,SAAS7O,KAAI,GAolB5D6U,KAAM,CACJvT,KAAMmS,GACNrR,GAAIpC,GAAKyT,GAAYzT,GAAG,KAG5B,WAAY,CACVwH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMgQ,GAAahQ,IAC/BoC,GAxlBepC,IACnB,MAAMgH,EAAIiJ,GAAaqD,KAAKtT,GAC5B,OAAOoP,GAAe,CAACpI,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAI,CAACtH,EAAGmI,IAAY,IAANA,EAA2B,IAAhB0D,WAAW7L,GAAW,EAAK6O,SAAS7O,KAAI,GAwlB9G6U,KAAM,CACJvT,KAAMqS,GACNvR,GAAIpC,GAAK2T,GAAa3T,GAAG,KAG7B,UAAW,CACTwH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMkQ,GAAYlQ,IAC9BoC,GAjlBcpC,IAClB,MAAMgH,EAAIwJ,GAAY8C,KAAKtT,GACrBiR,EAAMP,GAAc,CAAC1J,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6L,WAAW7L,MACjE,OAAOgP,EAAciC,EAAI,GAglBvB4D,KAAM,CACJvT,KAAMsS,GACNxR,GAAIpC,GAAK4T,GAAY5T,GAAG,KAG5B,WAAY,CACVwH,MAAO,CACLlG,KAAMtB,GAAK,EAAC,EAAMqQ,GAAarQ,IAC/BoC,GAtlBepC,IACnB,MAAMgH,EAAIyJ,GAAa6C,KAAKtT,GACtBkR,EAqBD,UAA0BP,EAAG7J,EAAG8J,EAAG1P,IAExC,MAAO,IADKwP,GAAc,CAACC,EAAG7J,EAAG8J,IACb,IAAJ1P,EAAU,EAC5B,CAxBekU,CAAgB,CAACpO,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAIM,KAAItH,GAAK6L,WAAW7L,MAC1E,OAAOoP,GAAe8B,EAAK,GAqlBzB2D,KAAM,CACJvT,KAAMuS,GACNzR,GAAIpC,GAAK6T,GAAa7T,GAAG,MC3qBhB,MAAMqV,WAAoB/R,EACvCI,YAAY3E,EAAKmG,GACfC,MAAMrG,EAAWC,EAAK,CAACmG,cACxB,ECFY,MAAMoQ,WAAe/K,EAClCgL,GAEA7R,YAAYkE,GACVzC,MAAM,gBAAiByC,GACvBjE,MAAK4R,EAAc5R,KAAKT,IACtB,IAAImS,GAAY,SAAU,kBAC1B9R,UACH,CACGiS,aACF,OAAO7R,MAAK4R,CACb,ECVY,MAAME,WAAkBrN,EACrChG,GACAd,GACAoU,GACA9I,GACA/J,GAAW,CACTP,WAAYC,GAGdmB,YAAY0F,EAAQvG,GAClB,MAAM6S,EAAY5W,EAAW,QAAS,CACpC+I,KAAM,QACNyB,QAAS,KACP,MAAO6D,EAAO1I,GAAQd,MAAKrC,EAAMoU,EAAUpW,OACvC6N,IACFxJ,MAAKiJ,GAAc,EACnBxD,EAAO/F,SAASoB,GACjB,EAEHtB,SAAU,KACR,MAAOgK,EAAO1I,GAAQd,MAAKrC,EAAMoU,EAAUpW,OACvC6N,IACFxJ,MAAKiJ,GAAc,EACnBxD,EAAOI,cAAc/E,GACtB,IAGLU,MAAMrG,EAAW,MAAO,CAAE,EAAE,CAAC4W,KAC7B/R,KAAKY,WAAW1B,GAChBc,MAAK+R,EAAaA,CACnB,CACD/O,cAAc3G,GACP2D,MAAKiJ,IACRjJ,MAAK+R,EAAWpW,MAAQqE,MAAKvB,EAAIpC,IAEnC2D,MAAKiJ,GAAc,CACpB,CACDrI,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtC,MAAOP,YAAYF,GAACA,EAAEd,KAAEA,IAASqC,MAAKd,EAGtC,OAFAc,MAAKvB,EAAMA,EACXuB,MAAKrC,EAAQA,EACNqC,IACR,ECxCY,MAAMgS,WAAc9K,EACjC+K,GACApI,GAEA9J,YAAY6C,EAAQC,EAAU3D,EAAU,CAAA,GACtCsC,MAAMoB,EAAQC,EAAU,gBACxB,MAAMwL,EAASnP,EAAQmP,QAAUI,GAAYzO,KAAKsH,aAC5CzD,MAACA,EAAKqN,KAAEA,GAAQD,GAAsB5C,GAC5CrO,MAAKiS,EAAajS,KAAKT,IAAI,IAAIuS,GAAU9R,KAAM,CAACrB,WAAYkF,KAC5D7D,MAAK6J,EAAY7J,KAAKT,IAAI,IAAIkL,EAASzK,KAAM,CAACrB,WAAYuS,KAC1DlR,KAAKgD,eACN,CACDpC,WAAW1B,GACT,MAAMmP,OAACA,GAAUnP,EACjB,GAAImP,EAAQ,CACV,MAAMxK,MAACA,EAAKqN,KAAEA,GAAQD,GAAsB5C,GAC5CrO,MAAKiS,EAAWrR,WAAW,CAACjC,WAAYkF,IACxC7D,MAAK6J,EAAUjJ,WAAW,CAACjC,WAAYuS,GACxC,CAED,OADA1P,MAAMZ,WAAW1B,GACVc,IACR,ECzBY,MAAMkS,WAAgB/Q,EACnCpB,cACEyB,MAAM,iBACP,ECLY,MAAM2Q,WAAkBhR,EACrCiR,GACAC,GAEAtS,YAAYwB,GACVC,MAAMD,GACNvB,MAAKoS,EAAe,GACpBpS,MAAKqS,EAAuBrS,IAC7B,CACG1E,eACF,OAAO0E,MAAKoS,CACb,CACGA,kBACF,OAAOpS,MAAKoS,EAAaE,QAAOC,KAAOA,aAAaJ,KACrD,CACGK,cACF,OAAOxS,MAAKoS,EAAaE,QAAOC,GAAKA,aAAaJ,IACnD,CACDxK,MAAM8K,GAAY,GAChB,IAAK,MAAM3P,KAAc9C,MAAKoS,EACtBtP,aAAsBqP,KAAcM,GACxC3P,EAAW6E,MAAM8K,GAGrB,OAAOzS,IACR,CACDgD,gBACE,IAAK,MAAMF,KAAc9C,MAAKoS,EAC5BtP,EAAWE,gBAEb,OAAOhD,IACR,CACDS,OAAOqC,GACL,MAAMhG,EAAMkD,MAAKoS,EAAarV,QAAQ+F,GACtC,GAAIhG,GAAO,EAAG,CACZ,MACM4V,EADI1S,MAAKoS,EAAapV,OAAOF,EAAK,GAC3B,GACA4V,EAAG9S,WACXa,SACLiS,EAAGhR,UAAU,KACd,CACD,OAAO1B,IACR,CACD2S,GAAmB7P,GAIjB,OAHA9C,KAAKJ,WAAWnD,YAAYqG,EAAWlD,YACvCI,MAAKoS,EAAa5R,KAAKsC,GACvBA,EAAWpB,UAAU1B,MACd8C,CACR,CACD8P,cAAc9P,GACZ,OAAO9C,MAAKqS,GAAqBM,EAAmB7P,EACrD,CACD+P,cAAcC,GAGZ,OAFA9S,KAAK4S,cAAcE,GACnB9S,MAAKqS,EAAuBS,EACrBA,CACR,CACDC,eAEE,OADA/S,MAAKqS,EAAuBrS,MAAKqS,EAAqB/Q,OAC/CtB,IACR,EC3DY,MAAMgT,WAAeb,GAClCc,GAEAlT,YAAYkE,EAAO,WAAY1C,EAAY,eACzCC,MAAMD,GACNvB,MAAKiT,EAAa9X,EAAW,SAC7B6E,KAAKC,QAAQ9E,EAAW,SAAU,CAChC+I,KAAM,SACNC,QAAS,IAAMnE,KAAKkT,cACnB,CAAClT,MAAKiT,KACTjT,KAAK6S,cAAc,IAAIV,GAAU,0BACjCnS,KAAK6S,cAAc,IAAIV,IACvBnS,KAAKiE,KAAKA,GACVjE,KAAKmT,MACN,CACDA,KAAKA,GAAO,GAGV,OAFAnT,KAAKJ,WAAW6B,UAAUK,OAAO,iBAAkBqR,GACnDnT,KAAKJ,WAAW6B,UAAUK,OAAO,cAAeqR,GACzCnT,IACR,CACDoT,QACE,OAAOpT,KAAKmT,MAAK,EAClB,CACDlP,KAAKA,GAEH,OADAjE,MAAKiT,EAAW7O,YAAcH,EACvBjE,IACR,CACD+G,MAAMA,GACJ,OAAO/G,KAAKiE,KAAK8C,EAClB,CACDmM,aAEE,OADAlT,KAAKmT,MAAMnT,KAAKJ,WAAW6B,UAAU4R,SAAS,gBACvCrT,IACR,EChCY,MAAMsT,WAAcnS,EACjCpB,YAAYmR,GACV1P,MAAM,gBACNxB,KAAKkR,KAAKA,EACX,CACDA,KAAKA,GAEH,OADAlR,KAAKJ,WAAWwE,YAAc8M,EACvBlR,IACR,ECZH,SAASuT,KACT,CAEO,SAASC,GAAwBjY,EAAMkY,EAAOC,GACnD,MAAMC,EAAOpY,EAAKqY,wBACZC,EAAIJ,EAAMK,QAAUH,EAAKI,KACzBC,EAAIP,EAAMQ,QAAUN,EAAKO,IACzBC,EAAKN,EAAIF,EAAKS,MACdC,EAAKL,EAAIL,EAAKW,OAEdC,EAAKV,GADXH,EAAQA,GAAS,CAACG,EAAGG,IACA,GACfQ,EAAKR,EAAIN,EAAM,GAGrB,MAAO,CAACG,IAAGG,IAAGG,KAAIE,KAAIE,KAAIC,KAAI1X,IAFlByX,EAAKZ,EAAKS,MAEaK,IADvBD,EAAKb,EAAKS,MAExB,CAEO,SAASM,GAAenZ,GAAMoZ,OAACA,EAASpB,GAAIqB,OAAEA,EAASrB,GAAIsB,KAAEA,EAAOtB,KACzE,IAAIG,EACJ,MAAMoB,EAAc,SAAUrB,GAC5B,MAAMhL,EAAI,CACRvE,KAAM,UACHsP,GAAwBjY,EAAMkY,EAAOC,IAE1CkB,EAAOnM,EACX,EAEQsM,EAAY,SAAUtB,GAC1BlY,EAAKyZ,sBAAsBvB,EAAMwB,WACjC1Z,EAAK2Z,oBAAoB,cAAeJ,GACxCvZ,EAAK2Z,oBAAoB,YAAaH,GAEtCvZ,SAAS2Z,KAAKvR,MAAMwR,gBAAkB,GAEtCP,EAAK,KACT,EAEQQ,EAAc,SAAU5B,GAC5BlY,EAAKW,iBAAiB,cAAe4Y,GACrCvZ,EAAKW,iBAAiB,YAAa6Y,GACnCxZ,EAAK+Z,kBAAkB7B,EAAMwB,WAE7B,MAAMM,EAAM/B,GAAwBjY,EAAMkY,GAC1CC,EAAQ,CAAC6B,EAAI1B,EAAG0B,EAAIvB,GACpBW,EAAO,CACLzQ,KAAM,UACHqR,GAET,EAIE,OAFAha,EAAKW,iBAAiB,cAAemZ,GAE9B,WACL9Z,EAAK2Z,oBAAoB,cAAeG,EAC5C,CACA,CCKA,SAASG,GAAmBja,GAQ1B,OAPAA,EAAK2G,iBAAiB,cAAcD,SAAQwT,IAC1C,MAAM/P,ElC3BD,aAAa/I,IkC4BlB8Y,EAAQ/P,GAAKA,EACbnK,EAAK2G,iBAAiB,gBAAgBuT,EAAQC,QAAQxX,QAAQ+D,SAAQ0T,IACpEA,EAAWpZ,aAAa,OAAQ,QAAQmJ,KAAM,GAC9C,IAEGnK,CACT,CAIe,MAAMqa,WAAyBnR,EAC5ChG,GACAd,GACAkY,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAtX,GAAW,CACTP,WAAYC,EACZiP,OAAO,GAET4I,GACAC,GAEA3W,YAAY0F,EAAQvG,GAClBsC,MAAMrG,EAAW,MAAO,CACtBwb,UA/EM,qtFAgFNpV,UAAW,sBAEbvB,MAAK6V,EAAgB7V,KAAKJ,WAAWtE,SAAS,GAC9C0E,MAAK+V,EAAa/V,KAAKJ,WAAWtE,SAAS,GAC3C0E,MAAKkW,EAAelW,KAAKJ,WAAWtE,SAAS,GAC7Cka,GAAmBxV,MAAK6V,GACxBL,GAAmBxV,MAAK+V,GACxBP,GAAmBxV,MAAKkW,GACxBlW,MAAK8V,EAAc9V,KAAKgB,EAAE,gCAC1BhB,MAAKgW,EAAWhW,KAAKgB,EAAE,uCACvBhB,MAAKiW,EAAiBjW,KAAKgB,EAAE,oCAC7BhB,MAAKmW,EAAanW,KAAKgB,EAAE,yCACzBhB,MAAKoW,EAAmBpW,KAAKgB,EAAE,sCAE/B,MAAM4V,EAAwBnO,IAC5B,MAAMtF,EAAIlG,EAAMwL,EAAE0L,GAAI,EAAG,GACnB9X,EAAIY,EAAMwL,EAAE4L,GAAI,EAAG,GACzBrU,MAAKqW,EAAM,GAAKlT,EAChBnD,MAAKqW,EAAM,GAAM,EAAIha,EACrB2D,MAAKsW,GAAiB,EACtBtW,MAAKwW,GAAmB,EACxB,MAAOhN,EAAO1I,GAAQd,MAAKrC,EAAMqC,MAAKyW,EAAsBzW,MAAKqW,IAC7D7M,GACF/D,EAAO/F,SAASoB,EACjB,EAGG+V,EAAmBpO,IACvB,MAAMuE,EAAI/P,EAAMwL,EAAE0L,GAAI,EAAG,GACzBnU,MAAKqW,EAAM,GAAKrJ,EAChBhN,MAAKuW,GAAsB,EAC3BvW,MAAKwW,GAAmB,EACxB,MAAOhN,EAAO1I,GAAQd,MAAKrC,EAAMqC,MAAKyW,EAAsBzW,MAAKqW,IAC7D7M,GACF/D,EAAO/F,SAASoB,EACjB,EAGGgW,EAAqBrO,IACzB,MAAMlL,EAAIN,EAAMwL,EAAE0L,GAAI,EAAG,GACzBnU,MAAKqW,EAAM,GAAK9Y,EAChByC,MAAKsW,GAAiB,EACtBtW,MAAKuW,GAAsB,EAC3B,MAAO/M,EAAO1I,GAAQd,MAAKrC,EAAMqC,MAAKyW,EAAsBzW,MAAKqW,IAC7D7M,GACF/D,EAAO/F,SAASoB,EACjB,EAGH4T,GAAe1U,MAAK6V,EAAe,CACjClB,OAAQiC,EACRhC,OAAQgC,IAEVlC,GAAe1U,MAAK+V,EAAY,CAC9BpB,OAAQkC,EACRjC,OAAQiC,IAEVnC,GAAe1U,MAAKkW,EAAc,CAChCvB,OAAQmC,EACRlC,OAAQkC,IAEV9W,KAAKY,WAAW1B,EACjB,CACD8D,cAAclC,GACPd,MAAKqW,IACRrW,MAAKqW,EAAQrW,MAAK0W,EAAsB1W,MAAKvB,EAAIqC,KAEnD,CACE,MAAOkM,EAAG7J,EAAG9G,EAAGkB,EAAI,GAAKyC,MAAK0W,EAAsB1W,MAAKvB,EAAIqC,IAExDd,MAAKsW,IACRtW,MAAKqW,EAAM,GAAKlT,EAAI,MAAS9G,EAAI,KAAQ2Q,EAAIhN,MAAKqW,EAAM,IAErDrW,MAAKuW,IACRvW,MAAKqW,EAAM,GAAKlT,EAChBnD,MAAKqW,EAAM,GAAKha,GAEb2D,MAAKwW,IACRxW,MAAKqW,EAAM,GAAK9Y,EAEnB,CACD,CACE,MAAOyP,EAAG7J,EAAG9G,EAAGkB,GAAKyC,MAAKqW,GACnB5I,EAAKC,EAAKqJ,GAAO1J,GAAkBO,GAAkB5N,MAAKqW,IAE5DrW,MAAKsW,GACRtW,MAAKiW,EAAe1Z,aAAa,YAAa,aAAiB,GAAJyQ,SAE7DhN,MAAKgW,EAAS1a,SAAS,GAAGiB,aAAa,aAAc,OAAa,IAANkR,eAAuBlQ,MACnFyC,MAAKgW,EAAS1a,SAAS,GAAGiB,aAAa,aAAc,OAAa,IAANkR,gBAAwBlQ,MAC/EyC,MAAKwW,GACRxW,MAAKoW,EAAiB7Z,aAAa,YAAa,aAAiB,GAAJgB,SAE/DyC,MAAKmW,EAAW7a,SAAS,GAAGiB,aAAa,aAAc,OAAa,IAANkR,KAAmB,IAANC,MAAoB,IAANqJ,WACzF/W,MAAKmW,EAAW7a,SAAS,GAAGiB,aAAa,aAAc,OAAa,IAANkR,KAAmB,IAANC,MAAoB,IAANqJ,WAEpF/W,MAAKuW,IACRvW,MAAK8V,EAAYvZ,aAAa,KAAM,GAAO,GAAJ4G,GACvCnD,MAAK8V,EAAYvZ,aAAa,KAAM,GAAa,IAAT,EAAIF,IAE/C,CACD2D,MAAKsW,GAAiB,EACtBtW,MAAKuW,GAAsB,EAC3BvW,MAAKwW,GAAmB,CACzB,CACD5V,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtC,MAAOP,YAAYF,GAACA,EAAEd,KAAEA,GAAKkQ,MAAEA,GAAS7N,MAAKd,EAU7C,OATAc,MAAKkW,EAAatS,MAAMoT,QAAUnJ,EAAQ,GAAK,OAC/C7N,MAAKyW,EAAwB5I,EACxBxR,GAAKwP,GAAe+B,GAAkBvR,IACtCA,GAAKsP,GAAc6B,GAAgBnR,IACxC2D,MAAK0W,EAAwB7I,EACxBxR,GAAK8R,GAAkBvC,GAAevP,IACtCA,GAAK0R,GAAgBrC,GAAcrP,IACxC2D,MAAKvB,EAAMA,EACXuB,MAAKrC,EAAQA,EACNqC,IACR,EC5LY,MAAMiX,WAA0B/P,EAC7CgN,GACAgD,GACA1R,GACA2R,IACAjY,GAAW,CACTiU,MAAM,GAGRpT,YAAY6C,EAAQC,EAAU3D,EAAU,CAAA,GACtCsC,MAAMoB,EAAQC,EAAU,8BAOxB7C,MAAKkU,EAAOlU,KAAKT,IAAI,IAAImS,GAAY,MAAO,wBAE5C,MAAMlM,EAAexF,MAAKkU,EAAKjU,QAAQ9E,EAAW,QAAS,CACzD+I,KAAM,WACN1E,SAAU,KACRQ,MAAKd,EAASiU,KAAO3N,EAAaI,QAClC5F,KAAKgD,eAAe,KAGxBhD,MAAKwF,EAAgBA,EACrBxF,MAAKkX,EAAclX,MAAKkU,EAAK3U,IAAI,IAAImS,GAAY,MAAO,2BACxD,MAAMoB,EAAY,IAAIpB,GAAY,MAAO,gDACzC1R,MAAKmX,GAAU,IAAIzF,GAAY,OAC/BoB,EAAUvT,IAAIS,MAAKmX,IACnBnX,KAAKT,IAAIuT,GACT9S,KAAKY,WAAW1B,EACjB,CACDkY,aAAaC,GACPrX,MAAKwF,IACPxF,MAAKwF,EAAc5B,MAAQ,4BACRyT,iCACGA,aAGzB,CACDrU,gBACExB,MAAMwB,gBACN,MAAMmQ,KAACA,GAAQnT,MAAKd,EACpBc,KAAKJ,WAAWtE,SAAS,GAAGmG,UAAUK,OAAO,cAAeqR,GAC5DnT,KAAKJ,WAAWtE,SAAS,GAAGmG,UAAUK,OAAO,iBAAkBqR,EAChE,CACDvS,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtCsC,MAAMZ,WAAW1B,GACjBc,KAAKgD,eACN,CACDsU,OAAO/W,GACL,OAAOP,MAAKkX,EAAY3X,IAAIgB,EAC7B,CACDgX,UAAUhX,GACR,OAAOP,MAAKmX,GAAQ5X,IAAIgB,EACzB,ECxEY,MAAMiX,WAAqBP,GACxChF,GACApI,GACApL,GAEAsB,YAAY6C,EAAQC,EAAU3D,EAAU,CAAA,GACtCsC,MAAMoB,EAAQC,EAAU,wBACxB,MAAMwL,EAASnP,EAAQmP,QAAUI,GAAYzO,KAAKsH,aAC5CzD,MAACA,EAAKqN,KAAEA,GAAQD,GAAsB5C,GAC5CrO,MAAKvB,EAAMoF,EAAMpF,GACjBuB,MAAK6J,EAAY,IAAIY,EAASzK,KAAM,CAACrB,WAAYuS,EAAMrD,MAAOO,GAASC,KACvErO,MAAKiS,EAAa,IAAI2D,GAAiB5V,KAAM,CAACrB,WAAYkF,EAAOgK,MAAOO,GAASC,KACjFrO,KAAKsX,OAAOtX,MAAK6J,GACjB7J,KAAKuX,UAAUvX,MAAKiS,GAEpBjS,KAAKyX,kBAAmB,EACxBzX,KAAKgD,eACN,CACD0U,MACE,GAAI1X,MAAKvB,EAAK,CACZ,MAAMkZ,EAAU3X,MAAKvB,EAAIuB,KAAKsH,YACxBuG,EAA2B,IAAnB8J,EAAQpT,OAAeoT,EAAQ3b,UAAU,EAAG,GAAK,KACzDwQ,EAAMC,GAAcrB,EAAcuM,IACxCnL,EAAI,IAAMA,EAAI,GAAK,IAAM,IACzB,MAAMoL,EAAMvM,EAAc0B,GAAcP,IACxCxM,KAAKoX,aAAa,GAAGO,EAAQ3b,UAAU,EAAG,KAAK6R,IAAS+J,EACzD,CACF,CACD5U,gBACExB,MAAMwB,gBACFhD,KAAKyX,kBACPzX,MAAK0X,IAER,CACD9W,WAAW1B,GAET,OADAsC,MAAMZ,WAAW1B,GACVc,IACR,ECfI,MAAM6X,WAAkB7E,GAC7BzT,IAAIqD,EAAQC,KAAaiV,GACvB,MAAMhV,EAAaF,aAAkBzB,EAC/ByB,EClBH,SAA0BA,EAAQC,KAAaiV,GACpD,MAAOC,GAAQD,EACf,GAAI1S,MAAMC,QAAQ0S,GAChB,OAAO,IAAI3N,EAAOxH,EAAQC,EAAU,CAACmH,UAAW+N,IAElD,GAAIA,GAAQA,EAAK/N,UACf,OAAO,IAAII,EAAOxH,EAAQC,EAAU,CAACmH,UAAW+N,EAAK/N,YAGvD,MAAMY,SAAWhI,EAAOC,GACxB,OAAQ+H,GACN,IAAK,SACH,GAAuB,iBAAZkN,EAAK,IAAsC,iBAAZA,EAAK,GAAiB,CAC9D,MAAM5a,EAAM4a,EAAK,GACX3a,EAAM2a,EAAK,GACXla,EAAOka,EAAK,GAClB,OAAO,IAAItN,EAAM5H,EAAQC,EAAU,CAAC3F,MAAKC,SAASS,GAAQ,CAACA,SAC5D,CACD,OAAuB,IAAhBka,EAAKvT,OACN,IAAIqF,EAAWhH,EAAQC,KAAaiV,GACpC,IAAItN,EAAM5H,EAAQC,KAAaiV,GACvC,IAAK,UACH,OAAO,IAAI/P,EAASnF,EAAQC,KAAaiV,GAC3C,IAAK,WACH,OAAO,IAAI/T,EAAOnB,EAAQC,KAAaiV,GACzC,IAAK,SACH,OAAO,IAAIpN,EAAK9H,EAAQC,KAAaiV,GACvC,IAAK,YACH,MAAM,IAAI3I,MAAM,qBAAqBtM,KACvC,QACE,MAAM,IAAIsM,MAAM,kBAAkBvE,kBAAkB/H,KAE1D,CDbUmV,CAAiBpV,EAAQC,KAAaiV,GAC5C,OAAO9X,KAAK4S,cAAc9P,EAC3B,CACDmV,UAAUhU,GACR,OAAOjE,KAAK4S,cAAc,IAAIjB,GAAO1N,GACtC,CACDiU,SAAStV,EAAQC,EAAU3D,EAAU,CAAA,GACnC,MAAMvD,EAAQiH,EAAOC,GACrB,OAAIuL,GAASlP,EAAQmP,QAAUI,GAAY9S,IAClCqE,KAAK4S,cAAc,IAAI4E,GAAa5U,EAAQC,EAAU3D,IAEtDc,KAAK4S,cAAc,IAAIZ,GAAMpP,EAAQC,EAAU3D,GAEzD,CACDiZ,aACE,OAAOnY,KAAK4S,cAAc,IAAIV,GAC/B,CACDkG,UAAUnU,GACR,OAAOjE,KAAK4S,cAAc,IAAIiF,GAAU5T,GACzC,CACDoU,SAASnH,GACP,OAAOlR,KAAK4S,cAAc,IAAIU,GAAMpC,GACrC,CACDoH,UAAUrU,EAAM7B,GACd,MAAMmW,EAAI,CAACnW,MACX,OAAOpC,KAAKT,IAAIgZ,EAAG,MAAMtU,KAAKA,EAC/B,EAGH,MAAMuU,WAAsBC,YAC1B1Y,cACEyB,QACAxB,KAAK0Y,OAAS1Y,KAAK2Y,aAAa,CAACC,KAAM,QACxC,EAGHC,eAAeC,OAAO,iBAAkBN,IAExC,MAAMO,GAAiB,IAAIC,cAErBC,GAAiB,IAAID,cAE3B,SAASE,GAAsBC,GAC7B,IAAIC,EACAC,EAEJ,SAASC,IACP,GAAIF,IAAWC,EAAe,CAC5B,MAAMlW,EAAIiW,EACVA,OAAS9c,EACT+c,EAAgBF,EAAW/V,QAAQD,GAAGoW,MAAK,KACzCF,OAAgB/c,EAChBgd,GAAa,GAEhB,CACF,CAED,OAAO,SAA0B1e,GAC/Bwe,EAASxe,EACT0e,GACJ,CACA,CAEA,MAAME,GAAkBN,GAAsBH,IACxCU,GAAkBP,GAAsBD,IAE9C,SAASS,GAASzV,GAChB,MAAMlJ,QAAEA,EAASH,IAAK+e,GAAW/e,EAAIE,OAAOmJ,GAC5C,MAAO,GAAGlJ,EAAQ4I,KAAIN,GAAKzI,EAAIyI,KAAIkI,KAAK,yBAAyBoO,GAAU,IAC7E,CAEO,MAAMC,WAAY/B,GACvBgC,kBAAoBlb,EACpBkb,gBAAkB1b,EAClB0b,2BAA6Brb,EAC7Bqb,wBAA0Bnb,EAC1Bmb,sBAAwBhb,EACxBib,IAAmB,IAAId,cAEvBjZ,YAAYb,EAAU,IACpBsC,MAAM,WAAY,eACdtC,aAAmBuZ,cACrBvZ,EAAU,CAACoC,OAAQpC,IAErB,MAAM6a,UACJA,GAAY,EAAI3F,MAChBA,EAAKrN,MACLA,EAAQ,YACN7H,EACJ,IAAIoC,OACFA,GACEpC,EASJ,GAPIkV,IACFpU,KAAKJ,WAAWgE,MAAMwQ,MAAQ,QAAQvF,KAAKuF,GAAS,GAAGA,MAAYA,QAEtD9X,IAAXgF,GAAwByY,IAC1BzY,EAAS9F,SAAS2Z,KAClBnV,KAAKJ,WAAW6B,UAAUlC,IAAI,sBAE5B+B,EAAQ,CACV,MAAM0Y,EAAgB7e,EAAW,kBACjC6e,EAAcC,WAAWC,mBAAqB,CAACla,MAAK8Z,GAAkBf,GAAgBE,IACtFe,EAActB,OAAOjc,YAAYuD,KAAKJ,YACtC0B,EAAO7E,YAAYud,EACpB,CACGjT,GACF/G,KAAK+G,MAAMA,GAEb/G,MAAK8Z,GAAiBK,YAAYvf,EAAIC,SACtCmF,KAAKJ,WAAW6B,UAAUlC,IAAI,SAAU,gBACzC,CACD6a,SAASxf,GACPoF,MAAK8Z,GAAiB1W,QAAQxI,EAC/B,CACDif,qBAAqBjf,GACnB4e,GAAgB5e,EACjB,CACDif,2BACE,OAAOd,EACR,CACDc,qBAAqBjf,GACnB6e,GAAgB7e,EACjB,CACDif,2BACE,OAAOZ,EACR,CACDoB,SAASpW,GACPjE,KAAKoa,SAASV,GAASzV,GACxB,CACD4V,gBAAgB5V,GACd2V,GAAIU,cAAcZ,GAASzV,GAC5B,EE5KH,SAASsP,KACT,CAEA,MAAMgH,GAAgB,CACpBC,UAAW,EAAE,EAAG,GAChBC,WAAY,CAAC,EAAG,GAChBC,QAAS,CAAC,GAAI,GACdC,UAAW,CAAC,EAAG,IAIV,SAASC,GAAkBrf,GAAMoZ,OAACA,EAASpB,GAAIsB,KAAEA,EAAOtB,KAC7D,MAAMsH,EAAU,SAAUpH,GACxB,MAAMqH,EAAOrH,EAAMsH,SAAW,GAAK,GAC5BxG,EAAIC,IAAO+F,GAAc9G,EAAM/X,MAAQ,CAAC,EAAG,IAAIiI,KAAItH,GAAKA,EAAIye,KACzC,YAAfrH,EAAMvP,KAAqByQ,EAASE,GAC5C,CACD3Q,KAAMuP,EAAMvP,KAAKlI,UAAU,GAC3BuY,KACAC,KACAf,SAEN,EAKE,OAHAlY,EAAKW,iBAAiB,UAAW2e,GACjCtf,EAAKW,iBAAiB,QAAS2e,GAExB,WACLtf,EAAK2Z,oBAAoB,UAAW2F,GACpCtf,EAAK2Z,oBAAoB,QAAS2F,EACtC,CACA,CC/BO,SAASG,GAAOC,EAAQC,EAAM,IACnC,IAAKD,EACH,MAAM,IAAI9L,MAAM+L,EAEpB,CCFA,SAASC,GAAwBC,EAAIC,EAAIC,EAAIC,EAAIC,EAAKC,GACpD,MAAMpY,EAAIjG,KAAK0L,IAAIwS,GAAMle,KAAKse,IAAID,GAC5B1d,EAAIX,KAAK0L,IAAIyS,GAAMne,KAAKue,IAAIF,GAElC,MAAO,CACLL,EAAKhe,KAAKse,IAAIF,GAAOnY,EAAIjG,KAAKue,IAAIH,GAAOzd,EACzCsd,EAAKje,KAAKue,IAAIH,GAAOnY,EAAIjG,KAAKse,IAAIF,GAAOzd,EAE7C,CAYO,SAAS6d,GAAIR,EAAIC,EAAIrP,EAAG0H,EAAOmI,GACpCb,GAAO5d,KAAK0L,IAAI4K,EAAQmI,IAAkB,EAAVze,KAAKkL,IACrC0S,GAAOtH,IAAUtW,KAAKkL,IAAMoL,GAAmB,EAAVtW,KAAKkL,IAC1C0S,GAAOtH,GAASmI,GAChBb,GAAOa,IAAQze,KAAKkL,IAAMuT,GAAiB,EAAVze,KAAKkL,IAEtC,MAAMwT,GAAEA,EAAEC,GAAEA,EAAEC,GAAEA,EAAEC,GAAEA,EAAEC,GAAEA,EAAEC,GAAEA,GAhB9B,SAA+Bf,EAAIC,EAAIC,EAAIC,EAAIC,EAAKC,EAAOW,GACzD,MAAON,EAAIC,GAAMZ,GAAwBC,EAAIC,EAAIC,EAAIC,EAAIC,EAAKC,IACvDO,EAAIC,GAAMd,GAAwBC,EAAIC,EAAIC,EAAIC,EAAIC,EAAKC,EAAQW,GAKtE,MAAO,CAAEN,KAAIC,KAAIC,KAAIC,KAAIC,GAHd9e,KAAK0L,IAAIsT,GAAUhf,KAAKkL,GAAK,EAAI,EAGf6T,GAFlBC,EAAS,EAAI,EAAI,EAG9B,CAQqCC,CAAsBjB,EAAIC,EAAIrP,EAAGA,EAAG,EAAG0H,EAAOmI,EAAMnI,GACvF,OAAOtW,KAAK0L,IAAI1L,KAAK0L,IAAI4K,EAAQmI,GAAiB,EAAVze,KAAKkL,IAAUH,OAAO+F,QACzD,IAAIkN,KAAMC,MAAOS,KAAMC,OAAQ/P,KAAKA,OAAOkQ,KAAMC,KAAMH,KAAMC,MAAOb,KAAMC,IAC1E,IAAIS,KAAMC,MAAOD,KAAMC,OAAQ/P,KAAKA,OAAOkQ,KAAMC,KAAMH,KAAMC,GACpE,CCvBA,MAYMK,GAAWjgB,GAAKyB,EAAgBzB,EAAIe,KAAKkL,GAAc,EAAVlL,KAAKkL,IAAUlL,KAAKkL,GAExD,MAAMiU,WAAsB9X,EACzC+X,IACAC,IACAC,IACAC,IACAzd,GAAW,CACTtB,KAAM,EACNV,KAAM,IACNC,IAAM,IAaNyf,QAASxf,KAAKkL,GACduU,OAASzf,KAAKkL,GAadqU,UAAMrgB,EACNqC,WAAYC,GAGdmB,YAAY0F,EAAQvG,EAAU,IAC5B,MAAMkK,EAAcb,IACpB/G,MAAMrG,EAAW,MAAO,CACtBoG,UAAW,oCACXoV,UAzDM,i0BA0DNrN,QAASb,IACPA,EAAEc,iBACF,MAAMrM,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB0J,EAAQQ,EAAYX,EAAG7K,GAC7B,IAAIkf,EAAQ9c,MAAK0c,GAAS9T,EACtB5I,MAAK2c,KACPG,EAAQhf,EAAgBgf,EAAQ5f,EAAKC,EAAMD,GAAOA,GAEpD,MAAM4D,EAAO7D,EAAMS,EAAQof,GAAOzgB,GAAKA,GAAGuB,GAAOV,EAAKC,GACtDsI,EAAO/F,SAASoB,EAAK,KAGzB,MAAMic,EAAetU,IACnB,MAAMvL,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,EAAIgf,OAAEA,EAAMC,OAAEA,GAAU7c,MAAKd,EACxCiV,EAAY,EAAP1L,EAAE0L,GAAS,EAChBE,EAAY,EAAP5L,EAAE4L,GAAS,EAChB9W,EAAIH,KAAK4f,MAAM3I,EAAIF,GAEnB8I,GAAUL,EAASC,GAAU,EAM7B9e,EAAId,GAJYqf,GAAS/e,EAAI0f,GACbX,GAASM,EAASK,KAC3BJ,EAASD,GAEoC,EAAG,GACvD9b,EAAOpD,EAAQR,GAAOC,EAAMD,GAAOa,GAAG1B,GAAKA,GAAGuB,GACpD6H,EAAO/F,SAASoB,EAAK,EAEvB4T,GAAe1U,KAAKJ,WAAY,CAC9B+U,OAAQoI,EACRnI,OAAQmI,IAEVnC,GAAkB5a,KAAKJ,WAAY,CACjC+U,OAASlM,IACP,MAAMvL,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB4B,EAAO7D,EAAMS,EAAQsC,MAAK0c,GAASjU,EAAE8L,GAAK3W,GAAMvB,GAAKA,GAAGuB,GAAOV,EAAKC,GAC1EsI,EAAO/F,SAASoB,EAAK,IAGzBd,MAAKwc,GAAaxc,KAAKgB,EAAE,iBACzBhB,MAAKyc,GAAazc,KAAKgB,EAAE,iBACzBhB,KAAKY,WAAW1B,EACjB,CACD8D,cAAc3G,GACZ2D,MAAK0c,GAASrgB,EACd,MAAMa,IAACA,EAAGC,IAAEA,GAAO6C,MAAKd,EAClBnB,GAAK1B,EAAIa,IAAQC,EAAMD,GACvBggB,GzCpEW3f,EyCoEEyC,MAAKd,EAAS0d,OzCpEbtY,EyCoEqBtE,MAAKd,EAAS2d,OzCpE1Btf,GAAK+G,EAAI/G,GyCoEyBQ,GzCpE/C,IAACR,EAAG+G,EyCqEpBtE,MAAKwc,GAAW5Y,MAAMuZ,UAAY,UAAUD,OAC7C,CACDtc,WAAW1B,GACTlB,EAAuBgC,MAAKd,EAAUA,GACtC,MAAM0d,OAACA,EAAMC,OAAEA,EAAMF,KAAEA,GAAQ3c,MAAKd,EACpCc,MAAK2c,QAAiBrgB,IAATqgB,EACRA,EACAvf,KAAK0L,IAAI8T,EAASC,IAAqB,EAAVzf,KAAKkL,GAASH,OAAO+F,QACvD,MAAOhR,EAAKC,GAAOyf,EAASC,EAAS,CAACD,EAAQC,GAAU,CAACA,EAASD,GAClE5c,MAAKyc,GAAWlgB,aAAa,IAAKqf,GAAI,EAAG,EAAG,MAAO1e,EAAKC,GACzD,EClHY,MAAMigB,WAAkBnG,GACrC/X,GACAa,YAAY6C,EAAQC,EAAU3D,GAC5BsC,MAAMoB,EAAQC,EAAU,oBAC5B7C,MAAKd,EAAWA,EACZc,KAAKsX,OAAO,IAAItO,EAAWhJ,KAC/BpB,IACIoB,KAAKuX,UAAU,IAAIgF,GAAcvc,KAAMd,IACvCc,KAAKgD,eACN,EChBY,MAAMqa,WAAsB5Y,EACzCsF,GAEAhK,YAAY0F,EAAQuE,EAAWsT,EAAO,GACpC,MAAMvT,EAAS,GACT9F,EAAOyC,IACblF,MAAMrG,EAAW,MAAO,CAAA,EAAI6O,EAAUrG,KAAI,EAAEjI,EAAKC,GAAQmB,KACvDiN,EAAOvJ,KAAK7E,GACLR,EAAW,QAAS,GAAI,CAC7BA,EAAW,QAAS,CAClB+I,KAAM,QACND,OACAtI,MAAOmB,EACP0C,SAAU,WACJQ,KAAK4F,SACPH,EAAOI,cAAc0X,GAAKxT,EAAQ/J,KAAKrE,OAE1C,IAEHR,EAAW,SAAU,CACnB+I,KAAM,SACNE,YAAa1I,EACbyI,QAAS,WACPnE,KAAKwd,uBAAuBC,OAC7B,WAKP,MAAMF,EAAOvd,KACbA,MAAK+J,EAAUA,EACf/J,KAAKsd,KAAKA,EACX,CACDta,cAAc3G,GACZ,MAAMS,EAAMkD,MAAK+J,EAAQhN,QAAQV,GACjC,IAAK,IAAImI,EAAI,EAAGA,EAAIxE,KAAKJ,WAAWtE,SAASiJ,SAAUC,EACrDxE,KAAKJ,WAAWtE,SAASkJ,GAAGlJ,SAAS,GAAGsK,QAAUpB,IAAM1H,CAE3D,CACDwgB,KAAKA,GACHtd,KAAKJ,WAAWgE,MAAM8Z,oBAAsB,UAAUJ,SACvD,ECzCY,MAAMK,WAAkBzW,EACrCnH,YAAY6C,EAAQC,EAAU3D,GAC5BsC,MAAMoB,EAAQC,EAAU,qBACxB,MAAMsH,EAA2C,iBAApBnK,KAAKsH,YAEhC0C,UAAWK,EAAciT,KACzBA,EAAO,GACLpe,EACE8K,EAAYE,EAAmBG,EAAgBF,GACrDnK,KAAKT,IAAI,IAAI8d,GAAcrd,KAAMgK,EAAWsT,IAC5Ctd,KAAKgD,eACN,ECfI,SAAS4a,GAASriB,EAAMsiB,GAC7B,IAAIC,gBAAe,KACjBD,EAAS,CAAClK,KAAMpY,EAAKqY,wBAAyBrY,QAAM,IACnDwiB,QAAQxiB,EACb,CAEO,SAASyiB,GAAmBziB,EAAM0iB,EAASC,EAASL,GACzDD,GAASriB,GAAM,EAAEoY,WACf,MAAMS,MAACA,EAAKE,OAAEA,GAAUX,EACxBpY,EAAKgB,aAAa,UAAW,IAAI6X,EAAQ6J,MAAY3J,EAAS4J,KAAW9J,KAASE,KAClFuJ,EAAS,CAACtiB,OAAMoY,QAAM,GAE1B,CC2BA,SAASwK,GAAezK,EAAOmI,EAAKje,EAAMV,EAAKC,EAAKmX,GAClD,MAAMtG,EAAI,GACN0F,EAAQxW,IACVwW,GAAShW,EAAQR,EAAMwW,GAAOrX,GAAKA,GAAGuB,IAExCie,EAAMze,KAAKF,IAAI2e,EAAK1e,GACpB,IAAK,IAAIqH,EAAIkP,EAAOlP,GAAKqX,EAAKrX,GAAK5G,EACjCoQ,EAAExN,KAAK,IAAIgE,UAAU8P,KAEvB,OAAOtG,EAAEzC,KAAK,IAChB,CAyBe,MAAM6S,WAAmB3Z,EACtC4Z,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAvK,IACAE,IACAoI,IACAkC,IACA1f,GAAW,CACThC,KAAM,IACNC,IAAK,IACLS,KAAM,EACNihB,KAAM,GACNC,SAAU,GACVC,aAAc,EACdC,QAAS3iB,GAAKA,EACd4iB,WAAY,EACZC,QAAQ,EACRC,iBAAa7iB,EACb8iB,iBAAa9iB,GAGfyD,YAAY0F,EAAQvG,GAClB,MAAMkK,EAAcb,IAoBpB,IAAI8W,EAnBJ7d,MAAMrG,EAAW,MAAO,CACtBwb,UA/FM,0kDAgGNpV,UAAW,qBACX+H,QAASb,IACPA,EAAEc,iBACF,MAAMrM,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB0J,EAAQQ,EAAYX,EAAG7K,GACvBkD,EAAO7D,EAAMS,EAAQsC,MAAK0c,GAAS9T,GAAOvM,GAAKA,GAAGuB,GAAOV,EAAKC,GACpEsI,EAAO/F,SAASoB,EAAK,KAGzBd,MAAKqe,GAAWre,KAAKgB,EAAE,OACvBhB,MAAKse,GAActe,KAAKgB,EAAE,kBAC1BhB,MAAKue,GAAave,KAAKgB,EAAE,iBACzBhB,MAAKwe,GAAcxe,KAAKgB,EAAE,kBAC1BhB,MAAKye,GAAeze,KAAKgB,EAAE,mBAC3BhB,MAAK0e,GAAgB1e,KAAKgB,EAAE,qBAC5BhB,MAAK2e,GAAiB3e,KAAKgB,EAAE,sBAC7BhB,KAAKY,WAAW1B,GAEhBwV,GAAe1U,KAAKJ,WAAY,CAC9B+U,OAAQ,KACN0K,EAASrf,MAAK0c,EAAM,EAEtB9H,OAASnM,IACP,MAAMvL,IAACA,EAAGC,IAAEA,EAAG2hB,SAAEA,EAAQD,KAAEA,EAAIjhB,KAAEA,GAAQoC,MAAKd,EACxC4B,EAAO7D,EAAMS,EAAQ2hB,EAAS5W,EAAE8L,GAAKuK,EAAWD,GAAMxiB,GAAKA,GAAGuB,GAAOV,EAAKC,GAChFsI,EAAO/F,SAASoB,EAAK,IAGzB8Z,GAAkB5a,KAAKJ,WAAY,CACjC+U,OAASlM,IACP,MAAMvL,IAACA,EAAGC,IAAEA,EAAGS,KAAEA,GAAQoC,MAAKd,EACxB4B,EAAO7D,EAAMS,EAAQsC,MAAK0c,GAASjU,EAAE8L,GAAK3W,GAAMvB,GAAKA,GAAGuB,GAAOV,EAAKC,GAC1EsI,EAAO/F,SAASoB,EAAK,IAGzBkd,GAAmBhe,MAAKqe,GAAU,GAAK,GAAG,EAAE1K,MAAOS,aACjDpU,MAAK0e,GAAcniB,aAAa,KAAM6X,EAAQ,GAC9CpU,MAAK2e,GAAepiB,aAAa,IAAK6X,EAAQ,EAAI,IAClDpU,MAAK4e,GA7EX,SAA4BrjB,GAC1B,MAAM+jB,EAAU/jB,EAAKob,UACrBpb,EAAKob,UAAY,kBACjB,MACMrQ,EADO/K,EAAK2F,cAAc,QACdqe,wBAElB,OADAhkB,EAAKob,UAAY2I,EACVhZ,CACT,CAsEwBkZ,CAAmBxf,MAAKye,IAC1Cze,MAAKoU,GAASA,EACdpU,MAAKyf,IAAe,GAEvB,CAIDA,MAEE,IAAKzf,MAAKoU,SAA0B9X,IAAhB0D,MAAK0c,GACvB,OAEF,MAAMsC,QACJA,EAAOE,OACPA,EAAMhiB,IACNA,EAAGC,IACHA,EAAGiiB,YACHA,EAAWH,WACXA,EAAUF,aACVA,EAAYF,KACZA,EAAIC,SACJA,EAAQK,YACRA,GACEnf,MAAKd,EACHwgB,EAActiB,KAAKuiB,KAAK3f,MAAKoU,GAAS0K,GAEtCc,EADS5f,MAAK0c,GACamC,EAC3BgB,EAAiBziB,KAAKS,MAAM+hB,EAAkBF,GAE9ChM,EAAQmM,EAAiBf,EACzBjD,GAFegE,EAA+B,EAAdH,GAEXZ,EACrBgB,EAAeZ,EAAShiB,EAAM4hB,EAAWD,EAAOnL,EAChDqM,EAAeb,EAAS/hB,EAAM2hB,EAAWD,EAAOhD,EAChDvH,EAAwB,KAAf0K,EAAQ,GAAY,GAAK,EACpCD,EAAe,GACjB/e,MAAKue,GAAWhiB,aAAa,IAAK4hB,GAAezK,EAAOmI,EAAKiD,EAAWC,EAAce,EAAcC,EAAczL,EAAS2K,IAE7Hjf,MAAKwe,GAAY5a,MAAMoc,OAAUb,EACjCnf,MAAKwe,GAAYjiB,aAAa,IAAK4hB,GAAezK,EAAOmI,EAAKiD,EAAUgB,EAAcC,EAAczL,IACpGtU,MAAKye,GAAa9H,UAnItB,SAA0BjD,EAAOmI,EAAKiD,EAAUD,EAAMD,EAAW1hB,EAAKC,EAAK6hB,GACzE,MAAMiB,EAAQ,GACVvM,EAAQxW,IACVwW,GAAShW,EAAQR,EAAMwW,GAAOrX,GAAKA,GAAGyiB,IAExCjD,EAAMze,KAAKF,IAAI2e,EAAK1e,GACpB,MAAM+iB,EAAS9iB,KAAKD,IAAI,GAAIC,KAAK+iB,MAAMtB,IAEvC,IAAK,IAAIra,EAAIkP,EAAOlP,GAAKqX,EAAKrX,GAAKsa,EACjCmB,EAAMzf,KAAK,6DAA6DgE,GAAK,EAAIA,EAAKA,EAAIoa,EAAY,YAF9FviB,EAE8GmI,EAAIsa,EAAWD,EAFxHG,EAAQ3iB,EAAE0O,QAAQmV,cAAvB7jB,MAIV,OAAO4jB,EAAM1U,KAAK,KACpB,CAuHkC6U,CAAiB1M,EAAOmI,EAAKiD,EAAUD,EAAM7e,MAAK4e,GAAYkB,EAAcC,EAAcf,GACxHhf,MAAKse,GAAY/hB,aAAa,YAAa,cAAcyD,MAAK0c,GAASoC,EAAWD,QAClF7e,MAAKqe,GAAS5c,UAAUK,OAAO,mBAAoC,OAAhBsd,EACpD,CACDpc,cAAc3G,GACZ2D,MAAK0c,GAASrgB,EACd2D,MAAKyf,IACN,CACD7e,WAAW1B,GAET,OADAlB,EAAuBgC,MAAKd,EAAUA,GAC/Bc,IACR,EC7LY,MAAMqgB,WAAenZ,EAClCnH,YAAY6C,EAAQC,EAAU3D,EAAU,CAAA,GACtCsC,MAAMoB,EAAQC,EAAU,iBACxB7C,KAAKT,IAAI,IAAI6e,GAAWpe,KAAMd,IAC9Bc,KAAKT,IAAI,IAAIyJ,EAAWhJ,KAAMd,IAC9Bc,KAAKgD,eACN,ECKY,MAAMsd,WAAiB7b,EACpC4Z,IACA7B,IACA1G,GACA4G,IAAS,GAET3c,YAAY0F,GACVjE,MAAMrG,EAAW,MAAO,CACtBwb,UAlBM,0iBAmBNpV,UAAW,sBAEb,MAAMgf,EAAW9X,IACf,MAAM2L,MAACA,EAAKE,OAAEA,GAAUtU,MAAKqe,GAASzK,wBAChCO,EAAY,EAAP1L,EAAE0L,GAAS,EAChBE,EAAY,EAAP5L,EAAE4L,GAAS,EACtB5O,EAAO/F,SAAS,CAACyU,EAAKC,EAAQ,GAAKC,EAAKC,EAAS,IAAK,EAExDI,GAAe1U,KAAKJ,WAAY,CAC9B+U,OAAQ4L,EACR3L,OAAQ2L,IAEVvgB,MAAKqe,GAAWre,KAAKgB,EAAE,OACvBhB,MAAKwc,GAAaxc,KAAKgB,EAAE,iBACzBhB,MAAK8V,EAAc9V,KAAKgB,EAAE,kBAC1Bgd,GAAmBhe,MAAKqe,GAAU,GAAK,IAAK,IAAMre,MAAKwgB,IACxD,CACDA,MACE,MAAO3M,EAAGG,GAAKhU,MAAK0c,GACpB1c,MAAKwc,GAAWjgB,aAAa,IAAK,QAAQsX,KAAKG,KAC/ChU,MAAK8V,EAAYvZ,aAAa,YAAa,aAAasX,MAAMG,KAC/D,CACDhR,cAAc3G,GACZ2D,MAAK0c,GAAO,GAAKrgB,EAAE,GACnB2D,MAAK0c,GAAO,GAAKrgB,EAAE,GACnB2D,MAAKwgB,IACN,ECpCY,MAAMC,WAAaxJ,GAChClX,YAAY6C,EAAQC,GAClBrB,MAAMoB,EAAQC,EAAU,eAExB,MAAM6d,EAAc5jB,IACX,CACL4C,SAAWrD,IACT,MAAMyE,EAAOd,KAAKsH,WAClBxG,EAAKhE,GAAOT,EACZ2D,KAAKN,SAASoB,EAAK,EAErB+E,cAAgBxJ,IACd,MAAMyE,EAAOd,KAAKsH,WAClBxG,EAAKhE,GAAOT,EACZ2D,KAAK6F,cAAc/E,EAAK,IAK9Bd,KAAKsX,OAAO,IAAItO,EAAW0X,EAAW,GAAI,CACxC/hB,WAAY,CACVF,GAAIpC,GAAKA,EAAE,GACXsB,KAAMqK,EAAYrK,SAGtBqC,KAAKsX,OAAO,IAAItO,EAAW0X,EAAW,GAAI,CACxC/hB,WAAY,CACVF,GAAIpC,GAAKA,EAAE,GACXsB,KAAMqK,EAAYrK,SAGtBqC,KAAKuX,UAAU,IAAI+I,GAAStgB,OAC5BA,KAAKgD,eACN,EC/CH,MAAM2d,GAAa,CACjBC,KAAM,QAEFC,GAAc,CAClBD,KAAM,QAGFE,GAAcC,OAAOC,WAAW,gCAEtC,IAAIvd,GACAwd,GAEJ,SAASC,KACPD,GAAaH,GAAYK,QACzB1d,GAASwd,GAAaN,GAAaE,EACrC,CACAC,GAAY5kB,iBAAiB,SAAUglB,IACvCA,KCHa,MAAAE,GAAU,CACrBC,MDIK,SAAexP,EAAQyP,GAAMpkB,IAChCA,GAAM,EAAEC,IACRA,EAAM,EAACokB,SACPA,EAAW,GAAE1d,MACbA,IAEF,MAAM2d,EAAM3P,EAAO4P,WAAW,MAe9BC,aAbA,WACE,MAAMtN,MAACA,EAAKE,OAAEA,GAAUzC,EACxB2P,EAAIG,UAAU,EAAG,EAAGvN,EAAOE,GAC3BkN,EAAII,YACJ,MAAMC,EAAQ1kB,EAAMD,EACpB,IAAK,IAAIsH,EAAI,EAAGA,EAAI8c,EAAK/c,SAAUC,EAAG,CACpC,MAAMqP,EAAIrP,EAAI4P,EAAQkN,EAAK/c,OACrByP,GAAKsN,EAAK9c,GAAKtH,GAAOoX,EAASuN,EACrCL,EAAIM,OAAOjO,EAAGG,EACf,CACDwN,EAAIO,YAAcle,GAASJ,GAAOmd,KAClCY,EAAIxB,QACL,GACmBuB,EACtB,ECzBES,QChBK,SAAiBC,EAAOrf,EAAQC,GAAU0e,SAACA,EAAW,KAAO,IAClEG,aAAY,KACVO,EAAM/Q,KAAKK,KAAK2Q,UAAUtf,EAAOC,GAAW,KAAM,GAAG,GACpD0e,EACL"} \ No newline at end of file diff --git a/dist/0.x/styles/muigui.css.d.ts b/dist/0.x/styles/muigui.css.d.ts index 8ba9894..519c287 100644 --- a/dist/0.x/styles/muigui.css.d.ts +++ b/dist/0.x/styles/muigui.css.d.ts @@ -2,9 +2,29 @@ declare namespace _default { let _default: string; export { _default as default }; export namespace themes { - let _default_1: string; + namespace _default_1 { + let include: string[]; + let css: string; + } export { _default_1 as default }; - export let float: string; + export namespace float { + let include_1: string[]; + export { include_1 as include }; + let css_1: string; + export { css_1 as css }; + } + export namespace form { + let include_2: never[]; + export { include_2 as include }; + let css_2: string; + export { css_2 as css }; + } + export namespace none { + let include_3: never[]; + export { include_3 as include }; + let css_3: string; + export { css_3 as css }; + } } } export default _default; diff --git a/examples/3rdParty/twgl-full.module.js b/examples/3rdParty/twgl-full.module.js new file mode 100644 index 0000000..dd530b7 --- /dev/null +++ b/examples/3rdParty/twgl-full.module.js @@ -0,0 +1,10085 @@ +/* @license twgl.js 5.5.3 Copyright (c) 2015, Gregg Tavares All Rights Reserved. +Available via the MIT license. +see: http://github.com/greggman/twgl.js for details */ +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * + * Vec3 math math functions. + * + * Almost all functions take an optional `dst` argument. If it is not passed in the + * functions will create a new Vec3. In other words you can do this + * + * var v = v3.cross(v1, v2); // Creates a new Vec3 with the cross product of v1 x v2. + * + * or + * + * var v = v3.create(); + * v3.cross(v1, v2, v); // Puts the cross product of v1 x v2 in v + * + * The first style is often easier but depending on where it's used it generates garbage where + * as there is almost never allocation with the second style. + * + * It is always save to pass any vector as the destination. So for example + * + * v3.cross(v1, v2, v1); // Puts the cross product of v1 x v2 in v1 + * + * @module twgl/v3 + */ + +let VecType = Float32Array; + +/** + * A JavaScript array with 3 values or a Float32Array with 3 values. + * When created by the library will create the default type which is `Float32Array` + * but can be set by calling {@link module:twgl/v3.setDefaultType}. + * @typedef {(number[]|Float32Array)} Vec3 + * @memberOf module:twgl/v3 + */ + +/** + * Sets the type this library creates for a Vec3 + * @param {constructor} ctor the constructor for the type. Either `Float32Array` or `Array` + * @return {constructor} previous constructor for Vec3 + * @memberOf module:twgl/v3 + */ +function setDefaultType$1(ctor) { + const oldType = VecType; + VecType = ctor; + return oldType; +} + +/** + * Creates a vec3; may be called with x, y, z to set initial values. + * @param {number} [x] Initial x value. + * @param {number} [y] Initial y value. + * @param {number} [z] Initial z value. + * @return {module:twgl/v3.Vec3} the created vector + * @memberOf module:twgl/v3 + */ +function create$1(x, y, z) { + const dst = new VecType(3); + if (x) { + dst[0] = x; + } + if (y) { + dst[1] = y; + } + if (z) { + dst[2] = z; + } + return dst; +} + +/** + * Adds two vectors; assumes a and b have the same dimension. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} A vector tha tis the sum of a and b. + * @memberOf module:twgl/v3 + */ +function add(a, b, dst) { + dst = dst || new VecType(3); + + dst[0] = a[0] + b[0]; + dst[1] = a[1] + b[1]; + dst[2] = a[2] + b[2]; + + return dst; +} + +/** + * Subtracts two vectors. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} A vector that is the difference of a and b. + * @memberOf module:twgl/v3 + */ +function subtract(a, b, dst) { + dst = dst || new VecType(3); + + dst[0] = a[0] - b[0]; + dst[1] = a[1] - b[1]; + dst[2] = a[2] - b[2]; + + return dst; +} + +/** + * Performs linear interpolation on two vectors. + * Given vectors a and b and interpolation coefficient t, returns + * a + t * (b - a). + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {number} t Interpolation coefficient. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The linear interpolated result. + * @memberOf module:twgl/v3 + */ +function lerp(a, b, t, dst) { + dst = dst || new VecType(3); + + dst[0] = a[0] + t * (b[0] - a[0]); + dst[1] = a[1] + t * (b[1] - a[1]); + dst[2] = a[2] + t * (b[2] - a[2]); + + return dst; +} + +/** + * Performs linear interpolation on two vectors. + * Given vectors a and b and interpolation coefficient vector t, returns + * a + t * (b - a). + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} t Interpolation coefficients vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} the linear interpolated result. + * @memberOf module:twgl/v3 + */ +function lerpV(a, b, t, dst) { + dst = dst || new VecType(3); + + dst[0] = a[0] + t[0] * (b[0] - a[0]); + dst[1] = a[1] + t[1] * (b[1] - a[1]); + dst[2] = a[2] + t[2] * (b[2] - a[2]); + + return dst; +} + +/** + * Return max values of two vectors. + * Given vectors a and b returns + * [max(a[0], b[0]), max(a[1], b[1]), max(a[2], b[2])]. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The max components vector. + * @memberOf module:twgl/v3 + */ +function max(a, b, dst) { + dst = dst || new VecType(3); + + dst[0] = Math.max(a[0], b[0]); + dst[1] = Math.max(a[1], b[1]); + dst[2] = Math.max(a[2], b[2]); + + return dst; +} + +/** + * Return min values of two vectors. + * Given vectors a and b returns + * [min(a[0], b[0]), min(a[1], b[1]), min(a[2], b[2])]. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The min components vector. + * @memberOf module:twgl/v3 + */ +function min(a, b, dst) { + dst = dst || new VecType(3); + + dst[0] = Math.min(a[0], b[0]); + dst[1] = Math.min(a[1], b[1]); + dst[2] = Math.min(a[2], b[2]); + + return dst; +} + +/** + * Multiplies a vector by a scalar. + * @param {module:twgl/v3.Vec3} v The vector. + * @param {number} k The scalar. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The scaled vector. + * @memberOf module:twgl/v3 + */ +function mulScalar(v, k, dst) { + dst = dst || new VecType(3); + + dst[0] = v[0] * k; + dst[1] = v[1] * k; + dst[2] = v[2] * k; + + return dst; +} + +/** + * Divides a vector by a scalar. + * @param {module:twgl/v3.Vec3} v The vector. + * @param {number} k The scalar. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The scaled vector. + * @memberOf module:twgl/v3 + */ +function divScalar(v, k, dst) { + dst = dst || new VecType(3); + + dst[0] = v[0] / k; + dst[1] = v[1] / k; + dst[2] = v[2] / k; + + return dst; +} + +/** + * Computes the cross product of two vectors; assumes both vectors have + * three entries. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The vector of a cross b. + * @memberOf module:twgl/v3 + */ +function cross(a, b, dst) { + dst = dst || new VecType(3); + + const t1 = a[2] * b[0] - a[0] * b[2]; + const t2 = a[0] * b[1] - a[1] * b[0]; + dst[0] = a[1] * b[2] - a[2] * b[1]; + dst[1] = t1; + dst[2] = t2; + + return dst; +} + +/** + * Computes the dot product of two vectors; assumes both vectors have + * three entries. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @return {number} dot product + * @memberOf module:twgl/v3 + */ +function dot(a, b) { + return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]); +} + +/** + * Computes the length of vector + * @param {module:twgl/v3.Vec3} v vector. + * @return {number} length of vector. + * @memberOf module:twgl/v3 + */ +function length$1(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); +} + +/** + * Computes the square of the length of vector + * @param {module:twgl/v3.Vec3} v vector. + * @return {number} square of the length of vector. + * @memberOf module:twgl/v3 + */ +function lengthSq(v) { + return v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; +} + +/** + * Computes the distance between 2 points + * @param {module:twgl/v3.Vec3} a vector. + * @param {module:twgl/v3.Vec3} b vector. + * @return {number} distance between a and b + * @memberOf module:twgl/v3 + */ +function distance(a, b) { + const dx = a[0] - b[0]; + const dy = a[1] - b[1]; + const dz = a[2] - b[2]; + return Math.sqrt(dx * dx + dy * dy + dz * dz); +} + +/** + * Computes the square of the distance between 2 points + * @param {module:twgl/v3.Vec3} a vector. + * @param {module:twgl/v3.Vec3} b vector. + * @return {number} square of the distance between a and b + * @memberOf module:twgl/v3 + */ +function distanceSq(a, b) { + const dx = a[0] - b[0]; + const dy = a[1] - b[1]; + const dz = a[2] - b[2]; + return dx * dx + dy * dy + dz * dz; +} + +/** + * Divides a vector by its Euclidean length and returns the quotient. + * @param {module:twgl/v3.Vec3} a The vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The normalized vector. + * @memberOf module:twgl/v3 + */ +function normalize(a, dst) { + dst = dst || new VecType(3); + + const lenSq = a[0] * a[0] + a[1] * a[1] + a[2] * a[2]; + const len = Math.sqrt(lenSq); + if (len > 0.00001) { + dst[0] = a[0] / len; + dst[1] = a[1] / len; + dst[2] = a[2] / len; + } else { + dst[0] = 0; + dst[1] = 0; + dst[2] = 0; + } + + return dst; +} + +/** + * Negates a vector. + * @param {module:twgl/v3.Vec3} v The vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} -v. + * @memberOf module:twgl/v3 + */ +function negate$1(v, dst) { + dst = dst || new VecType(3); + + dst[0] = -v[0]; + dst[1] = -v[1]; + dst[2] = -v[2]; + + return dst; +} + +/** + * Copies a vector. + * @param {module:twgl/v3.Vec3} v The vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} A copy of v. + * @memberOf module:twgl/v3 + */ +function copy$1(v, dst) { + dst = dst || new VecType(3); + + dst[0] = v[0]; + dst[1] = v[1]; + dst[2] = v[2]; + + return dst; +} + +/** + * Multiplies a vector by another vector (component-wise); assumes a and + * b have the same length. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The vector of products of entries of a and + * b. + * @memberOf module:twgl/v3 + */ +function multiply$1(a, b, dst) { + dst = dst || new VecType(3); + + dst[0] = a[0] * b[0]; + dst[1] = a[1] * b[1]; + dst[2] = a[2] * b[2]; + + return dst; +} + +/** + * Divides a vector by another vector (component-wise); assumes a and + * b have the same length. + * @param {module:twgl/v3.Vec3} a Operand vector. + * @param {module:twgl/v3.Vec3} b Operand vector. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created. + * @return {module:twgl/v3.Vec3} The vector of quotients of entries of a and + * b. + * @memberOf module:twgl/v3 + */ +function divide(a, b, dst) { + dst = dst || new VecType(3); + + dst[0] = a[0] / b[0]; + dst[1] = a[1] / b[1]; + dst[2] = a[2] / b[2]; + + return dst; +} + +var v3 = /*#__PURE__*/Object.freeze({ + __proto__: null, + add: add, + copy: copy$1, + create: create$1, + cross: cross, + distance: distance, + distanceSq: distanceSq, + divide: divide, + divScalar: divScalar, + dot: dot, + lerp: lerp, + lerpV: lerpV, + length: length$1, + lengthSq: lengthSq, + max: max, + min: min, + mulScalar: mulScalar, + multiply: multiply$1, + negate: negate$1, + normalize: normalize, + setDefaultType: setDefaultType$1, + subtract: subtract +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * 4x4 Matrix math math functions. + * + * Almost all functions take an optional `dst` argument. If it is not passed in the + * functions will create a new matrix. In other words you can do this + * + * const mat = m4.translation([1, 2, 3]); // Creates a new translation matrix + * + * or + * + * const mat = m4.create(); + * m4.translation([1, 2, 3], mat); // Puts translation matrix in mat. + * + * The first style is often easier but depending on where it's used it generates garbage where + * as there is almost never allocation with the second style. + * + * It is always save to pass any matrix as the destination. So for example + * + * const mat = m4.identity(); + * const trans = m4.translation([1, 2, 3]); + * m4.multiply(mat, trans, mat); // Multiplies mat * trans and puts result in mat. + * + * @module twgl/m4 + */ +let MatType = Float32Array; + +/** + * A JavaScript array with 16 values or a Float32Array with 16 values. + * When created by the library will create the default type which is `Float32Array` + * but can be set by calling {@link module:twgl/m4.setDefaultType}. + * @typedef {(number[]|Float32Array)} Mat4 + * @memberOf module:twgl/m4 + */ + +/** + * Sets the type this library creates for a Mat4 + * @param {constructor} ctor the constructor for the type. Either `Float32Array` or `Array` + * @return {constructor} previous constructor for Mat4 + * @memberOf module:twgl/m4 + */ +function setDefaultType(ctor) { + const oldType = MatType; + MatType = ctor; + return oldType; +} + +/** + * Negates a matrix. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} -m. + * @memberOf module:twgl/m4 + */ +function negate(m, dst) { + dst = dst || new MatType(16); + + dst[ 0] = -m[ 0]; + dst[ 1] = -m[ 1]; + dst[ 2] = -m[ 2]; + dst[ 3] = -m[ 3]; + dst[ 4] = -m[ 4]; + dst[ 5] = -m[ 5]; + dst[ 6] = -m[ 6]; + dst[ 7] = -m[ 7]; + dst[ 8] = -m[ 8]; + dst[ 9] = -m[ 9]; + dst[10] = -m[10]; + dst[11] = -m[11]; + dst[12] = -m[12]; + dst[13] = -m[13]; + dst[14] = -m[14]; + dst[15] = -m[15]; + + return dst; +} + +/** + * Creates a matrix. + * @return {module:twgl/m4.Mat4} A new matrix. + * @memberOf module:twgl/m4 + */ +function create() { + return new MatType(16).fill(0); +} + +/** + * Copies a matrix. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/m4.Mat4} [dst] The matrix. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} A copy of m. + * @memberOf module:twgl/m4 + */ +function copy(m, dst) { + dst = dst || new MatType(16); + + dst[ 0] = m[ 0]; + dst[ 1] = m[ 1]; + dst[ 2] = m[ 2]; + dst[ 3] = m[ 3]; + dst[ 4] = m[ 4]; + dst[ 5] = m[ 5]; + dst[ 6] = m[ 6]; + dst[ 7] = m[ 7]; + dst[ 8] = m[ 8]; + dst[ 9] = m[ 9]; + dst[10] = m[10]; + dst[11] = m[11]; + dst[12] = m[12]; + dst[13] = m[13]; + dst[14] = m[14]; + dst[15] = m[15]; + + return dst; +} + +/** + * Creates an n-by-n identity matrix. + * + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} An n-by-n identity matrix. + * @memberOf module:twgl/m4 + */ +function identity(dst) { + dst = dst || new MatType(16); + + dst[ 0] = 1; + dst[ 1] = 0; + dst[ 2] = 0; + dst[ 3] = 0; + dst[ 4] = 0; + dst[ 5] = 1; + dst[ 6] = 0; + dst[ 7] = 0; + dst[ 8] = 0; + dst[ 9] = 0; + dst[10] = 1; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + + return dst; +} + +/** + * Takes the transpose of a matrix. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The transpose of m. + * @memberOf module:twgl/m4 + */ + function transpose(m, dst) { + dst = dst || new MatType(16); + if (dst === m) { + let t; + + t = m[1]; + m[1] = m[4]; + m[4] = t; + + t = m[2]; + m[2] = m[8]; + m[8] = t; + + t = m[3]; + m[3] = m[12]; + m[12] = t; + + t = m[6]; + m[6] = m[9]; + m[9] = t; + + t = m[7]; + m[7] = m[13]; + m[13] = t; + + t = m[11]; + m[11] = m[14]; + m[14] = t; + return dst; + } + + const m00 = m[0 * 4 + 0]; + const m01 = m[0 * 4 + 1]; + const m02 = m[0 * 4 + 2]; + const m03 = m[0 * 4 + 3]; + const m10 = m[1 * 4 + 0]; + const m11 = m[1 * 4 + 1]; + const m12 = m[1 * 4 + 2]; + const m13 = m[1 * 4 + 3]; + const m20 = m[2 * 4 + 0]; + const m21 = m[2 * 4 + 1]; + const m22 = m[2 * 4 + 2]; + const m23 = m[2 * 4 + 3]; + const m30 = m[3 * 4 + 0]; + const m31 = m[3 * 4 + 1]; + const m32 = m[3 * 4 + 2]; + const m33 = m[3 * 4 + 3]; + + dst[ 0] = m00; + dst[ 1] = m10; + dst[ 2] = m20; + dst[ 3] = m30; + dst[ 4] = m01; + dst[ 5] = m11; + dst[ 6] = m21; + dst[ 7] = m31; + dst[ 8] = m02; + dst[ 9] = m12; + dst[10] = m22; + dst[11] = m32; + dst[12] = m03; + dst[13] = m13; + dst[14] = m23; + dst[15] = m33; + + return dst; +} + +/** + * Computes the inverse of a 4-by-4 matrix. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The inverse of m. + * @memberOf module:twgl/m4 + */ +function inverse(m, dst) { + dst = dst || new MatType(16); + + const m00 = m[0 * 4 + 0]; + const m01 = m[0 * 4 + 1]; + const m02 = m[0 * 4 + 2]; + const m03 = m[0 * 4 + 3]; + const m10 = m[1 * 4 + 0]; + const m11 = m[1 * 4 + 1]; + const m12 = m[1 * 4 + 2]; + const m13 = m[1 * 4 + 3]; + const m20 = m[2 * 4 + 0]; + const m21 = m[2 * 4 + 1]; + const m22 = m[2 * 4 + 2]; + const m23 = m[2 * 4 + 3]; + const m30 = m[3 * 4 + 0]; + const m31 = m[3 * 4 + 1]; + const m32 = m[3 * 4 + 2]; + const m33 = m[3 * 4 + 3]; + const tmp_0 = m22 * m33; + const tmp_1 = m32 * m23; + const tmp_2 = m12 * m33; + const tmp_3 = m32 * m13; + const tmp_4 = m12 * m23; + const tmp_5 = m22 * m13; + const tmp_6 = m02 * m33; + const tmp_7 = m32 * m03; + const tmp_8 = m02 * m23; + const tmp_9 = m22 * m03; + const tmp_10 = m02 * m13; + const tmp_11 = m12 * m03; + const tmp_12 = m20 * m31; + const tmp_13 = m30 * m21; + const tmp_14 = m10 * m31; + const tmp_15 = m30 * m11; + const tmp_16 = m10 * m21; + const tmp_17 = m20 * m11; + const tmp_18 = m00 * m31; + const tmp_19 = m30 * m01; + const tmp_20 = m00 * m21; + const tmp_21 = m20 * m01; + const tmp_22 = m00 * m11; + const tmp_23 = m10 * m01; + + const t0 = (tmp_0 * m11 + tmp_3 * m21 + tmp_4 * m31) - + (tmp_1 * m11 + tmp_2 * m21 + tmp_5 * m31); + const t1 = (tmp_1 * m01 + tmp_6 * m21 + tmp_9 * m31) - + (tmp_0 * m01 + tmp_7 * m21 + tmp_8 * m31); + const t2 = (tmp_2 * m01 + tmp_7 * m11 + tmp_10 * m31) - + (tmp_3 * m01 + tmp_6 * m11 + tmp_11 * m31); + const t3 = (tmp_5 * m01 + tmp_8 * m11 + tmp_11 * m21) - + (tmp_4 * m01 + tmp_9 * m11 + tmp_10 * m21); + + const d = 1.0 / (m00 * t0 + m10 * t1 + m20 * t2 + m30 * t3); + + dst[ 0] = d * t0; + dst[ 1] = d * t1; + dst[ 2] = d * t2; + dst[ 3] = d * t3; + dst[ 4] = d * ((tmp_1 * m10 + tmp_2 * m20 + tmp_5 * m30) - + (tmp_0 * m10 + tmp_3 * m20 + tmp_4 * m30)); + dst[ 5] = d * ((tmp_0 * m00 + tmp_7 * m20 + tmp_8 * m30) - + (tmp_1 * m00 + tmp_6 * m20 + tmp_9 * m30)); + dst[ 6] = d * ((tmp_3 * m00 + tmp_6 * m10 + tmp_11 * m30) - + (tmp_2 * m00 + tmp_7 * m10 + tmp_10 * m30)); + dst[ 7] = d * ((tmp_4 * m00 + tmp_9 * m10 + tmp_10 * m20) - + (tmp_5 * m00 + tmp_8 * m10 + tmp_11 * m20)); + dst[ 8] = d * ((tmp_12 * m13 + tmp_15 * m23 + tmp_16 * m33) - + (tmp_13 * m13 + tmp_14 * m23 + tmp_17 * m33)); + dst[ 9] = d * ((tmp_13 * m03 + tmp_18 * m23 + tmp_21 * m33) - + (tmp_12 * m03 + tmp_19 * m23 + tmp_20 * m33)); + dst[10] = d * ((tmp_14 * m03 + tmp_19 * m13 + tmp_22 * m33) - + (tmp_15 * m03 + tmp_18 * m13 + tmp_23 * m33)); + dst[11] = d * ((tmp_17 * m03 + tmp_20 * m13 + tmp_23 * m23) - + (tmp_16 * m03 + tmp_21 * m13 + tmp_22 * m23)); + dst[12] = d * ((tmp_14 * m22 + tmp_17 * m32 + tmp_13 * m12) - + (tmp_16 * m32 + tmp_12 * m12 + tmp_15 * m22)); + dst[13] = d * ((tmp_20 * m32 + tmp_12 * m02 + tmp_19 * m22) - + (tmp_18 * m22 + tmp_21 * m32 + tmp_13 * m02)); + dst[14] = d * ((tmp_18 * m12 + tmp_23 * m32 + tmp_15 * m02) - + (tmp_22 * m32 + tmp_14 * m02 + tmp_19 * m12)); + dst[15] = d * ((tmp_22 * m22 + tmp_16 * m02 + tmp_21 * m12) - + (tmp_20 * m12 + tmp_23 * m22 + tmp_17 * m02)); + + return dst; +} + +/** + * Multiplies two 4-by-4 matrices with a on the left and b on the right + * @param {module:twgl/m4.Mat4} a The matrix on the left. + * @param {module:twgl/m4.Mat4} b The matrix on the right. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The matrix product of a and b. + * @memberOf module:twgl/m4 + */ +function multiply(a, b, dst) { + dst = dst || new MatType(16); + + const a00 = a[0]; + const a01 = a[1]; + const a02 = a[2]; + const a03 = a[3]; + const a10 = a[ 4 + 0]; + const a11 = a[ 4 + 1]; + const a12 = a[ 4 + 2]; + const a13 = a[ 4 + 3]; + const a20 = a[ 8 + 0]; + const a21 = a[ 8 + 1]; + const a22 = a[ 8 + 2]; + const a23 = a[ 8 + 3]; + const a30 = a[12 + 0]; + const a31 = a[12 + 1]; + const a32 = a[12 + 2]; + const a33 = a[12 + 3]; + const b00 = b[0]; + const b01 = b[1]; + const b02 = b[2]; + const b03 = b[3]; + const b10 = b[ 4 + 0]; + const b11 = b[ 4 + 1]; + const b12 = b[ 4 + 2]; + const b13 = b[ 4 + 3]; + const b20 = b[ 8 + 0]; + const b21 = b[ 8 + 1]; + const b22 = b[ 8 + 2]; + const b23 = b[ 8 + 3]; + const b30 = b[12 + 0]; + const b31 = b[12 + 1]; + const b32 = b[12 + 2]; + const b33 = b[12 + 3]; + + dst[ 0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03; + dst[ 1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03; + dst[ 2] = a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03; + dst[ 3] = a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03; + dst[ 4] = a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13; + dst[ 5] = a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13; + dst[ 6] = a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13; + dst[ 7] = a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13; + dst[ 8] = a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23; + dst[ 9] = a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23; + dst[10] = a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23; + dst[11] = a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23; + dst[12] = a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33; + dst[13] = a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33; + dst[14] = a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33; + dst[15] = a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33; + + return dst; +} + +/** + * Sets the translation component of a 4-by-4 matrix to the given + * vector. + * @param {module:twgl/m4.Mat4} a The matrix. + * @param {module:twgl/v3.Vec3} v The vector. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The matrix with translation set. + * @memberOf module:twgl/m4 + */ +function setTranslation(a, v, dst) { + dst = dst || identity(); + if (a !== dst) { + dst[ 0] = a[ 0]; + dst[ 1] = a[ 1]; + dst[ 2] = a[ 2]; + dst[ 3] = a[ 3]; + dst[ 4] = a[ 4]; + dst[ 5] = a[ 5]; + dst[ 6] = a[ 6]; + dst[ 7] = a[ 7]; + dst[ 8] = a[ 8]; + dst[ 9] = a[ 9]; + dst[10] = a[10]; + dst[11] = a[11]; + } + dst[12] = v[0]; + dst[13] = v[1]; + dst[14] = v[2]; + dst[15] = 1; + return dst; +} + +/** + * Returns the translation component of a 4-by-4 matrix as a vector with 3 + * entries. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not passed a new one is created. + * @return {module:twgl/v3.Vec3} The translation component of m. + * @memberOf module:twgl/m4 + */ +function getTranslation(m, dst) { + dst = dst || create$1(); + dst[0] = m[12]; + dst[1] = m[13]; + dst[2] = m[14]; + return dst; +} + +/** + * Returns an axis of a 4x4 matrix as a vector with 3 entries + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {number} axis The axis 0 = x, 1 = y, 2 = z; + * @return {module:twgl/v3.Vec3} [dst] vector. + * @return {module:twgl/v3.Vec3} The axis component of m. + * @memberOf module:twgl/m4 + */ +function getAxis(m, axis, dst) { + dst = dst || create$1(); + const off = axis * 4; + dst[0] = m[off + 0]; + dst[1] = m[off + 1]; + dst[2] = m[off + 2]; + return dst; +} + +/** + * Sets an axis of a 4x4 matrix as a vector with 3 entries + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/v3.Vec3} v the axis vector + * @param {number} axis The axis 0 = x, 1 = y, 2 = z; + * @param {module:twgl/m4.Mat4} [dst] The matrix to set. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The matrix with axis set. + * @memberOf module:twgl/m4 + */ +function setAxis(a, v, axis, dst) { + if (dst !== a) { + dst = copy(a, dst); + } + const off = axis * 4; + dst[off + 0] = v[0]; + dst[off + 1] = v[1]; + dst[off + 2] = v[2]; + return dst; +} + +/** + * Computes a 4-by-4 perspective transformation matrix given the angular height + * of the frustum, the aspect ratio, and the near and far clipping planes. The + * arguments define a frustum extending in the negative z direction. The given + * angle is the vertical angle of the frustum, and the horizontal angle is + * determined to produce the given aspect ratio. The arguments near and far are + * the distances to the near and far clipping planes. Note that near and far + * are not z coordinates, but rather they are distances along the negative + * z-axis. The matrix generated sends the viewing frustum to the unit box. + * We assume a unit box extending from -1 to 1 in the x and y dimensions and + * from 0 to 1 in the z dimension. + * @param {number} fieldOfViewYInRadians The camera angle from top to bottom (in radians). + * @param {number} aspect The aspect ratio width / height. + * @param {number} zNear The depth (negative z coordinate) + * of the near clipping plane. + * @param {number} zFar The depth (negative z coordinate) + * of the far clipping plane. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The perspective matrix. + * @memberOf module:twgl/m4 + */ +function perspective(fieldOfViewYInRadians, aspect, zNear, zFar, dst) { + dst = dst || new MatType(16); + + const f = Math.tan(Math.PI * 0.5 - 0.5 * fieldOfViewYInRadians); + const rangeInv = 1.0 / (zNear - zFar); + + dst[0] = f / aspect; + dst[1] = 0; + dst[2] = 0; + dst[3] = 0; + + dst[4] = 0; + dst[5] = f; + dst[6] = 0; + dst[7] = 0; + + dst[8] = 0; + dst[9] = 0; + dst[10] = (zNear + zFar) * rangeInv; + dst[11] = -1; + + dst[12] = 0; + dst[13] = 0; + dst[14] = zNear * zFar * rangeInv * 2; + dst[15] = 0; + + return dst; +} + +/** + * Computes a 4-by-4 orthogonal transformation matrix given the left, right, + * bottom, and top dimensions of the near clipping plane as well as the + * near and far clipping plane distances. + * @param {number} left Left side of the near clipping plane viewport. + * @param {number} right Right side of the near clipping plane viewport. + * @param {number} bottom Bottom of the near clipping plane viewport. + * @param {number} top Top of the near clipping plane viewport. + * @param {number} near The depth (negative z coordinate) + * of the near clipping plane. + * @param {number} far The depth (negative z coordinate) + * of the far clipping plane. + * @param {module:twgl/m4.Mat4} [dst] Output matrix. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The perspective matrix. + * @memberOf module:twgl/m4 + */ +function ortho(left, right, bottom, top, near, far, dst) { + dst = dst || new MatType(16); + + dst[0] = 2 / (right - left); + dst[1] = 0; + dst[2] = 0; + dst[3] = 0; + + dst[4] = 0; + dst[5] = 2 / (top - bottom); + dst[6] = 0; + dst[7] = 0; + + dst[8] = 0; + dst[9] = 0; + dst[10] = 2 / (near - far); + dst[11] = 0; + + dst[12] = (right + left) / (left - right); + dst[13] = (top + bottom) / (bottom - top); + dst[14] = (far + near) / (near - far); + dst[15] = 1; + + return dst; +} + +/** + * Computes a 4-by-4 perspective transformation matrix given the left, right, + * top, bottom, near and far clipping planes. The arguments define a frustum + * extending in the negative z direction. The arguments near and far are the + * distances to the near and far clipping planes. Note that near and far are not + * z coordinates, but rather they are distances along the negative z-axis. The + * matrix generated sends the viewing frustum to the unit box. We assume a unit + * box extending from -1 to 1 in the x and y dimensions and from 0 to 1 in the z + * dimension. + * @param {number} left The x coordinate of the left plane of the box. + * @param {number} right The x coordinate of the right plane of the box. + * @param {number} bottom The y coordinate of the bottom plane of the box. + * @param {number} top The y coordinate of the right plane of the box. + * @param {number} near The negative z coordinate of the near plane of the box. + * @param {number} far The negative z coordinate of the far plane of the box. + * @param {module:twgl/m4.Mat4} [dst] Output matrix. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The perspective projection matrix. + * @memberOf module:twgl/m4 + */ +function frustum(left, right, bottom, top, near, far, dst) { + dst = dst || new MatType(16); + + const dx = (right - left); + const dy = (top - bottom); + const dz = (near - far); + + dst[ 0] = 2 * near / dx; + dst[ 1] = 0; + dst[ 2] = 0; + dst[ 3] = 0; + dst[ 4] = 0; + dst[ 5] = 2 * near / dy; + dst[ 6] = 0; + dst[ 7] = 0; + dst[ 8] = (left + right) / dx; + dst[ 9] = (top + bottom) / dy; + dst[10] = far / dz; + dst[11] = -1; + dst[12] = 0; + dst[13] = 0; + dst[14] = near * far / dz; + dst[15] = 0; + + return dst; +} + +let xAxis; +let yAxis; +let zAxis; + +/** + * Computes a 4-by-4 look-at transformation. + * + * This is a matrix which positions the camera itself. If you want + * a view matrix (a matrix which moves things in front of the camera) + * take the inverse of this. + * + * @param {module:twgl/v3.Vec3} eye The position of the eye. + * @param {module:twgl/v3.Vec3} target The position meant to be viewed. + * @param {module:twgl/v3.Vec3} up A vector pointing up. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The look-at matrix. + * @memberOf module:twgl/m4 + */ +function lookAt(eye, target, up, dst) { + dst = dst || new MatType(16); + + xAxis = xAxis || create$1(); + yAxis = yAxis || create$1(); + zAxis = zAxis || create$1(); + + normalize( + subtract(eye, target, zAxis), zAxis); + normalize(cross(up, zAxis, xAxis), xAxis); + normalize(cross(zAxis, xAxis, yAxis), yAxis); + + dst[ 0] = xAxis[0]; + dst[ 1] = xAxis[1]; + dst[ 2] = xAxis[2]; + dst[ 3] = 0; + dst[ 4] = yAxis[0]; + dst[ 5] = yAxis[1]; + dst[ 6] = yAxis[2]; + dst[ 7] = 0; + dst[ 8] = zAxis[0]; + dst[ 9] = zAxis[1]; + dst[10] = zAxis[2]; + dst[11] = 0; + dst[12] = eye[0]; + dst[13] = eye[1]; + dst[14] = eye[2]; + dst[15] = 1; + + return dst; +} + +/** + * Creates a 4-by-4 matrix which translates by the given vector v. + * @param {module:twgl/v3.Vec3} v The vector by + * which to translate. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The translation matrix. + * @memberOf module:twgl/m4 + */ +function translation(v, dst) { + dst = dst || new MatType(16); + + dst[ 0] = 1; + dst[ 1] = 0; + dst[ 2] = 0; + dst[ 3] = 0; + dst[ 4] = 0; + dst[ 5] = 1; + dst[ 6] = 0; + dst[ 7] = 0; + dst[ 8] = 0; + dst[ 9] = 0; + dst[10] = 1; + dst[11] = 0; + dst[12] = v[0]; + dst[13] = v[1]; + dst[14] = v[2]; + dst[15] = 1; + return dst; +} + +/** + * Translates the given 4-by-4 matrix by the given vector v. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/v3.Vec3} v The vector by + * which to translate. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The translated matrix. + * @memberOf module:twgl/m4 + */ +function translate(m, v, dst) { + dst = dst || new MatType(16); + + const v0 = v[0]; + const v1 = v[1]; + const v2 = v[2]; + const m00 = m[0]; + const m01 = m[1]; + const m02 = m[2]; + const m03 = m[3]; + const m10 = m[1 * 4 + 0]; + const m11 = m[1 * 4 + 1]; + const m12 = m[1 * 4 + 2]; + const m13 = m[1 * 4 + 3]; + const m20 = m[2 * 4 + 0]; + const m21 = m[2 * 4 + 1]; + const m22 = m[2 * 4 + 2]; + const m23 = m[2 * 4 + 3]; + const m30 = m[3 * 4 + 0]; + const m31 = m[3 * 4 + 1]; + const m32 = m[3 * 4 + 2]; + const m33 = m[3 * 4 + 3]; + + if (m !== dst) { + dst[ 0] = m00; + dst[ 1] = m01; + dst[ 2] = m02; + dst[ 3] = m03; + dst[ 4] = m10; + dst[ 5] = m11; + dst[ 6] = m12; + dst[ 7] = m13; + dst[ 8] = m20; + dst[ 9] = m21; + dst[10] = m22; + dst[11] = m23; + } + + dst[12] = m00 * v0 + m10 * v1 + m20 * v2 + m30; + dst[13] = m01 * v0 + m11 * v1 + m21 * v2 + m31; + dst[14] = m02 * v0 + m12 * v1 + m22 * v2 + m32; + dst[15] = m03 * v0 + m13 * v1 + m23 * v2 + m33; + + return dst; +} + +/** + * Creates a 4-by-4 matrix which rotates around the x-axis by the given angle. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The rotation matrix. + * @memberOf module:twgl/m4 + */ +function rotationX(angleInRadians, dst) { + dst = dst || new MatType(16); + + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + + dst[ 0] = 1; + dst[ 1] = 0; + dst[ 2] = 0; + dst[ 3] = 0; + dst[ 4] = 0; + dst[ 5] = c; + dst[ 6] = s; + dst[ 7] = 0; + dst[ 8] = 0; + dst[ 9] = -s; + dst[10] = c; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + + return dst; +} + +/** + * Rotates the given 4-by-4 matrix around the x-axis by the given + * angle. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The rotated matrix. + * @memberOf module:twgl/m4 + */ +function rotateX(m, angleInRadians, dst) { + dst = dst || new MatType(16); + + const m10 = m[4]; + const m11 = m[5]; + const m12 = m[6]; + const m13 = m[7]; + const m20 = m[8]; + const m21 = m[9]; + const m22 = m[10]; + const m23 = m[11]; + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + + dst[4] = c * m10 + s * m20; + dst[5] = c * m11 + s * m21; + dst[6] = c * m12 + s * m22; + dst[7] = c * m13 + s * m23; + dst[8] = c * m20 - s * m10; + dst[9] = c * m21 - s * m11; + dst[10] = c * m22 - s * m12; + dst[11] = c * m23 - s * m13; + + if (m !== dst) { + dst[ 0] = m[ 0]; + dst[ 1] = m[ 1]; + dst[ 2] = m[ 2]; + dst[ 3] = m[ 3]; + dst[12] = m[12]; + dst[13] = m[13]; + dst[14] = m[14]; + dst[15] = m[15]; + } + + return dst; +} + +/** + * Creates a 4-by-4 matrix which rotates around the y-axis by the given angle. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The rotation matrix. + * @memberOf module:twgl/m4 + */ +function rotationY(angleInRadians, dst) { + dst = dst || new MatType(16); + + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + + dst[ 0] = c; + dst[ 1] = 0; + dst[ 2] = -s; + dst[ 3] = 0; + dst[ 4] = 0; + dst[ 5] = 1; + dst[ 6] = 0; + dst[ 7] = 0; + dst[ 8] = s; + dst[ 9] = 0; + dst[10] = c; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + + return dst; +} + +/** + * Rotates the given 4-by-4 matrix around the y-axis by the given + * angle. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The rotated matrix. + * @memberOf module:twgl/m4 + */ +function rotateY(m, angleInRadians, dst) { + dst = dst || new MatType(16); + + const m00 = m[0 * 4 + 0]; + const m01 = m[0 * 4 + 1]; + const m02 = m[0 * 4 + 2]; + const m03 = m[0 * 4 + 3]; + const m20 = m[2 * 4 + 0]; + const m21 = m[2 * 4 + 1]; + const m22 = m[2 * 4 + 2]; + const m23 = m[2 * 4 + 3]; + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + + dst[ 0] = c * m00 - s * m20; + dst[ 1] = c * m01 - s * m21; + dst[ 2] = c * m02 - s * m22; + dst[ 3] = c * m03 - s * m23; + dst[ 8] = c * m20 + s * m00; + dst[ 9] = c * m21 + s * m01; + dst[10] = c * m22 + s * m02; + dst[11] = c * m23 + s * m03; + + if (m !== dst) { + dst[ 4] = m[ 4]; + dst[ 5] = m[ 5]; + dst[ 6] = m[ 6]; + dst[ 7] = m[ 7]; + dst[12] = m[12]; + dst[13] = m[13]; + dst[14] = m[14]; + dst[15] = m[15]; + } + + return dst; +} + +/** + * Creates a 4-by-4 matrix which rotates around the z-axis by the given angle. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The rotation matrix. + * @memberOf module:twgl/m4 + */ +function rotationZ(angleInRadians, dst) { + dst = dst || new MatType(16); + + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + + dst[ 0] = c; + dst[ 1] = s; + dst[ 2] = 0; + dst[ 3] = 0; + dst[ 4] = -s; + dst[ 5] = c; + dst[ 6] = 0; + dst[ 7] = 0; + dst[ 8] = 0; + dst[ 9] = 0; + dst[10] = 1; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + + return dst; +} + +/** + * Rotates the given 4-by-4 matrix around the z-axis by the given + * angle. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The rotated matrix. + * @memberOf module:twgl/m4 + */ +function rotateZ(m, angleInRadians, dst) { + dst = dst || new MatType(16); + + const m00 = m[0 * 4 + 0]; + const m01 = m[0 * 4 + 1]; + const m02 = m[0 * 4 + 2]; + const m03 = m[0 * 4 + 3]; + const m10 = m[1 * 4 + 0]; + const m11 = m[1 * 4 + 1]; + const m12 = m[1 * 4 + 2]; + const m13 = m[1 * 4 + 3]; + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + + dst[ 0] = c * m00 + s * m10; + dst[ 1] = c * m01 + s * m11; + dst[ 2] = c * m02 + s * m12; + dst[ 3] = c * m03 + s * m13; + dst[ 4] = c * m10 - s * m00; + dst[ 5] = c * m11 - s * m01; + dst[ 6] = c * m12 - s * m02; + dst[ 7] = c * m13 - s * m03; + + if (m !== dst) { + dst[ 8] = m[ 8]; + dst[ 9] = m[ 9]; + dst[10] = m[10]; + dst[11] = m[11]; + dst[12] = m[12]; + dst[13] = m[13]; + dst[14] = m[14]; + dst[15] = m[15]; + } + + return dst; +} + +/** + * Creates a 4-by-4 matrix which rotates around the given axis by the given + * angle. + * @param {module:twgl/v3.Vec3} axis The axis + * about which to rotate. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} A matrix which rotates angle radians + * around the axis. + * @memberOf module:twgl/m4 + */ +function axisRotation(axis, angleInRadians, dst) { + dst = dst || new MatType(16); + + let x = axis[0]; + let y = axis[1]; + let z = axis[2]; + const n = Math.sqrt(x * x + y * y + z * z); + x /= n; + y /= n; + z /= n; + const xx = x * x; + const yy = y * y; + const zz = z * z; + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + const oneMinusCosine = 1 - c; + + dst[ 0] = xx + (1 - xx) * c; + dst[ 1] = x * y * oneMinusCosine + z * s; + dst[ 2] = x * z * oneMinusCosine - y * s; + dst[ 3] = 0; + dst[ 4] = x * y * oneMinusCosine - z * s; + dst[ 5] = yy + (1 - yy) * c; + dst[ 6] = y * z * oneMinusCosine + x * s; + dst[ 7] = 0; + dst[ 8] = x * z * oneMinusCosine + y * s; + dst[ 9] = y * z * oneMinusCosine - x * s; + dst[10] = zz + (1 - zz) * c; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + + return dst; +} + +/** + * Rotates the given 4-by-4 matrix around the given axis by the + * given angle. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/v3.Vec3} axis The axis + * about which to rotate. + * @param {number} angleInRadians The angle by which to rotate (in radians). + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The rotated matrix. + * @memberOf module:twgl/m4 + */ +function axisRotate(m, axis, angleInRadians, dst) { + dst = dst || new MatType(16); + + let x = axis[0]; + let y = axis[1]; + let z = axis[2]; + const n = Math.sqrt(x * x + y * y + z * z); + x /= n; + y /= n; + z /= n; + const xx = x * x; + const yy = y * y; + const zz = z * z; + const c = Math.cos(angleInRadians); + const s = Math.sin(angleInRadians); + const oneMinusCosine = 1 - c; + + const r00 = xx + (1 - xx) * c; + const r01 = x * y * oneMinusCosine + z * s; + const r02 = x * z * oneMinusCosine - y * s; + const r10 = x * y * oneMinusCosine - z * s; + const r11 = yy + (1 - yy) * c; + const r12 = y * z * oneMinusCosine + x * s; + const r20 = x * z * oneMinusCosine + y * s; + const r21 = y * z * oneMinusCosine - x * s; + const r22 = zz + (1 - zz) * c; + + const m00 = m[0]; + const m01 = m[1]; + const m02 = m[2]; + const m03 = m[3]; + const m10 = m[4]; + const m11 = m[5]; + const m12 = m[6]; + const m13 = m[7]; + const m20 = m[8]; + const m21 = m[9]; + const m22 = m[10]; + const m23 = m[11]; + + dst[ 0] = r00 * m00 + r01 * m10 + r02 * m20; + dst[ 1] = r00 * m01 + r01 * m11 + r02 * m21; + dst[ 2] = r00 * m02 + r01 * m12 + r02 * m22; + dst[ 3] = r00 * m03 + r01 * m13 + r02 * m23; + dst[ 4] = r10 * m00 + r11 * m10 + r12 * m20; + dst[ 5] = r10 * m01 + r11 * m11 + r12 * m21; + dst[ 6] = r10 * m02 + r11 * m12 + r12 * m22; + dst[ 7] = r10 * m03 + r11 * m13 + r12 * m23; + dst[ 8] = r20 * m00 + r21 * m10 + r22 * m20; + dst[ 9] = r20 * m01 + r21 * m11 + r22 * m21; + dst[10] = r20 * m02 + r21 * m12 + r22 * m22; + dst[11] = r20 * m03 + r21 * m13 + r22 * m23; + + if (m !== dst) { + dst[12] = m[12]; + dst[13] = m[13]; + dst[14] = m[14]; + dst[15] = m[15]; + } + + return dst; +} + +/** + * Creates a 4-by-4 matrix which scales in each dimension by an amount given by + * the corresponding entry in the given vector; assumes the vector has three + * entries. + * @param {module:twgl/v3.Vec3} v A vector of + * three entries specifying the factor by which to scale in each dimension. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The scaling matrix. + * @memberOf module:twgl/m4 + */ +function scaling(v, dst) { + dst = dst || new MatType(16); + + dst[ 0] = v[0]; + dst[ 1] = 0; + dst[ 2] = 0; + dst[ 3] = 0; + dst[ 4] = 0; + dst[ 5] = v[1]; + dst[ 6] = 0; + dst[ 7] = 0; + dst[ 8] = 0; + dst[ 9] = 0; + dst[10] = v[2]; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + + return dst; +} + +/** + * Scales the given 4-by-4 matrix in each dimension by an amount + * given by the corresponding entry in the given vector; assumes the vector has + * three entries. + * @param {module:twgl/m4.Mat4} m The matrix to be modified. + * @param {module:twgl/v3.Vec3} v A vector of three entries specifying the + * factor by which to scale in each dimension. + * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created. + * @return {module:twgl/m4.Mat4} The scaled matrix. + * @memberOf module:twgl/m4 + */ +function scale(m, v, dst) { + dst = dst || new MatType(16); + + const v0 = v[0]; + const v1 = v[1]; + const v2 = v[2]; + + dst[ 0] = v0 * m[0 * 4 + 0]; + dst[ 1] = v0 * m[0 * 4 + 1]; + dst[ 2] = v0 * m[0 * 4 + 2]; + dst[ 3] = v0 * m[0 * 4 + 3]; + dst[ 4] = v1 * m[1 * 4 + 0]; + dst[ 5] = v1 * m[1 * 4 + 1]; + dst[ 6] = v1 * m[1 * 4 + 2]; + dst[ 7] = v1 * m[1 * 4 + 3]; + dst[ 8] = v2 * m[2 * 4 + 0]; + dst[ 9] = v2 * m[2 * 4 + 1]; + dst[10] = v2 * m[2 * 4 + 2]; + dst[11] = v2 * m[2 * 4 + 3]; + + if (m !== dst) { + dst[12] = m[12]; + dst[13] = m[13]; + dst[14] = m[14]; + dst[15] = m[15]; + } + + return dst; +} + +/** + * Takes a 4-by-4 matrix and a vector with 3 entries, + * interprets the vector as a point, transforms that point by the matrix, and + * returns the result as a vector with 3 entries. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/v3.Vec3} v The point. + * @param {module:twgl/v3.Vec3} [dst] optional vec3 to store result. If not passed a new one is created. + * @return {module:twgl/v3.Vec3} The transformed point. + * @memberOf module:twgl/m4 + */ +function transformPoint(m, v, dst) { + dst = dst || create$1(); + const v0 = v[0]; + const v1 = v[1]; + const v2 = v[2]; + const d = v0 * m[0 * 4 + 3] + v1 * m[1 * 4 + 3] + v2 * m[2 * 4 + 3] + m[3 * 4 + 3]; + + dst[0] = (v0 * m[0 * 4 + 0] + v1 * m[1 * 4 + 0] + v2 * m[2 * 4 + 0] + m[3 * 4 + 0]) / d; + dst[1] = (v0 * m[0 * 4 + 1] + v1 * m[1 * 4 + 1] + v2 * m[2 * 4 + 1] + m[3 * 4 + 1]) / d; + dst[2] = (v0 * m[0 * 4 + 2] + v1 * m[1 * 4 + 2] + v2 * m[2 * 4 + 2] + m[3 * 4 + 2]) / d; + + return dst; +} + +/** + * Takes a 4-by-4 matrix and a vector with 3 entries, interprets the vector as a + * direction, transforms that direction by the matrix, and returns the result; + * assumes the transformation of 3-dimensional space represented by the matrix + * is parallel-preserving, i.e. any combination of rotation, scaling and + * translation, but not a perspective distortion. Returns a vector with 3 + * entries. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/v3.Vec3} v The direction. + * @param {module:twgl/v3.Vec3} [dst] optional Vec3 to store result. If not passed a new one is created. + * @return {module:twgl/v3.Vec3} The transformed direction. + * @memberOf module:twgl/m4 + */ +function transformDirection(m, v, dst) { + dst = dst || create$1(); + + const v0 = v[0]; + const v1 = v[1]; + const v2 = v[2]; + + dst[0] = v0 * m[0 * 4 + 0] + v1 * m[1 * 4 + 0] + v2 * m[2 * 4 + 0]; + dst[1] = v0 * m[0 * 4 + 1] + v1 * m[1 * 4 + 1] + v2 * m[2 * 4 + 1]; + dst[2] = v0 * m[0 * 4 + 2] + v1 * m[1 * 4 + 2] + v2 * m[2 * 4 + 2]; + + return dst; +} + +/** + * Takes a 4-by-4 matrix m and a vector v with 3 entries, interprets the vector + * as a normal to a surface, and computes a vector which is normal upon + * transforming that surface by the matrix. The effect of this function is the + * same as transforming v (as a direction) by the inverse-transpose of m. This + * function assumes the transformation of 3-dimensional space represented by the + * matrix is parallel-preserving, i.e. any combination of rotation, scaling and + * translation, but not a perspective distortion. Returns a vector with 3 + * entries. + * @param {module:twgl/m4.Mat4} m The matrix. + * @param {module:twgl/v3.Vec3} v The normal. + * @param {module:twgl/v3.Vec3} [dst] The direction. If not passed a new one is created. + * @return {module:twgl/v3.Vec3} The transformed normal. + * @memberOf module:twgl/m4 + */ +function transformNormal$1(m, v, dst) { + dst = dst || create$1(); + const mi = inverse(m); + const v0 = v[0]; + const v1 = v[1]; + const v2 = v[2]; + + dst[0] = v0 * mi[0 * 4 + 0] + v1 * mi[0 * 4 + 1] + v2 * mi[0 * 4 + 2]; + dst[1] = v0 * mi[1 * 4 + 0] + v1 * mi[1 * 4 + 1] + v2 * mi[1 * 4 + 2]; + dst[2] = v0 * mi[2 * 4 + 0] + v1 * mi[2 * 4 + 1] + v2 * mi[2 * 4 + 2]; + + return dst; +} + +var m4 = /*#__PURE__*/Object.freeze({ + __proto__: null, + axisRotate: axisRotate, + axisRotation: axisRotation, + copy: copy, + create: create, + frustum: frustum, + getAxis: getAxis, + getTranslation: getTranslation, + identity: identity, + inverse: inverse, + lookAt: lookAt, + multiply: multiply, + negate: negate, + ortho: ortho, + perspective: perspective, + rotateX: rotateX, + rotateY: rotateY, + rotateZ: rotateZ, + rotationX: rotationX, + rotationY: rotationY, + rotationZ: rotationZ, + scale: scale, + scaling: scaling, + setAxis: setAxis, + setDefaultType: setDefaultType, + setTranslation: setTranslation, + transformDirection: transformDirection, + transformNormal: transformNormal$1, + transformPoint: transformPoint, + translate: translate, + translation: translation, + transpose: transpose +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* DataType */ +const BYTE$2 = 0x1400; +const UNSIGNED_BYTE$3 = 0x1401; +const SHORT$2 = 0x1402; +const UNSIGNED_SHORT$3 = 0x1403; +const INT$3 = 0x1404; +const UNSIGNED_INT$3 = 0x1405; +const FLOAT$3 = 0x1406; +const UNSIGNED_SHORT_4_4_4_4$1 = 0x8033; +const UNSIGNED_SHORT_5_5_5_1$1 = 0x8034; +const UNSIGNED_SHORT_5_6_5$1 = 0x8363; +const HALF_FLOAT$1 = 0x140B; +const UNSIGNED_INT_2_10_10_10_REV$1 = 0x8368; +const UNSIGNED_INT_10F_11F_11F_REV$1 = 0x8C3B; +const UNSIGNED_INT_5_9_9_9_REV$1 = 0x8C3E; +const FLOAT_32_UNSIGNED_INT_24_8_REV$1 = 0x8DAD; +const UNSIGNED_INT_24_8$1 = 0x84FA; + +const glTypeToTypedArray = {}; +{ + const tt = glTypeToTypedArray; + tt[BYTE$2] = Int8Array; + tt[UNSIGNED_BYTE$3] = Uint8Array; + tt[SHORT$2] = Int16Array; + tt[UNSIGNED_SHORT$3] = Uint16Array; + tt[INT$3] = Int32Array; + tt[UNSIGNED_INT$3] = Uint32Array; + tt[FLOAT$3] = Float32Array; + tt[UNSIGNED_SHORT_4_4_4_4$1] = Uint16Array; + tt[UNSIGNED_SHORT_5_5_5_1$1] = Uint16Array; + tt[UNSIGNED_SHORT_5_6_5$1] = Uint16Array; + tt[HALF_FLOAT$1] = Uint16Array; + tt[UNSIGNED_INT_2_10_10_10_REV$1] = Uint32Array; + tt[UNSIGNED_INT_10F_11F_11F_REV$1] = Uint32Array; + tt[UNSIGNED_INT_5_9_9_9_REV$1] = Uint32Array; + tt[FLOAT_32_UNSIGNED_INT_24_8_REV$1] = Uint32Array; + tt[UNSIGNED_INT_24_8$1] = Uint32Array; +} + +/** + * Get the GL type for a typedArray + * @param {ArrayBufferView} typedArray a typedArray + * @return {number} the GL type for array. For example pass in an `Int8Array` and `gl.BYTE` will + * be returned. Pass in a `Uint32Array` and `gl.UNSIGNED_INT` will be returned + * @memberOf module:twgl/typedArray + */ +function getGLTypeForTypedArray(typedArray) { + if (typedArray instanceof Int8Array) { return BYTE$2; } // eslint-disable-line + if (typedArray instanceof Uint8Array) { return UNSIGNED_BYTE$3; } // eslint-disable-line + if (typedArray instanceof Uint8ClampedArray) { return UNSIGNED_BYTE$3; } // eslint-disable-line + if (typedArray instanceof Int16Array) { return SHORT$2; } // eslint-disable-line + if (typedArray instanceof Uint16Array) { return UNSIGNED_SHORT$3; } // eslint-disable-line + if (typedArray instanceof Int32Array) { return INT$3; } // eslint-disable-line + if (typedArray instanceof Uint32Array) { return UNSIGNED_INT$3; } // eslint-disable-line + if (typedArray instanceof Float32Array) { return FLOAT$3; } // eslint-disable-line + throw new Error('unsupported typed array type'); +} + +/** + * Get the GL type for a typedArray type + * @param {ArrayBufferView} typedArrayType a typedArray constructor + * @return {number} the GL type for type. For example pass in `Int8Array` and `gl.BYTE` will + * be returned. Pass in `Uint32Array` and `gl.UNSIGNED_INT` will be returned + * @memberOf module:twgl/typedArray + */ +function getGLTypeForTypedArrayType(typedArrayType) { + if (typedArrayType === Int8Array) { return BYTE$2; } // eslint-disable-line + if (typedArrayType === Uint8Array) { return UNSIGNED_BYTE$3; } // eslint-disable-line + if (typedArrayType === Uint8ClampedArray) { return UNSIGNED_BYTE$3; } // eslint-disable-line + if (typedArrayType === Int16Array) { return SHORT$2; } // eslint-disable-line + if (typedArrayType === Uint16Array) { return UNSIGNED_SHORT$3; } // eslint-disable-line + if (typedArrayType === Int32Array) { return INT$3; } // eslint-disable-line + if (typedArrayType === Uint32Array) { return UNSIGNED_INT$3; } // eslint-disable-line + if (typedArrayType === Float32Array) { return FLOAT$3; } // eslint-disable-line + throw new Error('unsupported typed array type'); +} + +/** + * Get the typed array constructor for a given GL type + * @param {number} type the GL type. (eg: `gl.UNSIGNED_INT`) + * @return {function} the constructor for a the corresponding typed array. (eg. `Uint32Array`). + * @memberOf module:twgl/typedArray + */ +function getTypedArrayTypeForGLType(type) { + const CTOR = glTypeToTypedArray[type]; + if (!CTOR) { + throw new Error('unknown gl type'); + } + return CTOR; +} + +const isArrayBuffer$1 = typeof SharedArrayBuffer !== 'undefined' + ? function isArrayBufferOrSharedArrayBuffer(a) { + return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer); + } + : function isArrayBuffer(a) { + return a && a.buffer && a.buffer instanceof ArrayBuffer; + }; + +var typedarrays = /*#__PURE__*/Object.freeze({ + __proto__: null, + getGLTypeForTypedArray: getGLTypeForTypedArray, + getGLTypeForTypedArrayType: getGLTypeForTypedArrayType, + getTypedArrayTypeForGLType: getTypedArrayTypeForGLType, + isArrayBuffer: isArrayBuffer$1 +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* eslint no-console: "off" */ + +/** + * Copy named properties + * + * @param {string[]} names names of properties to copy + * @param {object} src object to copy properties from + * @param {object} dst object to copy properties to + * @private + */ +function copyNamedProperties(names, src, dst) { + names.forEach(function(name) { + const value = src[name]; + if (value !== undefined) { + dst[name] = value; + } + }); +} + +/** + * Copies properties from source to dest only if a matching key is in dest + * + * @param {Object.} src the source + * @param {Object.} dst the dest + * @private + */ +function copyExistingProperties(src, dst) { + Object.keys(dst).forEach(function(key) { + if (dst.hasOwnProperty(key) && src.hasOwnProperty(key)) { /* eslint no-prototype-builtins: 0 */ + dst[key] = src[key]; + } + }); +} + +function error$1(...args) { + console.error(...args); +} + +function warn$1(...args) { + console.warn(...args); +} + +const isTypeWeakMaps = new Map(); + +function isType(object, type) { + if (!object || typeof object !== 'object') { + return false; + } + let weakMap = isTypeWeakMaps.get(type); + if (!weakMap) { + weakMap = new WeakMap(); + isTypeWeakMaps.set(type, weakMap); + } + let isOfType = weakMap.get(object); + if (isOfType === undefined) { + const s = Object.prototype.toString.call(object); + isOfType = s.substring(8, s.length - 1) === type; + weakMap.set(object, isOfType); + } + return isOfType; +} + +function isBuffer(gl, t) { + return typeof WebGLBuffer !== 'undefined' && isType(t, 'WebGLBuffer'); +} + +function isRenderbuffer(gl, t) { + return typeof WebGLRenderbuffer !== 'undefined' && isType(t, 'WebGLRenderbuffer'); +} + +function isTexture(gl, t) { + return typeof WebGLTexture !== 'undefined' && isType(t, 'WebGLTexture'); +} + +function isSampler(gl, t) { + return typeof WebGLSampler !== 'undefined' && isType(t, 'WebGLSampler'); +} + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +const STATIC_DRAW = 0x88e4; +const ARRAY_BUFFER$1 = 0x8892; +const ELEMENT_ARRAY_BUFFER$2 = 0x8893; +const BUFFER_SIZE = 0x8764; + +const BYTE$1 = 0x1400; +const UNSIGNED_BYTE$2 = 0x1401; +const SHORT$1 = 0x1402; +const UNSIGNED_SHORT$2 = 0x1403; +const INT$2 = 0x1404; +const UNSIGNED_INT$2 = 0x1405; +const FLOAT$2 = 0x1406; +const defaults$2 = { + attribPrefix: "", +}; + +/** + * Sets the default attrib prefix + * + * When writing shaders I prefer to name attributes with `a_`, uniforms with `u_` and varyings with `v_` + * as it makes it clear where they came from. But, when building geometry I prefer using un-prefixed names. + * + * In other words I'll create arrays of geometry like this + * + * var arrays = { + * position: ... + * normal: ... + * texcoord: ... + * }; + * + * But need those mapped to attributes and my attributes start with `a_`. + * + * @deprecated see {@link module:twgl.setDefaults} + * @param {string} prefix prefix for attribs + * @memberOf module:twgl/attributes + */ +function setAttributePrefix(prefix) { + defaults$2.attribPrefix = prefix; +} + +function setDefaults$2(newDefaults) { + copyExistingProperties(newDefaults, defaults$2); +} + +function setBufferFromTypedArray(gl, type, buffer, array, drawType) { + gl.bindBuffer(type, buffer); + gl.bufferData(type, array, drawType || STATIC_DRAW); +} + +/** + * Given typed array creates a WebGLBuffer and copies the typed array + * into it. + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @param {ArrayBuffer|SharedArrayBuffer|ArrayBufferView|WebGLBuffer} typedArray the typed array. Note: If a WebGLBuffer is passed in it will just be returned. No action will be taken + * @param {number} [type] the GL bind type for the buffer. Default = `gl.ARRAY_BUFFER`. + * @param {number} [drawType] the GL draw type for the buffer. Default = 'gl.STATIC_DRAW`. + * @return {WebGLBuffer} the created WebGLBuffer + * @memberOf module:twgl/attributes + */ +function createBufferFromTypedArray(gl, typedArray, type, drawType) { + if (isBuffer(gl, typedArray)) { + return typedArray; + } + type = type || ARRAY_BUFFER$1; + const buffer = gl.createBuffer(); + setBufferFromTypedArray(gl, type, buffer, typedArray, drawType); + return buffer; +} + +function isIndices(name) { + return name === "indices"; +} + +// This is really just a guess. Though I can't really imagine using +// anything else? Maybe for some compression? +function getNormalizationForTypedArrayType(typedArrayType) { + if (typedArrayType === Int8Array) { return true; } // eslint-disable-line + if (typedArrayType === Uint8Array) { return true; } // eslint-disable-line + return false; +} + +function getArray$1(array) { + return array.length ? array : array.data; +} + +const texcoordRE = /coord|texture/i; +const colorRE = /color|colour/i; + +function guessNumComponentsFromName(name, length) { + let numComponents; + if (texcoordRE.test(name)) { + numComponents = 2; + } else if (colorRE.test(name)) { + numComponents = 4; + } else { + numComponents = 3; // position, normals, indices ... + } + + if (length % numComponents > 0) { + throw new Error(`Can not guess numComponents for attribute '${name}'. Tried ${numComponents} but ${length} values is not evenly divisible by ${numComponents}. You should specify it.`); + } + + return numComponents; +} + +function getNumComponents$1(array, arrayName, numValues) { + return array.numComponents || array.size || guessNumComponentsFromName(arrayName, numValues || getArray$1(array).length); +} + +function makeTypedArray(array, name) { + if (isArrayBuffer$1(array)) { + return array; + } + + if (isArrayBuffer$1(array.data)) { + return array.data; + } + + if (Array.isArray(array)) { + array = { + data: array, + }; + } + + let Type = array.type ? typedArrayTypeFromGLTypeOrTypedArrayCtor(array.type) : undefined; + if (!Type) { + if (isIndices(name)) { + Type = Uint16Array; + } else { + Type = Float32Array; + } + } + return new Type(array.data); +} + +function glTypeFromGLTypeOrTypedArrayType(glTypeOrTypedArrayCtor) { + return typeof glTypeOrTypedArrayCtor === 'number' + ? glTypeOrTypedArrayCtor + : glTypeOrTypedArrayCtor ? getGLTypeForTypedArrayType(glTypeOrTypedArrayCtor) : FLOAT$2; +} + +function typedArrayTypeFromGLTypeOrTypedArrayCtor(glTypeOrTypedArrayCtor) { + return typeof glTypeOrTypedArrayCtor === 'number' + ? getTypedArrayTypeForGLType(glTypeOrTypedArrayCtor) + : glTypeOrTypedArrayCtor || Float32Array; +} + +function attribBufferFromBuffer(gl, array/*, arrayName */) { + return { + buffer: array.buffer, + numValues: 2 * 3 * 4, // safely divided by 2, 3, 4 + type: glTypeFromGLTypeOrTypedArrayType(array.type), + arrayType: typedArrayTypeFromGLTypeOrTypedArrayCtor(array.type), + }; +} + +function attribBufferFromSize(gl, array/*, arrayName*/) { + const numValues = array.data || array; + const arrayType = typedArrayTypeFromGLTypeOrTypedArrayCtor(array.type); + const numBytes = numValues * arrayType.BYTES_PER_ELEMENT; + const buffer = gl.createBuffer(); + gl.bindBuffer(ARRAY_BUFFER$1, buffer); + gl.bufferData(ARRAY_BUFFER$1, numBytes, array.drawType || STATIC_DRAW); + return { + buffer, + numValues, + type: getGLTypeForTypedArrayType(arrayType), + arrayType, + }; +} + +function attribBufferFromArrayLike(gl, array, arrayName) { + const typedArray = makeTypedArray(array, arrayName); + return { + arrayType: typedArray.constructor, + buffer: createBufferFromTypedArray(gl, typedArray, undefined, array.drawType), + type: getGLTypeForTypedArray(typedArray), + numValues: 0, + }; +} + +/** + * The info for an attribute. This is effectively just the arguments to `gl.vertexAttribPointer` plus the WebGLBuffer + * for the attribute. + * + * @typedef {Object} AttribInfo + * @property {number[]|ArrayBufferView} [value] a constant value for the attribute. Note: if this is set the attribute will be + * disabled and set to this constant value and all other values will be ignored. + * @property {number} [numComponents] the number of components for this attribute. + * @property {number} [size] synonym for `numComponents`. + * @property {number} [type] the type of the attribute (eg. `gl.FLOAT`, `gl.UNSIGNED_BYTE`, etc...) Default = `gl.FLOAT` + * @property {boolean} [normalize] whether or not to normalize the data. Default = false + * @property {number} [offset] offset into buffer in bytes. Default = 0 + * @property {number} [stride] the stride in bytes per element. Default = 0 + * @property {number} [divisor] the divisor in instances. Default = 0. + * Requires WebGL2 or the ANGLE_instanced_arrays extension. + * and, if you're using WebGL1 you must have called {@link module:twgl.addExtensionsToContext} + * @property {WebGLBuffer} buffer the buffer that contains the data for this attribute + * @property {number} [drawType] the draw type passed to gl.bufferData. Default = gl.STATIC_DRAW + * @memberOf module:twgl + */ + +/** + * @typedef {(Int8ArrayConstructor|Uint8ArrayConstructor|Int16ArrayConstructor|Uint16ArrayConstructor|Int32ArrayConstructor|Uint32ArrayConstructor|Float32ArrayConstructor)} TypedArrayConstructor + */ + +/** + * Use this type of array spec when TWGL can't guess the type or number of components of an array + * @typedef {Object} FullArraySpec + * @property {number[]|ArrayBufferView} [value] a constant value for the attribute. Note: if this is set the attribute will be + * disabled and set to this constant value and all other values will be ignored. + * @property {(number|number[]|ArrayBufferView)} [data] The data of the array. A number alone becomes the number of elements of type. + * @property {number} [numComponents] number of components for `vertexAttribPointer`. Default is based on the name of the array. + * If `coord` is in the name assumes `numComponents = 2`. + * If `color` is in the name assumes `numComponents = 4`. + * otherwise assumes `numComponents = 3` + * @property {number|TypedArrayConstructor} [type] type. This is used if `data` is a JavaScript array, or `buffer` is passed in, or `data` is a number. + * It can either be the constructor for a typedarray. (eg. `Uint8Array`) OR a WebGL type, (eg `gl.UNSIGNED_BYTE`). + * For example if you want colors in a `Uint8Array` you might have a `FullArraySpec` like `{ type: gl.UNSIGNED_BYTE, data: [255,0,255,255, ...], }`. + * @property {number} [size] synonym for `numComponents`. + * @property {boolean} [normalize] normalize for `vertexAttribPointer`. Default is true if type is `Int8Array` or `Uint8Array` otherwise false. + * @property {number} [stride] stride for `vertexAttribPointer`. Default = 0 + * @property {number} [offset] offset for `vertexAttribPointer`. Default = 0 + * @property {number} [divisor] divisor for `vertexAttribDivisor`. Default = 0. + * Requires WebGL2 or the ANGLE_instanced_arrays extension. + * and, if you using WebGL1 you must have called {@link module:twgl.addExtensionsToContext} + * @property {string} [attrib] name of attribute this array maps to. Defaults to same name as array prefixed by the default attribPrefix. + * @property {string} [name] synonym for `attrib`. + * @property {string} [attribName] synonym for `attrib`. + * @property {WebGLBuffer} [buffer] Buffer to use for this attribute. This lets you use your own buffer + * but you will need to supply `numComponents` and `type`. You can effectively pass an `AttribInfo` + * to provide this. Example: + * + * const bufferInfo1 = twgl.createBufferInfoFromArrays(gl, { + * position: [1, 2, 3, ... ], + * }); + * const bufferInfo2 = twgl.createBufferInfoFromArrays(gl, { + * position: bufferInfo1.attribs.position, // use the same buffer from bufferInfo1 + * }); + * + * @property {number} [drawType] the draw type passed to gl.bufferData. Default = gl.STATIC_DRAW + * @memberOf module:twgl + */ + +/** + * An individual array in {@link module:twgl.Arrays} + * + * When passed to {@link module:twgl.createBufferInfoFromArrays} if an ArraySpec is `number[]` or `ArrayBufferView` + * the types will be guessed based on the name. `indices` will be `Uint16Array`, everything else will + * be `Float32Array`. If an ArraySpec is a number it's the number of floats for an empty (zeroed) buffer. + * + * @typedef {(number|number[]|ArrayBufferView|module:twgl.FullArraySpec)} ArraySpec + * @memberOf module:twgl + */ + +/** + * This is a JavaScript object of arrays by name. The names should match your shader's attributes. If your + * attributes have a common prefix you can specify it by calling {@link module:twgl.setAttributePrefix}. + * + * Bare JavaScript Arrays + * + * var arrays = { + * position: [-1, 1, 0], + * normal: [0, 1, 0], + * ... + * } + * + * Bare TypedArrays + * + * var arrays = { + * position: new Float32Array([-1, 1, 0]), + * color: new Uint8Array([255, 128, 64, 255]), + * ... + * } + * + * * Will guess at `numComponents` if not specified based on name. + * + * If `coord` is in the name assumes `numComponents = 2` + * + * If `color` is in the name assumes `numComponents = 4` + * + * otherwise assumes `numComponents = 3` + * + * Objects with various fields. See {@link module:twgl.FullArraySpec}. + * + * var arrays = { + * position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], }, + * texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1], }, + * normal: { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], }, + * indices: { numComponents: 3, data: [0, 1, 2, 1, 2, 3], }, + * }; + * + * @typedef {Object.} Arrays + * @memberOf module:twgl + */ + + +/** + * Creates a set of attribute data and WebGLBuffers from set of arrays + * + * Given + * + * var arrays = { + * position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], }, + * texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1], }, + * normal: { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], }, + * color: { numComponents: 4, data: [255, 255, 255, 255, 255, 0, 0, 255, 0, 0, 255, 255], type: Uint8Array, }, + * indices: { numComponents: 3, data: [0, 1, 2, 1, 2, 3], }, + * }; + * + * returns something like + * + * var attribs = { + * position: { numComponents: 3, type: gl.FLOAT, normalize: false, buffer: WebGLBuffer, }, + * texcoord: { numComponents: 2, type: gl.FLOAT, normalize: false, buffer: WebGLBuffer, }, + * normal: { numComponents: 3, type: gl.FLOAT, normalize: false, buffer: WebGLBuffer, }, + * color: { numComponents: 4, type: gl.UNSIGNED_BYTE, normalize: true, buffer: WebGLBuffer, }, + * }; + * + * notes: + * + * * Arrays can take various forms + * + * Bare JavaScript Arrays + * + * var arrays = { + * position: [-1, 1, 0], + * normal: [0, 1, 0], + * ... + * } + * + * Bare TypedArrays + * + * var arrays = { + * position: new Float32Array([-1, 1, 0]), + * color: new Uint8Array([255, 128, 64, 255]), + * ... + * } + * + * * Will guess at `numComponents` if not specified based on name. + * + * If `coord` is in the name assumes `numComponents = 2` + * + * If `color` is in the name assumes `numComponents = 4` + * + * otherwise assumes `numComponents = 3` + * + * @param {WebGLRenderingContext} gl The webgl rendering context. + * @param {module:twgl.Arrays} arrays The arrays + * @param {module:twgl.BufferInfo} [srcBufferInfo] a BufferInfo to copy from + * This lets you share buffers. Any arrays you supply will override + * the buffers from srcBufferInfo. + * @return {Object.} the attribs + * @memberOf module:twgl/attributes + */ +function createAttribsFromArrays(gl, arrays) { + const attribs = {}; + Object.keys(arrays).forEach(function(arrayName) { + if (!isIndices(arrayName)) { + const array = arrays[arrayName]; + const attribName = array.attrib || array.name || array.attribName || (defaults$2.attribPrefix + arrayName); + if (array.value) { + if (!Array.isArray(array.value) && !isArrayBuffer$1(array.value)) { + throw new Error('array.value is not array or typedarray'); + } + attribs[attribName] = { + value: array.value, + }; + } else { + let fn; + if (array.buffer && array.buffer instanceof WebGLBuffer) { + fn = attribBufferFromBuffer; + } else if (typeof array === "number" || typeof array.data === "number") { + fn = attribBufferFromSize; + } else { + fn = attribBufferFromArrayLike; + } + const {buffer, type, numValues, arrayType} = fn(gl, array, arrayName); + const normalization = array.normalize !== undefined ? array.normalize : getNormalizationForTypedArrayType(arrayType); + const numComponents = getNumComponents$1(array, arrayName, numValues); + attribs[attribName] = { + buffer: buffer, + numComponents: numComponents, + type: type, + normalize: normalization, + stride: array.stride || 0, + offset: array.offset || 0, + divisor: array.divisor === undefined ? undefined : array.divisor, + drawType: array.drawType, + }; + } + } + }); + gl.bindBuffer(ARRAY_BUFFER$1, null); + return attribs; +} + +/** + * Sets the contents of a buffer attached to an attribInfo + * + * This is helper function to dynamically update a buffer. + * + * Let's say you make a bufferInfo + * + * var arrays = { + * position: new Float32Array([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]), + * texcoord: new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]), + * normal: new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]), + * indices: new Uint16Array([0, 1, 2, 1, 2, 3]), + * }; + * var bufferInfo = twgl.createBufferInfoFromArrays(gl, arrays); + * + * And you want to dynamically update the positions. You could do this + * + * // assuming arrays.position has already been updated with new data. + * twgl.setAttribInfoBufferFromArray(gl, bufferInfo.attribs.position, arrays.position); + * + * @param {WebGLRenderingContext} gl + * @param {AttribInfo} attribInfo The attribInfo who's buffer contents to set. NOTE: If you have an attribute prefix + * the name of the attribute will include the prefix. + * @param {ArraySpec} array Note: it is arguably inefficient to pass in anything but a typed array because anything + * else will have to be converted to a typed array before it can be used by WebGL. During init time that + * inefficiency is usually not important but if you're updating data dynamically best to be efficient. + * @param {number} [offset] an optional offset into the buffer. This is only an offset into the WebGL buffer + * not the array. To pass in an offset into the array itself use a typed array and create an `ArrayBufferView` + * for the portion of the array you want to use. + * + * var someArray = new Float32Array(1000); // an array with 1000 floats + * var someSubArray = new Float32Array(someArray.buffer, offsetInBytes, sizeInUnits); // a view into someArray + * + * Now you can pass `someSubArray` into setAttribInfoBufferFromArray` + * @memberOf module:twgl/attributes + */ +function setAttribInfoBufferFromArray(gl, attribInfo, array, offset) { + array = makeTypedArray(array); + if (offset !== undefined) { + gl.bindBuffer(ARRAY_BUFFER$1, attribInfo.buffer); + gl.bufferSubData(ARRAY_BUFFER$1, offset, array); + } else { + setBufferFromTypedArray(gl, ARRAY_BUFFER$1, attribInfo.buffer, array, attribInfo.drawType); + } +} + +function getBytesPerValueForGLType(gl, type) { + if (type === BYTE$1) return 1; // eslint-disable-line + if (type === UNSIGNED_BYTE$2) return 1; // eslint-disable-line + if (type === SHORT$1) return 2; // eslint-disable-line + if (type === UNSIGNED_SHORT$2) return 2; // eslint-disable-line + if (type === INT$2) return 4; // eslint-disable-line + if (type === UNSIGNED_INT$2) return 4; // eslint-disable-line + if (type === FLOAT$2) return 4; // eslint-disable-line + return 0; +} + +// Tries to get the number of elements from a set of arrays. +const positionKeys = ['position', 'positions', 'a_position']; +function getNumElementsFromNonIndexedArrays(arrays) { + let key; + let ii; + for (ii = 0; ii < positionKeys.length; ++ii) { + key = positionKeys[ii]; + if (key in arrays) { + break; + } + } + if (ii === positionKeys.length) { + key = Object.keys(arrays)[0]; + } + const array = arrays[key]; + const length = getArray$1(array).length; + if (length === undefined) { + return 1; // There's no arrays + } + const numComponents = getNumComponents$1(array, key); + const numElements = length / numComponents; + if (length % numComponents > 0) { + throw new Error(`numComponents ${numComponents} not correct for length ${length}`); + } + return numElements; +} + +function getNumElementsFromAttributes(gl, attribs) { + let key; + let ii; + for (ii = 0; ii < positionKeys.length; ++ii) { + key = positionKeys[ii]; + if (key in attribs) { + break; + } + key = defaults$2.attribPrefix + key; + if (key in attribs) { + break; + } + } + if (ii === positionKeys.length) { + key = Object.keys(attribs)[0]; + } + const attrib = attribs[key]; + if (!attrib.buffer) { + return 1; // There's no buffer + } + gl.bindBuffer(ARRAY_BUFFER$1, attrib.buffer); + const numBytes = gl.getBufferParameter(ARRAY_BUFFER$1, BUFFER_SIZE); + gl.bindBuffer(ARRAY_BUFFER$1, null); + + const bytesPerValue = getBytesPerValueForGLType(gl, attrib.type); + const totalElements = numBytes / bytesPerValue; + const numComponents = attrib.numComponents || attrib.size; + // TODO: check stride + const numElements = totalElements / numComponents; + if (numElements % 1 !== 0) { + throw new Error(`numComponents ${numComponents} not correct for length ${length}`); + } + return numElements; +} + +/** + * @typedef {Object} BufferInfo + * @property {number} numElements The number of elements to pass to `gl.drawArrays` or `gl.drawElements`. + * @property {number} [elementType] The type of indices `UNSIGNED_BYTE`, `UNSIGNED_SHORT` etc.. + * @property {WebGLBuffer} [indices] The indices `ELEMENT_ARRAY_BUFFER` if any indices exist. + * @property {Object.} [attribs] The attribs appropriate to call `setAttributes` + * @memberOf module:twgl + */ + +/** + * Creates a BufferInfo from an object of arrays. + * + * This can be passed to {@link module:twgl.setBuffersAndAttributes} and to + * {@link module:twgl:drawBufferInfo}. + * + * Given an object like + * + * var arrays = { + * position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], }, + * texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1], }, + * normal: { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], }, + * indices: { numComponents: 3, data: [0, 1, 2, 1, 2, 3], }, + * }; + * + * Creates an BufferInfo like this + * + * bufferInfo = { + * numElements: 4, // or whatever the number of elements is + * indices: WebGLBuffer, // this property will not exist if there are no indices + * attribs: { + * position: { buffer: WebGLBuffer, numComponents: 3, }, + * normal: { buffer: WebGLBuffer, numComponents: 3, }, + * texcoord: { buffer: WebGLBuffer, numComponents: 2, }, + * }, + * }; + * + * The properties of arrays can be JavaScript arrays in which case the number of components + * will be guessed. + * + * var arrays = { + * position: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], + * texcoord: [0, 0, 0, 1, 1, 0, 1, 1], + * normal: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], + * indices: [0, 1, 2, 1, 2, 3], + * }; + * + * They can also be TypedArrays + * + * var arrays = { + * position: new Float32Array([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]), + * texcoord: new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]), + * normal: new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]), + * indices: new Uint16Array([0, 1, 2, 1, 2, 3]), + * }; + * + * Or AugmentedTypedArrays + * + * var positions = createAugmentedTypedArray(3, 4); + * var texcoords = createAugmentedTypedArray(2, 4); + * var normals = createAugmentedTypedArray(3, 4); + * var indices = createAugmentedTypedArray(3, 2, Uint16Array); + * + * positions.push([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]); + * texcoords.push([0, 0, 0, 1, 1, 0, 1, 1]); + * normals.push([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]); + * indices.push([0, 1, 2, 1, 2, 3]); + * + * var arrays = { + * position: positions, + * texcoord: texcoords, + * normal: normals, + * indices: indices, + * }; + * + * For the last example it is equivalent to + * + * var bufferInfo = { + * attribs: { + * position: { numComponents: 3, buffer: gl.createBuffer(), }, + * texcoord: { numComponents: 2, buffer: gl.createBuffer(), }, + * normal: { numComponents: 3, buffer: gl.createBuffer(), }, + * }, + * indices: gl.createBuffer(), + * numElements: 6, + * }; + * + * gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.position.buffer); + * gl.bufferData(gl.ARRAY_BUFFER, arrays.position, gl.STATIC_DRAW); + * gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.texcoord.buffer); + * gl.bufferData(gl.ARRAY_BUFFER, arrays.texcoord, gl.STATIC_DRAW); + * gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.normal.buffer); + * gl.bufferData(gl.ARRAY_BUFFER, arrays.normal, gl.STATIC_DRAW); + * gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferInfo.indices); + * gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, arrays.indices, gl.STATIC_DRAW); + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @param {module:twgl.Arrays} arrays Your data + * @param {module:twgl.BufferInfo} [srcBufferInfo] An existing + * buffer info to start from. WebGLBuffers etc specified + * in the srcBufferInfo will be used in a new BufferInfo + * with any arrays specified overriding the ones in + * srcBufferInfo. + * @return {module:twgl.BufferInfo} A BufferInfo + * @memberOf module:twgl/attributes + */ +function createBufferInfoFromArrays(gl, arrays, srcBufferInfo) { + const newAttribs = createAttribsFromArrays(gl, arrays); + const bufferInfo = Object.assign({}, srcBufferInfo ? srcBufferInfo : {}); + bufferInfo.attribs = Object.assign({}, srcBufferInfo ? srcBufferInfo.attribs : {}, newAttribs); + const indices = arrays.indices; + if (indices) { + const newIndices = makeTypedArray(indices, "indices"); + bufferInfo.indices = createBufferFromTypedArray(gl, newIndices, ELEMENT_ARRAY_BUFFER$2); + bufferInfo.numElements = newIndices.length; + bufferInfo.elementType = getGLTypeForTypedArray(newIndices); + } else if (!bufferInfo.numElements) { + bufferInfo.numElements = getNumElementsFromAttributes(gl, bufferInfo.attribs); + } + + return bufferInfo; +} + +/** + * Creates a buffer from an array, typed array, or array spec + * + * Given something like this + * + * [1, 2, 3], + * + * or + * + * new Uint16Array([1,2,3]); + * + * or + * + * { + * data: [1, 2, 3], + * type: Uint8Array, + * } + * + * returns a WebGLBuffer that contains the given data. + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext. + * @param {module:twgl.ArraySpec} array an array, typed array, or array spec. + * @param {string} arrayName name of array. Used to guess the type if type can not be derived otherwise. + * @return {WebGLBuffer} a WebGLBuffer containing the data in array. + * @memberOf module:twgl/attributes + */ +function createBufferFromArray(gl, array, arrayName) { + const type = arrayName === "indices" ? ELEMENT_ARRAY_BUFFER$2 : ARRAY_BUFFER$1; + const typedArray = makeTypedArray(array, arrayName); + return createBufferFromTypedArray(gl, typedArray, type); +} + +/** + * Creates buffers from arrays or typed arrays + * + * Given something like this + * + * var arrays = { + * positions: [1, 2, 3], + * normals: [0, 0, 1], + * } + * + * returns something like + * + * buffers = { + * positions: WebGLBuffer, + * normals: WebGLBuffer, + * } + * + * If the buffer is named 'indices' it will be made an ELEMENT_ARRAY_BUFFER. + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext. + * @param {module:twgl.Arrays} arrays + * @return {Object} returns an object with one WebGLBuffer per array + * @memberOf module:twgl/attributes + */ +function createBuffersFromArrays(gl, arrays) { + const buffers = { }; + Object.keys(arrays).forEach(function(key) { + buffers[key] = createBufferFromArray(gl, arrays[key], key); + }); + + // Ugh! + if (arrays.indices) { + buffers.numElements = arrays.indices.length; + buffers.elementType = getGLTypeForTypedArray(makeTypedArray(arrays.indices)); + } else { + buffers.numElements = getNumElementsFromNonIndexedArrays(arrays); + } + + return buffers; +} + +var attributes = /*#__PURE__*/Object.freeze({ + __proto__: null, + createAttribsFromArrays: createAttribsFromArrays, + createBuffersFromArrays: createBuffersFromArrays, + createBufferFromArray: createBufferFromArray, + createBufferFromTypedArray: createBufferFromTypedArray, + createBufferInfoFromArrays: createBufferInfoFromArrays, + setAttribInfoBufferFromArray: setAttribInfoBufferFromArray, + setAttributePrefix: setAttributePrefix, + setAttributeDefaults_: setDefaults$2, + getNumComponents_: getNumComponents$1, + getArray_: getArray$1 +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +const getArray = getArray$1; // eslint-disable-line +const getNumComponents = getNumComponents$1; // eslint-disable-line + +/** + * @typedef {(Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array)} TypedArray + */ + +/** + * Add `push` to a typed array. It just keeps a 'cursor' + * and allows use to `push` values into the array so we + * don't have to manually compute offsets + * @param {TypedArray} typedArray TypedArray to augment + * @param {number} numComponents number of components. + * @private + */ +function augmentTypedArray(typedArray, numComponents) { + let cursor = 0; + typedArray.push = function() { + for (let ii = 0; ii < arguments.length; ++ii) { + const value = arguments[ii]; + if (value instanceof Array || isArrayBuffer$1(value)) { + for (let jj = 0; jj < value.length; ++jj) { + typedArray[cursor++] = value[jj]; + } + } else { + typedArray[cursor++] = value; + } + } + }; + typedArray.reset = function(opt_index) { + cursor = opt_index || 0; + }; + typedArray.numComponents = numComponents; + Object.defineProperty(typedArray, 'numElements', { + get: function() { + return this.length / this.numComponents | 0; + }, + }); + return typedArray; +} + +/** + * creates a typed array with a `push` function attached + * so that you can easily *push* values. + * + * `push` can take multiple arguments. If an argument is an array each element + * of the array will be added to the typed array. + * + * Example: + * + * const array = createAugmentedTypedArray(3, 2); // creates a Float32Array with 6 values + * array.push(1, 2, 3); + * array.push([4, 5, 6]); + * // array now contains [1, 2, 3, 4, 5, 6] + * + * Also has `numComponents` and `numElements` properties. + * + * @param {number} numComponents number of components + * @param {number} numElements number of elements. The total size of the array will be `numComponents * numElements`. + * @param {constructor} opt_type A constructor for the type. Default = `Float32Array`. + * @return {ArrayBufferView} A typed array. + * @memberOf module:twgl/primitives + */ +function createAugmentedTypedArray(numComponents, numElements, opt_type) { + const Type = opt_type || Float32Array; + return augmentTypedArray(new Type(numComponents * numElements), numComponents); +} + +function allButIndices(name) { + return name !== "indices"; +} + +/** + * Given indexed vertices creates a new set of vertices un-indexed by expanding the indexed vertices. + * @param {Object.} vertices The indexed vertices to deindex + * @return {Object.} The deindexed vertices + * @memberOf module:twgl/primitives + */ +function deindexVertices(vertices) { + const indices = vertices.indices; + const newVertices = {}; + const numElements = indices.length; + + function expandToUnindexed(channel) { + const srcBuffer = vertices[channel]; + const numComponents = srcBuffer.numComponents; + const dstBuffer = createAugmentedTypedArray(numComponents, numElements, srcBuffer.constructor); + for (let ii = 0; ii < numElements; ++ii) { + const ndx = indices[ii]; + const offset = ndx * numComponents; + for (let jj = 0; jj < numComponents; ++jj) { + dstBuffer.push(srcBuffer[offset + jj]); + } + } + newVertices[channel] = dstBuffer; + } + + Object.keys(vertices).filter(allButIndices).forEach(expandToUnindexed); + + return newVertices; +} + +/** + * flattens the normals of deindexed vertices in place. + * @param {Object.} vertices The deindexed vertices who's normals to flatten + * @return {Object.} The flattened vertices (same as was passed in) + * @memberOf module:twgl/primitives + */ +function flattenNormals(vertices) { + if (vertices.indices) { + throw new Error('can not flatten normals of indexed vertices. deindex them first'); + } + + const normals = vertices.normal; + const numNormals = normals.length; + for (let ii = 0; ii < numNormals; ii += 9) { + // pull out the 3 normals for this triangle + const nax = normals[ii + 0]; + const nay = normals[ii + 1]; + const naz = normals[ii + 2]; + + const nbx = normals[ii + 3]; + const nby = normals[ii + 4]; + const nbz = normals[ii + 5]; + + const ncx = normals[ii + 6]; + const ncy = normals[ii + 7]; + const ncz = normals[ii + 8]; + + // add them + let nx = nax + nbx + ncx; + let ny = nay + nby + ncy; + let nz = naz + nbz + ncz; + + // normalize them + const length = Math.sqrt(nx * nx + ny * ny + nz * nz); + + nx /= length; + ny /= length; + nz /= length; + + // copy them back in + normals[ii + 0] = nx; + normals[ii + 1] = ny; + normals[ii + 2] = nz; + + normals[ii + 3] = nx; + normals[ii + 4] = ny; + normals[ii + 5] = nz; + + normals[ii + 6] = nx; + normals[ii + 7] = ny; + normals[ii + 8] = nz; + } + + return vertices; +} + +function applyFuncToV3Array(array, matrix, fn) { + const len = array.length; + const tmp = new Float32Array(3); + for (let ii = 0; ii < len; ii += 3) { + fn(matrix, [array[ii], array[ii + 1], array[ii + 2]], tmp); + array[ii ] = tmp[0]; + array[ii + 1] = tmp[1]; + array[ii + 2] = tmp[2]; + } +} + +function transformNormal(mi, v, dst) { + dst = dst || create$1(); + const v0 = v[0]; + const v1 = v[1]; + const v2 = v[2]; + + dst[0] = v0 * mi[0 * 4 + 0] + v1 * mi[0 * 4 + 1] + v2 * mi[0 * 4 + 2]; + dst[1] = v0 * mi[1 * 4 + 0] + v1 * mi[1 * 4 + 1] + v2 * mi[1 * 4 + 2]; + dst[2] = v0 * mi[2 * 4 + 0] + v1 * mi[2 * 4 + 1] + v2 * mi[2 * 4 + 2]; + + return dst; +} + +/** + * Reorients directions by the given matrix.. + * @param {(number[]|TypedArray)} array The array. Assumes value floats per element. + * @param {module:twgl/m4.Mat4} matrix A matrix to multiply by. + * @return {(number[]|TypedArray)} the same array that was passed in + * @memberOf module:twgl/primitives + */ +function reorientDirections(array, matrix) { + applyFuncToV3Array(array, matrix, transformDirection); + return array; +} + +/** + * Reorients normals by the inverse-transpose of the given + * matrix.. + * @param {(number[]|TypedArray)} array The array. Assumes value floats per element. + * @param {module:twgl/m4.Mat4} matrix A matrix to multiply by. + * @return {(number[]|TypedArray)} the same array that was passed in + * @memberOf module:twgl/primitives + */ +function reorientNormals(array, matrix) { + applyFuncToV3Array(array, inverse(matrix), transformNormal); + return array; +} + +/** + * Reorients positions by the given matrix. In other words, it + * multiplies each vertex by the given matrix. + * @param {(number[]|TypedArray)} array The array. Assumes value floats per element. + * @param {module:twgl/m4.Mat4} matrix A matrix to multiply by. + * @return {(number[]|TypedArray)} the same array that was passed in + * @memberOf module:twgl/primitives + */ +function reorientPositions(array, matrix) { + applyFuncToV3Array(array, matrix, transformPoint); + return array; +} + +/** + * @typedef {(number[]|TypedArray)} NativeArrayOrTypedArray + */ + +/** + * Reorients arrays by the given matrix. Assumes arrays have + * names that contains 'pos' could be reoriented as positions, + * 'binorm' or 'tan' as directions, and 'norm' as normals. + * + * @param {Object.} arrays The vertices to reorient + * @param {module:twgl/m4.Mat4} matrix matrix to reorient by. + * @return {Object.} same arrays that were passed in. + * @memberOf module:twgl/primitives + */ +function reorientVertices(arrays, matrix) { + Object.keys(arrays).forEach(function(name) { + const array = arrays[name]; + if (name.indexOf("pos") >= 0) { + reorientPositions(array, matrix); + } else if (name.indexOf("tan") >= 0 || name.indexOf("binorm") >= 0) { + reorientDirections(array, matrix); + } else if (name.indexOf("norm") >= 0) { + reorientNormals(array, matrix); + } + }); + return arrays; +} + +/** + * Creates XY quad BufferInfo + * + * The default with no parameters will return a 2x2 quad with values from -1 to +1. + * If you want a unit quad with that goes from 0 to 1 you'd call it with + * + * twgl.primitives.createXYQuadBufferInfo(gl, 1, 0.5, 0.5); + * + * If you want a unit quad centered above 0,0 you'd call it with + * + * twgl.primitives.createXYQuadBufferInfo(gl, 1, 0, 0.5); + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} [size] the size across the quad. Defaults to 2 which means vertices will go from -1 to +1 + * @param {number} [xOffset] the amount to offset the quad in X + * @param {number} [yOffset] the amount to offset the quad in Y + * @return {Object.} the created XY Quad BufferInfo + * @memberOf module:twgl/primitives + * @function createXYQuadBuffers + */ + +/** + * Creates XY quad Buffers + * + * The default with no parameters will return a 2x2 quad with values from -1 to +1. + * If you want a unit quad with that goes from 0 to 1 you'd call it with + * + * twgl.primitives.createXYQuadBufferInfo(gl, 1, 0.5, 0.5); + * + * If you want a unit quad centered above 0,0 you'd call it with + * + * twgl.primitives.createXYQuadBufferInfo(gl, 1, 0, 0.5); + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} [size] the size across the quad. Defaults to 2 which means vertices will go from -1 to +1 + * @param {number} [xOffset] the amount to offset the quad in X + * @param {number} [yOffset] the amount to offset the quad in Y + * @return {module:twgl.BufferInfo} the created XY Quad buffers + * @memberOf module:twgl/primitives + * @function createXYQuadBufferInfo + */ + +/** + * Creates XY quad vertices + * + * The default with no parameters will return a 2x2 quad with values from -1 to +1. + * If you want a unit quad with that goes from 0 to 1 you'd call it with + * + * twgl.primitives.createXYQuadVertices(1, 0.5, 0.5); + * + * If you want a unit quad centered above 0,0 you'd call it with + * + * twgl.primitives.createXYQuadVertices(1, 0, 0.5); + * + * @param {number} [size] the size across the quad. Defaults to 2 which means vertices will go from -1 to +1 + * @param {number} [xOffset] the amount to offset the quad in X + * @param {number} [yOffset] the amount to offset the quad in Y + * @return {Object.} the created XY Quad vertices + * @memberOf module:twgl/primitives + */ +function createXYQuadVertices(size, xOffset, yOffset) { + size = size || 2; + xOffset = xOffset || 0; + yOffset = yOffset || 0; + size *= 0.5; + return { + position: { + numComponents: 2, + data: [ + xOffset + -1 * size, yOffset + -1 * size, + xOffset + 1 * size, yOffset + -1 * size, + xOffset + -1 * size, yOffset + 1 * size, + xOffset + 1 * size, yOffset + 1 * size, + ], + }, + normal: [ + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + ], + texcoord: [ + 0, 0, + 1, 0, + 0, 1, + 1, 1, + ], + indices: [ 0, 1, 2, 2, 1, 3 ], + }; +} + +/** + * Creates XZ plane BufferInfo. + * + * The created plane has position, normal, and texcoord data + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} [width] Width of the plane. Default = 1 + * @param {number} [depth] Depth of the plane. Default = 1 + * @param {number} [subdivisionsWidth] Number of steps across the plane. Default = 1 + * @param {number} [subdivisionsDepth] Number of steps down the plane. Default = 1 + * @param {module:twgl/m4.Mat4} [matrix] A matrix by which to multiply all the vertices. + * @return {module:twgl.BufferInfo} The created plane BufferInfo. + * @memberOf module:twgl/primitives + * @function createPlaneBufferInfo + */ + +/** + * Creates XZ plane buffers. + * + * The created plane has position, normal, and texcoord data + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} [width] Width of the plane. Default = 1 + * @param {number} [depth] Depth of the plane. Default = 1 + * @param {number} [subdivisionsWidth] Number of steps across the plane. Default = 1 + * @param {number} [subdivisionsDepth] Number of steps down the plane. Default = 1 + * @param {module:twgl/m4.Mat4} [matrix] A matrix by which to multiply all the vertices. + * @return {Object.} The created plane buffers. + * @memberOf module:twgl/primitives + * @function createPlaneBuffers + */ + +/** + * Creates XZ plane vertices. + * + * The created plane has position, normal, and texcoord data + * + * @param {number} [width] Width of the plane. Default = 1 + * @param {number} [depth] Depth of the plane. Default = 1 + * @param {number} [subdivisionsWidth] Number of steps across the plane. Default = 1 + * @param {number} [subdivisionsDepth] Number of steps down the plane. Default = 1 + * @param {module:twgl/m4.Mat4} [matrix] A matrix by which to multiply all the vertices. + * @return {Object.} The created plane vertices. + * @memberOf module:twgl/primitives + */ +function createPlaneVertices( + width, + depth, + subdivisionsWidth, + subdivisionsDepth, + matrix) { + width = width || 1; + depth = depth || 1; + subdivisionsWidth = subdivisionsWidth || 1; + subdivisionsDepth = subdivisionsDepth || 1; + matrix = matrix || identity(); + + const numVertices = (subdivisionsWidth + 1) * (subdivisionsDepth + 1); + const positions = createAugmentedTypedArray(3, numVertices); + const normals = createAugmentedTypedArray(3, numVertices); + const texcoords = createAugmentedTypedArray(2, numVertices); + + for (let z = 0; z <= subdivisionsDepth; z++) { + for (let x = 0; x <= subdivisionsWidth; x++) { + const u = x / subdivisionsWidth; + const v = z / subdivisionsDepth; + positions.push( + width * u - width * 0.5, + 0, + depth * v - depth * 0.5); + normals.push(0, 1, 0); + texcoords.push(u, v); + } + } + + const numVertsAcross = subdivisionsWidth + 1; + const indices = createAugmentedTypedArray( + 3, subdivisionsWidth * subdivisionsDepth * 2, Uint16Array); + + for (let z = 0; z < subdivisionsDepth; z++) { // eslint-disable-line + for (let x = 0; x < subdivisionsWidth; x++) { // eslint-disable-line + // Make triangle 1 of quad. + indices.push( + (z + 0) * numVertsAcross + x, + (z + 1) * numVertsAcross + x, + (z + 0) * numVertsAcross + x + 1); + + // Make triangle 2 of quad. + indices.push( + (z + 1) * numVertsAcross + x, + (z + 1) * numVertsAcross + x + 1, + (z + 0) * numVertsAcross + x + 1); + } + } + + const arrays = reorientVertices({ + position: positions, + normal: normals, + texcoord: texcoords, + indices: indices, + }, matrix); + return arrays; +} + +/** + * Creates sphere BufferInfo. + * + * The created sphere has position, normal, and texcoord data + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius radius of the sphere. + * @param {number} subdivisionsAxis number of steps around the sphere. + * @param {number} subdivisionsHeight number of vertically on the sphere. + * @param {number} [opt_startLatitudeInRadians] where to start the + * top of the sphere. Default = 0. + * @param {number} [opt_endLatitudeInRadians] Where to end the + * bottom of the sphere. Default = Math.PI. + * @param {number} [opt_startLongitudeInRadians] where to start + * wrapping the sphere. Default = 0. + * @param {number} [opt_endLongitudeInRadians] where to end + * wrapping the sphere. Default = 2 * Math.PI. + * @return {module:twgl.BufferInfo} The created sphere BufferInfo. + * @memberOf module:twgl/primitives + * @function createSphereBufferInfo + */ + +/** + * Creates sphere buffers. + * + * The created sphere has position, normal, and texcoord data + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius radius of the sphere. + * @param {number} subdivisionsAxis number of steps around the sphere. + * @param {number} subdivisionsHeight number of vertically on the sphere. + * @param {number} [opt_startLatitudeInRadians] where to start the + * top of the sphere. Default = 0. + * @param {number} [opt_endLatitudeInRadians] Where to end the + * bottom of the sphere. Default = Math.PI. + * @param {number} [opt_startLongitudeInRadians] where to start + * wrapping the sphere. Default = 0. + * @param {number} [opt_endLongitudeInRadians] where to end + * wrapping the sphere. Default = 2 * Math.PI. + * @return {Object.} The created sphere buffers. + * @memberOf module:twgl/primitives + * @function createSphereBuffers + */ + +/** + * Creates sphere vertices. + * + * The created sphere has position, normal, and texcoord data + * + * @param {number} radius radius of the sphere. + * @param {number} subdivisionsAxis number of steps around the sphere. + * @param {number} subdivisionsHeight number of vertically on the sphere. + * @param {number} [opt_startLatitudeInRadians] where to start the + * top of the sphere. Default = 0. + * @param {number} [opt_endLatitudeInRadians] Where to end the + * bottom of the sphere. Default = Math.PI. + * @param {number} [opt_startLongitudeInRadians] where to start + * wrapping the sphere. Default = 0. + * @param {number} [opt_endLongitudeInRadians] where to end + * wrapping the sphere. Default = 2 * Math.PI. + * @return {Object.} The created sphere vertices. + * @memberOf module:twgl/primitives + */ +function createSphereVertices( + radius, + subdivisionsAxis, + subdivisionsHeight, + opt_startLatitudeInRadians, + opt_endLatitudeInRadians, + opt_startLongitudeInRadians, + opt_endLongitudeInRadians) { + if (subdivisionsAxis <= 0 || subdivisionsHeight <= 0) { + throw new Error('subdivisionAxis and subdivisionHeight must be > 0'); + } + + opt_startLatitudeInRadians = opt_startLatitudeInRadians || 0; + opt_endLatitudeInRadians = opt_endLatitudeInRadians || Math.PI; + opt_startLongitudeInRadians = opt_startLongitudeInRadians || 0; + opt_endLongitudeInRadians = opt_endLongitudeInRadians || (Math.PI * 2); + + const latRange = opt_endLatitudeInRadians - opt_startLatitudeInRadians; + const longRange = opt_endLongitudeInRadians - opt_startLongitudeInRadians; + + // We are going to generate our sphere by iterating through its + // spherical coordinates and generating 2 triangles for each quad on a + // ring of the sphere. + const numVertices = (subdivisionsAxis + 1) * (subdivisionsHeight + 1); + const positions = createAugmentedTypedArray(3, numVertices); + const normals = createAugmentedTypedArray(3, numVertices); + const texcoords = createAugmentedTypedArray(2, numVertices); + + // Generate the individual vertices in our vertex buffer. + for (let y = 0; y <= subdivisionsHeight; y++) { + for (let x = 0; x <= subdivisionsAxis; x++) { + // Generate a vertex based on its spherical coordinates + const u = x / subdivisionsAxis; + const v = y / subdivisionsHeight; + const theta = longRange * u + opt_startLongitudeInRadians; + const phi = latRange * v + opt_startLatitudeInRadians; + const sinTheta = Math.sin(theta); + const cosTheta = Math.cos(theta); + const sinPhi = Math.sin(phi); + const cosPhi = Math.cos(phi); + const ux = cosTheta * sinPhi; + const uy = cosPhi; + const uz = sinTheta * sinPhi; + positions.push(radius * ux, radius * uy, radius * uz); + normals.push(ux, uy, uz); + texcoords.push(1 - u, v); + } + } + + const numVertsAround = subdivisionsAxis + 1; + const indices = createAugmentedTypedArray(3, subdivisionsAxis * subdivisionsHeight * 2, Uint16Array); + for (let x = 0; x < subdivisionsAxis; x++) { // eslint-disable-line + for (let y = 0; y < subdivisionsHeight; y++) { // eslint-disable-line + // Make triangle 1 of quad. + indices.push( + (y + 0) * numVertsAround + x, + (y + 0) * numVertsAround + x + 1, + (y + 1) * numVertsAround + x); + + // Make triangle 2 of quad. + indices.push( + (y + 1) * numVertsAround + x, + (y + 0) * numVertsAround + x + 1, + (y + 1) * numVertsAround + x + 1); + } + } + + return { + position: positions, + normal: normals, + texcoord: texcoords, + indices: indices, + }; +} + +/** + * Array of the indices of corners of each face of a cube. + * @type {Array.} + * @private + */ +const CUBE_FACE_INDICES = [ + [3, 7, 5, 1], // right + [6, 2, 0, 4], // left + [6, 7, 3, 2], // ?? + [0, 1, 5, 4], // ?? + [7, 6, 4, 5], // front + [2, 3, 1, 0], // back +]; + +/** + * Creates a BufferInfo for a cube. + * + * The cube is created around the origin. (-size / 2, size / 2). + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} [size] width, height and depth of the cube. + * @return {module:twgl.BufferInfo} The created BufferInfo. + * @memberOf module:twgl/primitives + * @function createCubeBufferInfo + */ + +/** + * Creates the buffers and indices for a cube. + * + * The cube is created around the origin. (-size / 2, size / 2). + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} [size] width, height and depth of the cube. + * @return {Object.} The created buffers. + * @memberOf module:twgl/primitives + * @function createCubeBuffers + */ + +/** + * Creates the vertices and indices for a cube. + * + * The cube is created around the origin. (-size / 2, size / 2). + * + * @param {number} [size] width, height and depth of the cube. + * @return {Object.} The created vertices. + * @memberOf module:twgl/primitives + */ +function createCubeVertices(size) { + size = size || 1; + const k = size / 2; + + const cornerVertices = [ + [-k, -k, -k], + [+k, -k, -k], + [-k, +k, -k], + [+k, +k, -k], + [-k, -k, +k], + [+k, -k, +k], + [-k, +k, +k], + [+k, +k, +k], + ]; + + const faceNormals = [ + [+1, +0, +0], + [-1, +0, +0], + [+0, +1, +0], + [+0, -1, +0], + [+0, +0, +1], + [+0, +0, -1], + ]; + + const uvCoords = [ + [1, 0], + [0, 0], + [0, 1], + [1, 1], + ]; + + const numVertices = 6 * 4; + const positions = createAugmentedTypedArray(3, numVertices); + const normals = createAugmentedTypedArray(3, numVertices); + const texcoords = createAugmentedTypedArray(2 , numVertices); + const indices = createAugmentedTypedArray(3, 6 * 2, Uint16Array); + + for (let f = 0; f < 6; ++f) { + const faceIndices = CUBE_FACE_INDICES[f]; + for (let v = 0; v < 4; ++v) { + const position = cornerVertices[faceIndices[v]]; + const normal = faceNormals[f]; + const uv = uvCoords[v]; + + // Each face needs all four vertices because the normals and texture + // coordinates are not all the same. + positions.push(position); + normals.push(normal); + texcoords.push(uv); + + } + // Two triangles make a square face. + const offset = 4 * f; + indices.push(offset + 0, offset + 1, offset + 2); + indices.push(offset + 0, offset + 2, offset + 3); + } + + return { + position: positions, + normal: normals, + texcoord: texcoords, + indices: indices, + }; +} + +/** + * Creates a BufferInfo for a truncated cone, which is like a cylinder + * except that it has different top and bottom radii. A truncated cone + * can also be used to create cylinders and regular cones. The + * truncated cone will be created centered about the origin, with the + * y axis as its vertical axis. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} bottomRadius Bottom radius of truncated cone. + * @param {number} topRadius Top radius of truncated cone. + * @param {number} height Height of truncated cone. + * @param {number} radialSubdivisions The number of subdivisions around the + * truncated cone. + * @param {number} verticalSubdivisions The number of subdivisions down the + * truncated cone. + * @param {boolean} [opt_topCap] Create top cap. Default = true. + * @param {boolean} [opt_bottomCap] Create bottom cap. Default = true. + * @return {module:twgl.BufferInfo} The created cone BufferInfo. + * @memberOf module:twgl/primitives + * @function createTruncatedConeBufferInfo + */ + +/** + * Creates buffers for a truncated cone, which is like a cylinder + * except that it has different top and bottom radii. A truncated cone + * can also be used to create cylinders and regular cones. The + * truncated cone will be created centered about the origin, with the + * y axis as its vertical axis. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} bottomRadius Bottom radius of truncated cone. + * @param {number} topRadius Top radius of truncated cone. + * @param {number} height Height of truncated cone. + * @param {number} radialSubdivisions The number of subdivisions around the + * truncated cone. + * @param {number} verticalSubdivisions The number of subdivisions down the + * truncated cone. + * @param {boolean} [opt_topCap] Create top cap. Default = true. + * @param {boolean} [opt_bottomCap] Create bottom cap. Default = true. + * @return {Object.} The created cone buffers. + * @memberOf module:twgl/primitives + * @function createTruncatedConeBuffers + */ + +/** + * Creates vertices for a truncated cone, which is like a cylinder + * except that it has different top and bottom radii. A truncated cone + * can also be used to create cylinders and regular cones. The + * truncated cone will be created centered about the origin, with the + * y axis as its vertical axis. . + * + * @param {number} bottomRadius Bottom radius of truncated cone. + * @param {number} topRadius Top radius of truncated cone. + * @param {number} height Height of truncated cone. + * @param {number} radialSubdivisions The number of subdivisions around the + * truncated cone. + * @param {number} verticalSubdivisions The number of subdivisions down the + * truncated cone. + * @param {boolean} [opt_topCap] Create top cap. Default = true. + * @param {boolean} [opt_bottomCap] Create bottom cap. Default = true. + * @return {Object.} The created cone vertices. + * @memberOf module:twgl/primitives + */ +function createTruncatedConeVertices( + bottomRadius, + topRadius, + height, + radialSubdivisions, + verticalSubdivisions, + opt_topCap, + opt_bottomCap) { + if (radialSubdivisions < 3) { + throw new Error('radialSubdivisions must be 3 or greater'); + } + + if (verticalSubdivisions < 1) { + throw new Error('verticalSubdivisions must be 1 or greater'); + } + + const topCap = (opt_topCap === undefined) ? true : opt_topCap; + const bottomCap = (opt_bottomCap === undefined) ? true : opt_bottomCap; + + const extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0); + + const numVertices = (radialSubdivisions + 1) * (verticalSubdivisions + 1 + extra); + const positions = createAugmentedTypedArray(3, numVertices); + const normals = createAugmentedTypedArray(3, numVertices); + const texcoords = createAugmentedTypedArray(2, numVertices); + const indices = createAugmentedTypedArray(3, radialSubdivisions * (verticalSubdivisions + extra / 2) * 2, Uint16Array); + + const vertsAroundEdge = radialSubdivisions + 1; + + // The slant of the cone is constant across its surface + const slant = Math.atan2(bottomRadius - topRadius, height); + const cosSlant = Math.cos(slant); + const sinSlant = Math.sin(slant); + + const start = topCap ? -2 : 0; + const end = verticalSubdivisions + (bottomCap ? 2 : 0); + + for (let yy = start; yy <= end; ++yy) { + let v = yy / verticalSubdivisions; + let y = height * v; + let ringRadius; + if (yy < 0) { + y = 0; + v = 1; + ringRadius = bottomRadius; + } else if (yy > verticalSubdivisions) { + y = height; + v = 1; + ringRadius = topRadius; + } else { + ringRadius = bottomRadius + + (topRadius - bottomRadius) * (yy / verticalSubdivisions); + } + if (yy === -2 || yy === verticalSubdivisions + 2) { + ringRadius = 0; + v = 0; + } + y -= height / 2; + for (let ii = 0; ii < vertsAroundEdge; ++ii) { + const sin = Math.sin(ii * Math.PI * 2 / radialSubdivisions); + const cos = Math.cos(ii * Math.PI * 2 / radialSubdivisions); + positions.push(sin * ringRadius, y, cos * ringRadius); + if (yy < 0) { + normals.push(0, -1, 0); + } else if (yy > verticalSubdivisions) { + normals.push(0, 1, 0); + } else if (ringRadius === 0.0) { + normals.push(0, 0, 0); + } else { + normals.push(sin * cosSlant, sinSlant, cos * cosSlant); + } + texcoords.push((ii / radialSubdivisions), 1 - v); + } + } + + for (let yy = 0; yy < verticalSubdivisions + extra; ++yy) { // eslint-disable-line + if (yy === 1 && topCap || yy === verticalSubdivisions + extra - 2 && bottomCap) { + continue; + } + for (let ii = 0; ii < radialSubdivisions; ++ii) { // eslint-disable-line + indices.push(vertsAroundEdge * (yy + 0) + 0 + ii, + vertsAroundEdge * (yy + 0) + 1 + ii, + vertsAroundEdge * (yy + 1) + 1 + ii); + indices.push(vertsAroundEdge * (yy + 0) + 0 + ii, + vertsAroundEdge * (yy + 1) + 1 + ii, + vertsAroundEdge * (yy + 1) + 0 + ii); + } + } + + return { + position: positions, + normal: normals, + texcoord: texcoords, + indices: indices, + }; +} + +/** + * Expands RLE data + * @param {number[]} rleData data in format of run-length, x, y, z, run-length, x, y, z + * @param {number[]} [padding] value to add each entry with. + * @return {number[]} the expanded rleData + * @private + */ +function expandRLEData(rleData, padding) { + padding = padding || []; + const data = []; + for (let ii = 0; ii < rleData.length; ii += 4) { + const runLength = rleData[ii]; + const element = rleData.slice(ii + 1, ii + 4); + element.push.apply(element, padding); + for (let jj = 0; jj < runLength; ++jj) { + data.push.apply(data, element); + } + } + return data; +} + +/** + * Creates 3D 'F' BufferInfo. + * An 'F' is useful because you can easily tell which way it is oriented. + * The created 'F' has position, normal, texcoord, and color buffers. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @return {module:twgl.BufferInfo} The created BufferInfo. + * @memberOf module:twgl/primitives + * @function create3DFBufferInfo + */ + +/** + * Creates 3D 'F' buffers. + * An 'F' is useful because you can easily tell which way it is oriented. + * The created 'F' has position, normal, texcoord, and color buffers. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @return {Object.} The created buffers. + * @memberOf module:twgl/primitives + * @function create3DFBuffers + */ + +/** + * Creates 3D 'F' vertices. + * An 'F' is useful because you can easily tell which way it is oriented. + * The created 'F' has position, normal, texcoord, and color arrays. + * + * @return {Object.} The created vertices. + * @memberOf module:twgl/primitives + */ +function create3DFVertices() { + + const positions = [ + // left column front + 0, 0, 0, + 0, 150, 0, + 30, 0, 0, + 0, 150, 0, + 30, 150, 0, + 30, 0, 0, + + // top rung front + 30, 0, 0, + 30, 30, 0, + 100, 0, 0, + 30, 30, 0, + 100, 30, 0, + 100, 0, 0, + + // middle rung front + 30, 60, 0, + 30, 90, 0, + 67, 60, 0, + 30, 90, 0, + 67, 90, 0, + 67, 60, 0, + + // left column back + 0, 0, 30, + 30, 0, 30, + 0, 150, 30, + 0, 150, 30, + 30, 0, 30, + 30, 150, 30, + + // top rung back + 30, 0, 30, + 100, 0, 30, + 30, 30, 30, + 30, 30, 30, + 100, 0, 30, + 100, 30, 30, + + // middle rung back + 30, 60, 30, + 67, 60, 30, + 30, 90, 30, + 30, 90, 30, + 67, 60, 30, + 67, 90, 30, + + // top + 0, 0, 0, + 100, 0, 0, + 100, 0, 30, + 0, 0, 0, + 100, 0, 30, + 0, 0, 30, + + // top rung front + 100, 0, 0, + 100, 30, 0, + 100, 30, 30, + 100, 0, 0, + 100, 30, 30, + 100, 0, 30, + + // under top rung + 30, 30, 0, + 30, 30, 30, + 100, 30, 30, + 30, 30, 0, + 100, 30, 30, + 100, 30, 0, + + // between top rung and middle + 30, 30, 0, + 30, 60, 30, + 30, 30, 30, + 30, 30, 0, + 30, 60, 0, + 30, 60, 30, + + // top of middle rung + 30, 60, 0, + 67, 60, 30, + 30, 60, 30, + 30, 60, 0, + 67, 60, 0, + 67, 60, 30, + + // front of middle rung + 67, 60, 0, + 67, 90, 30, + 67, 60, 30, + 67, 60, 0, + 67, 90, 0, + 67, 90, 30, + + // bottom of middle rung. + 30, 90, 0, + 30, 90, 30, + 67, 90, 30, + 30, 90, 0, + 67, 90, 30, + 67, 90, 0, + + // front of bottom + 30, 90, 0, + 30, 150, 30, + 30, 90, 30, + 30, 90, 0, + 30, 150, 0, + 30, 150, 30, + + // bottom + 0, 150, 0, + 0, 150, 30, + 30, 150, 30, + 0, 150, 0, + 30, 150, 30, + 30, 150, 0, + + // left side + 0, 0, 0, + 0, 0, 30, + 0, 150, 30, + 0, 0, 0, + 0, 150, 30, + 0, 150, 0, + ]; + + const texcoords = [ + // left column front + 0.22, 0.19, + 0.22, 0.79, + 0.34, 0.19, + 0.22, 0.79, + 0.34, 0.79, + 0.34, 0.19, + + // top rung front + 0.34, 0.19, + 0.34, 0.31, + 0.62, 0.19, + 0.34, 0.31, + 0.62, 0.31, + 0.62, 0.19, + + // middle rung front + 0.34, 0.43, + 0.34, 0.55, + 0.49, 0.43, + 0.34, 0.55, + 0.49, 0.55, + 0.49, 0.43, + + // left column back + 0, 0, + 1, 0, + 0, 1, + 0, 1, + 1, 0, + 1, 1, + + // top rung back + 0, 0, + 1, 0, + 0, 1, + 0, 1, + 1, 0, + 1, 1, + + // middle rung back + 0, 0, + 1, 0, + 0, 1, + 0, 1, + 1, 0, + 1, 1, + + // top + 0, 0, + 1, 0, + 1, 1, + 0, 0, + 1, 1, + 0, 1, + + // top rung front + 0, 0, + 1, 0, + 1, 1, + 0, 0, + 1, 1, + 0, 1, + + // under top rung + 0, 0, + 0, 1, + 1, 1, + 0, 0, + 1, 1, + 1, 0, + + // between top rung and middle + 0, 0, + 1, 1, + 0, 1, + 0, 0, + 1, 0, + 1, 1, + + // top of middle rung + 0, 0, + 1, 1, + 0, 1, + 0, 0, + 1, 0, + 1, 1, + + // front of middle rung + 0, 0, + 1, 1, + 0, 1, + 0, 0, + 1, 0, + 1, 1, + + // bottom of middle rung. + 0, 0, + 0, 1, + 1, 1, + 0, 0, + 1, 1, + 1, 0, + + // front of bottom + 0, 0, + 1, 1, + 0, 1, + 0, 0, + 1, 0, + 1, 1, + + // bottom + 0, 0, + 0, 1, + 1, 1, + 0, 0, + 1, 1, + 1, 0, + + // left side + 0, 0, + 0, 1, + 1, 1, + 0, 0, + 1, 1, + 1, 0, + ]; + + const normals = expandRLEData([ + // left column front + // top rung front + // middle rung front + 18, 0, 0, 1, + + // left column back + // top rung back + // middle rung back + 18, 0, 0, -1, + + // top + 6, 0, 1, 0, + + // top rung front + 6, 1, 0, 0, + + // under top rung + 6, 0, -1, 0, + + // between top rung and middle + 6, 1, 0, 0, + + // top of middle rung + 6, 0, 1, 0, + + // front of middle rung + 6, 1, 0, 0, + + // bottom of middle rung. + 6, 0, -1, 0, + + // front of bottom + 6, 1, 0, 0, + + // bottom + 6, 0, -1, 0, + + // left side + 6, -1, 0, 0, + ]); + + const colors = expandRLEData([ + // left column front + // top rung front + // middle rung front + 18, 200, 70, 120, + + // left column back + // top rung back + // middle rung back + 18, 80, 70, 200, + + // top + 6, 70, 200, 210, + + // top rung front + 6, 200, 200, 70, + + // under top rung + 6, 210, 100, 70, + + // between top rung and middle + 6, 210, 160, 70, + + // top of middle rung + 6, 70, 180, 210, + + // front of middle rung + 6, 100, 70, 210, + + // bottom of middle rung. + 6, 76, 210, 100, + + // front of bottom + 6, 140, 210, 80, + + // bottom + 6, 90, 130, 110, + + // left side + 6, 160, 160, 220, + ], [255]); + + const numVerts = positions.length / 3; + + const arrays = { + position: createAugmentedTypedArray(3, numVerts), + texcoord: createAugmentedTypedArray(2, numVerts), + normal: createAugmentedTypedArray(3, numVerts), + color: createAugmentedTypedArray(4, numVerts, Uint8Array), + indices: createAugmentedTypedArray(3, numVerts / 3, Uint16Array), + }; + + arrays.position.push(positions); + arrays.texcoord.push(texcoords); + arrays.normal.push(normals); + arrays.color.push(colors); + + for (let ii = 0; ii < numVerts; ++ii) { + arrays.indices.push(ii); + } + + return arrays; +} + +/** + * Creates crescent BufferInfo. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} verticalRadius The vertical radius of the crescent. + * @param {number} outerRadius The outer radius of the crescent. + * @param {number} innerRadius The inner radius of the crescent. + * @param {number} thickness The thickness of the crescent. + * @param {number} subdivisionsDown number of steps around the crescent. + * @param {number} [startOffset] Where to start arc. Default 0. + * @param {number} [endOffset] Where to end arg. Default 1. + * @return {module:twgl.BufferInfo} The created BufferInfo. + * @memberOf module:twgl/primitives + * @function createCresentBufferInfo + */ + +/** + * Creates crescent buffers. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} verticalRadius The vertical radius of the crescent. + * @param {number} outerRadius The outer radius of the crescent. + * @param {number} innerRadius The inner radius of the crescent. + * @param {number} thickness The thickness of the crescent. + * @param {number} subdivisionsDown number of steps around the crescent. + * @param {number} [startOffset] Where to start arc. Default 0. + * @param {number} [endOffset] Where to end arg. Default 1. + * @return {Object.} The created buffers. + * @memberOf module:twgl/primitives + * @function createCresentBuffers + */ + +/** + * Creates crescent vertices. + * + * @param {number} verticalRadius The vertical radius of the crescent. + * @param {number} outerRadius The outer radius of the crescent. + * @param {number} innerRadius The inner radius of the crescent. + * @param {number} thickness The thickness of the crescent. + * @param {number} subdivisionsDown number of steps around the crescent. + * @param {number} [startOffset] Where to start arc. Default 0. + * @param {number} [endOffset] Where to end arg. Default 1. + * @return {Object.} The created vertices. + * @memberOf module:twgl/primitives + * @function createCresentBuffers + */ + +/** + * Creates crescent BufferInfo. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} verticalRadius The vertical radius of the crescent. + * @param {number} outerRadius The outer radius of the crescent. + * @param {number} innerRadius The inner radius of the crescent. + * @param {number} thickness The thickness of the crescent. + * @param {number} subdivisionsDown number of steps around the crescent. + * @param {number} [startOffset] Where to start arc. Default 0. + * @param {number} [endOffset] Where to end arg. Default 1. + * @return {module:twgl.BufferInfo} The created BufferInfo. + * @memberOf module:twgl/primitives + * @function createCrescentBufferInfo + */ + +/** + * Creates crescent buffers. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} verticalRadius The vertical radius of the crescent. + * @param {number} outerRadius The outer radius of the crescent. + * @param {number} innerRadius The inner radius of the crescent. + * @param {number} thickness The thickness of the crescent. + * @param {number} subdivisionsDown number of steps around the crescent. + * @param {number} [startOffset] Where to start arc. Default 0. + * @param {number} [endOffset] Where to end arg. Default 1. + * @return {Object.} The created buffers. + * @memberOf module:twgl/primitives + * @function createCrescentBuffers + */ + +/** + * Creates crescent vertices. + * + * @param {number} verticalRadius The vertical radius of the crescent. + * @param {number} outerRadius The outer radius of the crescent. + * @param {number} innerRadius The inner radius of the crescent. + * @param {number} thickness The thickness of the crescent. + * @param {number} subdivisionsDown number of steps around the crescent. + * @param {number} [startOffset] Where to start arc. Default 0. + * @param {number} [endOffset] Where to end arg. Default 1. + * @return {Object.} The created vertices. + * @memberOf module:twgl/primitives + */ + function createCrescentVertices( + verticalRadius, + outerRadius, + innerRadius, + thickness, + subdivisionsDown, + startOffset, + endOffset) { + if (subdivisionsDown <= 0) { + throw new Error('subdivisionDown must be > 0'); + } + + startOffset = startOffset || 0; + endOffset = endOffset || 1; + + const subdivisionsThick = 2; + + const offsetRange = endOffset - startOffset; + const numVertices = (subdivisionsDown + 1) * 2 * (2 + subdivisionsThick); + const positions = createAugmentedTypedArray(3, numVertices); + const normals = createAugmentedTypedArray(3, numVertices); + const texcoords = createAugmentedTypedArray(2, numVertices); + + function lerp(a, b, s) { + return a + (b - a) * s; + } + + function createArc(arcRadius, x, normalMult, normalAdd, uMult, uAdd) { + for (let z = 0; z <= subdivisionsDown; z++) { + const uBack = x / (subdivisionsThick - 1); + const v = z / subdivisionsDown; + const xBack = (uBack - 0.5) * 2; + const angle = (startOffset + (v * offsetRange)) * Math.PI; + const s = Math.sin(angle); + const c = Math.cos(angle); + const radius = lerp(verticalRadius, arcRadius, s); + const px = xBack * thickness; + const py = c * verticalRadius; + const pz = s * radius; + positions.push(px, py, pz); + const n = add(multiply$1([0, s, c], normalMult), normalAdd); + normals.push(n); + texcoords.push(uBack * uMult + uAdd, v); + } + } + + // Generate the individual vertices in our vertex buffer. + for (let x = 0; x < subdivisionsThick; x++) { + const uBack = (x / (subdivisionsThick - 1) - 0.5) * 2; + createArc(outerRadius, x, [1, 1, 1], [0, 0, 0], 1, 0); + createArc(outerRadius, x, [0, 0, 0], [uBack, 0, 0], 0, 0); + createArc(innerRadius, x, [1, 1, 1], [0, 0, 0], 1, 0); + createArc(innerRadius, x, [0, 0, 0], [uBack, 0, 0], 0, 1); + } + + // Do outer surface. + const indices = createAugmentedTypedArray(3, (subdivisionsDown * 2) * (2 + subdivisionsThick), Uint16Array); + + function createSurface(leftArcOffset, rightArcOffset) { + for (let z = 0; z < subdivisionsDown; ++z) { + // Make triangle 1 of quad. + indices.push( + leftArcOffset + z + 0, + leftArcOffset + z + 1, + rightArcOffset + z + 0); + + // Make triangle 2 of quad. + indices.push( + leftArcOffset + z + 1, + rightArcOffset + z + 1, + rightArcOffset + z + 0); + } + } + + const numVerticesDown = subdivisionsDown + 1; + // front + createSurface(numVerticesDown * 0, numVerticesDown * 4); + // right + createSurface(numVerticesDown * 5, numVerticesDown * 7); + // back + createSurface(numVerticesDown * 6, numVerticesDown * 2); + // left + createSurface(numVerticesDown * 3, numVerticesDown * 1); + + return { + position: positions, + normal: normals, + texcoord: texcoords, + indices: indices, + }; +} + +/** + * Creates cylinder BufferInfo. The cylinder will be created around the origin + * along the y-axis. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius Radius of cylinder. + * @param {number} height Height of cylinder. + * @param {number} radialSubdivisions The number of subdivisions around the cylinder. + * @param {number} verticalSubdivisions The number of subdivisions down the cylinder. + * @param {boolean} [topCap] Create top cap. Default = true. + * @param {boolean} [bottomCap] Create bottom cap. Default = true. + * @return {module:twgl.BufferInfo} The created BufferInfo. + * @memberOf module:twgl/primitives + * @function createCylinderBufferInfo + */ + + /** + * Creates cylinder buffers. The cylinder will be created around the origin + * along the y-axis. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius Radius of cylinder. + * @param {number} height Height of cylinder. + * @param {number} radialSubdivisions The number of subdivisions around the cylinder. + * @param {number} verticalSubdivisions The number of subdivisions down the cylinder. + * @param {boolean} [topCap] Create top cap. Default = true. + * @param {boolean} [bottomCap] Create bottom cap. Default = true. + * @return {Object.} The created buffers. + * @memberOf module:twgl/primitives + * @function createCylinderBuffers + */ + + /** + * Creates cylinder vertices. The cylinder will be created around the origin + * along the y-axis. + * + * @param {number} radius Radius of cylinder. + * @param {number} height Height of cylinder. + * @param {number} radialSubdivisions The number of subdivisions around the cylinder. + * @param {number} verticalSubdivisions The number of subdivisions down the cylinder. + * @param {boolean} [topCap] Create top cap. Default = true. + * @param {boolean} [bottomCap] Create bottom cap. Default = true. + * @return {Object.} The created vertices. + * @memberOf module:twgl/primitives + */ +function createCylinderVertices( + radius, + height, + radialSubdivisions, + verticalSubdivisions, + topCap, + bottomCap) { + return createTruncatedConeVertices( + radius, + radius, + height, + radialSubdivisions, + verticalSubdivisions, + topCap, + bottomCap); +} + +/** + * Creates BufferInfo for a torus + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius radius of center of torus circle. + * @param {number} thickness radius of torus ring. + * @param {number} radialSubdivisions The number of subdivisions around the torus. + * @param {number} bodySubdivisions The number of subdivisions around the body torus. + * @param {boolean} [startAngle] start angle in radians. Default = 0. + * @param {boolean} [endAngle] end angle in radians. Default = Math.PI * 2. + * @return {module:twgl.BufferInfo} The created BufferInfo. + * @memberOf module:twgl/primitives + * @function createTorusBufferInfo + */ + +/** + * Creates buffers for a torus + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius radius of center of torus circle. + * @param {number} thickness radius of torus ring. + * @param {number} radialSubdivisions The number of subdivisions around the torus. + * @param {number} bodySubdivisions The number of subdivisions around the body torus. + * @param {boolean} [startAngle] start angle in radians. Default = 0. + * @param {boolean} [endAngle] end angle in radians. Default = Math.PI * 2. + * @return {Object.} The created buffers. + * @memberOf module:twgl/primitives + * @function createTorusBuffers + */ + +/** + * Creates vertices for a torus + * + * @param {number} radius radius of center of torus circle. + * @param {number} thickness radius of torus ring. + * @param {number} radialSubdivisions The number of subdivisions around the torus. + * @param {number} bodySubdivisions The number of subdivisions around the body torus. + * @param {boolean} [startAngle] start angle in radians. Default = 0. + * @param {boolean} [endAngle] end angle in radians. Default = Math.PI * 2. + * @return {Object.} The created vertices. + * @memberOf module:twgl/primitives + */ +function createTorusVertices( + radius, + thickness, + radialSubdivisions, + bodySubdivisions, + startAngle, + endAngle) { + if (radialSubdivisions < 3) { + throw new Error('radialSubdivisions must be 3 or greater'); + } + + if (bodySubdivisions < 3) { + throw new Error('verticalSubdivisions must be 3 or greater'); + } + + startAngle = startAngle || 0; + endAngle = endAngle || Math.PI * 2; + const range = endAngle - startAngle; + + const radialParts = radialSubdivisions + 1; + const bodyParts = bodySubdivisions + 1; + const numVertices = radialParts * bodyParts; + const positions = createAugmentedTypedArray(3, numVertices); + const normals = createAugmentedTypedArray(3, numVertices); + const texcoords = createAugmentedTypedArray(2, numVertices); + const indices = createAugmentedTypedArray(3, (radialSubdivisions) * (bodySubdivisions) * 2, Uint16Array); + + for (let slice = 0; slice < bodyParts; ++slice) { + const v = slice / bodySubdivisions; + const sliceAngle = v * Math.PI * 2; + const sliceSin = Math.sin(sliceAngle); + const ringRadius = radius + sliceSin * thickness; + const ny = Math.cos(sliceAngle); + const y = ny * thickness; + for (let ring = 0; ring < radialParts; ++ring) { + const u = ring / radialSubdivisions; + const ringAngle = startAngle + u * range; + const xSin = Math.sin(ringAngle); + const zCos = Math.cos(ringAngle); + const x = xSin * ringRadius; + const z = zCos * ringRadius; + const nx = xSin * sliceSin; + const nz = zCos * sliceSin; + positions.push(x, y, z); + normals.push(nx, ny, nz); + texcoords.push(u, 1 - v); + } + } + + for (let slice = 0; slice < bodySubdivisions; ++slice) { // eslint-disable-line + for (let ring = 0; ring < radialSubdivisions; ++ring) { // eslint-disable-line + const nextRingIndex = 1 + ring; + const nextSliceIndex = 1 + slice; + indices.push(radialParts * slice + ring, + radialParts * nextSliceIndex + ring, + radialParts * slice + nextRingIndex); + indices.push(radialParts * nextSliceIndex + ring, + radialParts * nextSliceIndex + nextRingIndex, + radialParts * slice + nextRingIndex); + } + } + + return { + position: positions, + normal: normals, + texcoord: texcoords, + indices: indices, + }; +} + + +/** + * Creates a disc BufferInfo. The disc will be in the xz plane, centered at + * the origin. When creating, at least 3 divisions, or pie + * pieces, need to be specified, otherwise the triangles making + * up the disc will be degenerate. You can also specify the + * number of radial pieces `stacks`. A value of 1 for + * stacks will give you a simple disc of pie pieces. If you + * want to create an annulus you can set `innerRadius` to a + * value > 0. Finally, `stackPower` allows you to have the widths + * increase or decrease as you move away from the center. This + * is particularly useful when using the disc as a ground plane + * with a fixed camera such that you don't need the resolution + * of small triangles near the perimeter. For example, a value + * of 2 will produce stacks whose outside radius increases with + * the square of the stack index. A value of 1 will give uniform + * stacks. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius Radius of the ground plane. + * @param {number} divisions Number of triangles in the ground plane (at least 3). + * @param {number} [stacks] Number of radial divisions (default=1). + * @param {number} [innerRadius] Default 0. + * @param {number} [stackPower] Power to raise stack size to for decreasing width. + * @return {module:twgl.BufferInfo} The created BufferInfo. + * @memberOf module:twgl/primitives + * @function createDiscBufferInfo + */ + +/** + * Creates disc buffers. The disc will be in the xz plane, centered at + * the origin. When creating, at least 3 divisions, or pie + * pieces, need to be specified, otherwise the triangles making + * up the disc will be degenerate. You can also specify the + * number of radial pieces `stacks`. A value of 1 for + * stacks will give you a simple disc of pie pieces. If you + * want to create an annulus you can set `innerRadius` to a + * value > 0. Finally, `stackPower` allows you to have the widths + * increase or decrease as you move away from the center. This + * is particularly useful when using the disc as a ground plane + * with a fixed camera such that you don't need the resolution + * of small triangles near the perimeter. For example, a value + * of 2 will produce stacks whose outside radius increases with + * the square of the stack index. A value of 1 will give uniform + * stacks. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext. + * @param {number} radius Radius of the ground plane. + * @param {number} divisions Number of triangles in the ground plane (at least 3). + * @param {number} [stacks] Number of radial divisions (default=1). + * @param {number} [innerRadius] Default 0. + * @param {number} [stackPower] Power to raise stack size to for decreasing width. + * @return {Object.} The created buffers. + * @memberOf module:twgl/primitives + * @function createDiscBuffers + */ + +/** + * Creates disc vertices. The disc will be in the xz plane, centered at + * the origin. When creating, at least 3 divisions, or pie + * pieces, need to be specified, otherwise the triangles making + * up the disc will be degenerate. You can also specify the + * number of radial pieces `stacks`. A value of 1 for + * stacks will give you a simple disc of pie pieces. If you + * want to create an annulus you can set `innerRadius` to a + * value > 0. Finally, `stackPower` allows you to have the widths + * increase or decrease as you move away from the center. This + * is particularly useful when using the disc as a ground plane + * with a fixed camera such that you don't need the resolution + * of small triangles near the perimeter. For example, a value + * of 2 will produce stacks whose outside radius increases with + * the square of the stack index. A value of 1 will give uniform + * stacks. + * + * @param {number} radius Radius of the ground plane. + * @param {number} divisions Number of triangles in the ground plane (at least 3). + * @param {number} [stacks] Number of radial divisions (default=1). + * @param {number} [innerRadius] Default 0. + * @param {number} [stackPower] Power to raise stack size to for decreasing width. + * @return {Object.} The created vertices. + * @memberOf module:twgl/primitives + */ +function createDiscVertices( + radius, + divisions, + stacks, + innerRadius, + stackPower) { + if (divisions < 3) { + throw new Error('divisions must be at least 3'); + } + + stacks = stacks ? stacks : 1; + stackPower = stackPower ? stackPower : 1; + innerRadius = innerRadius ? innerRadius : 0; + + // Note: We don't share the center vertex because that would + // mess up texture coordinates. + const numVertices = (divisions + 1) * (stacks + 1); + + const positions = createAugmentedTypedArray(3, numVertices); + const normals = createAugmentedTypedArray(3, numVertices); + const texcoords = createAugmentedTypedArray(2, numVertices); + const indices = createAugmentedTypedArray(3, stacks * divisions * 2, Uint16Array); + + let firstIndex = 0; + const radiusSpan = radius - innerRadius; + const pointsPerStack = divisions + 1; + + // Build the disk one stack at a time. + for (let stack = 0; stack <= stacks; ++stack) { + const stackRadius = innerRadius + radiusSpan * Math.pow(stack / stacks, stackPower); + + for (let i = 0; i <= divisions; ++i) { + const theta = 2.0 * Math.PI * i / divisions; + const x = stackRadius * Math.cos(theta); + const z = stackRadius * Math.sin(theta); + + positions.push(x, 0, z); + normals.push(0, 1, 0); + texcoords.push(1 - (i / divisions), stack / stacks); + if (stack > 0 && i !== divisions) { + // a, b, c and d are the indices of the vertices of a quad. unless + // the current stack is the one closest to the center, in which case + // the vertices a and b connect to the center vertex. + const a = firstIndex + (i + 1); + const b = firstIndex + i; + const c = firstIndex + i - pointsPerStack; + const d = firstIndex + (i + 1) - pointsPerStack; + + // Make a quad of the vertices a, b, c, d. + indices.push(a, b, c); + indices.push(a, c, d); + } + } + + firstIndex += divisions + 1; + } + + return { + position: positions, + normal: normals, + texcoord: texcoords, + indices: indices, + }; +} + +/** + * creates a random integer between 0 and range - 1 inclusive. + * @param {number} range + * @return {number} random value between 0 and range - 1 inclusive. + * @private + */ +function randInt(range) { + return Math.random() * range | 0; +} + +/** + * Used to supply random colors + * @callback RandomColorFunc + * @param {number} ndx index of triangle/quad if unindexed or index of vertex if indexed + * @param {number} channel 0 = red, 1 = green, 2 = blue, 3 = alpha + * @return {number} a number from 0 to 255 + * @memberOf module:twgl/primitives + */ + +/** + * @typedef {Object} RandomVerticesOptions + * @property {number} [vertsPerColor] Defaults to 3 for non-indexed vertices + * @property {module:twgl/primitives.RandomColorFunc} [rand] A function to generate random numbers + * @memberOf module:twgl/primitives + */ + +/** + * Creates an augmentedTypedArray of random vertex colors. + * If the vertices are indexed (have an indices array) then will + * just make random colors. Otherwise assumes they are triangles + * and makes one random color for every 3 vertices. + * @param {Object.} vertices Vertices as returned from one of the createXXXVertices functions. + * @param {module:twgl/primitives.RandomVerticesOptions} [options] options. + * @return {Object.} same vertices as passed in with `color` added. + * @memberOf module:twgl/primitives + */ +function makeRandomVertexColors(vertices, options) { + options = options || {}; + const numElements = vertices.position.numElements; + const vColors = createAugmentedTypedArray(4, numElements, Uint8Array); + const rand = options.rand || function(ndx, channel) { + return channel < 3 ? randInt(256) : 255; + }; + vertices.color = vColors; + if (vertices.indices) { + // just make random colors if index + for (let ii = 0; ii < numElements; ++ii) { + vColors.push(rand(ii, 0), rand(ii, 1), rand(ii, 2), rand(ii, 3)); + } + } else { + // make random colors per triangle + const numVertsPerColor = options.vertsPerColor || 3; + const numSets = numElements / numVertsPerColor; + for (let ii = 0; ii < numSets; ++ii) { // eslint-disable-line + const color = [rand(ii, 0), rand(ii, 1), rand(ii, 2), rand(ii, 3)]; + for (let jj = 0; jj < numVertsPerColor; ++jj) { + vColors.push(color); + } + } + } + return vertices; +} + +/** + * creates a function that calls fn to create vertices and then + * creates a buffers for them + * @private + */ +function createBufferFunc(fn) { + return function(gl) { + const arrays = fn.apply(this, Array.prototype.slice.call(arguments, 1)); + return createBuffersFromArrays(gl, arrays); + }; +} + +/** + * creates a function that calls fn to create vertices and then + * creates a bufferInfo object for them + * @private + */ +function createBufferInfoFunc(fn) { + return function(gl) { + const arrays = fn.apply(null, Array.prototype.slice.call(arguments, 1)); + return createBufferInfoFromArrays(gl, arrays); + }; +} + +const arraySpecPropertyNames = [ + "numComponents", + "size", + "type", + "normalize", + "stride", + "offset", + "attrib", + "name", + "attribName", +]; + +/** + * Copy elements from one array to another + * + * @param {Array|TypedArray} src source array + * @param {Array|TypedArray} dst dest array + * @param {number} dstNdx index in dest to copy src + * @param {number} [offset] offset to add to copied values + * @private + */ +function copyElements(src, dst, dstNdx, offset) { + offset = offset || 0; + const length = src.length; + for (let ii = 0; ii < length; ++ii) { + dst[dstNdx + ii] = src[ii] + offset; + } +} + +/** + * Creates an array of the same time + * + * @param {(number[]|ArrayBufferView|module:twgl.FullArraySpec)} srcArray array who's type to copy + * @param {number} length size of new array + * @return {(number[]|ArrayBufferView|module:twgl.FullArraySpec)} array with same type as srcArray + * @private + */ +function createArrayOfSameType(srcArray, length) { + const arraySrc = getArray(srcArray); + const newArray = new arraySrc.constructor(length); + let newArraySpec = newArray; + // If it appears to have been augmented make new one augmented + if (arraySrc.numComponents && arraySrc.numElements) { + augmentTypedArray(newArray, arraySrc.numComponents); + } + // If it was a full spec make new one a full spec + if (srcArray.data) { + newArraySpec = { + data: newArray, + }; + copyNamedProperties(arraySpecPropertyNames, srcArray, newArraySpec); + } + return newArraySpec; +} + +/** + * Concatenates sets of vertices + * + * Assumes the vertices match in composition. For example + * if one set of vertices has positions, normals, and indices + * all sets of vertices must have positions, normals, and indices + * and of the same type. + * + * Example: + * + * const cubeVertices = twgl.primitives.createCubeVertices(2); + * const sphereVertices = twgl.primitives.createSphereVertices(1, 10, 10); + * // move the sphere 2 units up + * twgl.primitives.reorientVertices( + * sphereVertices, twgl.m4.translation([0, 2, 0])); + * // merge the sphere with the cube + * const cubeSphereVertices = twgl.primitives.concatVertices( + * [cubeVertices, sphereVertices]); + * // turn them into WebGL buffers and attrib data + * const bufferInfo = twgl.createBufferInfoFromArrays(gl, cubeSphereVertices); + * + * @param {module:twgl.Arrays[]} arrays Array of arrays of vertices + * @return {module:twgl.Arrays} The concatenated vertices. + * @memberOf module:twgl/primitives + */ +function concatVertices(arrayOfArrays) { + const names = {}; + let baseName; + // get names of all arrays. + // and numElements for each set of vertices + for (let ii = 0; ii < arrayOfArrays.length; ++ii) { + const arrays = arrayOfArrays[ii]; + Object.keys(arrays).forEach(function(name) { // eslint-disable-line + if (!names[name]) { + names[name] = []; + } + if (!baseName && name !== 'indices') { + baseName = name; + } + const arrayInfo = arrays[name]; + const numComponents = getNumComponents(arrayInfo, name); + const array = getArray(arrayInfo); + const numElements = array.length / numComponents; + names[name].push(numElements); + }); + } + + // compute length of combined array + // and return one for reference + function getLengthOfCombinedArrays(name) { + let length = 0; + let arraySpec; + for (let ii = 0; ii < arrayOfArrays.length; ++ii) { + const arrays = arrayOfArrays[ii]; + const arrayInfo = arrays[name]; + const array = getArray(arrayInfo); + length += array.length; + if (!arraySpec || arrayInfo.data) { + arraySpec = arrayInfo; + } + } + return { + length: length, + spec: arraySpec, + }; + } + + function copyArraysToNewArray(name, base, newArray) { + let baseIndex = 0; + let offset = 0; + for (let ii = 0; ii < arrayOfArrays.length; ++ii) { + const arrays = arrayOfArrays[ii]; + const arrayInfo = arrays[name]; + const array = getArray(arrayInfo); + if (name === 'indices') { + copyElements(array, newArray, offset, baseIndex); + baseIndex += base[ii]; + } else { + copyElements(array, newArray, offset); + } + offset += array.length; + } + } + + const base = names[baseName]; + + const newArrays = {}; + Object.keys(names).forEach(function(name) { + const info = getLengthOfCombinedArrays(name); + const newArraySpec = createArrayOfSameType(info.spec, info.length); + copyArraysToNewArray(name, base, getArray(newArraySpec)); + newArrays[name] = newArraySpec; + }); + return newArrays; +} + +/** + * Creates a duplicate set of vertices + * + * This is useful for calling reorientVertices when you + * also want to keep the original available + * + * @param {module:twgl.Arrays} arrays of vertices + * @return {module:twgl.Arrays} The duplicated vertices. + * @memberOf module:twgl/primitives + */ +function duplicateVertices(arrays) { + const newArrays = {}; + Object.keys(arrays).forEach(function(name) { + const arraySpec = arrays[name]; + const srcArray = getArray(arraySpec); + const newArraySpec = createArrayOfSameType(arraySpec, srcArray.length); + copyElements(srcArray, getArray(newArraySpec), 0); + newArrays[name] = newArraySpec; + }); + return newArrays; +} + +const create3DFBufferInfo = createBufferInfoFunc(create3DFVertices); +const create3DFBuffers = createBufferFunc(create3DFVertices); +const createCubeBufferInfo = createBufferInfoFunc(createCubeVertices); +const createCubeBuffers = createBufferFunc(createCubeVertices); +const createPlaneBufferInfo = createBufferInfoFunc(createPlaneVertices); +const createPlaneBuffers = createBufferFunc(createPlaneVertices); +const createSphereBufferInfo = createBufferInfoFunc(createSphereVertices); +const createSphereBuffers = createBufferFunc(createSphereVertices); +const createTruncatedConeBufferInfo = createBufferInfoFunc(createTruncatedConeVertices); +const createTruncatedConeBuffers = createBufferFunc(createTruncatedConeVertices); +const createXYQuadBufferInfo = createBufferInfoFunc(createXYQuadVertices); +const createXYQuadBuffers = createBufferFunc(createXYQuadVertices); +const createCrescentBufferInfo = createBufferInfoFunc(createCrescentVertices); +const createCrescentBuffers = createBufferFunc(createCrescentVertices); +const createCylinderBufferInfo = createBufferInfoFunc(createCylinderVertices); +const createCylinderBuffers = createBufferFunc(createCylinderVertices); +const createTorusBufferInfo = createBufferInfoFunc(createTorusVertices); +const createTorusBuffers = createBufferFunc(createTorusVertices); +const createDiscBufferInfo = createBufferInfoFunc(createDiscVertices); +const createDiscBuffers = createBufferFunc(createDiscVertices); + +// these were mis-spelled until 4.12 +const createCresentBufferInfo = createCrescentBufferInfo; +const createCresentBuffers = createCrescentBuffers; +const createCresentVertices = createCrescentVertices; + +var primitives = /*#__PURE__*/Object.freeze({ + __proto__: null, + create3DFBufferInfo: create3DFBufferInfo, + create3DFBuffers: create3DFBuffers, + create3DFVertices: create3DFVertices, + createAugmentedTypedArray: createAugmentedTypedArray, + createCubeBufferInfo: createCubeBufferInfo, + createCubeBuffers: createCubeBuffers, + createCubeVertices: createCubeVertices, + createPlaneBufferInfo: createPlaneBufferInfo, + createPlaneBuffers: createPlaneBuffers, + createPlaneVertices: createPlaneVertices, + createSphereBufferInfo: createSphereBufferInfo, + createSphereBuffers: createSphereBuffers, + createSphereVertices: createSphereVertices, + createTruncatedConeBufferInfo: createTruncatedConeBufferInfo, + createTruncatedConeBuffers: createTruncatedConeBuffers, + createTruncatedConeVertices: createTruncatedConeVertices, + createXYQuadBufferInfo: createXYQuadBufferInfo, + createXYQuadBuffers: createXYQuadBuffers, + createXYQuadVertices: createXYQuadVertices, + createCresentBufferInfo: createCresentBufferInfo, + createCresentBuffers: createCresentBuffers, + createCresentVertices: createCresentVertices, + createCrescentBufferInfo: createCrescentBufferInfo, + createCrescentBuffers: createCrescentBuffers, + createCrescentVertices: createCrescentVertices, + createCylinderBufferInfo: createCylinderBufferInfo, + createCylinderBuffers: createCylinderBuffers, + createCylinderVertices: createCylinderVertices, + createTorusBufferInfo: createTorusBufferInfo, + createTorusBuffers: createTorusBuffers, + createTorusVertices: createTorusVertices, + createDiscBufferInfo: createDiscBufferInfo, + createDiscBuffers: createDiscBuffers, + createDiscVertices: createDiscVertices, + deindexVertices: deindexVertices, + flattenNormals: flattenNormals, + makeRandomVertexColors: makeRandomVertexColors, + reorientDirections: reorientDirections, + reorientNormals: reorientNormals, + reorientPositions: reorientPositions, + reorientVertices: reorientVertices, + concatVertices: concatVertices, + duplicateVertices: duplicateVertices +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * Gets the gl version as a number + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @return {number} version of gl + * @private + */ +//function getVersionAsNumber(gl) { +// return parseFloat(gl.getParameter(gl.VERSION).substr(6)); +//} + +/** + * Check if context is WebGL 2.0 + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @return {bool} true if it's WebGL 2.0 + * @memberOf module:twgl + */ +function isWebGL2(gl) { + // This is the correct check but it's slow + // return gl.getParameter(gl.VERSION).indexOf("WebGL 2.0") === 0; + // This might also be the correct check but I'm assuming it's slow-ish + // return gl instanceof WebGL2RenderingContext; + return !!gl.texStorage2D; +} + +/** + * Check if context is WebGL 1.0 + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @return {bool} true if it's WebGL 1.0 + * @memberOf module:twgl + */ +function isWebGL1(gl) { + // This is the correct check but it's slow + // const version = getVersionAsNumber(gl); + // return version <= 1.0 && version > 0.0; // because as of 2016/5 Edge returns 0.96 + // This might also be the correct check but I'm assuming it's slow-ish + // return gl instanceof WebGLRenderingContext; + return !gl.texStorage2D; +} + +/** + * Gets a string for WebGL enum + * + * Note: Several enums are the same. Without more + * context (which function) it's impossible to always + * give the correct enum. As it is, for matching values + * it gives all enums. Checking the WebGL2RenderingContext + * that means + * + * 0 = ZERO | POINT | NONE | NO_ERROR + * 1 = ONE | LINES | SYNC_FLUSH_COMMANDS_BIT + * 32777 = BLEND_EQUATION_RGB | BLEND_EQUATION_RGB + * 36662 = COPY_READ_BUFFER | COPY_READ_BUFFER_BINDING + * 36663 = COPY_WRITE_BUFFER | COPY_WRITE_BUFFER_BINDING + * 36006 = FRAMEBUFFER_BINDING | DRAW_FRAMEBUFFER_BINDING + * + * It's also not useful for bits really unless you pass in individual bits. + * In other words + * + * const bits = gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT; + * twgl.glEnumToString(gl, bits); // not going to work + * + * Note that some enums only exist on extensions. If you + * want them to show up you need to pass the extension at least + * once. For example + * + * const ext = gl.getExtension('WEBGL_compressed_texture_s3tc'); + * if (ext) { + * twgl.glEnumToString(ext, 0); // just prime the function + * + * ..later.. + * + * const internalFormat = ext.COMPRESSED_RGB_S3TC_DXT1_EXT; + * console.log(twgl.glEnumToString(gl, internalFormat)); + * + * Notice I didn't have to pass the extension the second time. This means + * you can have place that generically gets an enum for texture formats for example. + * and as long as you primed the function with the extensions + * + * If you're using `twgl.addExtensionsToContext` to enable your extensions + * then twgl will automatically get the extension's enums. + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext or any extension object + * @param {number} value the value of the enum you want to look up. + * @return {string} enum string or hex value + * @memberOf module:twgl + * @function glEnumToString + */ +const glEnumToString = (function() { + const haveEnumsForType = {}; + const enums = {}; + + function addEnums(gl) { + const type = gl.constructor.name; + if (!haveEnumsForType[type]) { + for (const key in gl) { + if (typeof gl[key] === 'number') { + const existing = enums[gl[key]]; + enums[gl[key]] = existing ? `${existing} | ${key}` : key; + } + } + haveEnumsForType[type] = true; + } + } + + return function glEnumToString(gl, value) { + addEnums(gl); + return enums[value] || (typeof value === 'number' ? `0x${value.toString(16)}` : value); + }; +}()); + +var utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + glEnumToString: glEnumToString, + isWebGL1: isWebGL1, + isWebGL2: isWebGL2 +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +const defaults$1 = { + textureColor: new Uint8Array([128, 192, 255, 255]), + textureOptions: {}, + crossOrigin: undefined, +}; +const isArrayBuffer = isArrayBuffer$1; + +// Should we make this on demand? +const getShared2DContext = function() { + let s_ctx; + return function getShared2DContext() { + s_ctx = s_ctx || + ((typeof document !== 'undefined' && document.createElement) + ? document.createElement("canvas").getContext("2d") + : null); + return s_ctx; + }; +}(); + +// NOTE: Chrome supports 2D canvas in a Worker (behind flag as of v64 but +// not only does Firefox NOT support it but Firefox freezes immediately +// if you try to create one instead of just returning null and continuing. +// : (global.OffscreenCanvas && (new global.OffscreenCanvas(1, 1)).getContext("2d")); // OffscreenCanvas may not support 2d + +// NOTE: We can maybe remove some of the need for the 2d canvas. In WebGL2 +// we can use the various unpack settings. Otherwise we could try using +// the ability of an ImageBitmap to be cut. Unfortunately cutting an ImageBitmap +// is async and the current TWGL code expects a non-Async result though that +// might not be a problem. ImageBitmap though is not available in Edge or Safari +// as of 2018-01-02 + +/* PixelFormat */ +const ALPHA = 0x1906; +const RGB = 0x1907; +const RGBA$1 = 0x1908; +const LUMINANCE = 0x1909; +const LUMINANCE_ALPHA = 0x190A; +const DEPTH_COMPONENT$1 = 0x1902; +const DEPTH_STENCIL$1 = 0x84F9; + +/* TextureWrapMode */ +// const REPEAT = 0x2901; +// const MIRRORED_REPEAT = 0x8370; +const CLAMP_TO_EDGE$1 = 0x812f; + +/* TextureMagFilter */ +const NEAREST = 0x2600; +const LINEAR$1 = 0x2601; + +/* TextureMinFilter */ +// const NEAREST_MIPMAP_NEAREST = 0x2700; +// const LINEAR_MIPMAP_NEAREST = 0x2701; +// const NEAREST_MIPMAP_LINEAR = 0x2702; +// const LINEAR_MIPMAP_LINEAR = 0x2703; + +/* Texture Target */ +const TEXTURE_2D$2 = 0x0de1; +const TEXTURE_CUBE_MAP$1 = 0x8513; +const TEXTURE_3D$1 = 0x806f; +const TEXTURE_2D_ARRAY$1 = 0x8c1a; + +/* Cubemap Targets */ +const TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515; +const TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516; +const TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517; +const TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518; +const TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519; +const TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851a; + +/* Texture Parameters */ +const TEXTURE_MIN_FILTER = 0x2801; +const TEXTURE_MAG_FILTER = 0x2800; +const TEXTURE_WRAP_S = 0x2802; +const TEXTURE_WRAP_T = 0x2803; +const TEXTURE_WRAP_R = 0x8072; +const TEXTURE_MIN_LOD = 0x813a; +const TEXTURE_MAX_LOD = 0x813b; +const TEXTURE_BASE_LEVEL = 0x813c; +const TEXTURE_MAX_LEVEL = 0x813d; +const TEXTURE_COMPARE_MODE = 0x884C; +const TEXTURE_COMPARE_FUNC = 0x884D; + +/* Pixel store */ +const UNPACK_ALIGNMENT = 0x0cf5; +const UNPACK_ROW_LENGTH = 0x0cf2; +const UNPACK_IMAGE_HEIGHT = 0x806e; +const UNPACK_SKIP_PIXELS = 0x0cf4; +const UNPACK_SKIP_ROWS = 0x0cf3; +const UNPACK_SKIP_IMAGES = 0x806d; +const UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243; +const UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241; +const UNPACK_FLIP_Y_WEBGL = 0x9240; + +const R8 = 0x8229; +const R8_SNORM = 0x8F94; +const R16F = 0x822D; +const R32F = 0x822E; +const R8UI = 0x8232; +const R8I = 0x8231; +const RG16UI = 0x823A; +const RG16I = 0x8239; +const RG32UI = 0x823C; +const RG32I = 0x823B; +const RG8 = 0x822B; +const RG8_SNORM = 0x8F95; +const RG16F = 0x822F; +const RG32F = 0x8230; +const RG8UI = 0x8238; +const RG8I = 0x8237; +const R16UI = 0x8234; +const R16I = 0x8233; +const R32UI = 0x8236; +const R32I = 0x8235; +const RGB8 = 0x8051; +const SRGB8 = 0x8C41; +const RGB565$1 = 0x8D62; +const RGB8_SNORM = 0x8F96; +const R11F_G11F_B10F = 0x8C3A; +const RGB9_E5 = 0x8C3D; +const RGB16F = 0x881B; +const RGB32F = 0x8815; +const RGB8UI = 0x8D7D; +const RGB8I = 0x8D8F; +const RGB16UI = 0x8D77; +const RGB16I = 0x8D89; +const RGB32UI = 0x8D71; +const RGB32I = 0x8D83; +const RGBA8 = 0x8058; +const SRGB8_ALPHA8 = 0x8C43; +const RGBA8_SNORM = 0x8F97; +const RGB5_A1$1 = 0x8057; +const RGBA4$1 = 0x8056; +const RGB10_A2 = 0x8059; +const RGBA16F = 0x881A; +const RGBA32F = 0x8814; +const RGBA8UI = 0x8D7C; +const RGBA8I = 0x8D8E; +const RGB10_A2UI = 0x906F; +const RGBA16UI = 0x8D76; +const RGBA16I = 0x8D88; +const RGBA32I = 0x8D82; +const RGBA32UI = 0x8D70; + +const DEPTH_COMPONENT16$1 = 0x81A5; +const DEPTH_COMPONENT24$1 = 0x81A6; +const DEPTH_COMPONENT32F$1 = 0x8CAC; +const DEPTH32F_STENCIL8$1 = 0x8CAD; +const DEPTH24_STENCIL8$1 = 0x88F0; + +/* DataType */ +const BYTE = 0x1400; +const UNSIGNED_BYTE$1 = 0x1401; +const SHORT = 0x1402; +const UNSIGNED_SHORT$1 = 0x1403; +const INT$1 = 0x1404; +const UNSIGNED_INT$1 = 0x1405; +const FLOAT$1 = 0x1406; +const UNSIGNED_SHORT_4_4_4_4 = 0x8033; +const UNSIGNED_SHORT_5_5_5_1 = 0x8034; +const UNSIGNED_SHORT_5_6_5 = 0x8363; +const HALF_FLOAT = 0x140B; +const HALF_FLOAT_OES = 0x8D61; // Thanks Khronos for making this different >:( +const UNSIGNED_INT_2_10_10_10_REV = 0x8368; +const UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; +const UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; +const FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; +const UNSIGNED_INT_24_8 = 0x84FA; + +const RG = 0x8227; +const RG_INTEGER = 0x8228; +const RED = 0x1903; +const RED_INTEGER = 0x8D94; +const RGB_INTEGER = 0x8D98; +const RGBA_INTEGER = 0x8D99; + +const formatInfo = {}; +{ + // NOTE: this is named `numColorComponents` vs `numComponents` so we can let Uglify mangle + // the name. + const f = formatInfo; + f[ALPHA] = { numColorComponents: 1, }; + f[LUMINANCE] = { numColorComponents: 1, }; + f[LUMINANCE_ALPHA] = { numColorComponents: 2, }; + f[RGB] = { numColorComponents: 3, }; + f[RGBA$1] = { numColorComponents: 4, }; + f[RED] = { numColorComponents: 1, }; + f[RED_INTEGER] = { numColorComponents: 1, }; + f[RG] = { numColorComponents: 2, }; + f[RG_INTEGER] = { numColorComponents: 2, }; + f[RGB] = { numColorComponents: 3, }; + f[RGB_INTEGER] = { numColorComponents: 3, }; + f[RGBA$1] = { numColorComponents: 4, }; + f[RGBA_INTEGER] = { numColorComponents: 4, }; + f[DEPTH_COMPONENT$1] = { numColorComponents: 1, }; + f[DEPTH_STENCIL$1] = { numColorComponents: 2, }; +} + +/** + * @typedef {Object} TextureFormatDetails + * @property {number} textureFormat format to pass texImage2D and similar functions. + * @property {boolean} colorRenderable true if you can render to this format of texture. + * @property {boolean} textureFilterable true if you can filter the texture, false if you can ony use `NEAREST`. + * @property {number[]} type Array of possible types you can pass to texImage2D and similar function + * @property {Object.} bytesPerElementMap A map of types to bytes per element + * @private + */ + +let s_textureInternalFormatInfo; +function getTextureInternalFormatInfo(internalFormat) { + if (!s_textureInternalFormatInfo) { + // NOTE: these properties need unique names so we can let Uglify mangle the name. + const t = {}; + // unsized formats + t[ALPHA] = { textureFormat: ALPHA, colorRenderable: true, textureFilterable: true, bytesPerElement: [1, 2, 2, 4], type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1], }; + t[LUMINANCE] = { textureFormat: LUMINANCE, colorRenderable: true, textureFilterable: true, bytesPerElement: [1, 2, 2, 4], type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1], }; + t[LUMINANCE_ALPHA] = { textureFormat: LUMINANCE_ALPHA, colorRenderable: true, textureFilterable: true, bytesPerElement: [2, 4, 4, 8], type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1], }; + t[RGB] = { textureFormat: RGB, colorRenderable: true, textureFilterable: true, bytesPerElement: [3, 6, 6, 12, 2], type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1, UNSIGNED_SHORT_5_6_5], }; + t[RGBA$1] = { textureFormat: RGBA$1, colorRenderable: true, textureFilterable: true, bytesPerElement: [4, 8, 8, 16, 2, 2], type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1, UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_5_5_5_1], }; + t[DEPTH_COMPONENT$1] = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true, textureFilterable: false, bytesPerElement: [2, 4], type: [UNSIGNED_INT$1, UNSIGNED_SHORT$1], }; + + // sized formats + t[R8] = { textureFormat: RED, colorRenderable: true, textureFilterable: true, bytesPerElement: [1], type: [UNSIGNED_BYTE$1], }; + t[R8_SNORM] = { textureFormat: RED, colorRenderable: false, textureFilterable: true, bytesPerElement: [1], type: [BYTE], }; + t[R16F] = { textureFormat: RED, colorRenderable: false, textureFilterable: true, bytesPerElement: [4, 2], type: [FLOAT$1, HALF_FLOAT], }; + t[R32F] = { textureFormat: RED, colorRenderable: false, textureFilterable: false, bytesPerElement: [4], type: [FLOAT$1], }; + t[R8UI] = { textureFormat: RED_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [1], type: [UNSIGNED_BYTE$1], }; + t[R8I] = { textureFormat: RED_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [1], type: [BYTE], }; + t[R16UI] = { textureFormat: RED_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [2], type: [UNSIGNED_SHORT$1], }; + t[R16I] = { textureFormat: RED_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [2], type: [SHORT], }; + t[R32UI] = { textureFormat: RED_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [UNSIGNED_INT$1], }; + t[R32I] = { textureFormat: RED_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [INT$1], }; + t[RG8] = { textureFormat: RG, colorRenderable: true, textureFilterable: true, bytesPerElement: [2], type: [UNSIGNED_BYTE$1], }; + t[RG8_SNORM] = { textureFormat: RG, colorRenderable: false, textureFilterable: true, bytesPerElement: [2], type: [BYTE], }; + t[RG16F] = { textureFormat: RG, colorRenderable: false, textureFilterable: true, bytesPerElement: [8, 4], type: [FLOAT$1, HALF_FLOAT], }; + t[RG32F] = { textureFormat: RG, colorRenderable: false, textureFilterable: false, bytesPerElement: [8], type: [FLOAT$1], }; + t[RG8UI] = { textureFormat: RG_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [2], type: [UNSIGNED_BYTE$1], }; + t[RG8I] = { textureFormat: RG_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [2], type: [BYTE], }; + t[RG16UI] = { textureFormat: RG_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [UNSIGNED_SHORT$1], }; + t[RG16I] = { textureFormat: RG_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [SHORT], }; + t[RG32UI] = { textureFormat: RG_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [8], type: [UNSIGNED_INT$1], }; + t[RG32I] = { textureFormat: RG_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [8], type: [INT$1], }; + t[RGB8] = { textureFormat: RGB, colorRenderable: true, textureFilterable: true, bytesPerElement: [3], type: [UNSIGNED_BYTE$1], }; + t[SRGB8] = { textureFormat: RGB, colorRenderable: false, textureFilterable: true, bytesPerElement: [3], type: [UNSIGNED_BYTE$1], }; + t[RGB565$1] = { textureFormat: RGB, colorRenderable: true, textureFilterable: true, bytesPerElement: [3, 2], type: [UNSIGNED_BYTE$1, UNSIGNED_SHORT_5_6_5], }; + t[RGB8_SNORM] = { textureFormat: RGB, colorRenderable: false, textureFilterable: true, bytesPerElement: [3], type: [BYTE], }; + t[R11F_G11F_B10F] = { textureFormat: RGB, colorRenderable: false, textureFilterable: true, bytesPerElement: [12, 6, 4], type: [FLOAT$1, HALF_FLOAT, UNSIGNED_INT_10F_11F_11F_REV], }; + t[RGB9_E5] = { textureFormat: RGB, colorRenderable: false, textureFilterable: true, bytesPerElement: [12, 6, 4], type: [FLOAT$1, HALF_FLOAT, UNSIGNED_INT_5_9_9_9_REV], }; + t[RGB16F] = { textureFormat: RGB, colorRenderable: false, textureFilterable: true, bytesPerElement: [12, 6], type: [FLOAT$1, HALF_FLOAT], }; + t[RGB32F] = { textureFormat: RGB, colorRenderable: false, textureFilterable: false, bytesPerElement: [12], type: [FLOAT$1], }; + t[RGB8UI] = { textureFormat: RGB_INTEGER, colorRenderable: false, textureFilterable: false, bytesPerElement: [3], type: [UNSIGNED_BYTE$1], }; + t[RGB8I] = { textureFormat: RGB_INTEGER, colorRenderable: false, textureFilterable: false, bytesPerElement: [3], type: [BYTE], }; + t[RGB16UI] = { textureFormat: RGB_INTEGER, colorRenderable: false, textureFilterable: false, bytesPerElement: [6], type: [UNSIGNED_SHORT$1], }; + t[RGB16I] = { textureFormat: RGB_INTEGER, colorRenderable: false, textureFilterable: false, bytesPerElement: [6], type: [SHORT], }; + t[RGB32UI] = { textureFormat: RGB_INTEGER, colorRenderable: false, textureFilterable: false, bytesPerElement: [12], type: [UNSIGNED_INT$1], }; + t[RGB32I] = { textureFormat: RGB_INTEGER, colorRenderable: false, textureFilterable: false, bytesPerElement: [12], type: [INT$1], }; + t[RGBA8] = { textureFormat: RGBA$1, colorRenderable: true, textureFilterable: true, bytesPerElement: [4], type: [UNSIGNED_BYTE$1], }; + t[SRGB8_ALPHA8] = { textureFormat: RGBA$1, colorRenderable: true, textureFilterable: true, bytesPerElement: [4], type: [UNSIGNED_BYTE$1], }; + t[RGBA8_SNORM] = { textureFormat: RGBA$1, colorRenderable: false, textureFilterable: true, bytesPerElement: [4], type: [BYTE], }; + t[RGB5_A1$1] = { textureFormat: RGBA$1, colorRenderable: true, textureFilterable: true, bytesPerElement: [4, 2, 4], type: [UNSIGNED_BYTE$1, UNSIGNED_SHORT_5_5_5_1, UNSIGNED_INT_2_10_10_10_REV], }; + t[RGBA4$1] = { textureFormat: RGBA$1, colorRenderable: true, textureFilterable: true, bytesPerElement: [4, 2], type: [UNSIGNED_BYTE$1, UNSIGNED_SHORT_4_4_4_4], }; + t[RGB10_A2] = { textureFormat: RGBA$1, colorRenderable: true, textureFilterable: true, bytesPerElement: [4], type: [UNSIGNED_INT_2_10_10_10_REV], }; + t[RGBA16F] = { textureFormat: RGBA$1, colorRenderable: false, textureFilterable: true, bytesPerElement: [16, 8], type: [FLOAT$1, HALF_FLOAT], }; + t[RGBA32F] = { textureFormat: RGBA$1, colorRenderable: false, textureFilterable: false, bytesPerElement: [16], type: [FLOAT$1], }; + t[RGBA8UI] = { textureFormat: RGBA_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [UNSIGNED_BYTE$1], }; + t[RGBA8I] = { textureFormat: RGBA_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [BYTE], }; + t[RGB10_A2UI] = { textureFormat: RGBA_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [UNSIGNED_INT_2_10_10_10_REV], }; + t[RGBA16UI] = { textureFormat: RGBA_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [8], type: [UNSIGNED_SHORT$1], }; + t[RGBA16I] = { textureFormat: RGBA_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [8], type: [SHORT], }; + t[RGBA32I] = { textureFormat: RGBA_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [16], type: [INT$1], }; + t[RGBA32UI] = { textureFormat: RGBA_INTEGER, colorRenderable: true, textureFilterable: false, bytesPerElement: [16], type: [UNSIGNED_INT$1], }; + // Sized Internal + t[DEPTH_COMPONENT16$1] = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true, textureFilterable: false, bytesPerElement: [2, 4], type: [UNSIGNED_SHORT$1, UNSIGNED_INT$1], }; + t[DEPTH_COMPONENT24$1] = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [UNSIGNED_INT$1], }; + t[DEPTH_COMPONENT32F$1] = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [FLOAT$1], }; + t[DEPTH24_STENCIL8$1] = { textureFormat: DEPTH_STENCIL$1, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [UNSIGNED_INT_24_8], }; + t[DEPTH32F_STENCIL8$1] = { textureFormat: DEPTH_STENCIL$1, colorRenderable: true, textureFilterable: false, bytesPerElement: [4], type: [FLOAT_32_UNSIGNED_INT_24_8_REV], }; + + Object.keys(t).forEach(function(internalFormat) { + const info = t[internalFormat]; + info.bytesPerElementMap = {}; + info.bytesPerElement.forEach(function(bytesPerElement, ndx) { + const type = info.type[ndx]; + info.bytesPerElementMap[type] = bytesPerElement; + }); + }); + s_textureInternalFormatInfo = t; + } + return s_textureInternalFormatInfo[internalFormat]; +} + +/** + * Gets the number of bytes per element for a given internalFormat / type + * @param {number} internalFormat The internalFormat parameter from texImage2D etc.. + * @param {number} type The type parameter for texImage2D etc.. + * @return {number} the number of bytes per element for the given internalFormat, type combo + * @memberOf module:twgl/textures + */ +function getBytesPerElementForInternalFormat(internalFormat, type) { + const info = getTextureInternalFormatInfo(internalFormat); + if (!info) { + throw "unknown internal format"; + } + const bytesPerElement = info.bytesPerElementMap[type]; + if (bytesPerElement === undefined) { + throw "unknown internal format"; + } + return bytesPerElement; +} + +/** + * Info related to a specific texture internalFormat as returned + * from {@link module:twgl/textures.getFormatAndTypeForInternalFormat}. + * + * @typedef {Object} TextureFormatInfo + * @property {number} format Format to pass to texImage2D and related functions + * @property {number} type Type to pass to texImage2D and related functions + * @memberOf module:twgl/textures + */ + +/** + * Gets the format and type for a given internalFormat + * + * @param {number} internalFormat The internal format + * @return {module:twgl/textures.TextureFormatInfo} the corresponding format and type, + * @memberOf module:twgl/textures + */ +function getFormatAndTypeForInternalFormat(internalFormat) { + const info = getTextureInternalFormatInfo(internalFormat); + if (!info) { + throw "unknown internal format"; + } + return { + format: info.textureFormat, + type: info.type[0], + }; +} + +/** + * Returns true if value is power of 2 + * @param {number} value number to check. + * @return true if value is power of 2 + * @private + */ +function isPowerOf2(value) { + return (value & (value - 1)) === 0; +} + +/** + * Gets whether or not we can generate mips for the given + * internal format. + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {number} width The width parameter from texImage2D etc.. + * @param {number} height The height parameter from texImage2D etc.. + * @param {number} internalFormat The internalFormat parameter from texImage2D etc.. + * @return {boolean} true if we can generate mips + * @memberOf module:twgl/textures + */ +function canGenerateMipmap(gl, width, height, internalFormat) { + if (!isWebGL2(gl)) { + return isPowerOf2(width) && isPowerOf2(height); + } + const info = getTextureInternalFormatInfo(internalFormat); + if (!info) { + throw "unknown internal format"; + } + return info.colorRenderable && info.textureFilterable; +} + +/** + * Gets whether or not we can generate mips for the given format + * @param {number} internalFormat The internalFormat parameter from texImage2D etc.. + * @return {boolean} true if we can generate mips + * @memberOf module:twgl/textures + */ +function canFilter(internalFormat) { + const info = getTextureInternalFormatInfo(internalFormat); + if (!info) { + throw "unknown internal format"; + } + return info.textureFilterable; +} + +/** + * Gets the number of components for a given image format. + * @param {number} format the format. + * @return {number} the number of components for the format. + * @memberOf module:twgl/textures + */ +function getNumComponentsForFormat(format) { + const info = formatInfo[format]; + if (!info) { + throw "unknown format: " + format; + } + return info.numColorComponents; +} + +/** + * Gets the texture type for a given array type. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @return {number} the gl texture type + * @private + */ +function getTextureTypeForArrayType(gl, src, defaultType) { + if (isArrayBuffer(src)) { + return getGLTypeForTypedArray(src); + } + return defaultType || UNSIGNED_BYTE$1; +} + +function guessDimensions(gl, target, width, height, numElements) { + if (numElements % 1 !== 0) { + throw "can't guess dimensions"; + } + if (!width && !height) { + const size = Math.sqrt(numElements / (target === TEXTURE_CUBE_MAP$1 ? 6 : 1)); + if (size % 1 === 0) { + width = size; + height = size; + } else { + width = numElements; + height = 1; + } + } else if (!height) { + height = numElements / width; + if (height % 1) { + throw "can't guess dimensions"; + } + } else if (!width) { + width = numElements / height; + if (width % 1) { + throw "can't guess dimensions"; + } + } + return { + width: width, + height: height, + }; +} + +/** + * Sets the default texture color. + * + * The default texture color is used when loading textures from + * urls. Because the URL will be loaded async we'd like to be + * able to use the texture immediately. By putting a 1x1 pixel + * color in the texture we can start using the texture before + * the URL has loaded. + * + * @param {number[]} color Array of 4 values in the range 0 to 1 + * @deprecated see {@link module:twgl.setDefaults} + * @memberOf module:twgl/textures + */ +function setDefaultTextureColor(color) { + defaults$1.textureColor = new Uint8Array([color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255]); +} + +function setDefaults$1(newDefaults) { + copyExistingProperties(newDefaults, defaults$1); + if (newDefaults.textureColor) { + setDefaultTextureColor(newDefaults.textureColor); + } +} + +/** + * A function to generate the source for a texture. + * @callback TextureFunc + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @param {module:twgl.TextureOptions} options the texture options + * @return {*} Returns any of the things documented for `src` for {@link module:twgl.TextureOptions}. + * @memberOf module:twgl + */ + +/** + * Texture options passed to most texture functions. Each function will use whatever options + * are appropriate for its needs. This lets you pass the same options to all functions. + * + * Note: A `TexImageSource` is defined in the WebGL spec as a `HTMLImageElement`, `HTMLVideoElement`, + * `HTMLCanvasElement`, `ImageBitmap`, or `ImageData`. + * + * @typedef {Object} TextureOptions + * @property {number} [target] the type of texture `gl.TEXTURE_2D` or `gl.TEXTURE_CUBE_MAP`. Defaults to `gl.TEXTURE_2D`. + * @property {number} [level] the mip level to affect. Defaults to 0. Note, if set auto will be considered false unless explicitly set to true. + * @property {number} [width] the width of the texture. Only used if src is an array or typed array or null. + * @property {number} [height] the height of a texture. Only used if src is an array or typed array or null. + * @property {number} [depth] the depth of a texture. Only used if src is an array or type array or null and target is `TEXTURE_3D` . + * @property {number} [min] the min filter setting (eg. `gl.LINEAR`). Defaults to `gl.NEAREST_MIPMAP_LINEAR` + * or if texture is not a power of 2 on both dimensions then defaults to `gl.LINEAR`. + * @property {number} [mag] the mag filter setting (eg. `gl.LINEAR`). Defaults to `gl.LINEAR` + * @property {number} [minMag] both the min and mag filter settings. + * @property {number} [internalFormat] internal format for texture. Defaults to `gl.RGBA` + * @property {number} [format] format for texture. Defaults to `gl.RGBA`. + * @property {number} [type] type for texture. Defaults to `gl.UNSIGNED_BYTE` unless `src` is ArrayBufferView. If `src` + * is ArrayBufferView defaults to type that matches ArrayBufferView type. + * @property {number} [wrap] Texture wrapping for both S and T (and R if TEXTURE_3D or WebGLSampler). Defaults to `gl.REPEAT` for 2D unless src is WebGL1 and src not npot and `gl.CLAMP_TO_EDGE` for cube + * @property {number} [wrapS] Texture wrapping for S. Defaults to `gl.REPEAT` and `gl.CLAMP_TO_EDGE` for cube. If set takes precedence over `wrap`. + * @property {number} [wrapT] Texture wrapping for T. Defaults to `gl.REPEAT` and `gl.CLAMP_TO_EDGE` for cube. If set takes precedence over `wrap`. + * @property {number} [wrapR] Texture wrapping for R. Defaults to `gl.REPEAT` and `gl.CLAMP_TO_EDGE` for cube. If set takes precedence over `wrap`. + * @property {number} [minLod] TEXTURE_MIN_LOD setting + * @property {number} [maxLod] TEXTURE_MAX_LOD setting + * @property {number} [baseLevel] TEXTURE_BASE_LEVEL setting + * @property {number} [maxLevel] TEXTURE_MAX_LEVEL setting + * @property {number} [compareFunc] TEXTURE_COMPARE_FUNC setting + * @property {number} [compareMode] TEXTURE_COMPARE_MODE setting + * @property {number} [unpackAlignment] The `gl.UNPACK_ALIGNMENT` used when uploading an array. Defaults to 1. + * @property {number[]|ArrayBufferView} [color] Color to initialize this texture with if loading an image asynchronously. + * The default use a blue 1x1 pixel texture. You can set another default by calling `twgl.setDefaults` + * or you can set an individual texture's initial color by setting this property. Example: `[1, .5, .5, 1]` = pink + * @property {number} [premultiplyAlpha] Whether or not to premultiply alpha. Defaults to whatever the current setting is. + * This lets you set it once before calling `twgl.createTexture` or `twgl.createTextures` and only override + * the current setting for specific textures. + * @property {number} [flipY] Whether or not to flip the texture vertically on upload. Defaults to whatever the current setting is. + * This lets you set it once before calling `twgl.createTexture` or `twgl.createTextures` and only override + * the current setting for specific textures. + * @property {number} [colorspaceConversion] Whether or not to let the browser do colorspace conversion of the texture on upload. Defaults to whatever the current setting is. + * This lets you set it once before calling `twgl.createTexture` or `twgl.createTextures` and only override + * the current setting for specific textures. + * @property {boolean} [auto] If `undefined` or `true`, in WebGL1, texture filtering is set automatically for non-power of 2 images and + * mips are generated for power of 2 images. In WebGL2 mips are generated if they can be. Note: if `level` is set above + * then then `auto` is assumed to be `false` unless explicity set to `true`. + * @property {number[]} [cubeFaceOrder] The order that cube faces are pulled out of an img or set of images. The default is + * + * [gl.TEXTURE_CUBE_MAP_POSITIVE_X, + * gl.TEXTURE_CUBE_MAP_NEGATIVE_X, + * gl.TEXTURE_CUBE_MAP_POSITIVE_Y, + * gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, + * gl.TEXTURE_CUBE_MAP_POSITIVE_Z, + * gl.TEXTURE_CUBE_MAP_NEGATIVE_Z] + * + * @property {(number[]|ArrayBufferView|TexImageSource|TexImageSource[]|string|string[]|module:twgl.TextureFunc)} [src] source for texture + * + * If `string` then it's assumed to be a URL to an image. The image will be downloaded async. A usable + * 1x1 pixel texture will be returned immediately. The texture will be updated once the image has downloaded. + * If `target` is `gl.TEXTURE_CUBE_MAP` will attempt to divide image into 6 square pieces. 1x6, 6x1, 3x2, 2x3. + * The pieces will be uploaded in `cubeFaceOrder` + * + * If `string[]` or `TexImageSource[]` and target is `gl.TEXTURE_CUBE_MAP` then it must have 6 entries, one for each face of a cube map. + * + * If `string[]` or `TexImageSource[]` and target is `gl.TEXTURE_2D_ARRAY` then each entry is a slice of the a 2d array texture + * and will be scaled to the specified width and height OR to the size of the first image that loads. + * + * If `TexImageSource` then it wil be used immediately to create the contents of the texture. Examples `HTMLImageElement`, + * `HTMLCanvasElement`, `HTMLVideoElement`. + * + * If `number[]` or `ArrayBufferView` it's assumed to be data for a texture. If `width` or `height` is + * not specified it is guessed as follows. First the number of elements is computed by `src.length / numComponents` + * where `numComponents` is derived from `format`. If `target` is `gl.TEXTURE_CUBE_MAP` then `numElements` is divided + * by 6. Then + * + * * If neither `width` nor `height` are specified and `sqrt(numElements)` is an integer then width and height + * are set to `sqrt(numElements)`. Otherwise `width = numElements` and `height = 1`. + * + * * If only one of `width` or `height` is specified then the other equals `numElements / specifiedDimension`. + * + * If `number[]` will be converted to `type`. + * + * If `src` is a function it will be called with a `WebGLRenderingContext` and these options. + * Whatever it returns is subject to these rules. So it can return a string url, an `HTMLElement` + * an array etc... + * + * If `src` is undefined then an empty texture will be created of size `width` by `height`. + * + * @property {string} [crossOrigin] What to set the crossOrigin property of images when they are downloaded. + * default: undefined. Also see {@link module:twgl.setDefaults}. + * + * @memberOf module:twgl + */ + +/** + * Sets any packing state that will be set based on the options. + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @private + */ +function setPackState(gl, options) { + if (options.colorspaceConversion !== undefined) { + gl.pixelStorei(UNPACK_COLORSPACE_CONVERSION_WEBGL, options.colorspaceConversion); + } + if (options.premultiplyAlpha !== undefined) { + gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, options.premultiplyAlpha); + } + if (options.flipY !== undefined) { + gl.pixelStorei(UNPACK_FLIP_Y_WEBGL, options.flipY); + } +} + +/** + * Set skip state to defaults + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @private + */ +function setSkipStateToDefault(gl) { + gl.pixelStorei(UNPACK_ALIGNMENT, 4); + if (isWebGL2(gl)) { + gl.pixelStorei(UNPACK_ROW_LENGTH, 0); + gl.pixelStorei(UNPACK_IMAGE_HEIGHT, 0); + gl.pixelStorei(UNPACK_SKIP_PIXELS, 0); + gl.pixelStorei(UNPACK_SKIP_ROWS, 0); + gl.pixelStorei(UNPACK_SKIP_IMAGES, 0); + } +} + +/** + * Sets the parameters of a texture or sampler + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {number|WebGLSampler} target texture target or sampler + * @param {function()} parameteriFn texParameteri or samplerParameteri fn + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * This is often the same options you passed in when you created the texture. + * @private + */ +function setTextureSamplerParameters(gl, target, parameteriFn, options) { + if (options.minMag) { + parameteriFn.call(gl, target, TEXTURE_MIN_FILTER, options.minMag); + parameteriFn.call(gl, target, TEXTURE_MAG_FILTER, options.minMag); + } + if (options.min) { + parameteriFn.call(gl, target, TEXTURE_MIN_FILTER, options.min); + } + if (options.mag) { + parameteriFn.call(gl, target, TEXTURE_MAG_FILTER, options.mag); + } + if (options.wrap) { + parameteriFn.call(gl, target, TEXTURE_WRAP_S, options.wrap); + parameteriFn.call(gl, target, TEXTURE_WRAP_T, options.wrap); + if (target === TEXTURE_3D$1 || isSampler(gl, target)) { + parameteriFn.call(gl, target, TEXTURE_WRAP_R, options.wrap); + } + } + if (options.wrapR) { + parameteriFn.call(gl, target, TEXTURE_WRAP_R, options.wrapR); + } + if (options.wrapS) { + parameteriFn.call(gl, target, TEXTURE_WRAP_S, options.wrapS); + } + if (options.wrapT) { + parameteriFn.call(gl, target, TEXTURE_WRAP_T, options.wrapT); + } + if (options.minLod !== undefined) { + parameteriFn.call(gl, target, TEXTURE_MIN_LOD, options.minLod); + } + if (options.maxLod !== undefined) { + parameteriFn.call(gl, target, TEXTURE_MAX_LOD, options.maxLod); + } + if (options.baseLevel !== undefined) { + parameteriFn.call(gl, target, TEXTURE_BASE_LEVEL, options.baseLevel); + } + if (options.maxLevel !== undefined) { + parameteriFn.call(gl, target, TEXTURE_MAX_LEVEL, options.maxLevel); + } + if (options.compareFunc !== undefined) { + parameteriFn.call(gl, target, TEXTURE_COMPARE_FUNC, options.compareFunc); + } + if (options.compareMode !== undefined) { + parameteriFn.call(gl, target, TEXTURE_COMPARE_MODE, options.compareMode); + } +} + +/** + * Sets the texture parameters of a texture. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * This is often the same options you passed in when you created the texture. + * @memberOf module:twgl/textures + */ +function setTextureParameters(gl, tex, options) { + const target = options.target || TEXTURE_2D$2; + gl.bindTexture(target, tex); + setTextureSamplerParameters(gl, target, gl.texParameteri, options); +} + +/** + * Sets the sampler parameters of a sampler. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLSampler} sampler the WebGLSampler to set parameters for + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * @memberOf module:twgl/textures + */ +function setSamplerParameters(gl, sampler, options) { + setTextureSamplerParameters(gl, sampler, gl.samplerParameteri, options); +} + +/** + * Creates a new sampler object and sets parameters. + * + * Example: + * + * const sampler = twgl.createSampler(gl, { + * minMag: gl.NEAREST, // sets both TEXTURE_MIN_FILTER and TEXTURE_MAG_FILTER + * wrap: gl.CLAMP_TO_NEAREST, // sets both TEXTURE_WRAP_S and TEXTURE_WRAP_T and TEXTURE_WRAP_R + * }); + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {Object.} options A object of TextureOptions one per sampler. + * @return {Object.} the created samplers by name + * @private + */ +function createSampler(gl, options) { + const sampler = gl.createSampler(); + setSamplerParameters(gl, sampler, options); + return sampler; +} + +/** + * Creates a multiple sampler objects and sets parameters on each. + * + * Example: + * + * const samplers = twgl.createSamplers(gl, { + * nearest: { + * minMag: gl.NEAREST, + * }, + * nearestClampS: { + * minMag: gl.NEAREST, + * wrapS: gl.CLAMP_TO_NEAREST, + * }, + * linear: { + * minMag: gl.LINEAR, + * }, + * nearestClamp: { + * minMag: gl.NEAREST, + * wrap: gl.CLAMP_TO_EDGE, + * }, + * linearClamp: { + * minMag: gl.LINEAR, + * wrap: gl.CLAMP_TO_EDGE, + * }, + * linearClampT: { + * minMag: gl.LINEAR, + * wrapT: gl.CLAMP_TO_EDGE, + * }, + * }); + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set on the sampler + * @private + */ +function createSamplers(gl, samplerOptions) { + const samplers = {}; + Object.keys(samplerOptions).forEach(function(name) { + samplers[name] = createSampler(gl, samplerOptions[name]); + }); + return samplers; +} + +/** + * Makes a 1x1 pixel + * If no color is passed in uses the default color which can be set by calling `setDefaultTextureColor`. + * @param {(number[]|ArrayBufferView)} [color] The color using 0-1 values + * @return {Uint8Array} Unit8Array with color. + * @private + */ +function make1Pixel(color) { + color = color || defaults$1.textureColor; + if (isArrayBuffer(color)) { + return color; + } + return new Uint8Array([color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255]); +} + +/** + * Sets filtering or generates mips for texture based on width or height + * If width or height is not passed in uses `options.width` and//or `options.height` + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set. + * This is often the same options you passed in when you created the texture. + * @param {number} [width] width of texture + * @param {number} [height] height of texture + * @param {number} [internalFormat] The internalFormat parameter from texImage2D etc.. + * @memberOf module:twgl/textures + */ +function setTextureFilteringForSize(gl, tex, options, width, height, internalFormat) { + options = options || defaults$1.textureOptions; + internalFormat = internalFormat || RGBA$1; + const target = options.target || TEXTURE_2D$2; + width = width || options.width; + height = height || options.height; + gl.bindTexture(target, tex); + if (canGenerateMipmap(gl, width, height, internalFormat)) { + gl.generateMipmap(target); + } else { + const filtering = canFilter(internalFormat) ? LINEAR$1 : NEAREST; + gl.texParameteri(target, TEXTURE_MIN_FILTER, filtering); + gl.texParameteri(target, TEXTURE_MAG_FILTER, filtering); + gl.texParameteri(target, TEXTURE_WRAP_S, CLAMP_TO_EDGE$1); + gl.texParameteri(target, TEXTURE_WRAP_T, CLAMP_TO_EDGE$1); + } +} + +function shouldAutomaticallySetTextureFilteringForSize(options) { + return options.auto === true || (options.auto === undefined && options.level === undefined); +} + +/** + * Gets an array of cubemap face enums + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * This is often the same options you passed in when you created the texture. + * @return {number[]} cubemap face enums + * @private + */ +function getCubeFaceOrder(gl, options) { + options = options || {}; + return options.cubeFaceOrder || [ + TEXTURE_CUBE_MAP_POSITIVE_X, + TEXTURE_CUBE_MAP_NEGATIVE_X, + TEXTURE_CUBE_MAP_POSITIVE_Y, + TEXTURE_CUBE_MAP_NEGATIVE_Y, + TEXTURE_CUBE_MAP_POSITIVE_Z, + TEXTURE_CUBE_MAP_NEGATIVE_Z, + ]; +} + +/** + * @typedef {Object} FaceInfo + * @property {number} face gl enum for texImage2D + * @property {number} ndx face index (0 - 5) into source data + * @ignore + */ + +/** + * Gets an array of FaceInfos + * There's a bug in some NVidia drivers that will crash the driver if + * `gl.TEXTURE_CUBE_MAP_POSITIVE_X` is not uploaded first. So, we take + * the user's desired order from his faces to WebGL and make sure we + * do the faces in WebGL order + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * @return {FaceInfo[]} cubemap face infos. Arguably the `face` property of each element is redundant but + * it's needed internally to sort the array of `ndx` properties by `face`. + * @private + */ +function getCubeFacesWithNdx(gl, options) { + const faces = getCubeFaceOrder(gl, options); + // work around bug in NVidia drivers. We have to upload the first face first else the driver crashes :( + const facesWithNdx = faces.map(function(face, ndx) { + return { face: face, ndx: ndx }; + }); + facesWithNdx.sort(function(a, b) { + return a.face - b.face; + }); + return facesWithNdx; +} + +/** + * Set a texture from the contents of an element. Will also set + * texture filtering or generate mips based on the dimensions of the element + * unless `options.auto === false`. If `target === gl.TEXTURE_CUBE_MAP` will + * attempt to slice image into 1x6, 2x3, 3x2, or 6x1 images, one for each face. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {HTMLElement} element a canvas, img, or video element. + * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set. + * This is often the same options you passed in when you created the texture. + * @memberOf module:twgl/textures + * @kind function + */ +function setTextureFromElement(gl, tex, element, options) { + options = options || defaults$1.textureOptions; + const target = options.target || TEXTURE_2D$2; + const level = options.level || 0; + let width = element.width; + let height = element.height; + const internalFormat = options.internalFormat || options.format || RGBA$1; + const formatType = getFormatAndTypeForInternalFormat(internalFormat); + const format = options.format || formatType.format; + const type = options.type || formatType.type; + setPackState(gl, options); + gl.bindTexture(target, tex); + if (target === TEXTURE_CUBE_MAP$1) { + // guess the parts + const imgWidth = element.width; + const imgHeight = element.height; + let size; + let slices; + if (imgWidth / 6 === imgHeight) { + // It's 6x1 + size = imgHeight; + slices = [0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0]; + } else if (imgHeight / 6 === imgWidth) { + // It's 1x6 + size = imgWidth; + slices = [0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5]; + } else if (imgWidth / 3 === imgHeight / 2) { + // It's 3x2 + size = imgWidth / 3; + slices = [0, 0, 1, 0, 2, 0, 0, 1, 1, 1, 2, 1]; + } else if (imgWidth / 2 === imgHeight / 3) { + // It's 2x3 + size = imgWidth / 2; + slices = [0, 0, 1, 0, 0, 1, 1, 1, 0, 2, 1, 2]; + } else { + throw "can't figure out cube map from element: " + (element.src ? element.src : element.nodeName); + } + const ctx = getShared2DContext(); + if (ctx) { + ctx.canvas.width = size; + ctx.canvas.height = size; + width = size; + height = size; + getCubeFacesWithNdx(gl, options).forEach(function(f) { + const xOffset = slices[f.ndx * 2 + 0] * size; + const yOffset = slices[f.ndx * 2 + 1] * size; + ctx.drawImage(element, xOffset, yOffset, size, size, 0, 0, size, size); + gl.texImage2D(f.face, level, internalFormat, format, type, ctx.canvas); + }); + // Free up the canvas memory + ctx.canvas.width = 1; + ctx.canvas.height = 1; + } else if (typeof createImageBitmap !== 'undefined') { + // NOTE: It seems like we should prefer ImageBitmap because unlike canvas it's + // note lossy? (alpha is not premultiplied? although I'm not sure what + width = size; + height = size; + getCubeFacesWithNdx(gl, options).forEach(function(f) { + const xOffset = slices[f.ndx * 2 + 0] * size; + const yOffset = slices[f.ndx * 2 + 1] * size; + // We can't easily use a default texture color here as it would have to match + // the type across all faces where as with a 2D one there's only one face + // so we're replacing everything all at once. It also has to be the correct size. + // On the other hand we need all faces to be the same size so as one face loads + // the rest match else the texture will be un-renderable. + gl.texImage2D(f.face, level, internalFormat, size, size, 0, format, type, null); + createImageBitmap(element, xOffset, yOffset, size, size, { + premultiplyAlpha: 'none', + colorSpaceConversion: 'none', + }) + .then(function(imageBitmap) { + setPackState(gl, options); + gl.bindTexture(target, tex); + gl.texImage2D(f.face, level, internalFormat, format, type, imageBitmap); + if (shouldAutomaticallySetTextureFilteringForSize(options)) { + setTextureFilteringForSize(gl, tex, options, width, height, internalFormat); + } + }); + }); + } + } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) { + const smallest = Math.min(element.width, element.height); + const largest = Math.max(element.width, element.height); + const depth = largest / smallest; + if (depth % 1 !== 0) { + throw "can not compute 3D dimensions of element"; + } + const xMult = element.width === largest ? 1 : 0; + const yMult = element.height === largest ? 1 : 0; + gl.pixelStorei(UNPACK_ALIGNMENT, 1); + gl.pixelStorei(UNPACK_ROW_LENGTH, element.width); + gl.pixelStorei(UNPACK_IMAGE_HEIGHT, 0); + gl.pixelStorei(UNPACK_SKIP_IMAGES, 0); + gl.texImage3D(target, level, internalFormat, smallest, smallest, smallest, 0, format, type, null); + for (let d = 0; d < depth; ++d) { + const srcX = d * smallest * xMult; + const srcY = d * smallest * yMult; + gl.pixelStorei(UNPACK_SKIP_PIXELS, srcX); + gl.pixelStorei(UNPACK_SKIP_ROWS, srcY); + gl.texSubImage3D(target, level, 0, 0, d, smallest, smallest, 1, format, type, element); + } + setSkipStateToDefault(gl); + } else { + gl.texImage2D(target, level, internalFormat, format, type, element); + } + if (shouldAutomaticallySetTextureFilteringForSize(options)) { + setTextureFilteringForSize(gl, tex, options, width, height, internalFormat); + } + setTextureParameters(gl, tex, options); +} + +function noop() { +} + +/** + * Checks whether the url's origin is the same so that we can set the `crossOrigin` + * @param {string} url url to image + * @returns {boolean} true if the window's origin is the same as image's url + * @private + */ +function urlIsSameOrigin(url) { + if (typeof document !== 'undefined') { + // for IE really + const a = document.createElement('a'); + a.href = url; + return a.hostname === location.hostname && + a.port === location.port && + a.protocol === location.protocol; + } else { + const localOrigin = (new URL(location.href)).origin; + const urlOrigin = (new URL(url, location.href)).origin; + return urlOrigin === localOrigin; + } +} + +function setToAnonymousIfUndefinedAndURLIsNotSameOrigin(url, crossOrigin) { + return crossOrigin === undefined && !urlIsSameOrigin(url) + ? 'anonymous' + : crossOrigin; +} + +/** + * Loads an image + * @param {string} url url to image + * @param {string} crossOrigin + * @param {function(err, img)} [callback] a callback that's passed an error and the image. The error will be non-null + * if there was an error + * @return {HTMLImageElement} the image being loaded. + * @private + */ +function loadImage(url, crossOrigin, callback) { + callback = callback || noop; + let img; + crossOrigin = crossOrigin !== undefined ? crossOrigin : defaults$1.crossOrigin; + crossOrigin = setToAnonymousIfUndefinedAndURLIsNotSameOrigin(url, crossOrigin); + if (typeof Image !== 'undefined') { + img = new Image(); + if (crossOrigin !== undefined) { + img.crossOrigin = crossOrigin; + } + + const clearEventHandlers = function clearEventHandlers() { + img.removeEventListener('error', onError); // eslint-disable-line + img.removeEventListener('load', onLoad); // eslint-disable-line + img = null; + }; + + const onError = function onError() { + const msg = "couldn't load image: " + url; + error$1(msg); + callback(msg, img); + clearEventHandlers(); + }; + + const onLoad = function onLoad() { + callback(null, img); + clearEventHandlers(); + }; + + img.addEventListener('error', onError); + img.addEventListener('load', onLoad); + img.src = url; + return img; + } else if (typeof ImageBitmap !== 'undefined') { + let err; + let bm; + const cb = function cb() { + callback(err, bm); + }; + + const options = {}; + if (crossOrigin) { + options.mode = 'cors'; // TODO: not sure how to translate image.crossOrigin + } + fetch(url, options).then(function(response) { + if (!response.ok) { + throw response; + } + return response.blob(); + }).then(function(blob) { + return createImageBitmap(blob, { + premultiplyAlpha: 'none', + colorSpaceConversion: 'none', + }); + }).then(function(bitmap) { + // not sure if this works. We don't want + // to catch the user's error. So, call + // the callback in a timeout so we're + // not in this scope inside the promise. + bm = bitmap; + setTimeout(cb); + }).catch(function(e) { + err = e; + setTimeout(cb); + }); + img = null; + } + return img; +} + +/** + * check if object is a TexImageSource + * + * @param {Object} obj Object to test + * @return {boolean} true if object is a TexImageSource + * @private + */ +function isTexImageSource(obj) { + return (typeof ImageBitmap !== 'undefined' && obj instanceof ImageBitmap) || + (typeof ImageData !== 'undefined' && obj instanceof ImageData) || + (typeof HTMLElement !== 'undefined' && obj instanceof HTMLElement); +} + +/** + * if obj is an TexImageSource then just + * uses it otherwise if obj is a string + * then load it first. + * + * @param {string|TexImageSource} obj + * @param {string} crossOrigin + * @param {function(err, img)} [callback] a callback that's passed an error and the image. The error will be non-null + * if there was an error + * @private + */ +function loadAndUseImage(obj, crossOrigin, callback) { + if (isTexImageSource(obj)) { + setTimeout(function() { + callback(null, obj); + }); + return obj; + } + + return loadImage(obj, crossOrigin, callback); +} + +/** + * Sets a texture to a 1x1 pixel color. If `options.color === false` is nothing happens. If it's not set + * the default texture color is used which can be set by calling `setDefaultTextureColor`. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set. + * This is often the same options you passed in when you created the texture. + * @memberOf module:twgl/textures + * @private + */ +function setTextureTo1PixelColor(gl, tex, options) { + options = options || defaults$1.textureOptions; + const target = options.target || TEXTURE_2D$2; + gl.bindTexture(target, tex); + if (options.color === false) { + return; + } + // Assume it's a URL + // Put 1x1 pixels in texture. That makes it renderable immediately regardless of filtering. + const color = make1Pixel(options.color); + if (target === TEXTURE_CUBE_MAP$1) { + for (let ii = 0; ii < 6; ++ii) { + gl.texImage2D(TEXTURE_CUBE_MAP_POSITIVE_X + ii, 0, RGBA$1, 1, 1, 0, RGBA$1, UNSIGNED_BYTE$1, color); + } + } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) { + gl.texImage3D(target, 0, RGBA$1, 1, 1, 1, 0, RGBA$1, UNSIGNED_BYTE$1, color); + } else { + gl.texImage2D(target, 0, RGBA$1, 1, 1, 0, RGBA$1, UNSIGNED_BYTE$1, color); + } +} + +/** + * The src image(s) used to create a texture. + * + * When you call {@link module:twgl.createTexture} or {@link module:twgl.createTextures} + * you can pass in urls for images to load into the textures. If it's a single url + * then this will be a single HTMLImageElement. If it's an array of urls used for a cubemap + * this will be a corresponding array of images for the cubemap. + * + * @typedef {HTMLImageElement|HTMLImageElement[]} TextureSrc + * @memberOf module:twgl + */ + +/** + * A callback for when an image finished downloading and been uploaded into a texture + * @callback TextureReadyCallback + * @param {*} err If truthy there was an error. + * @param {WebGLTexture} texture the texture. + * @param {module:twgl.TextureSrc} source image(s) used to as the src for the texture + * @memberOf module:twgl + */ + +/** + * A callback for when all images have finished downloading and been uploaded into their respective textures + * @callback TexturesReadyCallback + * @param {*} err If truthy there was an error. + * @param {Object.} textures the created textures by name. Same as returned by {@link module:twgl.createTextures}. + * @param {Object.} sources the image(s) used for the texture by name. + * @memberOf module:twgl + */ + +/** + * A callback for when an image finished downloading and been uploaded into a texture + * @callback CubemapReadyCallback + * @param {*} err If truthy there was an error. + * @param {WebGLTexture} tex the texture. + * @param {HTMLImageElement[]} imgs the images for each face. + * @memberOf module:twgl + */ + +/** + * A callback for when an image finished downloading and been uploaded into a texture + * @callback ThreeDReadyCallback + * @param {*} err If truthy there was an error. + * @param {WebGLTexture} tex the texture. + * @param {HTMLImageElement[]} imgs the images for each slice. + * @memberOf module:twgl + */ + +/** + * Loads a texture from an image from a Url as specified in `options.src` + * If `options.color !== false` will set the texture to a 1x1 pixel color so that the texture is + * immediately useable. It will be updated with the contents of the image once the image has finished + * downloading. Filtering options will be set as appropriate for image unless `options.auto === false`. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set. + * @param {module:twgl.TextureReadyCallback} [callback] A function to be called when the image has finished loading. err will + * be non null if there was an error. + * @return {HTMLImageElement} the image being downloaded. + * @memberOf module:twgl/textures + */ +function loadTextureFromUrl(gl, tex, options, callback) { + callback = callback || noop; + options = options || defaults$1.textureOptions; + setTextureTo1PixelColor(gl, tex, options); + // Because it's async we need to copy the options. + options = Object.assign({}, options); + const img = loadAndUseImage(options.src, options.crossOrigin, function(err, img) { + if (err) { + callback(err, tex, img); + } else { + setTextureFromElement(gl, tex, img, options); + callback(null, tex, img); + } + }); + return img; +} + +/** + * Loads a cubemap from 6 urls or TexImageSources as specified in `options.src`. Will set the cubemap to a 1x1 pixel color + * so that it is usable immediately unless `option.color === false`. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * @param {module:twgl.CubemapReadyCallback} [callback] A function to be called when all the images have finished loading. err will + * be non null if there was an error. + * @memberOf module:twgl/textures + * @private + */ +function loadCubemapFromUrls(gl, tex, options, callback) { + callback = callback || noop; + const urls = options.src; + if (urls.length !== 6) { + throw "there must be 6 urls for a cubemap"; + } + const level = options.level || 0; + const internalFormat = options.internalFormat || options.format || RGBA$1; + const formatType = getFormatAndTypeForInternalFormat(internalFormat); + const format = options.format || formatType.format; + const type = options.type || UNSIGNED_BYTE$1; + const target = options.target || TEXTURE_2D$2; + if (target !== TEXTURE_CUBE_MAP$1) { + throw "target must be TEXTURE_CUBE_MAP"; + } + setTextureTo1PixelColor(gl, tex, options); + // Because it's async we need to copy the options. + options = Object.assign({}, options); + let numToLoad = 6; + const errors = []; + const faces = getCubeFaceOrder(gl, options); + let imgs; // eslint-disable-line + + function uploadImg(faceTarget) { + return function(err, img) { + --numToLoad; + if (err) { + errors.push(err); + } else { + if (img.width !== img.height) { + errors.push("cubemap face img is not a square: " + img.src); + } else { + setPackState(gl, options); + gl.bindTexture(target, tex); + + // So assuming this is the first image we now have one face that's img sized + // and 5 faces that are 1x1 pixel so size the other faces + if (numToLoad === 5) { + // use the default order + getCubeFaceOrder().forEach(function(otherTarget) { + // Should we re-use the same face or a color? + gl.texImage2D(otherTarget, level, internalFormat, format, type, img); + }); + } else { + gl.texImage2D(faceTarget, level, internalFormat, format, type, img); + } + + if (shouldAutomaticallySetTextureFilteringForSize(options)) { + gl.generateMipmap(target); + } + } + } + + if (numToLoad === 0) { + callback(errors.length ? errors : undefined, tex, imgs); + } + }; + } + + imgs = urls.map(function(url, ndx) { + return loadAndUseImage(url, options.crossOrigin, uploadImg(faces[ndx])); + }); +} + +/** + * Loads a 2d array or 3d texture from urls OR TexImageSources as specified in `options.src`. + * Will set the texture to a 1x1 pixel color + * so that it is usable immediately unless `option.color === false`. + * + * If the width and height is not specified the width and height of the first + * image loaded will be used. Note that since images are loaded async + * which image downloads first is unknown. + * + * If an image is not the same size as the width and height it will be scaled + * to that width and height. + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * @param {module:twgl.ThreeDReadyCallback} [callback] A function to be called when all the images have finished loading. err will + * be non null if there was an error. + * @memberOf module:twgl/textures + * @private + */ +function loadSlicesFromUrls(gl, tex, options, callback) { + callback = callback || noop; + const urls = options.src; + const internalFormat = options.internalFormat || options.format || RGBA$1; + const formatType = getFormatAndTypeForInternalFormat(internalFormat); + const format = options.format || formatType.format; + const type = options.type || UNSIGNED_BYTE$1; + const target = options.target || TEXTURE_2D_ARRAY$1; + if (target !== TEXTURE_3D$1 && target !== TEXTURE_2D_ARRAY$1) { + throw "target must be TEXTURE_3D or TEXTURE_2D_ARRAY"; + } + setTextureTo1PixelColor(gl, tex, options); + // Because it's async we need to copy the options. + options = Object.assign({}, options); + let numToLoad = urls.length; + const errors = []; + let imgs; // eslint-disable-line + const level = options.level || 0; + let width = options.width; + let height = options.height; + const depth = urls.length; + let firstImage = true; + + function uploadImg(slice) { + return function(err, img) { + --numToLoad; + if (err) { + errors.push(err); + } else { + setPackState(gl, options); + gl.bindTexture(target, tex); + + if (firstImage) { + firstImage = false; + width = options.width || img.width; + height = options.height || img.height; + gl.texImage3D(target, level, internalFormat, width, height, depth, 0, format, type, null); + + // put it in every slice otherwise some slices will be 0,0,0,0 + for (let s = 0; s < depth; ++s) { + gl.texSubImage3D(target, level, 0, 0, s, width, height, 1, format, type, img); + } + } else { + let src = img; + let ctx; + if (img.width !== width || img.height !== height) { + // Size the image to fix + ctx = getShared2DContext(); + src = ctx.canvas; + ctx.canvas.width = width; + ctx.canvas.height = height; + ctx.drawImage(img, 0, 0, width, height); + } + + gl.texSubImage3D(target, level, 0, 0, slice, width, height, 1, format, type, src); + + // free the canvas memory + if (ctx && src === ctx.canvas) { + ctx.canvas.width = 0; + ctx.canvas.height = 0; + } + } + + if (shouldAutomaticallySetTextureFilteringForSize(options)) { + gl.generateMipmap(target); + } + } + + if (numToLoad === 0) { + callback(errors.length ? errors : undefined, tex, imgs); + } + }; + } + + imgs = urls.map(function(url, ndx) { + return loadAndUseImage(url, options.crossOrigin, uploadImg(ndx)); + }); +} + +/** + * Sets a texture from an array or typed array. If the width or height is not provided will attempt to + * guess the size. See {@link module:twgl.TextureOptions}. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {(number[]|ArrayBufferView)} src An array or typed arry with texture data. + * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set. + * This is often the same options you passed in when you created the texture. + * @memberOf module:twgl/textures + */ +function setTextureFromArray(gl, tex, src, options) { + options = options || defaults$1.textureOptions; + const target = options.target || TEXTURE_2D$2; + gl.bindTexture(target, tex); + let width = options.width; + let height = options.height; + let depth = options.depth; + const level = options.level || 0; + const internalFormat = options.internalFormat || options.format || RGBA$1; + const formatType = getFormatAndTypeForInternalFormat(internalFormat); + const format = options.format || formatType.format; + const type = options.type || getTextureTypeForArrayType(gl, src, formatType.type); + if (!isArrayBuffer(src)) { + const Type = getTypedArrayTypeForGLType(type); + src = new Type(src); + } else if (src instanceof Uint8ClampedArray) { + src = new Uint8Array(src.buffer); + } + + const bytesPerElement = getBytesPerElementForInternalFormat(internalFormat, type); + const numElements = src.byteLength / bytesPerElement; // TODO: check UNPACK_ALIGNMENT? + if (numElements % 1) { + throw "length wrong size for format: " + glEnumToString(gl, format); + } + let dimensions; + if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) { + if (!width && !height && !depth) { + const size = Math.cbrt(numElements); + if (size % 1 !== 0) { + throw "can't guess cube size of array of numElements: " + numElements; + } + width = size; + height = size; + depth = size; + } else if (width && (!height || !depth)) { + dimensions = guessDimensions(gl, target, height, depth, numElements / width); + height = dimensions.width; + depth = dimensions.height; + } else if (height && (!width || !depth)) { + dimensions = guessDimensions(gl, target, width, depth, numElements / height); + width = dimensions.width; + depth = dimensions.height; + } else { + dimensions = guessDimensions(gl, target, width, height, numElements / depth); + width = dimensions.width; + height = dimensions.height; + } + } else { + dimensions = guessDimensions(gl, target, width, height, numElements); + width = dimensions.width; + height = dimensions.height; + } + setSkipStateToDefault(gl); + gl.pixelStorei(UNPACK_ALIGNMENT, options.unpackAlignment || 1); + setPackState(gl, options); + if (target === TEXTURE_CUBE_MAP$1) { + const elementsPerElement = bytesPerElement / src.BYTES_PER_ELEMENT; + const faceSize = numElements / 6 * elementsPerElement; + + getCubeFacesWithNdx(gl, options).forEach(f => { + const offset = faceSize * f.ndx; + const data = src.subarray(offset, offset + faceSize); + gl.texImage2D(f.face, level, internalFormat, width, height, 0, format, type, data); + }); + } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) { + gl.texImage3D(target, level, internalFormat, width, height, depth, 0, format, type, src); + } else { + gl.texImage2D(target, level, internalFormat, width, height, 0, format, type, src); + } + return { + width: width, + height: height, + depth: depth, + type: type, + }; +} + +/** + * Sets a texture with no contents of a certain size. In other words calls `gl.texImage2D` with `null`. + * You must set `options.width` and `options.height`. + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the WebGLTexture to set parameters for + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * @memberOf module:twgl/textures + */ +function setEmptyTexture(gl, tex, options) { + const target = options.target || TEXTURE_2D$2; + gl.bindTexture(target, tex); + const level = options.level || 0; + const internalFormat = options.internalFormat || options.format || RGBA$1; + const formatType = getFormatAndTypeForInternalFormat(internalFormat); + const format = options.format || formatType.format; + const type = options.type || formatType.type; + setPackState(gl, options); + if (target === TEXTURE_CUBE_MAP$1) { + for (let ii = 0; ii < 6; ++ii) { + gl.texImage2D(TEXTURE_CUBE_MAP_POSITIVE_X + ii, level, internalFormat, options.width, options.height, 0, format, type, null); + } + } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) { + gl.texImage3D(target, level, internalFormat, options.width, options.height, options.depth, 0, format, type, null); + } else { + gl.texImage2D(target, level, internalFormat, options.width, options.height, 0, format, type, null); + } +} + +/** + * Creates a texture based on the options passed in. + * + * Note: may reset UNPACK_ALIGNMENT, UNPACK_ROW_LENGTH, UNPACK_IMAGE_HEIGHT, UNPACK_SKIP_IMAGES + * UNPACK_SKIP_PIXELS, and UNPACK_SKIP_ROWS + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set. + * @param {module:twgl.TextureReadyCallback} [callback] A callback called when an image has been downloaded and uploaded to the texture. + * @return {WebGLTexture} the created texture. + * @memberOf module:twgl/textures + */ +function createTexture(gl, options, callback) { + callback = callback || noop; + options = options || defaults$1.textureOptions; + const tex = gl.createTexture(); + const target = options.target || TEXTURE_2D$2; + let width = options.width || 1; + let height = options.height || 1; + const internalFormat = options.internalFormat || RGBA$1; + gl.bindTexture(target, tex); + if (target === TEXTURE_CUBE_MAP$1) { + // this should have been the default for cubemaps :( + gl.texParameteri(target, TEXTURE_WRAP_S, CLAMP_TO_EDGE$1); + gl.texParameteri(target, TEXTURE_WRAP_T, CLAMP_TO_EDGE$1); + } + let src = options.src; + if (src) { + if (typeof src === "function") { + src = src(gl, options); + } + if (typeof (src) === "string") { + loadTextureFromUrl(gl, tex, options, callback); + } else if (isArrayBuffer(src) || + (Array.isArray(src) && ( + typeof src[0] === 'number' || + Array.isArray(src[0]) || + isArrayBuffer(src[0])) + ) + ) { + const dimensions = setTextureFromArray(gl, tex, src, options); + width = dimensions.width; + height = dimensions.height; + } else if (Array.isArray(src) && (typeof (src[0]) === 'string' || isTexImageSource(src[0]))) { + if (target === TEXTURE_CUBE_MAP$1) { + loadCubemapFromUrls(gl, tex, options, callback); + } else { + loadSlicesFromUrls(gl, tex, options, callback); + } + } else { // if (isTexImageSource(src)) + setTextureFromElement(gl, tex, src, options); + width = src.width; + height = src.height; + } + } else { + setEmptyTexture(gl, tex, options); + } + if (shouldAutomaticallySetTextureFilteringForSize(options)) { + setTextureFilteringForSize(gl, tex, options, width, height, internalFormat); + } + setTextureParameters(gl, tex, options); + return tex; +} + +/** + * Resizes a texture based on the options passed in. + * + * Note: This is not a generic resize anything function. + * It's mostly used by {@link module:twgl.resizeFramebufferInfo} + * It will use `options.src` if it exists to try to determine a `type` + * otherwise it will assume `gl.UNSIGNED_BYTE`. No data is provided + * for the texture. Texture parameters will be set accordingly + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {WebGLTexture} tex the texture to resize + * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set. + * @param {number} [width] the new width. If not passed in will use `options.width` + * @param {number} [height] the new height. If not passed in will use `options.height` + * @param {number} [depth] the new depth. If not passed in will use `options.depth` + * @memberOf module:twgl/textures + */ +function resizeTexture(gl, tex, options, width, height, depth) { + width = width || options.width; + height = height || options.height; + depth = depth || options.depth; + const target = options.target || TEXTURE_2D$2; + gl.bindTexture(target, tex); + const level = options.level || 0; + const internalFormat = options.internalFormat || options.format || RGBA$1; + const formatType = getFormatAndTypeForInternalFormat(internalFormat); + const format = options.format || formatType.format; + let type; + const src = options.src; + if (!src) { + type = options.type || formatType.type; + } else if (isArrayBuffer(src) || (Array.isArray(src) && typeof (src[0]) === 'number')) { + type = options.type || getTextureTypeForArrayType(gl, src, formatType.type); + } else { + type = options.type || formatType.type; + } + if (target === TEXTURE_CUBE_MAP$1) { + for (let ii = 0; ii < 6; ++ii) { + gl.texImage2D(TEXTURE_CUBE_MAP_POSITIVE_X + ii, level, internalFormat, width, height, 0, format, type, null); + } + } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) { + gl.texImage3D(target, level, internalFormat, width, height, depth, 0, format, type, null); + } else { + gl.texImage2D(target, level, internalFormat, width, height, 0, format, type, null); + } +} + +/** + * Check if a src is an async request. + * if src is a string we're going to download an image + * if src is an array of strings we're going to download cubemap images + * @param {*} src The src from a TextureOptions + * @returns {bool} true if src is async. + * @private + */ +function isAsyncSrc(src) { + return typeof src === 'string' || + (Array.isArray(src) && typeof src[0] === 'string'); +} + +/** + * Creates a bunch of textures based on the passed in options. + * + * Example: + * + * const textures = twgl.createTextures(gl, { + * // a power of 2 image + * hftIcon: { src: "images/hft-icon-16.png", mag: gl.NEAREST }, + * // a non-power of 2 image + * clover: { src: "images/clover.jpg" }, + * // From a canvas + * fromCanvas: { src: ctx.canvas }, + * // A cubemap from 6 images + * yokohama: { + * target: gl.TEXTURE_CUBE_MAP, + * src: [ + * 'images/yokohama/posx.jpg', + * 'images/yokohama/negx.jpg', + * 'images/yokohama/posy.jpg', + * 'images/yokohama/negy.jpg', + * 'images/yokohama/posz.jpg', + * 'images/yokohama/negz.jpg', + * ], + * }, + * // A cubemap from 1 image (can be 1x6, 2x3, 3x2, 6x1) + * goldengate: { + * target: gl.TEXTURE_CUBE_MAP, + * src: 'images/goldengate.jpg', + * }, + * // A 2x2 pixel texture from a JavaScript array + * checker: { + * mag: gl.NEAREST, + * min: gl.LINEAR, + * src: [ + * 255,255,255,255, + * 192,192,192,255, + * 192,192,192,255, + * 255,255,255,255, + * ], + * }, + * // a 1x2 pixel texture from a typed array. + * stripe: { + * mag: gl.NEAREST, + * min: gl.LINEAR, + * format: gl.LUMINANCE, + * src: new Uint8Array([ + * 255, + * 128, + * 255, + * 128, + * 255, + * 128, + * 255, + * 128, + * ]), + * width: 1, + * }, + * }); + * + * Now + * + * * `textures.hftIcon` will be a 2d texture + * * `textures.clover` will be a 2d texture + * * `textures.fromCanvas` will be a 2d texture + * * `textures.yohohama` will be a cubemap texture + * * `textures.goldengate` will be a cubemap texture + * * `textures.checker` will be a 2d texture + * * `textures.stripe` will be a 2d texture + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {Object.} options A object of TextureOptions one per texture. + * @param {module:twgl.TexturesReadyCallback} [callback] A callback called when all textures have been downloaded. + * @return {Object.} the created textures by name + * @memberOf module:twgl/textures + */ +function createTextures(gl, textureOptions, callback) { + callback = callback || noop; + let numDownloading = 0; + const errors = []; + const textures = {}; + const images = {}; + + function callCallbackIfReady() { + if (numDownloading === 0) { + setTimeout(function() { + callback(errors.length ? errors : undefined, textures, images); + }, 0); + } + } + + Object.keys(textureOptions).forEach(function(name) { + const options = textureOptions[name]; + let onLoadFn; + if (isAsyncSrc(options.src)) { + onLoadFn = function(err, tex, img) { + images[name] = img; + --numDownloading; + if (err) { + errors.push(err); + } + callCallbackIfReady(); + }; + ++numDownloading; + } + textures[name] = createTexture(gl, options, onLoadFn); + }); + + // queue the callback if there are no images to download. + // We do this because if your code is structured to wait for + // images to download but then you comment out all the async + // images your code would break. + callCallbackIfReady(); + + return textures; +} + +var textures = /*#__PURE__*/Object.freeze({ + __proto__: null, + setTextureDefaults_: setDefaults$1, + createSampler: createSampler, + createSamplers: createSamplers, + setSamplerParameters: setSamplerParameters, + createTexture: createTexture, + setEmptyTexture: setEmptyTexture, + setTextureFromArray: setTextureFromArray, + loadTextureFromUrl: loadTextureFromUrl, + setTextureFromElement: setTextureFromElement, + setTextureFilteringForSize: setTextureFilteringForSize, + setTextureParameters: setTextureParameters, + setDefaultTextureColor: setDefaultTextureColor, + createTextures: createTextures, + resizeTexture: resizeTexture, + canGenerateMipmap: canGenerateMipmap, + canFilter: canFilter, + getNumComponentsForFormat: getNumComponentsForFormat, + getBytesPerElementForInternalFormat: getBytesPerElementForInternalFormat, + getFormatAndTypeForInternalFormat: getFormatAndTypeForInternalFormat +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * Low level shader program related functions + * + * You should generally not need to use these functions. They are provided + * for those cases where you're doing something out of the ordinary + * and you need lower level access. + * + * For backward compatibility they are available at both `twgl.programs` and `twgl` + * itself + * + * See {@link module:twgl} for core functions + * + * @module twgl/programs + */ + +const error = error$1; +const warn = warn$1; +function getElementById(id) { + return (typeof document !== 'undefined' && document.getElementById) + ? document.getElementById(id) + : null; +} + +const TEXTURE0 = 0x84c0; +const DYNAMIC_DRAW = 0x88e8; + +const ARRAY_BUFFER = 0x8892; +const ELEMENT_ARRAY_BUFFER$1 = 0x8893; +const UNIFORM_BUFFER = 0x8a11; +const TRANSFORM_FEEDBACK_BUFFER = 0x8c8e; + +const TRANSFORM_FEEDBACK = 0x8e22; + +const COMPILE_STATUS = 0x8b81; +const LINK_STATUS = 0x8b82; +const FRAGMENT_SHADER = 0x8b30; +const VERTEX_SHADER = 0x8b31; +const SEPARATE_ATTRIBS = 0x8c8d; + +const ACTIVE_UNIFORMS = 0x8b86; +const ACTIVE_ATTRIBUTES = 0x8b89; +const TRANSFORM_FEEDBACK_VARYINGS = 0x8c83; +const ACTIVE_UNIFORM_BLOCKS = 0x8a36; +const UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8a44; +const UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8a46; +const UNIFORM_BLOCK_DATA_SIZE = 0x8a40; +const UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8a43; + +const FLOAT = 0x1406; +const FLOAT_VEC2 = 0x8B50; +const FLOAT_VEC3 = 0x8B51; +const FLOAT_VEC4 = 0x8B52; +const INT = 0x1404; +const INT_VEC2 = 0x8B53; +const INT_VEC3 = 0x8B54; +const INT_VEC4 = 0x8B55; +const BOOL = 0x8B56; +const BOOL_VEC2 = 0x8B57; +const BOOL_VEC3 = 0x8B58; +const BOOL_VEC4 = 0x8B59; +const FLOAT_MAT2 = 0x8B5A; +const FLOAT_MAT3 = 0x8B5B; +const FLOAT_MAT4 = 0x8B5C; +const SAMPLER_2D = 0x8B5E; +const SAMPLER_CUBE = 0x8B60; +const SAMPLER_3D = 0x8B5F; +const SAMPLER_2D_SHADOW = 0x8B62; +const FLOAT_MAT2x3 = 0x8B65; +const FLOAT_MAT2x4 = 0x8B66; +const FLOAT_MAT3x2 = 0x8B67; +const FLOAT_MAT3x4 = 0x8B68; +const FLOAT_MAT4x2 = 0x8B69; +const FLOAT_MAT4x3 = 0x8B6A; +const SAMPLER_2D_ARRAY = 0x8DC1; +const SAMPLER_2D_ARRAY_SHADOW = 0x8DC4; +const SAMPLER_CUBE_SHADOW = 0x8DC5; +const UNSIGNED_INT = 0x1405; +const UNSIGNED_INT_VEC2 = 0x8DC6; +const UNSIGNED_INT_VEC3 = 0x8DC7; +const UNSIGNED_INT_VEC4 = 0x8DC8; +const INT_SAMPLER_2D = 0x8DCA; +const INT_SAMPLER_3D = 0x8DCB; +const INT_SAMPLER_CUBE = 0x8DCC; +const INT_SAMPLER_2D_ARRAY = 0x8DCF; +const UNSIGNED_INT_SAMPLER_2D = 0x8DD2; +const UNSIGNED_INT_SAMPLER_3D = 0x8DD3; +const UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4; +const UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7; + +const TEXTURE_2D$1 = 0x0DE1; +const TEXTURE_CUBE_MAP = 0x8513; +const TEXTURE_3D = 0x806F; +const TEXTURE_2D_ARRAY = 0x8C1A; + +const typeMap = {}; + +/** + * Returns the corresponding bind point for a given sampler type + * @private + */ +function getBindPointForSamplerType(gl, type) { + return typeMap[type].bindPoint; +} + +// This kind of sucks! If you could compose functions as in `var fn = gl[name];` +// this code could be a lot smaller but that is sadly really slow (T_T) + +function floatSetter(gl, location) { + return function(v) { + gl.uniform1f(location, v); + }; +} + +function floatArraySetter(gl, location) { + return function(v) { + gl.uniform1fv(location, v); + }; +} + +function floatVec2Setter(gl, location) { + return function(v) { + gl.uniform2fv(location, v); + }; +} + +function floatVec3Setter(gl, location) { + return function(v) { + gl.uniform3fv(location, v); + }; +} + +function floatVec4Setter(gl, location) { + return function(v) { + gl.uniform4fv(location, v); + }; +} + +function intSetter(gl, location) { + return function(v) { + gl.uniform1i(location, v); + }; +} + +function intArraySetter(gl, location) { + return function(v) { + gl.uniform1iv(location, v); + }; +} + +function intVec2Setter(gl, location) { + return function(v) { + gl.uniform2iv(location, v); + }; +} + +function intVec3Setter(gl, location) { + return function(v) { + gl.uniform3iv(location, v); + }; +} + +function intVec4Setter(gl, location) { + return function(v) { + gl.uniform4iv(location, v); + }; +} + +function uintSetter(gl, location) { + return function(v) { + gl.uniform1ui(location, v); + }; +} + +function uintArraySetter(gl, location) { + return function(v) { + gl.uniform1uiv(location, v); + }; +} + +function uintVec2Setter(gl, location) { + return function(v) { + gl.uniform2uiv(location, v); + }; +} + +function uintVec3Setter(gl, location) { + return function(v) { + gl.uniform3uiv(location, v); + }; +} + +function uintVec4Setter(gl, location) { + return function(v) { + gl.uniform4uiv(location, v); + }; +} + +function floatMat2Setter(gl, location) { + return function(v) { + gl.uniformMatrix2fv(location, false, v); + }; +} + +function floatMat3Setter(gl, location) { + return function(v) { + gl.uniformMatrix3fv(location, false, v); + }; +} + +function floatMat4Setter(gl, location) { + return function(v) { + gl.uniformMatrix4fv(location, false, v); + }; +} + +function floatMat23Setter(gl, location) { + return function(v) { + gl.uniformMatrix2x3fv(location, false, v); + }; +} + +function floatMat32Setter(gl, location) { + return function(v) { + gl.uniformMatrix3x2fv(location, false, v); + }; +} + +function floatMat24Setter(gl, location) { + return function(v) { + gl.uniformMatrix2x4fv(location, false, v); + }; +} + +function floatMat42Setter(gl, location) { + return function(v) { + gl.uniformMatrix4x2fv(location, false, v); + }; +} + +function floatMat34Setter(gl, location) { + return function(v) { + gl.uniformMatrix3x4fv(location, false, v); + }; +} + +function floatMat43Setter(gl, location) { + return function(v) { + gl.uniformMatrix4x3fv(location, false, v); + }; +} + +function samplerSetter(gl, type, unit, location) { + const bindPoint = getBindPointForSamplerType(gl, type); + return isWebGL2(gl) ? function(textureOrPair) { + let texture; + let sampler; + if (!textureOrPair || isTexture(gl, textureOrPair)) { + texture = textureOrPair; + sampler = null; + } else { + texture = textureOrPair.texture; + sampler = textureOrPair.sampler; + } + gl.uniform1i(location, unit); + gl.activeTexture(TEXTURE0 + unit); + gl.bindTexture(bindPoint, texture); + gl.bindSampler(unit, sampler); + } : function(texture) { + gl.uniform1i(location, unit); + gl.activeTexture(TEXTURE0 + unit); + gl.bindTexture(bindPoint, texture); + }; +} + +function samplerArraySetter(gl, type, unit, location, size) { + const bindPoint = getBindPointForSamplerType(gl, type); + const units = new Int32Array(size); + for (let ii = 0; ii < size; ++ii) { + units[ii] = unit + ii; + } + + return isWebGL2(gl) ? function(textures) { + gl.uniform1iv(location, units); + textures.forEach(function(textureOrPair, index) { + gl.activeTexture(TEXTURE0 + units[index]); + let texture; + let sampler; + if (!textureOrPair || isTexture(gl, textureOrPair)) { + texture = textureOrPair; + sampler = null; + } else { + texture = textureOrPair.texture; + sampler = textureOrPair.sampler; + } + gl.bindSampler(unit, sampler); + gl.bindTexture(bindPoint, texture); + }); + } : function(textures) { + gl.uniform1iv(location, units); + textures.forEach(function(texture, index) { + gl.activeTexture(TEXTURE0 + units[index]); + gl.bindTexture(bindPoint, texture); + }); + }; +} + +typeMap[FLOAT] = { Type: Float32Array, size: 4, setter: floatSetter, arraySetter: floatArraySetter, }; +typeMap[FLOAT_VEC2] = { Type: Float32Array, size: 8, setter: floatVec2Setter, cols: 2, }; +typeMap[FLOAT_VEC3] = { Type: Float32Array, size: 12, setter: floatVec3Setter, cols: 3, }; +typeMap[FLOAT_VEC4] = { Type: Float32Array, size: 16, setter: floatVec4Setter, cols: 4, }; +typeMap[INT] = { Type: Int32Array, size: 4, setter: intSetter, arraySetter: intArraySetter, }; +typeMap[INT_VEC2] = { Type: Int32Array, size: 8, setter: intVec2Setter, cols: 2, }; +typeMap[INT_VEC3] = { Type: Int32Array, size: 12, setter: intVec3Setter, cols: 3, }; +typeMap[INT_VEC4] = { Type: Int32Array, size: 16, setter: intVec4Setter, cols: 4, }; +typeMap[UNSIGNED_INT] = { Type: Uint32Array, size: 4, setter: uintSetter, arraySetter: uintArraySetter, }; +typeMap[UNSIGNED_INT_VEC2] = { Type: Uint32Array, size: 8, setter: uintVec2Setter, cols: 2, }; +typeMap[UNSIGNED_INT_VEC3] = { Type: Uint32Array, size: 12, setter: uintVec3Setter, cols: 3, }; +typeMap[UNSIGNED_INT_VEC4] = { Type: Uint32Array, size: 16, setter: uintVec4Setter, cols: 4, }; +typeMap[BOOL] = { Type: Uint32Array, size: 4, setter: intSetter, arraySetter: intArraySetter, }; +typeMap[BOOL_VEC2] = { Type: Uint32Array, size: 8, setter: intVec2Setter, cols: 2, }; +typeMap[BOOL_VEC3] = { Type: Uint32Array, size: 12, setter: intVec3Setter, cols: 3, }; +typeMap[BOOL_VEC4] = { Type: Uint32Array, size: 16, setter: intVec4Setter, cols: 4, }; +typeMap[FLOAT_MAT2] = { Type: Float32Array, size: 32, setter: floatMat2Setter, rows: 2, cols: 2, }; +typeMap[FLOAT_MAT3] = { Type: Float32Array, size: 48, setter: floatMat3Setter, rows: 3, cols: 3, }; +typeMap[FLOAT_MAT4] = { Type: Float32Array, size: 64, setter: floatMat4Setter, rows: 4, cols: 4, }; +typeMap[FLOAT_MAT2x3] = { Type: Float32Array, size: 32, setter: floatMat23Setter, rows: 2, cols: 3, }; +typeMap[FLOAT_MAT2x4] = { Type: Float32Array, size: 32, setter: floatMat24Setter, rows: 2, cols: 4, }; +typeMap[FLOAT_MAT3x2] = { Type: Float32Array, size: 48, setter: floatMat32Setter, rows: 3, cols: 2, }; +typeMap[FLOAT_MAT3x4] = { Type: Float32Array, size: 48, setter: floatMat34Setter, rows: 3, cols: 4, }; +typeMap[FLOAT_MAT4x2] = { Type: Float32Array, size: 64, setter: floatMat42Setter, rows: 4, cols: 2, }; +typeMap[FLOAT_MAT4x3] = { Type: Float32Array, size: 64, setter: floatMat43Setter, rows: 4, cols: 3, }; +typeMap[SAMPLER_2D] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1, }; +typeMap[SAMPLER_CUBE] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, }; +typeMap[SAMPLER_3D] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_3D, }; +typeMap[SAMPLER_2D_SHADOW] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1, }; +typeMap[SAMPLER_2D_ARRAY] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, }; +typeMap[SAMPLER_2D_ARRAY_SHADOW] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, }; +typeMap[SAMPLER_CUBE_SHADOW] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, }; +typeMap[INT_SAMPLER_2D] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1, }; +typeMap[INT_SAMPLER_3D] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_3D, }; +typeMap[INT_SAMPLER_CUBE] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, }; +typeMap[INT_SAMPLER_2D_ARRAY] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, }; +typeMap[UNSIGNED_INT_SAMPLER_2D] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1, }; +typeMap[UNSIGNED_INT_SAMPLER_3D] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_3D, }; +typeMap[UNSIGNED_INT_SAMPLER_CUBE] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, }; +typeMap[UNSIGNED_INT_SAMPLER_2D_ARRAY] = { Type: null, size: 0, setter: samplerSetter, arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, }; + +function floatAttribSetter(gl, index) { + return function(b) { + if (b.value) { + gl.disableVertexAttribArray(index); + switch (b.value.length) { + case 4: + gl.vertexAttrib4fv(index, b.value); + break; + case 3: + gl.vertexAttrib3fv(index, b.value); + break; + case 2: + gl.vertexAttrib2fv(index, b.value); + break; + case 1: + gl.vertexAttrib1fv(index, b.value); + break; + default: + throw new Error('the length of a float constant value must be between 1 and 4!'); + } + } else { + gl.bindBuffer(ARRAY_BUFFER, b.buffer); + gl.enableVertexAttribArray(index); + gl.vertexAttribPointer( + index, b.numComponents || b.size, b.type || FLOAT, b.normalize || false, b.stride || 0, b.offset || 0); + if (gl.vertexAttribDivisor) { + gl.vertexAttribDivisor(index, b.divisor || 0); + } + } + }; +} + +function intAttribSetter(gl, index) { + return function(b) { + if (b.value) { + gl.disableVertexAttribArray(index); + if (b.value.length === 4) { + gl.vertexAttrib4iv(index, b.value); + } else { + throw new Error('The length of an integer constant value must be 4!'); + } + } else { + gl.bindBuffer(ARRAY_BUFFER, b.buffer); + gl.enableVertexAttribArray(index); + gl.vertexAttribIPointer( + index, b.numComponents || b.size, b.type || INT, b.stride || 0, b.offset || 0); + if (gl.vertexAttribDivisor) { + gl.vertexAttribDivisor(index, b.divisor || 0); + } + } + }; +} + +function uintAttribSetter(gl, index) { + return function(b) { + if (b.value) { + gl.disableVertexAttribArray(index); + if (b.value.length === 4) { + gl.vertexAttrib4uiv(index, b.value); + } else { + throw new Error('The length of an unsigned integer constant value must be 4!'); + } + } else { + gl.bindBuffer(ARRAY_BUFFER, b.buffer); + gl.enableVertexAttribArray(index); + gl.vertexAttribIPointer( + index, b.numComponents || b.size, b.type || UNSIGNED_INT, b.stride || 0, b.offset || 0); + if (gl.vertexAttribDivisor) { + gl.vertexAttribDivisor(index, b.divisor || 0); + } + } + }; +} + +function matAttribSetter(gl, index, typeInfo) { + const defaultSize = typeInfo.size; + const count = typeInfo.count; + + return function(b) { + gl.bindBuffer(ARRAY_BUFFER, b.buffer); + const numComponents = b.size || b.numComponents || defaultSize; + const size = numComponents / count; + const type = b.type || FLOAT; + const typeInfo = typeMap[type]; + const stride = typeInfo.size * numComponents; + const normalize = b.normalize || false; + const offset = b.offset || 0; + const rowOffset = stride / count; + for (let i = 0; i < count; ++i) { + gl.enableVertexAttribArray(index + i); + gl.vertexAttribPointer( + index + i, size, type, normalize, stride, offset + rowOffset * i); + if (gl.vertexAttribDivisor) { + gl.vertexAttribDivisor(index + i, b.divisor || 0); + } + } + }; +} + + + +const attrTypeMap = {}; +attrTypeMap[FLOAT] = { size: 4, setter: floatAttribSetter, }; +attrTypeMap[FLOAT_VEC2] = { size: 8, setter: floatAttribSetter, }; +attrTypeMap[FLOAT_VEC3] = { size: 12, setter: floatAttribSetter, }; +attrTypeMap[FLOAT_VEC4] = { size: 16, setter: floatAttribSetter, }; +attrTypeMap[INT] = { size: 4, setter: intAttribSetter, }; +attrTypeMap[INT_VEC2] = { size: 8, setter: intAttribSetter, }; +attrTypeMap[INT_VEC3] = { size: 12, setter: intAttribSetter, }; +attrTypeMap[INT_VEC4] = { size: 16, setter: intAttribSetter, }; +attrTypeMap[UNSIGNED_INT] = { size: 4, setter: uintAttribSetter, }; +attrTypeMap[UNSIGNED_INT_VEC2] = { size: 8, setter: uintAttribSetter, }; +attrTypeMap[UNSIGNED_INT_VEC3] = { size: 12, setter: uintAttribSetter, }; +attrTypeMap[UNSIGNED_INT_VEC4] = { size: 16, setter: uintAttribSetter, }; +attrTypeMap[BOOL] = { size: 4, setter: intAttribSetter, }; +attrTypeMap[BOOL_VEC2] = { size: 8, setter: intAttribSetter, }; +attrTypeMap[BOOL_VEC3] = { size: 12, setter: intAttribSetter, }; +attrTypeMap[BOOL_VEC4] = { size: 16, setter: intAttribSetter, }; +attrTypeMap[FLOAT_MAT2] = { size: 4, setter: matAttribSetter, count: 2, }; +attrTypeMap[FLOAT_MAT3] = { size: 9, setter: matAttribSetter, count: 3, }; +attrTypeMap[FLOAT_MAT4] = { size: 16, setter: matAttribSetter, count: 4, }; + +const errorRE = /ERROR:\s*\d+:(\d+)/gi; +function addLineNumbersWithError(src, log = '', lineOffset = 0) { + // Note: Error message formats are not defined by any spec so this may or may not work. + const matches = [...log.matchAll(errorRE)]; + const lineNoToErrorMap = new Map(matches.map((m, ndx) => { + const lineNo = parseInt(m[1]); + const next = matches[ndx + 1]; + const end = next ? next.index : log.length; + const msg = log.substring(m.index, end); + return [lineNo - 1, msg]; + })); + return src.split('\n').map((line, lineNo) => { + const err = lineNoToErrorMap.get(lineNo); + return `${lineNo + 1 + lineOffset}: ${line}${err ? `\n\n^^^ ${err}` : ''}`; + }).join('\n'); +} + +/** + * Error Callback + * @callback ErrorCallback + * @param {string} msg error message. + * @param {number} [lineOffset] amount to add to line number + * @memberOf module:twgl + */ + +/** + * Program Callback + * @callback ProgramCallback + * @param {string} [err] error message, falsy if no error + * @param {WebGLProgram|module:twgl.ProgramInfo} [result] the program or programInfo + */ + +const spaceRE = /^[ \t]*\n/; + +/** + * Remove the first end of line because WebGL 2.0 requires + * #version 300 es + * as the first line. No whitespace allowed before that line + * so + * + * + * + * Has one line before it which is invalid according to GLSL ES 3.00 + * + * @param {string} shaderSource The source of the shader + * @returns {{shaderSource: string, lineOffset: number}} + * @private + */ +function prepShaderSource(shaderSource) { + let lineOffset = 0; + if (spaceRE.test(shaderSource)) { + lineOffset = 1; + shaderSource = shaderSource.replace(spaceRE, ''); + } + return {lineOffset, shaderSource}; +} + +/** + * @param {module:twgl.ProgramOptions} progOptions + * @param {string} msg + * @return null + * @private + */ +function reportError(progOptions, msg) { + progOptions.errorCallback(msg); + if (progOptions.callback) { + setTimeout(() => { + progOptions.callback(`${msg}\n${progOptions.errors.join('\n')}`); + }); + } + return null; +} + +/** + * Check Shader status + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {number} shaderType The shader type + * @param {WebGLShader} shader The shader + * @param {ErrorCallback} [errFn] function to receive error message. + * @return {string} errors or empty string + * @private + */ +function checkShaderStatus(gl, shaderType, shader, errFn) { + errFn = errFn || error; + // Check the compile status + const compiled = gl.getShaderParameter(shader, COMPILE_STATUS); + if (!compiled) { + // Something went wrong during compilation; get the error + const lastError = gl.getShaderInfoLog(shader); + const {lineOffset, shaderSource} = prepShaderSource(gl.getShaderSource(shader)); + const error = `${addLineNumbersWithError(shaderSource, lastError, lineOffset)}\nError compiling ${glEnumToString(gl, shaderType)}: ${lastError}`; + errFn(error); + return error; + } + return ''; +} + +/** + * @typedef {Object} FullProgramSpec + * @property {string[]} shaders the shader source or element ids. + * @property {function(string)} [errorCallback] callback for errors + * @property {Object.|string[]} [attribLocations] a attribute name to location map, or array of attribute names where index = location. + * @property {(module:twgl.BufferInfo|Object.|string[])} [transformFeedbackVaryings] If passed + * a BufferInfo will use the attribs names inside. If passed an object of AttribInfos will use the names from that object. Otherwise + * you can pass an array of names. + * @property {number} [transformFeedbackMode] the mode to pass `gl.transformFeedbackVaryings`. Defaults to `SEPARATE_ATTRIBS`. + * @property {ProgramCallback} [callback] callback for async program compilation. + * @memberOf module:twgl + */ + +/** + * @typedef {string[]|module:twgl.FullProgramSpec} ProgramSpec + * @memberOf module:twgl + */ + +/** + * @typedef {Object} ProgramOptions + * @property {function(string)} [errorCallback] callback for errors + * @property {Object.|string[]} [attribLocations] a attribute name to location map, or array of attribute names where index = location. + * @property {(module:twgl.BufferInfo|Object.|string[])} [transformFeedbackVaryings] If passed + * a BufferInfo will use the attribs names inside. If passed an object of AttribInfos will use the names from that object. Otherwise + * you can pass an array of names. + * @property {number} [transformFeedbackMode] the mode to pass `gl.transformFeedbackVaryings`. Defaults to `SEPARATE_ATTRIBS`. + * @property {ProgramCallback} [callback] callback for async program compilation. + * @memberOf module:twgl + */ + +/** + * Gets the program options based on all these optional arguments + * @param {module:twgl.ProgramOptions|string[]} [opt_attribs] Options for the program or an array of attribs names. Locations will be assigned by index if not passed in + * @param {number[]} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations. + * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console + * on error. If you want something else pass an callback. It's passed an error message. + * @return {module:twgl.ProgramOptions} an instance of ProgramOptions based on the arguments passed in + * @private + */ +function getProgramOptions(opt_attribs, opt_locations, opt_errorCallback) { + let transformFeedbackVaryings; + let transformFeedbackMode; + let callback; + if (typeof opt_locations === 'function') { + opt_errorCallback = opt_locations; + opt_locations = undefined; + } + if (typeof opt_attribs === 'function') { + opt_errorCallback = opt_attribs; + opt_attribs = undefined; + } else if (opt_attribs && !Array.isArray(opt_attribs)) { + const opt = opt_attribs; + opt_errorCallback = opt.errorCallback; + opt_attribs = opt.attribLocations; + transformFeedbackVaryings = opt.transformFeedbackVaryings; + transformFeedbackMode = opt.transformFeedbackMode; + callback = opt.callback; + } + + const errorCallback = opt_errorCallback || error; + const errors = []; + const options = { + errorCallback(msg, ...args) { + errors.push(msg); + errorCallback(msg, ...args); + }, + transformFeedbackVaryings, + transformFeedbackMode, + callback, + errors, + }; + + { + let attribLocations = {}; + if (Array.isArray(opt_attribs)) { + opt_attribs.forEach(function(attrib, ndx) { + attribLocations[attrib] = opt_locations ? opt_locations[ndx] : ndx; + }); + } else { + attribLocations = opt_attribs || {}; + } + options.attribLocations = attribLocations; + } + + return options; +} + +const defaultShaderType = [ + "VERTEX_SHADER", + "FRAGMENT_SHADER", +]; + +function getShaderTypeFromScriptType(gl, scriptType) { + if (scriptType.indexOf("frag") >= 0) { + return FRAGMENT_SHADER; + } else if (scriptType.indexOf("vert") >= 0) { + return VERTEX_SHADER; + } + return undefined; +} + +function deleteProgramAndShaders(gl, program, notThese) { + const shaders = gl.getAttachedShaders(program); + for (const shader of shaders) { + if (notThese.has(shader)) { + gl.deleteShader(shader); + } + } + gl.deleteProgram(program); +} + +const wait = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms)); + +function createProgramNoCheck(gl, shaders, programOptions) { + const program = gl.createProgram(); + const { + attribLocations, + transformFeedbackVaryings, + transformFeedbackMode, + } = getProgramOptions(programOptions); + + for (let ndx = 0; ndx < shaders.length; ++ndx) { + let shader = shaders[ndx]; + if (typeof shader === 'string') { + const elem = getElementById(shader); + const src = elem ? elem.text : shader; + let type = gl[defaultShaderType[ndx]]; + if (elem && elem.type) { + type = getShaderTypeFromScriptType(gl, elem.type) || type; + } + shader = gl.createShader(type); + gl.shaderSource(shader, prepShaderSource(src).shaderSource); + gl.compileShader(shader); + gl.attachShader(program, shader); + } + } + + Object.entries(attribLocations).forEach(([attrib, loc]) => gl.bindAttribLocation(program, loc, attrib)); + + { + let varyings = transformFeedbackVaryings; + if (varyings) { + if (varyings.attribs) { + varyings = varyings.attribs; + } + if (!Array.isArray(varyings)) { + varyings = Object.keys(varyings); + } + gl.transformFeedbackVaryings(program, varyings, transformFeedbackMode || SEPARATE_ATTRIBS); + } + } + + gl.linkProgram(program); + return program; +} + +/** + * Creates a program, attaches (and/or compiles) shaders, binds attrib locations, links the + * program. + * + * NOTE: There are 4 signatures for this function + * + * twgl.createProgram(gl, [vs, fs], options); + * twgl.createProgram(gl, [vs, fs], opt_errFunc); + * twgl.createProgram(gl, [vs, fs], opt_attribs, opt_errFunc); + * twgl.createProgram(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc); + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {WebGLShader[]|string[]} shaders The shaders to attach, or element ids for their source, or strings that contain their source + * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in + * @param {number[]} [opt_locations|module:twgl.ErrorCallback] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback. + * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console + * on error. If you want something else pass an callback. It's passed an error message. + * @return {WebGLProgram?} the created program or null if error of a callback was provided. + * @memberOf module:twgl/programs + */ +function createProgram( + gl, shaders, opt_attribs, opt_locations, opt_errorCallback) { + // This code is really convoluted, because it may or may not be async + // Maybe it would be better to have a separate function + const progOptions = getProgramOptions(opt_attribs, opt_locations, opt_errorCallback); + const shaderSet = new Set(shaders); + const program = createProgramNoCheck(gl, shaders, progOptions); + + function hasErrors(gl, program) { + const errors = getProgramErrors(gl, program, progOptions.errorCallback); + if (errors) { + deleteProgramAndShaders(gl, program, shaderSet); + } + return errors; + } + + if (progOptions.callback) { + waitForProgramLinkCompletionAsync(gl, program).then(() => { + const errors = hasErrors(gl, program); + progOptions.callback(errors, errors ? undefined : program); + }); + return undefined; + } + + return hasErrors(gl, program) ? undefined : program; +} + +/** + * This only works because the functions it wraps the first 2 arguments + * are gl and any, followed by things that become programOptions + * @private + */ +function wrapCallbackFnToAsyncFn(fn) { + return function(gl, arg1, ...args) { + return new Promise((resolve, reject) => { + const programOptions = getProgramOptions(...args); + programOptions.callback = (err, program) => { + if (err) { + reject(err); + } else { + resolve(program); + } + }; + fn(gl, arg1, programOptions); + }); + }; +} + +/** + * Same as createProgram but returns a promise + * + * NOTE: There are 4 signatures for this function + * + * twgl.createProgramAsync(gl, [vs, fs], options); + * twgl.createProgramAsync(gl, [vs, fs], opt_errFunc); + * twgl.createProgramAsync(gl, [vs, fs], opt_attribs, opt_errFunc); + * twgl.createProgramAsync(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc); + * + * @function + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {WebGLShader[]|string[]} shaders The shaders to attach, or element ids for their source, or strings that contain their source + * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in + * @param {number[]} [opt_locations|module:twgl.ErrorCallback] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback. + * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console + * on error. If you want something else pass an callback. It's passed an error message. + * @return {Promise} The created program + * @memberOf module:twgl/programs + */ +const createProgramAsync = wrapCallbackFnToAsyncFn(createProgram); + +/** + * Same as createProgramInfo but returns a promise + * @function + * @param {WebGLRenderingContext} gl The WebGLRenderingContext + * to use. + * @param {string[]} shaderSources Array of sources for the + * shaders or ids. The first is assumed to be the vertex shader, + * the second the fragment shader. + * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in + * @param {number[]} [opt_locations|module:twgl.ErrorCallback] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback. + * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console + * on error. If you want something else pass an callback. It's passed an error message. + * @return {Promise} The created ProgramInfo + * @memberOf module:twgl/programs + */ +const createProgramInfoAsync = wrapCallbackFnToAsyncFn(createProgramInfo); + +async function waitForProgramLinkCompletionAsync(gl, program) { + const ext = gl.getExtension('KHR_parallel_shader_compile'); + const checkFn = ext + ? (gl, program) => gl.getProgramParameter(program, ext.COMPLETION_STATUS_KHR) + : () => true; + + let waitTime = 0; + do { + await wait(waitTime); // must wait at least once + waitTime = 1000 / 60; + } while (!checkFn(gl, program)); +} + +async function waitForAllProgramsLinkCompletionAsync(gl, programs) { + for (const program of Object.values(programs)) { + await waitForProgramLinkCompletionAsync(gl, program); + } +} + +/** + * Check a program's link status + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {WebGLProgram} program Program to check + * @param {ErrorCallback} [errFn] func for errors + * @return {string?} errors if program is failed, else undefined + * @private + */ +function getProgramErrors(gl, program, errFn) { + errFn = errFn || error; + // Check the link status + const linked = gl.getProgramParameter(program, LINK_STATUS); + if (!linked) { + // something went wrong with the link + const lastError = gl.getProgramInfoLog(program); + errFn(`Error in program linking: ${lastError}`); + // print any errors from these shaders + const shaders = gl.getAttachedShaders(program); + const errors = shaders.map(shader => checkShaderStatus(gl, gl.getShaderParameter(shader, gl.SHADER_TYPE), shader, errFn)); + return `${lastError}\n${errors.filter(_ => _).join('\n')}`; + } + return undefined; +} + +/** + * Creates a program from 2 script tags. + * + * NOTE: There are 4 signatures for this function + * + * twgl.createProgramFromScripts(gl, [vs, fs], opt_options); + * twgl.createProgramFromScripts(gl, [vs, fs], opt_errFunc); + * twgl.createProgramFromScripts(gl, [vs, fs], opt_attribs, opt_errFunc); + * twgl.createProgramFromScripts(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc); + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext + * to use. + * @param {string[]} shaderScriptIds Array of ids of the script + * tags for the shaders. The first is assumed to be the + * vertex shader, the second the fragment shader. + * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in + * @param {number[]} [opt_locations|module:twgl.ErrorCallback] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback. + * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console + * on error. If you want something else pass an callback. It's passed an error message. + * @return {WebGLProgram?} the created program or null if error or a callback was provided. + * @memberOf module:twgl/programs + */ +function createProgramFromScripts( + gl, shaderScriptIds, opt_attribs, opt_locations, opt_errorCallback) { + const progOptions = getProgramOptions(opt_attribs, opt_locations, opt_errorCallback); + const shaders = []; + for (const scriptId of shaderScriptIds) { + const shaderScript = getElementById(scriptId); + if (!shaderScript) { + return reportError(progOptions, `unknown script element: ${scriptId}`); + } + shaders.push(shaderScript.text); + } + return createProgram(gl, shaders, progOptions); +} + +/** + * Creates a program from 2 sources. + * + * NOTE: There are 4 signatures for this function + * + * twgl.createProgramFromSource(gl, [vs, fs], opt_options); + * twgl.createProgramFromSource(gl, [vs, fs], opt_errFunc); + * twgl.createProgramFromSource(gl, [vs, fs], opt_attribs, opt_errFunc); + * twgl.createProgramFromSource(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc); + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext + * to use. + * @param {string[]} shaderSources Array of sources for the + * shaders. The first is assumed to be the vertex shader, + * the second the fragment shader. + * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in + * @param {number[]} [opt_locations|module:twgl.ErrorCallback] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback. + * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console + * on error. If you want something else pass an callback. It's passed an error message. + * @return {WebGLProgram?} the created program or null if error or a callback was provided. + * @memberOf module:twgl/programs + */ +function createProgramFromSources( + gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback) { + return createProgram(gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback); +} + +/** + * Returns true if attribute/uniform is a reserved/built in + * + * It makes no sense to me why GL returns these because it's + * illegal to call `gl.getUniformLocation` and `gl.getAttribLocation` + * with names that start with `gl_` (and `webgl_` in WebGL) + * + * I can only assume they are there because they might count + * when computing the number of uniforms/attributes used when you want to + * know if you are near the limit. That doesn't really make sense + * to me but the fact that these get returned are in the spec. + * + * @param {WebGLActiveInfo} info As returned from `gl.getActiveUniform` or + * `gl.getActiveAttrib`. + * @return {bool} true if it's reserved + * @private + */ +function isBuiltIn(info) { + const name = info.name; + return name.startsWith("gl_") || name.startsWith("webgl_"); +} + +const tokenRE = /(\.|\[|]|\w+)/g; +const isDigit = s => s >= '0' && s <= '9'; +function addSetterToUniformTree(fullPath, setter, node, uniformSetters) { + const tokens = fullPath.split(tokenRE).filter(s => s !== ''); + let tokenNdx = 0; + let path = ''; + + for (;;) { + const token = tokens[tokenNdx++]; // has to be name or number + path += token; + const isArrayIndex = isDigit(token[0]); + const accessor = isArrayIndex + ? parseInt(token) + : token; + if (isArrayIndex) { + path += tokens[tokenNdx++]; // skip ']' + } + const isLastToken = tokenNdx === tokens.length; + if (isLastToken) { + node[accessor] = setter; + break; + } else { + const token = tokens[tokenNdx++]; // has to be . or [ + const isArray = token === '['; + const child = node[accessor] || (isArray ? [] : {}); + node[accessor] = child; + node = child; + uniformSetters[path] = uniformSetters[path] || function(node) { + return function(value) { + setUniformTree(node, value); + }; + }(child); + path += token; + } + } +} + +/** + * Creates setter functions for all uniforms of a shader + * program. + * + * @see {@link module:twgl.setUniforms} + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {WebGLProgram} program the program to create setters for. + * @returns {Object.} an object with a setter by name for each uniform + * @memberOf module:twgl/programs + */ +function createUniformSetters(gl, program) { + let textureUnit = 0; + + /** + * Creates a setter for a uniform of the given program with it's + * location embedded in the setter. + * @param {WebGLProgram} program + * @param {WebGLUniformInfo} uniformInfo + * @returns {function} the created setter. + */ + function createUniformSetter(program, uniformInfo, location) { + const isArray = uniformInfo.name.endsWith("[0]"); + const type = uniformInfo.type; + const typeInfo = typeMap[type]; + if (!typeInfo) { + throw new Error(`unknown type: 0x${type.toString(16)}`); // we should never get here. + } + let setter; + if (typeInfo.bindPoint) { + // it's a sampler + const unit = textureUnit; + textureUnit += uniformInfo.size; + if (isArray) { + setter = typeInfo.arraySetter(gl, type, unit, location, uniformInfo.size); + } else { + setter = typeInfo.setter(gl, type, unit, location, uniformInfo.size); + } + } else { + if (typeInfo.arraySetter && isArray) { + setter = typeInfo.arraySetter(gl, location); + } else { + setter = typeInfo.setter(gl, location); + } + } + setter.location = location; + return setter; + } + + const uniformSetters = {}; + const uniformTree = {}; + const numUniforms = gl.getProgramParameter(program, ACTIVE_UNIFORMS); + + for (let ii = 0; ii < numUniforms; ++ii) { + const uniformInfo = gl.getActiveUniform(program, ii); + if (isBuiltIn(uniformInfo)) { + continue; + } + let name = uniformInfo.name; + // remove the array suffix. + if (name.endsWith("[0]")) { + name = name.substr(0, name.length - 3); + } + const location = gl.getUniformLocation(program, uniformInfo.name); + // the uniform will have no location if it's in a uniform block + if (location) { + const setter = createUniformSetter(program, uniformInfo, location); + uniformSetters[name] = setter; + addSetterToUniformTree(name, setter, uniformTree, uniformSetters); + } + } + + return uniformSetters; +} + +/** + * @typedef {Object} TransformFeedbackInfo + * @property {number} index index of transform feedback + * @property {number} type GL type + * @property {number} size 1 - 4 + * @memberOf module:twgl + */ + +/** + * Create TransformFeedbackInfo for passing to bindTransformFeedbackInfo. + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {WebGLProgram} program an existing WebGLProgram. + * @return {Object} + * @memberOf module:twgl + */ +function createTransformFeedbackInfo(gl, program) { + const info = {}; + const numVaryings = gl.getProgramParameter(program, TRANSFORM_FEEDBACK_VARYINGS); + for (let ii = 0; ii < numVaryings; ++ii) { + const varying = gl.getTransformFeedbackVarying(program, ii); + info[varying.name] = { + index: ii, + type: varying.type, + size: varying.size, + }; + } + return info; +} + +/** + * Binds buffers for transform feedback. + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {(module:twgl.ProgramInfo|Object)} transformFeedbackInfo A ProgramInfo or TransformFeedbackInfo. + * @param {(module:twgl.BufferInfo|Object)} [bufferInfo] A BufferInfo or set of AttribInfos. + * @memberOf module:twgl + */ +function bindTransformFeedbackInfo(gl, transformFeedbackInfo, bufferInfo) { + if (transformFeedbackInfo.transformFeedbackInfo) { + transformFeedbackInfo = transformFeedbackInfo.transformFeedbackInfo; + } + if (bufferInfo.attribs) { + bufferInfo = bufferInfo.attribs; + } + for (const name in bufferInfo) { + const varying = transformFeedbackInfo[name]; + if (varying) { + const buf = bufferInfo[name]; + if (buf.offset) { + gl.bindBufferRange(TRANSFORM_FEEDBACK_BUFFER, varying.index, buf.buffer, buf.offset, buf.size); + } else { + gl.bindBufferBase(TRANSFORM_FEEDBACK_BUFFER, varying.index, buf.buffer); + } + } + } +} + +/** + * Creates a transform feedback and sets the buffers + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {module:twgl.ProgramInfo} programInfo A ProgramInfo as returned from {@link module:twgl.createProgramInfo} + * @param {(module:twgl.BufferInfo|Object)} [bufferInfo] A BufferInfo or set of AttribInfos. + * @return {WebGLTransformFeedback} the created transform feedback + * @memberOf module:twgl + */ +function createTransformFeedback(gl, programInfo, bufferInfo) { + const tf = gl.createTransformFeedback(); + gl.bindTransformFeedback(TRANSFORM_FEEDBACK, tf); + gl.useProgram(programInfo.program); + bindTransformFeedbackInfo(gl, programInfo, bufferInfo); + gl.bindTransformFeedback(TRANSFORM_FEEDBACK, null); + return tf; +} + +/** + * @typedef {Object} UniformData + * @property {string} name The name of the uniform + * @property {number} type The WebGL type enum for this uniform + * @property {number} size The number of elements for this uniform + * @property {number} blockNdx The block index this uniform appears in + * @property {number} offset The byte offset in the block for this uniform's value + * @memberOf module:twgl + */ + +/** + * The specification for one UniformBlockObject + * + * @typedef {Object} BlockSpec + * @property {number} index The index of the block. + * @property {number} size The size in bytes needed for the block + * @property {number[]} uniformIndices The indices of the uniforms used by the block. These indices + * correspond to entries in a UniformData array in the {@link module:twgl.UniformBlockSpec}. + * @property {bool} usedByVertexShader Self explanatory + * @property {bool} usedByFragmentShader Self explanatory + * @property {bool} used Self explanatory + * @memberOf module:twgl + */ + +/** + * A `UniformBlockSpec` represents the data needed to create and bind + * UniformBlockObjects for a given program + * + * @typedef {Object} UniformBlockSpec + * @property {Object.} blockSpecs The BlockSpec for each block by block name + * @property {UniformData[]} uniformData An array of data for each uniform by uniform index. + * @memberOf module:twgl + */ + +/** + * Creates a UniformBlockSpec for the given program. + * + * A UniformBlockSpec represents the data needed to create and bind + * UniformBlockObjects + * + * @param {WebGL2RenderingContext} gl A WebGL2 Rendering Context + * @param {WebGLProgram} program A WebGLProgram for a successfully linked program + * @return {module:twgl.UniformBlockSpec} The created UniformBlockSpec + * @memberOf module:twgl/programs + */ +function createUniformBlockSpecFromProgram(gl, program) { + const numUniforms = gl.getProgramParameter(program, ACTIVE_UNIFORMS); + const uniformData = []; + const uniformIndices = []; + + for (let ii = 0; ii < numUniforms; ++ii) { + uniformIndices.push(ii); + uniformData.push({}); + const uniformInfo = gl.getActiveUniform(program, ii); + uniformData[ii].name = uniformInfo.name; + } + + [ + [ "UNIFORM_TYPE", "type" ], + [ "UNIFORM_SIZE", "size" ], // num elements + [ "UNIFORM_BLOCK_INDEX", "blockNdx" ], + [ "UNIFORM_OFFSET", "offset", ], + ].forEach(function(pair) { + const pname = pair[0]; + const key = pair[1]; + gl.getActiveUniforms(program, uniformIndices, gl[pname]).forEach(function(value, ndx) { + uniformData[ndx][key] = value; + }); + }); + + const blockSpecs = {}; + + const numUniformBlocks = gl.getProgramParameter(program, ACTIVE_UNIFORM_BLOCKS); + for (let ii = 0; ii < numUniformBlocks; ++ii) { + const name = gl.getActiveUniformBlockName(program, ii); + const blockSpec = { + index: gl.getUniformBlockIndex(program, name), + usedByVertexShader: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER), + usedByFragmentShader: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER), + size: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_DATA_SIZE), + uniformIndices: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES), + }; + blockSpec.used = blockSpec.usedByVertexShader || blockSpec.usedByFragmentShader; + blockSpecs[name] = blockSpec; + } + + return { + blockSpecs: blockSpecs, + uniformData: uniformData, + }; +} + +const arraySuffixRE = /\[\d+\]\.$/; // better way to check? + +const pad = (v, padding) => ((v + (padding - 1)) / padding | 0) * padding; + +function createUniformBlockUniformSetter(view, isArray, rows, cols) { + if (isArray || rows) { + cols = cols || 1; + const numElements = view.length; + const totalRows = numElements / 4; + return function(value) { + let dst = 0; + let src = 0; + for (let row = 0; row < totalRows; ++row) { + for (let col = 0; col < cols; ++col) { + view[dst++] = value[src++]; + } + dst += 4 - cols; + } + }; + } else { + return function(value) { + if (value.length) { + view.set(value); + } else { + view[0] = value; + } + }; + } +} + +/** + * Represents a UniformBlockObject including an ArrayBuffer with all the uniform values + * and a corresponding WebGLBuffer to hold those values on the GPU + * + * @typedef {Object} UniformBlockInfo + * @property {string} name The name of the block + * @property {ArrayBuffer} array The array buffer that contains the uniform values + * @property {Float32Array} asFloat A float view on the array buffer. This is useful + * inspecting the contents of the buffer in the debugger. + * @property {WebGLBuffer} buffer A WebGL buffer that will hold a copy of the uniform values for rendering. + * @property {number} [offset] offset into buffer + * @property {Object} uniforms A uniform name to ArrayBufferView map. + * each Uniform has a correctly typed `ArrayBufferView` into array at the correct offset + * and length of that uniform. So for example a float uniform would have a 1 float `Float32Array` + * view. A single mat4 would have a 16 element `Float32Array` view. An ivec2 would have an + * `Int32Array` view, etc. + * @property {Object} setters A setter for this uniform. + * The reason to use setters is elements of arrays are padded to vec4 sizes which + * means if you want to set an array of 4 floats you'd need to set 16 values + * (or set elements 0, 4, 8, 12). In other words + * `someBlockInfo.uniforms.some4FloatArrayUniform.set([0, , , , 1, , , , 2, , , , 3])` + * where as the setter handles just passing in [0, 1, 2, 3] either directly as in + * `someBlockInfo.setter.some4FloatArrayUniform.set([0, 1, 2, 3])` (not recommended) + * or via {@link module:twgl.setBlockUniforms} + * @memberOf module:twgl + */ + +/** + * Creates a `UniformBlockInfo` for the specified block + * + * Note: **If the blockName matches no existing blocks a warning is printed to the console and a dummy + * `UniformBlockInfo` is returned**. This is because when debugging GLSL + * it is common to comment out large portions of a shader or for example set + * the final output to a constant. When that happens blocks get optimized out. + * If this function did not create dummy blocks your code would crash when debugging. + * + * @param {WebGL2RenderingContext} gl A WebGL2RenderingContext + * @param {WebGLProgram} program A WebGLProgram + * @param {module:twgl.UniformBlockSpec} uniformBlockSpec. A UniformBlockSpec as returned + * from {@link module:twgl.createUniformBlockSpecFromProgram}. + * @param {string} blockName The name of the block. + * @return {module:twgl.UniformBlockInfo} The created UniformBlockInfo + * @memberOf module:twgl/programs + */ +function createUniformBlockInfoFromProgram(gl, program, uniformBlockSpec, blockName) { + const blockSpecs = uniformBlockSpec.blockSpecs; + const uniformData = uniformBlockSpec.uniformData; + const blockSpec = blockSpecs[blockName]; + if (!blockSpec) { + warn("no uniform block object named:", blockName); + return { + name: blockName, + uniforms: {}, + }; + } + const array = new ArrayBuffer(blockSpec.size); + const buffer = gl.createBuffer(); + const uniformBufferIndex = blockSpec.index; + gl.bindBuffer(UNIFORM_BUFFER, buffer); + gl.uniformBlockBinding(program, blockSpec.index, uniformBufferIndex); + + let prefix = blockName + "."; + if (arraySuffixRE.test(prefix)) { + prefix = prefix.replace(arraySuffixRE, "."); + } + const uniforms = {}; + const setters = {}; + const setterTree = {}; + blockSpec.uniformIndices.forEach(function(uniformNdx) { + const data = uniformData[uniformNdx]; + let name = data.name; + if (name.startsWith(prefix)) { + name = name.substr(prefix.length); + } + const isArray = name.endsWith('[0]'); + if (isArray) { + name = name.substr(0, name.length - 3); + } + const typeInfo = typeMap[data.type]; + const Type = typeInfo.Type; + const byteLength = isArray + ? pad(typeInfo.size, 16) * data.size + : typeInfo.size * data.size; + const uniformView = new Type(array, data.offset, byteLength / Type.BYTES_PER_ELEMENT); + uniforms[name] = uniformView; + // Note: I'm not sure what to do here. The original + // idea was to create TypedArray views into each part + // of the block. This is useful, for example if you have + // a block with { mat4: model; mat4 view; mat4 projection; } + // you'll get a Float32Array for each one suitable for + // passing to most JS math libraries including twgl's and glMatrix.js. + // + // But, if you have a an array of structures, especially if that + // array is large, you get a whole bunch of TypedArray views. + // Every one of them has overhead and switching between them all + // is probably a cache miss. In that case it would really be better + // to just have one view (asFloat) and have all the setters + // just reference the correct portion. But, then you can't easily + // treat a matrix, or a vec4, as a standalone thing like you can + // with all the views. + // + // Another problem with the views is they are not shared. With + // uniforms you have one set of setters. With UniformBlockInfo + // you have a set of setters *pre block instance*. That's because + // TypedArray views can't be mapped to different buffers. + // + // My gut right now is if you really want the speed and compactness + // then you should probably roll your own solution. TWGL's goal + // here is ease of use as AFAICT there is no simple generic efficient + // solution. + const setter = createUniformBlockUniformSetter(uniformView, isArray, typeInfo.rows, typeInfo.cols); + setters[name] = setter; + addSetterToUniformTree(name, setter, setterTree, setters); + }); + return { + name: blockName, + array, + asFloat: new Float32Array(array), // for debugging + buffer, + uniforms, + setters, + }; +} + +/** + * Creates a `UniformBlockInfo` for the specified block + * + * Note: **If the blockName matches no existing blocks a warning is printed to the console and a dummy + * `UniformBlockInfo` is returned**. This is because when debugging GLSL + * it is common to comment out large portions of a shader or for example set + * the final output to a constant. When that happens blocks get optimized out. + * If this function did not create dummy blocks your code would crash when debugging. + * + * @param {WebGL2RenderingContext} gl A WebGL2RenderingContext + * @param {module:twgl.ProgramInfo} programInfo a `ProgramInfo` + * as returned from {@link module:twgl.createProgramInfo} + * @param {string} blockName The name of the block. + * @return {module:twgl.UniformBlockInfo} The created UniformBlockInfo + * @memberOf module:twgl/programs + */ +function createUniformBlockInfo(gl, programInfo, blockName) { + return createUniformBlockInfoFromProgram(gl, programInfo.program, programInfo.uniformBlockSpec, blockName); +} + +/** + * Binds a uniform block to the matching uniform block point. + * Matches by blocks by name so blocks must have the same name not just the same + * structure. + * + * If you have changed any values and you upload the values into the corresponding WebGLBuffer + * call {@link module:twgl.setUniformBlock} instead. + * + * @param {WebGL2RenderingContext} gl A WebGL 2 rendering context. + * @param {(module:twgl.ProgramInfo|module:twgl.UniformBlockSpec)} programInfo a `ProgramInfo` + * as returned from {@link module:twgl.createProgramInfo} or or `UniformBlockSpec` as + * returned from {@link module:twgl.createUniformBlockSpecFromProgram}. + * @param {module:twgl.UniformBlockInfo} uniformBlockInfo a `UniformBlockInfo` as returned from + * {@link module:twgl.createUniformBlockInfo}. + * @return {bool} true if buffer was bound. If the programInfo has no block with the same block name + * no buffer is bound. + * @memberOf module:twgl/programs + */ +function bindUniformBlock(gl, programInfo, uniformBlockInfo) { + const uniformBlockSpec = programInfo.uniformBlockSpec || programInfo; + const blockSpec = uniformBlockSpec.blockSpecs[uniformBlockInfo.name]; + if (blockSpec) { + const bufferBindIndex = blockSpec.index; + gl.bindBufferRange(UNIFORM_BUFFER, bufferBindIndex, uniformBlockInfo.buffer, uniformBlockInfo.offset || 0, uniformBlockInfo.array.byteLength); + return true; + } + return false; +} + +/** + * Uploads the current uniform values to the corresponding WebGLBuffer + * and binds that buffer to the program's corresponding bind point for the uniform block object. + * + * If you haven't changed any values and you only need to bind the uniform block object + * call {@link module:twgl.bindUniformBlock} instead. + * + * @param {WebGL2RenderingContext} gl A WebGL 2 rendering context. + * @param {(module:twgl.ProgramInfo|module:twgl.UniformBlockSpec)} programInfo a `ProgramInfo` + * as returned from {@link module:twgl.createProgramInfo} or or `UniformBlockSpec` as + * returned from {@link module:twgl.createUniformBlockSpecFromProgram}. + * @param {module:twgl.UniformBlockInfo} uniformBlockInfo a `UniformBlockInfo` as returned from + * {@link module:twgl.createUniformBlockInfo}. + * @memberOf module:twgl/programs + */ +function setUniformBlock(gl, programInfo, uniformBlockInfo) { + if (bindUniformBlock(gl, programInfo, uniformBlockInfo)) { + gl.bufferData(UNIFORM_BUFFER, uniformBlockInfo.array, DYNAMIC_DRAW); + } +} + +/** + * Sets values of a uniform block object + * + * @param {module:twgl.UniformBlockInfo} uniformBlockInfo A UniformBlockInfo as returned by {@link module:twgl.createUniformBlockInfo}. + * @param {Object.} values A uniform name to value map where the value is correct for the given + * type of uniform. So for example given a block like + * + * uniform SomeBlock { + * float someFloat; + * vec2 someVec2; + * vec3 someVec3Array[2]; + * int someInt; + * } + * + * You can set the values of the uniform block with + * + * twgl.setBlockUniforms(someBlockInfo, { + * someFloat: 12.3, + * someVec2: [1, 2], + * someVec3Array: [1, 2, 3, 4, 5, 6], + * someInt: 5, + * } + * + * Arrays can be JavaScript arrays or typed arrays + * + * You can also fill out structure and array values either via + * shortcut. Example + * + * // -- in shader -- + * struct Light { + * float intensity; + * vec4 color; + * float nearFar[2]; + * }; + * uniform Lights { + * Light lights[2]; + * }; + * + * // in JavaScript + * + * twgl.setBlockUniforms(someBlockInfo, { + * lights: [ + * { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.1, 10] }, + * { intensity: 2.0, color: [0, 0, 1, 1], nearFar[0.2, 15] }, + * ], + * }); + * + * or the more traditional way + * + * twgl.setBlockUniforms(someBlockInfo, { + * "lights[0].intensity": 5.0, + * "lights[0].color": [1, 0, 0, 1], + * "lights[0].nearFar": [0.1, 10], + * "lights[1].intensity": 2.0, + * "lights[1].color": [0, 0, 1, 1], + * "lights[1].nearFar": [0.2, 15], + * }); + * + * You can also specify partial paths + * + * twgl.setBlockUniforms(someBlockInfo, { + * 'lights[1]': { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.2, 15] }, + * }); + * + * But you can not specify leaf array indices. + * + * twgl.setBlockUniforms(someBlockInfo, { + * 'lights[1].nearFar[1]': 15, // BAD! nearFar is a leaf + * 'lights[1].nearFar': [0.2, 15], // GOOD + * }); + * + * **IMPORTANT!**, packing in a UniformBlock is unintuitive. + * For example the actual layout of `someVec3Array` above in memory + * is `1, 2, 3, unused, 4, 5, 6, unused`. twgl takes in 6 values + * as shown about and copies them, skipping the padding. This might + * be confusing if you're already familiar with Uniform blocks. + * + * If you want to deal with the padding yourself you can access the array + * buffer views directly. eg: + * + * someBlockInfo.someVec3Array.set([1, 2, 3, 0, 4, 5, 6, 0]); + * + * Any name that doesn't match will be ignored + * @memberOf module:twgl/programs + */ +function setBlockUniforms(uniformBlockInfo, values) { + const setters = uniformBlockInfo.setters; + for (const name in values) { + const setter = setters[name]; + if (setter) { + const value = values[name]; + setter(value); + } + } +} + +function setUniformTree(tree, values) { + for (const name in values) { + const prop = tree[name]; + if (typeof prop === 'function') { + prop(values[name]); + } else { + setUniformTree(tree[name], values[name]); + } + } +} + +/** + * Set uniforms and binds related textures. + * + * example: + * + * const programInfo = createProgramInfo( + * gl, ["some-vs", "some-fs"]); + * + * const tex1 = gl.createTexture(); + * const tex2 = gl.createTexture(); + * + * ... assume we setup the textures with data ... + * + * const uniforms = { + * u_someSampler: tex1, + * u_someOtherSampler: tex2, + * u_someColor: [1,0,0,1], + * u_somePosition: [0,1,1], + * u_someMatrix: [ + * 1,0,0,0, + * 0,1,0,0, + * 0,0,1,0, + * 0,0,0,0, + * ], + * }; + * + * gl.useProgram(programInfo.program); + * + * This will automatically bind the textures AND set the + * uniforms. + * + * twgl.setUniforms(programInfo, uniforms); + * + * For the example above it is equivalent to + * + * let texUnit = 0; + * gl.activeTexture(gl.TEXTURE0 + texUnit); + * gl.bindTexture(gl.TEXTURE_2D, tex1); + * gl.uniform1i(u_someSamplerLocation, texUnit++); + * gl.activeTexture(gl.TEXTURE0 + texUnit); + * gl.bindTexture(gl.TEXTURE_2D, tex2); + * gl.uniform1i(u_someSamplerLocation, texUnit++); + * gl.uniform4fv(u_someColorLocation, [1, 0, 0, 1]); + * gl.uniform3fv(u_somePositionLocation, [0, 1, 1]); + * gl.uniformMatrix4fv(u_someMatrix, false, [ + * 1,0,0,0, + * 0,1,0,0, + * 0,0,1,0, + * 0,0,0,0, + * ]); + * + * Note it is perfectly reasonable to call `setUniforms` multiple times. For example + * + * const uniforms = { + * u_someSampler: tex1, + * u_someOtherSampler: tex2, + * }; + * + * const moreUniforms { + * u_someColor: [1,0,0,1], + * u_somePosition: [0,1,1], + * u_someMatrix: [ + * 1,0,0,0, + * 0,1,0,0, + * 0,0,1,0, + * 0,0,0,0, + * ], + * }; + * + * twgl.setUniforms(programInfo, uniforms); + * twgl.setUniforms(programInfo, moreUniforms); + * + * You can also add WebGLSamplers to uniform samplers as in + * + * const uniforms = { + * u_someSampler: { + * texture: someWebGLTexture, + * sampler: someWebGLSampler, + * }, + * }; + * + * In which case both the sampler and texture will be bound to the + * same unit. + * + * @param {(module:twgl.ProgramInfo|Object.)} setters a `ProgramInfo` as returned from `createProgramInfo` or the setters returned from + * `createUniformSetters`. + * @param {Object.} values an object with values for the + * uniforms. + * You can pass multiple objects by putting them in an array or by calling with more arguments.For example + * + * const sharedUniforms = { + * u_fogNear: 10, + * u_projection: ... + * ... + * }; + * + * const localUniforms = { + * u_world: ... + * u_diffuseColor: ... + * }; + * + * twgl.setUniforms(programInfo, sharedUniforms, localUniforms); + * + * // is the same as + * + * twgl.setUniforms(programInfo, [sharedUniforms, localUniforms]); + * + * // is the same as + * + * twgl.setUniforms(programInfo, sharedUniforms); + * twgl.setUniforms(programInfo, localUniforms}; + * + * You can also fill out structure and array values either via + * shortcut. Example + * + * // -- in shader -- + * struct Light { + * float intensity; + * vec4 color; + * float nearFar[2]; + * }; + * uniform Light lights[2]; + * + * // in JavaScript + * + * twgl.setUniforms(programInfo, { + * lights: [ + * { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.1, 10] }, + * { intensity: 2.0, color: [0, 0, 1, 1], nearFar[0.2, 15] }, + * ], + * }); + * + * or the more traditional way + * + * twgl.setUniforms(programInfo, { + * "lights[0].intensity": 5.0, + * "lights[0].color": [1, 0, 0, 1], + * "lights[0].nearFar": [0.1, 10], + * "lights[1].intensity": 2.0, + * "lights[1].color": [0, 0, 1, 1], + * "lights[1].nearFar": [0.2, 15], + * }); + * + * You can also specify partial paths + * + * twgl.setUniforms(programInfo, { + * 'lights[1]': { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.2, 15] }, + * }); + * + * But you can not specify leaf array indices + * + * twgl.setUniforms(programInfo, { + * 'lights[1].nearFar[1]': 15, // BAD! nearFar is a leaf + * 'lights[1].nearFar': [0.2, 15], // GOOD + * }); + * + * @memberOf module:twgl/programs + */ +function setUniforms(setters, ...args) { // eslint-disable-line + const actualSetters = setters.uniformSetters || setters; + const numArgs = args.length; + for (let aNdx = 0; aNdx < numArgs; ++aNdx) { + const values = args[aNdx]; + if (Array.isArray(values)) { + const numValues = values.length; + for (let ii = 0; ii < numValues; ++ii) { + setUniforms(actualSetters, values[ii]); + } + } else { + for (const name in values) { + const setter = actualSetters[name]; + if (setter) { + setter(values[name]); + } + } + } + } +} + +/** + * Alias for `setUniforms` + * @function + * @param {(module:twgl.ProgramInfo|Object.)} setters a `ProgramInfo` as returned from `createProgramInfo` or the setters returned from + * `createUniformSetters`. + * @param {Object.} values an object with values for the + * @memberOf module:twgl/programs + */ +const setUniformsAndBindTextures = setUniforms; + +/** + * Creates setter functions for all attributes of a shader + * program. You can pass this to {@link module:twgl.setBuffersAndAttributes} to set all your buffers and attributes. + * + * @see {@link module:twgl.setAttributes} for example + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {WebGLProgram} program the program to create setters for. + * @return {Object.} an object with a setter for each attribute by name. + * @memberOf module:twgl/programs + */ +function createAttributeSetters(gl, program) { + const attribSetters = { + }; + + const numAttribs = gl.getProgramParameter(program, ACTIVE_ATTRIBUTES); + for (let ii = 0; ii < numAttribs; ++ii) { + const attribInfo = gl.getActiveAttrib(program, ii); + if (isBuiltIn(attribInfo)) { + continue; + } + const index = gl.getAttribLocation(program, attribInfo.name); + const typeInfo = attrTypeMap[attribInfo.type]; + const setter = typeInfo.setter(gl, index, typeInfo); + setter.location = index; + attribSetters[attribInfo.name] = setter; + } + + return attribSetters; +} + +/** + * Sets attributes and binds buffers (deprecated... use {@link module:twgl.setBuffersAndAttributes}) + * + * Example: + * + * const program = createProgramFromScripts( + * gl, ["some-vs", "some-fs"); + * + * const attribSetters = createAttributeSetters(program); + * + * const positionBuffer = gl.createBuffer(); + * const texcoordBuffer = gl.createBuffer(); + * + * const attribs = { + * a_position: {buffer: positionBuffer, numComponents: 3}, + * a_texcoord: {buffer: texcoordBuffer, numComponents: 2}, + * }; + * + * gl.useProgram(program); + * + * This will automatically bind the buffers AND set the + * attributes. + * + * setAttributes(attribSetters, attribs); + * + * Properties of attribs. For each attrib you can add + * properties: + * + * * type: the type of data in the buffer. Default = gl.FLOAT + * * normalize: whether or not to normalize the data. Default = false + * * stride: the stride. Default = 0 + * * offset: offset into the buffer. Default = 0 + * * divisor: the divisor for instances. Default = undefined + * + * For example if you had 3 value float positions, 2 value + * float texcoord and 4 value uint8 colors you'd setup your + * attribs like this + * + * const attribs = { + * a_position: {buffer: positionBuffer, numComponents: 3}, + * a_texcoord: {buffer: texcoordBuffer, numComponents: 2}, + * a_color: { + * buffer: colorBuffer, + * numComponents: 4, + * type: gl.UNSIGNED_BYTE, + * normalize: true, + * }, + * }; + * + * @param {Object.} setters Attribute setters as returned from createAttributeSetters + * @param {Object.} buffers AttribInfos mapped by attribute name. + * @memberOf module:twgl/programs + * @deprecated use {@link module:twgl.setBuffersAndAttributes} + * @private + */ +function setAttributes(setters, buffers) { + for (const name in buffers) { + const setter = setters[name]; + if (setter) { + setter(buffers[name]); + } + } +} + +/** + * Sets attributes and buffers including the `ELEMENT_ARRAY_BUFFER` if appropriate + * + * Example: + * + * const programInfo = createProgramInfo( + * gl, ["some-vs", "some-fs"); + * + * const arrays = { + * position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], }, + * texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1], }, + * }; + * + * const bufferInfo = createBufferInfoFromArrays(gl, arrays); + * + * gl.useProgram(programInfo.program); + * + * This will automatically bind the buffers AND set the + * attributes. + * + * setBuffersAndAttributes(gl, programInfo, bufferInfo); + * + * For the example above it is equivalent to + * + * gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + * gl.enableVertexAttribArray(a_positionLocation); + * gl.vertexAttribPointer(a_positionLocation, 3, gl.FLOAT, false, 0, 0); + * gl.bindBuffer(gl.ARRAY_BUFFER, texcoordBuffer); + * gl.enableVertexAttribArray(a_texcoordLocation); + * gl.vertexAttribPointer(a_texcoordLocation, 4, gl.FLOAT, false, 0, 0); + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext. + * @param {(module:twgl.ProgramInfo|Object.)} setters A `ProgramInfo` as returned from {@link module:twgl.createProgramInfo} or Attribute setters as returned from {@link module:twgl.createAttributeSetters} + * @param {(module:twgl.BufferInfo|module:twgl.VertexArrayInfo)} buffers a `BufferInfo` as returned from {@link module:twgl.createBufferInfoFromArrays}. + * or a `VertexArrayInfo` as returned from {@link module:twgl.createVertexArrayInfo} + * @memberOf module:twgl/programs + */ +function setBuffersAndAttributes(gl, programInfo, buffers) { + if (buffers.vertexArrayObject) { + gl.bindVertexArray(buffers.vertexArrayObject); + } else { + setAttributes(programInfo.attribSetters || programInfo, buffers.attribs); + if (buffers.indices) { + gl.bindBuffer(ELEMENT_ARRAY_BUFFER$1, buffers.indices); + } + } +} + +/** + * @typedef {Object} ProgramInfo + * @property {WebGLProgram} program A shader program + * @property {Object} uniformSetters object of setters as returned from createUniformSetters, + * @property {Object} attribSetters object of setters as returned from createAttribSetters, + * @property {module:twgl.UniformBlockSpec} [uniformBlockSpec] a uniform block spec for making UniformBlockInfos with createUniformBlockInfo etc.. + * @property {Object} [transformFeedbackInfo] info for transform feedbacks + * @memberOf module:twgl + */ + +/** + * Creates a ProgramInfo from an existing program. + * + * A ProgramInfo contains + * + * programInfo = { + * program: WebGLProgram, + * uniformSetters: object of setters as returned from createUniformSetters, + * attribSetters: object of setters as returned from createAttribSetters, + * } + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext + * to use. + * @param {WebGLProgram} program an existing WebGLProgram. + * @return {module:twgl.ProgramInfo} The created ProgramInfo. + * @memberOf module:twgl/programs + */ +function createProgramInfoFromProgram(gl, program) { + const uniformSetters = createUniformSetters(gl, program); + const attribSetters = createAttributeSetters(gl, program); + const programInfo = { + program, + uniformSetters, + attribSetters, + }; + + if (isWebGL2(gl)) { + programInfo.uniformBlockSpec = createUniformBlockSpecFromProgram(gl, program); + programInfo.transformFeedbackInfo = createTransformFeedbackInfo(gl, program); + } + + return programInfo; +} + +const notIdRE = /\s|{|}|;/; + +/** + * Creates a ProgramInfo from 2 sources. + * + * A ProgramInfo contains + * + * programInfo = { + * program: WebGLProgram, + * uniformSetters: object of setters as returned from createUniformSetters, + * attribSetters: object of setters as returned from createAttribSetters, + * } + * + * NOTE: There are 4 signatures for this function + * + * twgl.createProgramInfo(gl, [vs, fs], options); + * twgl.createProgramInfo(gl, [vs, fs], opt_errFunc); + * twgl.createProgramInfo(gl, [vs, fs], opt_attribs, opt_errFunc); + * twgl.createProgramInfo(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc); + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext + * to use. + * @param {string[]} shaderSources Array of sources for the + * shaders or ids. The first is assumed to be the vertex shader, + * the second the fragment shader. + * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in + * @param {number[]} [opt_locations|module:twgl.ErrorCallback] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback. + * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console + * on error. If you want something else pass an callback. It's passed an error message. + * @return {module:twgl.ProgramInfo?} The created ProgramInfo or null if it failed to link or compile + * @memberOf module:twgl/programs + */ +function createProgramInfo( + gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback) { + const progOptions = getProgramOptions(opt_attribs, opt_locations, opt_errorCallback); + const errors = []; + shaderSources = shaderSources.map(function(source) { + // Lets assume if there is no \n it's an id + if (!notIdRE.test(source)) { + const script = getElementById(source); + if (!script) { + const err = `no element with id: ${source}`; + progOptions.errorCallback(err); + errors.push(err); + } else { + source = script.text; + } + } + return source; + }); + + if (errors.length) { + return reportError(progOptions, ''); + } + + const origCallback = progOptions.callback; + if (origCallback) { + progOptions.callback = (err, program) => { + origCallback(err, err ? undefined : createProgramInfoFromProgram(gl, program)); + }; + } + + const program = createProgramFromSources(gl, shaderSources, progOptions); + if (!program) { + return null; + } + + return createProgramInfoFromProgram(gl, program); +} + +function checkAllPrograms(gl, programs, programSpecs, noDeleteShadersSet, programOptions) { + // check errors for everything. + for (const [name, program] of Object.entries(programs)) { + const options = {...programOptions}; + const spec = programSpecs[name]; + if (!Array.isArray(spec)) { + Object.assign(options, spec); + } + const errors = getProgramErrors(gl, program, options.errorCallback); + if (errors) { + // delete everything we created + for (const program of Object.values(programs)) { + const shaders = gl.getAttachedShaders(program); + gl.deleteProgram(program); + for (const shader of shaders) { + // Don't delete it if we didn't create it. + if (!noDeleteShadersSet.has(shader)) { + gl.deleteShader(shader); + } + } + } + return errors; + } + } + + return undefined; +} + +/** + * Creates multiple programs + * + * Note: the reason this function exists is because the fastest way to create multiple + * programs in WebGL is to create and compile all shaders and link all programs and only + * afterwards check if they succeeded. In that way, giving all your shaders + * + * @see {@link module:twgl.createProgram} + * + * Example: + * + * const programs = twgl.createPrograms(gl, { + * lambert: [lambertVS, lambertFS], + * phong: [phongVS, phoneFS], + * particles: { + * shaders: [particlesVS, particlesFS], + * transformFeedbackVaryings: ['position', 'velocity'], + * }, + * }); + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {Object.} programSpecs An object of ProgramSpecs, one per program. + * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs + * @return {Object.?} the created programInfos by name + */ +function createPrograms(gl, programSpecs, programOptions = {}) { + // Remember existing shaders so that if there is an error we don't delete them + const noDeleteShadersSet = new Set(); + + // compile and link everything + const programs = Object.fromEntries(Object.entries(programSpecs).map(([name, spec]) => { + const options = {...programOptions}; + const shaders = Array.isArray(spec) ? spec : spec.shaders; + if (!Array.isArray(spec)) { + Object.assign(options, spec); + } + shaders.forEach(noDeleteShadersSet.add, noDeleteShadersSet); + return [name, createProgramNoCheck(gl, shaders, options)]; + })); + + if (programOptions.callback) { + waitForAllProgramsLinkCompletionAsync(gl, programs).then(() => { + const errors = checkAllPrograms(gl, programs, programSpecs, noDeleteShadersSet, programOptions); + programOptions.callback(errors, errors ? undefined : programs); + }); + return undefined; + } + + const errors = checkAllPrograms(gl, programs, programSpecs, noDeleteShadersSet, programOptions); + return errors ? undefined : programs; +} + +/** + * Creates multiple programInfos + * + * Note: the reason this function exists is because the fastest way to create multiple + * programs in WebGL is to create and compile all shaders and link all programs and only + * afterwards check if they succeeded. In that way, giving all your shaders + * + * @see {@link module:twgl.createProgramInfo} + * + * Examples: + * + * const programInfos = twgl.createProgramInfos(gl, { + * lambert: [lambertVS, lambertFS], + * phong: [phongVS, phoneFS], + * particles: { + * shaders: [particlesVS, particlesFS], + * transformFeedbackVaryings: ['position', 'velocity'], + * }, + * }); + * + * or + * + * const {lambert, phong, particles} = twgl.createProgramInfos(gl, { + * lambert: [lambertVS, lambertFS], + * phong: [phongVS, phoneFS], + * particles: { + * shaders: [particlesVS, particlesFS], + * transformFeedbackVaryings: ['position', 'velocity'], + * }, + * }); + * + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {Object.} programSpecs An object of ProgramSpecs, one per program. + * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs + * @return {Object.?} the created programInfos by name + */ +function createProgramInfos(gl, programSpecs, programOptions) { + programOptions = getProgramOptions(programOptions); + + function createProgramInfosForPrograms(gl, programs) { + return Object.fromEntries(Object.entries(programs).map(([name, program]) => + [name, createProgramInfoFromProgram(gl, program)] + )); + } + + const origCallback = programOptions.callback; + if (origCallback) { + programOptions.callback = (err, programs) => { + origCallback(err, err ? undefined : createProgramInfosForPrograms(gl, programs)); + }; + } + + const programs = createPrograms(gl, programSpecs, programOptions); + if (origCallback || !programs) { + return undefined; + } + + return createProgramInfosForPrograms(gl, programs); +} + +/** + * Creates multiple programs asynchronously + * + * @see {@link module:twgl.createProgramAsync} + * + * Example: + * + * const programs = await twgl.createProgramsAsync(gl, { + * lambert: [lambertVS, lambertFS], + * phong: [phongVS, phoneFS], + * particles: { + * shaders: [particlesVS, particlesFS], + * transformFeedbackVaryings: ['position', 'velocity'], + * }, + * }); + * + * @function + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {Object.} programSpecs An object of ProgramSpecs, one per program. + * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs + * @return {Object.?} the created programInfos by name + */ +const createProgramsAsync = wrapCallbackFnToAsyncFn(createPrograms); + +/** + * Creates multiple programInfos asynchronously + * + * @see {@link module:twgl.createProgramInfoAsync} + * + * Example: + * + * const programInfos = await twgl.createProgramInfosAsync(gl, { + * lambert: [lambertVS, lambertFS], + * phong: [phongVS, phoneFS], + * particles: { + * shaders: [particlesVS, particlesFS], + * transformFeedbackVaryings: ['position', 'velocity'], + * }, + * }); + * + * @function + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {Object.} programSpecs An object of ProgramSpecs, one per program. + * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs + * @return {Promise>} the created programInfos by name + */ +const createProgramInfosAsync = wrapCallbackFnToAsyncFn(createProgramInfos); + +var programs = /*#__PURE__*/Object.freeze({ + __proto__: null, + createAttributeSetters: createAttributeSetters, + createProgram: createProgram, + createProgramAsync: createProgramAsync, + createPrograms: createPrograms, + createProgramsAsync: createProgramsAsync, + createProgramFromScripts: createProgramFromScripts, + createProgramFromSources: createProgramFromSources, + createProgramInfo: createProgramInfo, + createProgramInfoAsync: createProgramInfoAsync, + createProgramInfos: createProgramInfos, + createProgramInfosAsync: createProgramInfosAsync, + createProgramInfoFromProgram: createProgramInfoFromProgram, + createUniformSetters: createUniformSetters, + createUniformBlockSpecFromProgram: createUniformBlockSpecFromProgram, + createUniformBlockInfoFromProgram: createUniformBlockInfoFromProgram, + createUniformBlockInfo: createUniformBlockInfo, + createTransformFeedback: createTransformFeedback, + createTransformFeedbackInfo: createTransformFeedbackInfo, + bindTransformFeedbackInfo: bindTransformFeedbackInfo, + setAttributes: setAttributes, + setBuffersAndAttributes: setBuffersAndAttributes, + setUniforms: setUniforms, + setUniformsAndBindTextures: setUniformsAndBindTextures, + setUniformBlock: setUniformBlock, + setBlockUniforms: setBlockUniforms, + bindUniformBlock: bindUniformBlock +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +const TRIANGLES = 0x0004; +const UNSIGNED_SHORT = 0x1403; + +/** + * Drawing related functions + * + * For backward compatibility they are available at both `twgl.draw` and `twgl` + * itself + * + * See {@link module:twgl} for core functions + * + * @module twgl/draw + */ + +/** + * Calls `gl.drawElements` or `gl.drawArrays`, whichever is appropriate + * + * normally you'd call `gl.drawElements` or `gl.drawArrays` yourself + * but calling this means if you switch from indexed data to non-indexed + * data you don't have to remember to update your draw call. + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @param {(module:twgl.BufferInfo|module:twgl.VertexArrayInfo)} bufferInfo A BufferInfo as returned from {@link module:twgl.createBufferInfoFromArrays} or + * a VertexArrayInfo as returned from {@link module:twgl.createVertexArrayInfo} + * @param {number} [type] eg (gl.TRIANGLES, gl.LINES, gl.POINTS, gl.TRIANGLE_STRIP, ...). Defaults to `gl.TRIANGLES` + * @param {number} [count] An optional count. Defaults to bufferInfo.numElements + * @param {number} [offset] An optional offset. Defaults to 0. + * @param {number} [instanceCount] An optional instanceCount. if set then `drawArraysInstanced` or `drawElementsInstanced` will be called + * @memberOf module:twgl/draw + */ +function drawBufferInfo(gl, bufferInfo, type, count, offset, instanceCount) { + type = type === undefined ? TRIANGLES : type; + const indices = bufferInfo.indices; + const elementType = bufferInfo.elementType; + const numElements = count === undefined ? bufferInfo.numElements : count; + offset = offset === undefined ? 0 : offset; + if (elementType || indices) { + if (instanceCount !== undefined) { + gl.drawElementsInstanced(type, numElements, elementType === undefined ? UNSIGNED_SHORT : bufferInfo.elementType, offset, instanceCount); + } else { + gl.drawElements(type, numElements, elementType === undefined ? UNSIGNED_SHORT : bufferInfo.elementType, offset); + } + } else { + if (instanceCount !== undefined) { + gl.drawArraysInstanced(type, offset, numElements, instanceCount); + } else { + gl.drawArrays(type, offset, numElements); + } + } +} + +/** + * A DrawObject is useful for putting objects in to an array and passing them to {@link module:twgl.drawObjectList}. + * + * You need either a `BufferInfo` or a `VertexArrayInfo`. + * + * @typedef {Object} DrawObject + * @property {boolean} [active] whether or not to draw. Default = `true` (must be `false` to be not true). In other words `undefined` = `true` + * @property {number} [type] type to draw eg. `gl.TRIANGLES`, `gl.LINES`, etc... + * @property {module:twgl.ProgramInfo} programInfo A ProgramInfo as returned from {@link module:twgl.createProgramInfo} + * @property {module:twgl.BufferInfo} [bufferInfo] A BufferInfo as returned from {@link module:twgl.createBufferInfoFromArrays} + * @property {module:twgl.VertexArrayInfo} [vertexArrayInfo] A VertexArrayInfo as returned from {@link module:twgl.createVertexArrayInfo} + * @property {Object} uniforms The values for the uniforms. + * You can pass multiple objects by putting them in an array. For example + * + * var sharedUniforms = { + * u_fogNear: 10, + * u_projection: ... + * ... + * }; + * + * var localUniforms = { + * u_world: ... + * u_diffuseColor: ... + * }; + * + * var drawObj = { + * ... + * uniforms: [sharedUniforms, localUniforms], + * }; + * + * @property {number} [offset] the offset to pass to `gl.drawArrays` or `gl.drawElements`. Defaults to 0. + * @property {number} [count] the count to pass to `gl.drawArrays` or `gl.drawElements`. Defaults to bufferInfo.numElements. + * @property {number} [instanceCount] the number of instances. Defaults to undefined. + * @memberOf module:twgl + */ + +/** + * Draws a list of objects + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @param {DrawObject[]} objectsToDraw an array of objects to draw. + * @memberOf module:twgl/draw + */ +function drawObjectList(gl, objectsToDraw) { + let lastUsedProgramInfo = null; + let lastUsedBufferInfo = null; + + objectsToDraw.forEach(function(object) { + if (object.active === false) { + return; + } + + const programInfo = object.programInfo; + const bufferInfo = object.vertexArrayInfo || object.bufferInfo; + let bindBuffers = false; + const type = object.type === undefined ? TRIANGLES : object.type; + + if (programInfo !== lastUsedProgramInfo) { + lastUsedProgramInfo = programInfo; + gl.useProgram(programInfo.program); + + // We have to rebind buffers when changing programs because we + // only bind buffers the program uses. So if 2 programs use the same + // bufferInfo but the 1st one uses only positions the when the + // we switch to the 2nd one some of the attributes will not be on. + bindBuffers = true; + } + + // Setup all the needed attributes. + if (bindBuffers || bufferInfo !== lastUsedBufferInfo) { + if (lastUsedBufferInfo && lastUsedBufferInfo.vertexArrayObject && !bufferInfo.vertexArrayObject) { + gl.bindVertexArray(null); + } + lastUsedBufferInfo = bufferInfo; + setBuffersAndAttributes(gl, programInfo, bufferInfo); + } + + // Set the uniforms. + setUniforms(programInfo, object.uniforms); + + // Draw + drawBufferInfo(gl, bufferInfo, type, object.count, object.offset, object.instanceCount); + }); + + if (lastUsedBufferInfo && lastUsedBufferInfo.vertexArrayObject) { + gl.bindVertexArray(null); + } +} + +var draw = /*#__PURE__*/Object.freeze({ + __proto__: null, + drawBufferInfo: drawBufferInfo, + drawObjectList: drawObjectList +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +const FRAMEBUFFER = 0x8d40; +const RENDERBUFFER = 0x8d41; +const TEXTURE_2D = 0x0de1; + +const UNSIGNED_BYTE = 0x1401; + +/* PixelFormat */ +const DEPTH_COMPONENT = 0x1902; +const RGBA = 0x1908; +const DEPTH_COMPONENT24 = 0x81a6; +const DEPTH_COMPONENT32F = 0x8cac; +const DEPTH24_STENCIL8 = 0x88f0; +const DEPTH32F_STENCIL8 = 0x8cad; + +/* Framebuffer Object. */ +const RGBA4 = 0x8056; +const RGB5_A1 = 0x8057; +const RGB565 = 0x8D62; +const DEPTH_COMPONENT16 = 0x81A5; +const STENCIL_INDEX = 0x1901; +const STENCIL_INDEX8 = 0x8D48; +const DEPTH_STENCIL = 0x84F9; +const COLOR_ATTACHMENT0 = 0x8CE0; +const DEPTH_ATTACHMENT = 0x8D00; +const STENCIL_ATTACHMENT = 0x8D20; +const DEPTH_STENCIL_ATTACHMENT = 0x821A; + +/* TextureWrapMode */ +const CLAMP_TO_EDGE = 0x812F; + +/* TextureMagFilter */ +const LINEAR = 0x2601; + +/** + * The options for a framebuffer attachment. + * + * Note: For a `format` that is a texture include all the texture + * options from {@link module:twgl.TextureOptions} for example + * `min`, `mag`, `clamp`, etc... Note that unlike {@link module:twgl.TextureOptions} + * `auto` defaults to `false` for attachment textures but `min` and `mag` default + * to `gl.LINEAR` and `wrap` defaults to `CLAMP_TO_EDGE` + * + * @typedef {Object} AttachmentOptions + * @property {number} [attachmentPoint] The attachment point. Defaults + * to `gl.COLOR_ATTACHMENT0 + ndx` unless type is a depth or stencil type + * then it's gl.DEPTH_ATTACHMENT or `gl.DEPTH_STENCIL_ATTACHMENT` depending + * on the format or attachment type. + * @property {number} [format] The format. If one of `gl.RGBA4`, + * `gl.RGB565`, `gl.RGB5_A1`, `gl.DEPTH_COMPONENT16`, + * `gl.STENCIL_INDEX8` or `gl.DEPTH_STENCIL` then will create a + * renderbuffer. Otherwise will create a texture. Default = `gl.RGBA` + * @property {number} [type] The type. Used for texture. Default = `gl.UNSIGNED_BYTE`. + * @property {number} [target] The texture target for `gl.framebufferTexture2D`. + * Defaults to `gl.TEXTURE_2D`. Set to appropriate face for cube maps. + * @property {number} [samples] The number of samples. Default = 1 + * @property {number} [level] level for `gl.framebufferTexture2D`. Defaults to 0. + * @property {number} [layer] layer for `gl.framebufferTextureLayer`. Defaults to undefined. + * If set then `gl.framebufferTextureLayer` is called, if not then `gl.framebufferTexture2D` + * @property {(WebGLRenderbuffer | WebGLTexture)} [attachment] An existing renderbuffer or texture. + * If provided will attach this Object. This allows you to share + * attachments across framebuffers. + * @memberOf module:twgl + * @mixes module:twgl.TextureOptions + */ + +const defaultAttachments = [ + { format: RGBA, type: UNSIGNED_BYTE, min: LINEAR, wrap: CLAMP_TO_EDGE, }, + { format: DEPTH_STENCIL, }, +]; + +const attachmentsByFormat = {}; +attachmentsByFormat[DEPTH_STENCIL] = DEPTH_STENCIL_ATTACHMENT; +attachmentsByFormat[STENCIL_INDEX] = STENCIL_ATTACHMENT; +attachmentsByFormat[STENCIL_INDEX8] = STENCIL_ATTACHMENT; +attachmentsByFormat[DEPTH_COMPONENT] = DEPTH_ATTACHMENT; +attachmentsByFormat[DEPTH_COMPONENT16] = DEPTH_ATTACHMENT; +attachmentsByFormat[DEPTH_COMPONENT24] = DEPTH_ATTACHMENT; +attachmentsByFormat[DEPTH_COMPONENT32F] = DEPTH_ATTACHMENT; +attachmentsByFormat[DEPTH24_STENCIL8] = DEPTH_STENCIL_ATTACHMENT; +attachmentsByFormat[DEPTH32F_STENCIL8] = DEPTH_STENCIL_ATTACHMENT; + +function getAttachmentPointForFormat(format, internalFormat) { + return attachmentsByFormat[format] || attachmentsByFormat[internalFormat]; +} + +const renderbufferFormats = {}; +renderbufferFormats[RGBA4] = true; +renderbufferFormats[RGB5_A1] = true; +renderbufferFormats[RGB565] = true; +renderbufferFormats[DEPTH_STENCIL] = true; +renderbufferFormats[DEPTH_COMPONENT16] = true; +renderbufferFormats[STENCIL_INDEX] = true; +renderbufferFormats[STENCIL_INDEX8] = true; + +function isRenderbufferFormat(format) { + return renderbufferFormats[format]; +} + +const MAX_COLOR_ATTACHMENT_POINTS = 32; // even an 3090 only supports 8 but WebGL/OpenGL ES define constants for 32 + +function isColorAttachmentPoint(attachmentPoint) { + return attachmentPoint >= COLOR_ATTACHMENT0 && attachmentPoint < COLOR_ATTACHMENT0 + MAX_COLOR_ATTACHMENT_POINTS; +} + +/** + * @typedef {Object} FramebufferInfo + * @property {WebGLFramebuffer} framebuffer The WebGLFramebuffer for this framebufferInfo + * @property {Array.<(WebGLRenderbuffer | WebGLTexture)>} attachments The created attachments in the same order as passed in to {@link module:twgl.createFramebufferInfo}. + * @property {number} width The width of the framebuffer and its attachments + * @property {number} height The width of the framebuffer and its attachments + * @memberOf module:twgl + */ + +/** + * Creates a framebuffer and attachments. + * + * This returns a {@link module:twgl.FramebufferInfo} because it needs to return the attachments as well as the framebuffer. + * It also leaves the framebuffer it just created as the currently bound `FRAMEBUFFER`. + * Note: If this is WebGL2 or if you called {@link module:twgl.addExtensionsToContext} then it will set the drawBuffers + * to `[COLOR_ATTACHMENT0, COLOR_ATTACHMENT1, ...]` for how ever many color attachments were created. + * + * The simplest usage + * + * // create an RGBA/UNSIGNED_BYTE texture and DEPTH_STENCIL renderbuffer + * const fbi = twgl.createFramebufferInfo(gl); + * + * More complex usage + * + * // create an RGB565 renderbuffer and a STENCIL_INDEX8 renderbuffer + * const attachments = [ + * { format: RGB565, mag: NEAREST }, + * { format: STENCIL_INDEX8 }, + * ] + * const fbi = twgl.createFramebufferInfo(gl, attachments); + * + * Passing in a specific size + * + * const width = 256; + * const height = 256; + * const fbi = twgl.createFramebufferInfo(gl, attachments, width, height); + * + * **Note!!** It is up to you to check if the framebuffer is renderable by calling `gl.checkFramebufferStatus`. + * [WebGL1 only guarantees 3 combinations of attachments work](https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.6). + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {module:twgl.AttachmentOptions[]} [attachments] which attachments to create. If not provided the default is a framebuffer with an + * `RGBA`, `UNSIGNED_BYTE` texture `COLOR_ATTACHMENT0` and a `DEPTH_STENCIL` renderbuffer `DEPTH_STENCIL_ATTACHMENT`. + * @param {number} [width] the width for the attachments. Default = size of drawingBuffer + * @param {number} [height] the height for the attachments. Default = size of drawingBuffer + * @return {module:twgl.FramebufferInfo} the framebuffer and attachments. + * @memberOf module:twgl/framebuffers + */ +function createFramebufferInfo(gl, attachments, width, height) { + const target = FRAMEBUFFER; + const fb = gl.createFramebuffer(); + gl.bindFramebuffer(target, fb); + width = width || gl.drawingBufferWidth; + height = height || gl.drawingBufferHeight; + attachments = attachments || defaultAttachments; + const usedColorAttachmentsPoints = []; + const framebufferInfo = { + framebuffer: fb, + attachments: [], + width: width, + height: height, + }; + + attachments.forEach(function(attachmentOptions, i) { + let attachment = attachmentOptions.attachment; + const samples = attachmentOptions.samples; + const format = attachmentOptions.format; + let attachmentPoint = attachmentOptions.attachmentPoint || getAttachmentPointForFormat(format, attachmentOptions.internalFormat); + if (!attachmentPoint) { + attachmentPoint = COLOR_ATTACHMENT0 + i; + } + if (isColorAttachmentPoint(attachmentPoint)) { + usedColorAttachmentsPoints.push(attachmentPoint); + } + if (!attachment) { + if (samples !== undefined || isRenderbufferFormat(format)) { + attachment = gl.createRenderbuffer(); + gl.bindRenderbuffer(RENDERBUFFER, attachment); + if (samples > 1) { + gl.renderbufferStorageMultisample(RENDERBUFFER, samples, format, width, height); + } else { + gl.renderbufferStorage(RENDERBUFFER, format, width, height); + } + } else { + const textureOptions = Object.assign({}, attachmentOptions); + textureOptions.width = width; + textureOptions.height = height; + if (textureOptions.auto === undefined) { + textureOptions.auto = false; + textureOptions.min = textureOptions.min || textureOptions.minMag || LINEAR; + textureOptions.mag = textureOptions.mag || textureOptions.minMag || LINEAR; + textureOptions.wrapS = textureOptions.wrapS || textureOptions.wrap || CLAMP_TO_EDGE; + textureOptions.wrapT = textureOptions.wrapT || textureOptions.wrap || CLAMP_TO_EDGE; + } + attachment = createTexture(gl, textureOptions); + } + } + if (isRenderbuffer(gl, attachment)) { + gl.framebufferRenderbuffer(target, attachmentPoint, RENDERBUFFER, attachment); + } else if (isTexture(gl, attachment)) { + if (attachmentOptions.layer !== undefined) { + gl.framebufferTextureLayer( + target, + attachmentPoint, + attachment, + attachmentOptions.level || 0, + attachmentOptions.layer); + } else { + gl.framebufferTexture2D( + target, + attachmentPoint, + attachmentOptions.target || TEXTURE_2D, + attachment, + attachmentOptions.level || 0); + } + } else { + throw new Error('unknown attachment type'); + } + framebufferInfo.attachments.push(attachment); + }); + if (gl.drawBuffers) { + gl.drawBuffers(usedColorAttachmentsPoints); + } + return framebufferInfo; +} + +/** + * Resizes the attachments of a framebuffer. + * + * You need to pass in the same `attachments` as you passed in {@link module:twgl.createFramebufferInfo} + * because TWGL has no idea the format/type of each attachment. + * + * The simplest usage + * + * // create an RGBA/UNSIGNED_BYTE texture and DEPTH_STENCIL renderbuffer + * const fbi = twgl.createFramebufferInfo(gl); + * + * ... + * + * function render() { + * if (twgl.resizeCanvasToDisplaySize(gl.canvas)) { + * // resize the attachments + * twgl.resizeFramebufferInfo(gl, fbi); + * } + * + * More complex usage + * + * // create an RGB565 renderbuffer and a STENCIL_INDEX8 renderbuffer + * const attachments = [ + * { format: RGB565, mag: NEAREST }, + * { format: STENCIL_INDEX8 }, + * ] + * const fbi = twgl.createFramebufferInfo(gl, attachments); + * + * ... + * + * function render() { + * if (twgl.resizeCanvasToDisplaySize(gl.canvas)) { + * // resize the attachments to match + * twgl.resizeFramebufferInfo(gl, fbi, attachments); + * } + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {module:twgl.FramebufferInfo} framebufferInfo a framebufferInfo as returned from {@link module:twgl.createFramebufferInfo}. + * @param {module:twgl.AttachmentOptions[]} [attachments] the same attachments options as passed to {@link module:twgl.createFramebufferInfo}. + * @param {number} [width] the width for the attachments. Default = size of drawingBuffer + * @param {number} [height] the height for the attachments. Default = size of drawingBuffer + * @memberOf module:twgl/framebuffers + */ +function resizeFramebufferInfo(gl, framebufferInfo, attachments, width, height) { + width = width || gl.drawingBufferWidth; + height = height || gl.drawingBufferHeight; + framebufferInfo.width = width; + framebufferInfo.height = height; + attachments = attachments || defaultAttachments; + attachments.forEach(function(attachmentOptions, ndx) { + const attachment = framebufferInfo.attachments[ndx]; + const format = attachmentOptions.format; + const samples = attachmentOptions.samples; + if (samples !== undefined || isRenderbuffer(gl, attachment)) { + gl.bindRenderbuffer(RENDERBUFFER, attachment); + if (samples > 1) { + gl.renderbufferStorageMultisample(RENDERBUFFER, samples, format, width, height); + } else { + gl.renderbufferStorage(RENDERBUFFER, format, width, height); + } + } else if (isTexture(gl, attachment)) { + resizeTexture(gl, attachment, attachmentOptions, width, height); + } else { + throw new Error('unknown attachment type'); + } + }); +} + +/** + * Binds a framebuffer + * + * This function pretty much solely exists because I spent hours + * trying to figure out why something I wrote wasn't working only + * to realize I forget to set the viewport dimensions. + * My hope is this function will fix that. + * + * It is effectively the same as + * + * gl.bindFramebuffer(gl.FRAMEBUFFER, someFramebufferInfo.framebuffer); + * gl.viewport(0, 0, someFramebufferInfo.width, someFramebufferInfo.height); + * + * @param {WebGLRenderingContext} gl the WebGLRenderingContext + * @param {module:twgl.FramebufferInfo|null} [framebufferInfo] a framebufferInfo as returned from {@link module:twgl.createFramebufferInfo}. + * If falsy will bind the canvas. + * @param {number} [target] The target. If not passed `gl.FRAMEBUFFER` will be used. + * @memberOf module:twgl/framebuffers + */ + +function bindFramebufferInfo(gl, framebufferInfo, target) { + target = target || FRAMEBUFFER; + if (framebufferInfo) { + gl.bindFramebuffer(target, framebufferInfo.framebuffer); + gl.viewport(0, 0, framebufferInfo.width, framebufferInfo.height); + } else { + gl.bindFramebuffer(target, null); + gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); + } +} + +var framebuffers = /*#__PURE__*/Object.freeze({ + __proto__: null, + bindFramebufferInfo: bindFramebufferInfo, + createFramebufferInfo: createFramebufferInfo, + resizeFramebufferInfo: resizeFramebufferInfo +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * vertex array object related functions + * + * You should generally not need to use these functions. They are provided + * for those cases where you're doing something out of the ordinary + * and you need lower level access. + * + * For backward compatibility they are available at both `twgl.attributes` and `twgl` + * itself + * + * See {@link module:twgl} for core functions + * + * @module twgl/vertexArrays + */ + +const ELEMENT_ARRAY_BUFFER = 0x8893; + +/** + * @typedef {Object} VertexArrayInfo + * @property {number} numElements The number of elements to pass to `gl.drawArrays` or `gl.drawElements`. + * @property {number} [elementType] The type of indices `UNSIGNED_BYTE`, `UNSIGNED_SHORT` etc.. + * @property {WebGLVertexArrayObject} [vertexArrayObject] a vertex array object + * @memberOf module:twgl + */ + +/** + * Creates a VertexArrayInfo from a BufferInfo and one or more ProgramInfos + * + * This can be passed to {@link module:twgl.setBuffersAndAttributes} and to + * {@link module:twgl:drawBufferInfo}. + * + * > **IMPORTANT:** Vertex Array Objects are **not** a direct analog for a BufferInfo. Vertex Array Objects + * assign buffers to specific attributes at creation time. That means they can only be used with programs + * who's attributes use the same attribute locations for the same purposes. + * + * > Bind your attribute locations by passing an array of attribute names to {@link module:twgl.createProgramInfo} + * or use WebGL 2's GLSL ES 3's `layout(location = )` to make sure locations match. + * + * also + * + * > **IMPORTANT:** After calling twgl.setBuffersAndAttribute with a BufferInfo that uses a Vertex Array Object + * that Vertex Array Object will be bound. That means **ANY MANIPULATION OF ELEMENT_ARRAY_BUFFER or ATTRIBUTES** + * will affect the Vertex Array Object state. + * + * > Call `gl.bindVertexArray(null)` to get back manipulating the global attributes and ELEMENT_ARRAY_BUFFER. + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @param {module:twgl.ProgramInfo|module:twgl.ProgramInfo[]} programInfo a programInfo or array of programInfos + * @param {module:twgl.BufferInfo} bufferInfo BufferInfo as returned from createBufferInfoFromArrays etc... + * + * You need to make sure every attribute that will be used is bound. So for example assume shader 1 + * uses attributes A, B, C and shader 2 uses attributes A, B, D. If you only pass in the programInfo + * for shader 1 then only attributes A, B, and C will have their attributes set because TWGL doesn't + * now attribute D's location. + * + * So, you can pass in both shader 1 and shader 2's programInfo + * + * @return {module:twgl.VertexArrayInfo} The created VertexArrayInfo + * + * @memberOf module:twgl/vertexArrays + */ +function createVertexArrayInfo(gl, programInfos, bufferInfo) { + const vao = gl.createVertexArray(); + gl.bindVertexArray(vao); + if (!programInfos.length) { + programInfos = [programInfos]; + } + programInfos.forEach(function(programInfo) { + setBuffersAndAttributes(gl, programInfo, bufferInfo); + }); + gl.bindVertexArray(null); + return { + numElements: bufferInfo.numElements, + elementType: bufferInfo.elementType, + vertexArrayObject: vao, + }; +} + +/** + * Creates a vertex array object and then sets the attributes on it + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use. + * @param {Object.} setters Attribute setters as returned from createAttributeSetters + * @param {Object.} attribs AttribInfos mapped by attribute name. + * @param {WebGLBuffer} [indices] an optional ELEMENT_ARRAY_BUFFER of indices + * + * @return {WebGLVertexArrayObject|null} The created WebGLVertexArrayObject + * + * @memberOf module:twgl/vertexArrays + */ +function createVAOAndSetAttributes(gl, setters, attribs, indices) { + const vao = gl.createVertexArray(); + gl.bindVertexArray(vao); + setAttributes(setters, attribs); + if (indices) { + gl.bindBuffer(ELEMENT_ARRAY_BUFFER, indices); + } + // We unbind this because otherwise any change to ELEMENT_ARRAY_BUFFER + // like when creating buffers for other stuff will mess up this VAO's binding + gl.bindVertexArray(null); + return vao; +} + +/** + * Creates a vertex array object and then sets the attributes + * on it + * + * @param {WebGLRenderingContext} gl The WebGLRenderingContext + * to use. + * @param {Object.| module:twgl.ProgramInfo} programInfo as returned from createProgramInfo or Attribute setters as returned from createAttributeSetters + * @param {module:twgl.BufferInfo} bufferInfo BufferInfo as returned from createBufferInfoFromArrays etc... + * @param {WebGLBuffer} [indices] an optional ELEMENT_ARRAY_BUFFER of indices + * + * @return {WebGLVertexArrayObject|null} The created WebGLVertexArrayObject + * + * @memberOf module:twgl/vertexArrays + */ +function createVAOFromBufferInfo(gl, programInfo, bufferInfo) { + return createVAOAndSetAttributes(gl, programInfo.attribSetters || programInfo, bufferInfo.attribs, bufferInfo.indices); +} + +var vertexArrays = /*#__PURE__*/Object.freeze({ + __proto__: null, + createVertexArrayInfo: createVertexArrayInfo, + createVAOAndSetAttributes: createVAOAndSetAttributes, + createVAOFromBufferInfo: createVAOFromBufferInfo +}); + +/* + * Copyright 2019 Gregg Tavares + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +const defaults = { + addExtensionsToContext: true, +}; + +/** + * Various default settings for twgl. + * + * Note: You can call this any number of times. Example: + * + * twgl.setDefaults({ textureColor: [1, 0, 0, 1] }); + * twgl.setDefaults({ attribPrefix: 'a_' }); + * + * is equivalent to + * + * twgl.setDefaults({ + * textureColor: [1, 0, 0, 1], + * attribPrefix: 'a_', + * }); + * + * @typedef {Object} Defaults + * @property {string} [attribPrefix] The prefix to stick on attributes + * + * When writing shaders I prefer to name attributes with `a_`, uniforms with `u_` and varyings with `v_` + * as it makes it clear where they came from. But, when building geometry I prefer using un-prefixed names. + * + * In other words I'll create arrays of geometry like this + * + * const arrays = { + * position: ... + * normal: ... + * texcoord: ... + * }; + * + * But need those mapped to attributes and my attributes start with `a_`. + * + * Default: `""` + * + * @property {number[]} [textureColor] Array of 4 values in the range 0 to 1 + * + * The default texture color is used when loading textures from + * urls. Because the URL will be loaded async we'd like to be + * able to use the texture immediately. By putting a 1x1 pixel + * color in the texture we can start using the texture before + * the URL has loaded. + * + * Default: `[0.5, 0.75, 1, 1]` + * + * @property {string} [crossOrigin] + * + * If not undefined sets the crossOrigin attribute on images + * that twgl creates when downloading images for textures. + * + * Also see {@link module:twgl.TextureOptions}. + * + * @property {bool} [addExtensionsToContext] + * + * If true, then, when twgl will try to add any supported WebGL extensions + * directly to the context under their normal GL names. For example + * if ANGLE_instances_arrays exists then twgl would enable it, + * add the functions `vertexAttribDivisor`, `drawArraysInstanced`, + * `drawElementsInstanced`, and the constant `VERTEX_ATTRIB_ARRAY_DIVISOR` + * to the `WebGLRenderingContext`. + * + * @memberOf module:twgl + */ + +/** + * Sets various defaults for twgl. + * + * In the interest of terseness which is kind of the point + * of twgl I've integrated a few of the older functions here + * + * @param {module:twgl.Defaults} newDefaults The default settings. + * @memberOf module:twgl + */ +function setDefaults(newDefaults) { + copyExistingProperties(newDefaults, defaults); + setDefaults$2(newDefaults); // eslint-disable-line + setDefaults$1(newDefaults); // eslint-disable-line +} + +const prefixRE = /^(.*?)_/; +function addExtensionToContext(gl, extensionName) { + glEnumToString(gl, 0); + const ext = gl.getExtension(extensionName); + if (ext) { + const enums = {}; + const fnSuffix = prefixRE.exec(extensionName)[1]; + const enumSuffix = '_' + fnSuffix; + for (const key in ext) { + const value = ext[key]; + const isFunc = typeof (value) === 'function'; + const suffix = isFunc ? fnSuffix : enumSuffix; + let name = key; + // examples of where this is not true are WEBGL_compressed_texture_s3tc + // and WEBGL_compressed_texture_pvrtc + if (key.endsWith(suffix)) { + name = key.substring(0, key.length - suffix.length); + } + if (gl[name] !== undefined) { + if (!isFunc && gl[name] !== value) { + warn$1(name, gl[name], value, key); + } + } else { + if (isFunc) { + gl[name] = function(origFn) { + return function() { + return origFn.apply(ext, arguments); + }; + }(value); + } else { + gl[name] = value; + enums[name] = value; + } + } + } + // pass the modified enums to glEnumToString + enums.constructor = { + name: ext.constructor.name, + }; + glEnumToString(enums, 0); + } + return ext; +} + +/* + * If you're wondering why the code doesn't just iterate + * over all extensions using `gl.getExtensions` is that it's possible + * some future extension is incompatible with this code. Rather than + * have thing suddenly break it seems better to manually add to this + * list. + * + */ +const supportedExtensions = [ + 'ANGLE_instanced_arrays', + 'EXT_blend_minmax', + 'EXT_color_buffer_float', + 'EXT_color_buffer_half_float', + 'EXT_disjoint_timer_query', + 'EXT_disjoint_timer_query_webgl2', + 'EXT_frag_depth', + 'EXT_sRGB', + 'EXT_shader_texture_lod', + 'EXT_texture_filter_anisotropic', + 'OES_element_index_uint', + 'OES_standard_derivatives', + 'OES_texture_float', + 'OES_texture_float_linear', + 'OES_texture_half_float', + 'OES_texture_half_float_linear', + 'OES_vertex_array_object', + 'WEBGL_color_buffer_float', + 'WEBGL_compressed_texture_atc', + 'WEBGL_compressed_texture_etc1', + 'WEBGL_compressed_texture_pvrtc', + 'WEBGL_compressed_texture_s3tc', + 'WEBGL_compressed_texture_s3tc_srgb', + 'WEBGL_depth_texture', + 'WEBGL_draw_buffers', +]; + +/** + * Attempts to enable all of the following extensions + * and add their functions and constants to the + * `WebGLRenderingContext` using their normal non-extension like names. + * + * ANGLE_instanced_arrays + * EXT_blend_minmax + * EXT_color_buffer_float + * EXT_color_buffer_half_float + * EXT_disjoint_timer_query + * EXT_disjoint_timer_query_webgl2 + * EXT_frag_depth + * EXT_sRGB + * EXT_shader_texture_lod + * EXT_texture_filter_anisotropic + * OES_element_index_uint + * OES_standard_derivatives + * OES_texture_float + * OES_texture_float_linear + * OES_texture_half_float + * OES_texture_half_float_linear + * OES_vertex_array_object + * WEBGL_color_buffer_float + * WEBGL_compressed_texture_atc + * WEBGL_compressed_texture_etc1 + * WEBGL_compressed_texture_pvrtc + * WEBGL_compressed_texture_s3tc + * WEBGL_compressed_texture_s3tc_srgb + * WEBGL_depth_texture + * WEBGL_draw_buffers + * + * For example if `ANGLE_instanced_arrays` exists then the functions + * `drawArraysInstanced`, `drawElementsInstanced`, `vertexAttribDivisor` + * and the constant `VERTEX_ATTRIB_ARRAY_DIVISOR` are added to the + * `WebGLRenderingContext`. + * + * Note that if you want to know if the extension exists you should + * probably call `gl.getExtension` for each extension. Alternatively + * you can check for the existence of the functions or constants that + * are expected to be added. For example + * + * if (gl.drawBuffers) { + * // Either WEBGL_draw_buffers was enabled OR you're running in WebGL2 + * .... + * + * @param {WebGLRenderingContext} gl A WebGLRenderingContext + * @memberOf module:twgl + */ +function addExtensionsToContext(gl) { + for (let ii = 0; ii < supportedExtensions.length; ++ii) { + addExtensionToContext(gl, supportedExtensions[ii]); + } +} + +/** + * Creates a webgl context. + * @param {HTMLCanvasElement} canvas The canvas tag to get + * context from. If one is not passed in one will be + * created. + * @return {WebGLRenderingContext} The created context. + * @private + */ +function create3DContext(canvas, opt_attribs) { + const names = ["webgl", "experimental-webgl"]; + let context = null; + for (let ii = 0; ii < names.length; ++ii) { + context = canvas.getContext(names[ii], opt_attribs); + if (context) { + if (defaults.addExtensionsToContext) { + addExtensionsToContext(context); + } + break; + } + } + return context; +} + +/** + * Gets a WebGL1 context. + * + * Note: Will attempt to enable Vertex Array Objects + * and add WebGL2 entry points. (unless you first set defaults with + * `twgl.setDefaults({enableVertexArrayObjects: false})`; + * + * @param {HTMLCanvasElement} canvas a canvas element. + * @param {WebGLContextAttributes} [opt_attribs] optional webgl context creation attributes + * @return {WebGLRenderingContext} The created context. + * @memberOf module:twgl + * @deprecated + * @private + */ +function getWebGLContext(canvas, opt_attribs) { + const gl = create3DContext(canvas, opt_attribs); + return gl; +} + +/** + * Creates a webgl context. + * + * Will return a WebGL2 context if possible. + * + * You can check if it's WebGL2 with + * + * twgl.isWebGL2(gl); + * + * @param {HTMLCanvasElement} canvas The canvas tag to get + * context from. If one is not passed in one will be + * created. + * @return {WebGLRenderingContext} The created context. + */ +function createContext(canvas, opt_attribs) { + const names = ["webgl2", "webgl", "experimental-webgl"]; + let context = null; + for (let ii = 0; ii < names.length; ++ii) { + context = canvas.getContext(names[ii], opt_attribs); + if (context) { + if (defaults.addExtensionsToContext) { + addExtensionsToContext(context); + } + break; + } + } + return context; +} + +/** + * Gets a WebGL context. Will create a WebGL2 context if possible. + * + * You can check if it's WebGL2 with + * + * function isWebGL2(gl) { + * return gl.getParameter(gl.VERSION).indexOf("WebGL 2.0 ") == 0; + * } + * + * Note: For a WebGL1 context will attempt to enable Vertex Array Objects + * and add WebGL2 entry points. (unless you first set defaults with + * `twgl.setDefaults({enableVertexArrayObjects: false})`; + * + * @param {HTMLCanvasElement} canvas a canvas element. + * @param {WebGLContextAttributes} [opt_attribs] optional webgl context creation attributes + * @return {WebGLRenderingContext} The created context. + * @memberOf module:twgl + */ +function getContext(canvas, opt_attribs) { + const gl = createContext(canvas, opt_attribs); + return gl; +} + +/** + * Resize a canvas to match the size it's displayed. + * @param {HTMLCanvasElement} canvas The canvas to resize. + * @param {number} [multiplier] So you can pass in `window.devicePixelRatio` or other scale value if you want to. + * @return {boolean} true if the canvas was resized. + * @memberOf module:twgl + */ +function resizeCanvasToDisplaySize(canvas, multiplier) { + multiplier = multiplier || 1; + multiplier = Math.max(0, multiplier); + const width = canvas.clientWidth * multiplier | 0; + const height = canvas.clientHeight * multiplier | 0; + if (canvas.width !== width || canvas.height !== height) { + canvas.width = width; + canvas.height = height; + return true; + } + return false; +} + +export { addExtensionsToContext, attributes, bindFramebufferInfo, bindTransformFeedbackInfo, bindUniformBlock, canFilter, canGenerateMipmap, createAttribsFromArrays, createAttributeSetters, createBufferFromArray, createBufferFromTypedArray, createBufferInfoFromArrays, createBuffersFromArrays, createFramebufferInfo, createProgram, createProgramAsync, createProgramFromScripts, createProgramFromSources, createProgramInfo, createProgramInfoAsync, createProgramInfoFromProgram, createProgramInfos, createProgramInfosAsync, createPrograms, createProgramsAsync, createSampler, createSamplers, createTexture, createTextures, createTransformFeedback, createTransformFeedbackInfo, createUniformBlockInfo, createUniformBlockInfoFromProgram, createUniformBlockSpecFromProgram, createUniformSetters, createVAOAndSetAttributes, createVAOFromBufferInfo, createVertexArrayInfo, draw, drawBufferInfo, drawObjectList, framebuffers, getArray$1 as getArray_, getBytesPerElementForInternalFormat, getContext, getFormatAndTypeForInternalFormat, getGLTypeForTypedArray, getGLTypeForTypedArrayType, getNumComponentsForFormat, getNumComponents$1 as getNumComponents_, getTypedArrayTypeForGLType, getWebGLContext, glEnumToString, isArrayBuffer$1 as isArrayBuffer, isWebGL1, isWebGL2, loadTextureFromUrl, m4, primitives, programs, resizeCanvasToDisplaySize, resizeFramebufferInfo, resizeTexture, setAttribInfoBufferFromArray, setDefaults$2 as setAttributeDefaults_, setAttributePrefix, setAttributes, setBlockUniforms, setBuffersAndAttributes, setDefaultTextureColor, setDefaults, setEmptyTexture, setSamplerParameters, setDefaults$1 as setTextureDefaults_, setTextureFilteringForSize, setTextureFromArray, setTextureFromElement, setTextureParameters, setUniformBlock, setUniforms, setUniformsAndBindTextures, textures, typedarrays, utils, v3, vertexArrays }; diff --git a/examples/js/index/VSAEffect.js b/examples/js/index/VSAEffect.js new file mode 100644 index 0000000..2761d0e --- /dev/null +++ b/examples/js/index/VSAEffect.js @@ -0,0 +1,343 @@ +/* eslint-disable no-underscore-dangle */ + +import * as twgl from '../../3rdParty/twgl-full.module.js'; + +const m4 = twgl.m4; + +const kMaxCount = 100000; + +const s_vsHeader = ` +attribute float vertexId; + +uniform vec2 mouse; +uniform vec2 resolution; +uniform vec4 background; +uniform float time; +uniform float vertexCount; +uniform sampler2D sound; +uniform vec2 soundRes; +uniform float _dontUseDirectly_pointSize; + +varying vec4 v_color; +`; + +const s_fs = ` +precision mediump float; + +varying vec4 v_color; + +void main() { + gl_FragColor = v_color; +} +`; + + +const s_historyVS = ` +attribute vec4 position; +attribute vec2 texcoord; +uniform mat4 u_matrix; +varying vec2 v_texcoord; + +void main() { + gl_Position = u_matrix * position; + v_texcoord = texcoord; +} +`; + +const s_historyFS = ` +precision mediump float; + +uniform sampler2D u_texture; +uniform float u_mix; +uniform float u_mult; +varying vec2 v_texcoord; + +void main() { + vec4 color = texture2D(u_texture, v_texcoord); + gl_FragColor = mix(color.aaaa, color.rgba, u_mix) * u_mult; +} +`; + +const s_rectVS = ` +attribute vec4 position; +uniform mat4 u_matrix; + +void main() { + gl_Position = u_matrix * position; +} +`; + +const s_rectFS = ` +precision mediump float; + +uniform vec4 u_color; + +void main() { + gl_FragColor = u_color; +} +`; + +class HistoryTexture { + constructor(gl, options) { + this.gl = gl; + const _width = options.width; + const type = options.type || gl.UNSIGNED_BYTE; + const format = options.format || gl.RGBA; + const Ctor = twgl.getTypedArrayTypeForGLType(type); + const numComponents = twgl.getNumComponentsForFormat(format); + const size = _width * numComponents; + const _buffer = new Ctor(size); + const _texSpec = { + src: _buffer, + height: 1, + min: options.min || gl.LINEAR, + mag: options.mag || gl.LINEAR, + wrap: gl.CLAMP_TO_EDGE, + format: format, + auto: false, // don't set tex params or call genmipmap + }; + const _tex = twgl.createTexture(gl, _texSpec); + + const _length = options.length; + const _historyAttachments = [ + { + format: options.historyFormat || gl.RGBA, + type: type, + mag: options.mag || gl.LINEAR, + min: options.min || gl.LINEAR, + wrap: gl.CLAMP_TO_EDGE, + }, + ]; + + let _srcFBI = twgl.createFramebufferInfo(gl, _historyAttachments, _width, _length); + let _dstFBI = twgl.createFramebufferInfo(gl, _historyAttachments, _width, _length); + + const _historyUniforms = { + u_mix: 0, + u_mult: 1, + u_matrix: m4.identity(), + u_texture: undefined, + }; + + this.buffer = _buffer; + + this.update = (gl, historyProgramInfo, quadBufferInfo) => { + const temp = _srcFBI; + _srcFBI = _dstFBI; + _dstFBI = temp; + + twgl.setTextureFromArray(gl, _tex, _texSpec.src, _texSpec); + + gl.useProgram(historyProgramInfo.program); + twgl.bindFramebufferInfo(gl, _dstFBI); + + // copy from historySrc to historyDst one pixel down + m4.translation([0, 2 / _length, 0], _historyUniforms.u_matrix); + _historyUniforms.u_mix = 1; + _historyUniforms.u_texture = _srcFBI.attachments[0]; + + twgl.setUniforms(historyProgramInfo, _historyUniforms); + twgl.drawBufferInfo(gl, quadBufferInfo); + + // copy audio data into top row of historyDst + _historyUniforms.u_mix = format === gl.ALPHA ? 0 : 1; + _historyUniforms.u_texture = _tex; + m4.translation( + [0, -(_length - 0.5) / _length, 0], + _historyUniforms.u_matrix); + m4.scale( + _historyUniforms.u_matrix, + [1, 1 / _length, 1], + _historyUniforms.u_matrix); + + twgl.setUniforms(historyProgramInfo, _historyUniforms); + twgl.drawBufferInfo(gl, quadBufferInfo); + }; + + this.getTexture = () => { + return _dstFBI.attachments[0]; + }; + } +} + +const mainRE = /(void[ \t\n\r]+main[ \t\n\r]*\([ \t\n\r]*\)[ \t\n\r]\{)/g; +function applyTemplateToShader(src) { + let vSrc = s_vsHeader + src; + vSrc = vSrc.replace(mainRE, function (m) { + return `${m}gl_PointSize=1.0;`; + }); + const lastBraceNdx = vSrc.lastIndexOf('}'); + if (lastBraceNdx >= 0) { + const before = vSrc.substr(0, lastBraceNdx); + const after = vSrc.substr(lastBraceNdx); + vSrc = `${before};gl_PointSize = max(0., gl_PointSize*_dontUseDirectly_pointSize);${after}`; + } + return vSrc; +} + +export default class VSAEffect { + constructor(gl) { + this.gl = gl; + this.time = 0; + this.then = undefined; + this.rectProgramInfo = twgl.createProgramInfo(gl, [s_rectVS, s_rectFS]); + this.historyProgramInfo = twgl.createProgramInfo(gl, [s_historyVS, s_historyFS]); + } + #init(gl, analyser) { + if (this.init) { + return; + } + this.init = true; + const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + this.numSoundSamples = Math.min(maxTextureSize, analyser.frequencyBinCount); + this.numHistorySamples = 60 * 4; // 4 seconds; + + this.soundHistory = new HistoryTexture(gl, { + width: this.numSoundSamples, + length: this.numHistorySamples, + format: gl.ALPHA, + }); + + const count = new Float32Array(kMaxCount); + for (let ii = 0; ii < count.length; ++ii) { + count[ii] = ii; + } + const arrays = { + vertexId: { data: count, numComponents: 1 }, + }; + this.countBufferInfo = twgl.createBufferInfoFromArrays(gl, arrays); + this.quadBufferInfo = twgl.createBufferInfoFromArrays(gl, { + position: { numComponents: 2, data: [-1, -1, 1, -1, -1, 1, 1, 1] }, + texcoord: [0, 0, 1, 0, 0, 1, 1, 1], + indices: [0, 1, 2, 2, 1, 3], + }); + + this.uniforms = { + time: 0, + vertexCount: 0, + resolution: [1, 1], + background: [0, 0, 0, 1], + mouse: [0, 0], + sound: undefined, + floatSound: undefined, + soundRes: [this.numSoundSamples, this.numHistorySamples], + _dontUseDirectly_pointSize: 1, + }; + + this.historyUniforms = { + u_mix: 0, + u_matrix: m4.identity(), + u_texture: undefined, + }; + } + async setSettings(vsa) { + try { + if (vsa === this.currentVsa) { + // It's the current URL + return; + } + if (vsa === this.pendingVsa) { + // It's the pending Url + return; + } + this.pendingVsa = vsa; + if (this.compiling) { + return; + } + // It doesn't matter if the URL is bad, we don't want to try again + this.currentVsa = this.pendingVsa; + this.pendingVsa = undefined; + this.compiling = true; + const gl = this.gl; + const vs = applyTemplateToShader(vsa.settings.shader); + const programInfo = await twgl.createProgramInfoAsync(gl, [vs, s_fs]); + this.programInfo = programInfo; + this.vsa = vsa; + } catch (e) { + console.error(e); + } + this.compiling = false; + if (this.pendingVsa) { + const nextVsa = this.pendingVsa; + this.pendingVsa = undefined; + this.setSettings(nextVsa); + } + } + reset(/*gl*/) { + } + resize() { + } + + #updateSoundHistory(gl, analysers) { + // Copy audio data to Nx1 texture + analysers[0].getByteFrequencyData(this.soundHistory.buffer); + + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.BLEND); + + twgl.setBuffersAndAttributes(gl, this.historyProgramInfo, this.quadBufferInfo); + + this.soundHistory.update(gl, this.historyProgramInfo, this.quadBufferInfo); + } + + #renderScene(gl, commonUniforms, soundHistoryTex, time) { + twgl.bindFramebufferInfo(gl); + const settings = this.vsa.settings; + + const programInfo = this.programInfo; + if (!programInfo) { + return; + } + + const { width, height, left, bottom } = commonUniforms; + + gl.viewport(left, bottom, width, height); + gl.scissor(left, bottom, width, height); + gl.enable(gl.DEPTH_TEST); + gl.enable(gl.BLEND); + gl.enable(gl.SCISSOR_TEST); + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + gl.clearColor(...settings.backgroundColor); + //gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + const num = settings.num; + const mode = gl[settings.mode]; + const uniforms = this.uniforms; + uniforms.time = time; + uniforms.vertexCount = num; + uniforms.resolution[0] = width; + uniforms.resolution[1] = height; + uniforms.background[0] = settings.backgroundColor[0]; + uniforms.background[1] = settings.backgroundColor[1]; + uniforms.background[2] = settings.backgroundColor[2]; + uniforms.background[3] = settings.backgroundColor[3]; + uniforms._dontUseDirectly_pointSize = 1; + uniforms.sound = soundHistoryTex; + + gl.useProgram(programInfo.program); + twgl.setBuffersAndAttributes(gl, programInfo, this.countBufferInfo); + twgl.setUniforms(programInfo, uniforms); + twgl.setUniforms(programInfo, commonUniforms); + twgl.drawBufferInfo(gl, this.countBufferInfo, mode, num); + + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.BLEND); + gl.disable(gl.SCISSOR_TEST); + } + + render(gl, commonUniforms, byteBeat, analyzers) { + if (!this.vsa || !this.programInfo) { + return; + } + this.#init(gl, analyzers[0]); + const now = byteBeat.getTime() / byteBeat.getDesiredSampleRate(); + const deltaTime = (now - (this.then || now)) * (commonUniforms.speed === undefined ? 1 : commonUniforms.speed); + this.then = now; + this.time += deltaTime; + + this.#updateSoundHistory(gl, analyzers, this.time); + + const historyTex = this.soundHistory.getTexture(); + this.#renderScene(gl, commonUniforms, historyTex, this.time); + } +} \ No newline at end of file diff --git a/examples/js/index/effects.js b/examples/js/index/effects.js new file mode 100644 index 0000000..0bd8f39 --- /dev/null +++ b/examples/js/index/effects.js @@ -0,0 +1,27 @@ +import admo from './effects/admo.js'; +import bwow from './effects/bwow.js'; +import codez from './effects/codez.js'; +import cyty from './effects/cyty.js'; +import discus from './effects/discus.js'; +import dottoChoukoukei from './effects/dotto-chouhoukei.js'; +import hexit2 from './effects/hexit2.js'; +import loopTest from './effects/loop-test.js'; +import pookymelon from './effects/pookymelon.js'; +import rollin from './effects/rollin.js'; +import starfield from './effects/starfield.js'; +import ung from './effects/ung.js'; + +export default { + admo, + bwow, + codez, + cyty, + discus, + dottoChoukoukei, + hexit2, + loopTest, + pookymelon, + rollin, + starfield, + ung, +}; diff --git a/examples/js/index/effects/admo.js b/examples/js/index/effects/admo.js new file mode 100644 index 0000000..4af709f --- /dev/null +++ b/examples/js/index/effects/admo.js @@ -0,0 +1,390 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "PkSbv7TufuWHiNRbd", + createdAt: "2017-01-28T04:48:49.529Z", + modifiedAt: "2017-01-28T05:56:37.779Z", + origId: "qjkP6BDvEFyD6CfZC", + name: "admo", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 15360, + mode: "TRIANGLES", + sound: "https://soundcloud.com/beatsfar/grand-mas-mandoline", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 1, + 1, + 1 + ], + shader: `/* 🌈 */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +uniform float opacity; +uniform vec3 color1; +uniform vec3 color2; + + +#define PI radians(180.) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +vec3 rgb2hsv(vec3 c) { + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +mat4 rotX(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + 1, 0, 0, 0, + 0, c, s, 0, + 0, -s, c, 0, + 0, 0, 0, 1); +} + +mat4 rotY(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + +mat4 rotZ(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +// times 2 minus 1 +float t2m1(float v) { + return v * 2. - 1.; +} + +// times .5 plus .5 +float t5p5(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + +void getCirclePoint(const float numEdgePointsPerCircle, const float id, const float inner, const float start, const float end, out vec3 pos) { + float outId = id - floor(id / 3.) * 2. - 1.; // 0 1 2 3 4 5 6 7 8 .. 0 1 2, 1 2 3, 2 3 4 + float ux = floor(id / 6.) + mod(id, 2.); + float vy = mod(floor(id / 2.) + floor(id / 3.), 2.); // change that 3. for cool fx + float u = ux / numEdgePointsPerCircle; + float v = mix(inner, 1., vy); + float a = mix(start, end, u) * PI * 2. + PI * 0.0; + float s = sin(a); + float c = cos(a); + float x = c * v; + float y = s * v; + float z = 0.; + pos = vec3(x, y, z); +} + + +#define NUM_EDGE_POINTS_PER_CIRCLE 64.0 +#define NUM_POINTS_PER_CIRCLE (NUM_EDGE_POINTS_PER_CIRCLE * 6.0) +#define NUM_CIRCLES_PER_GROUP 1.0 +void main() { + float circleId = floor(vertexId / NUM_POINTS_PER_CIRCLE); + float groupId = floor(circleId / NUM_CIRCLES_PER_GROUP); + float pointId = mod(vertexId, NUM_POINTS_PER_CIRCLE); + float sliceId = mod(floor(vertexId / 6.), 2.); + float side = mix(-1., 1., step(0.5, mod(circleId, 2.))); + float numCircles = floor(vertexCount / NUM_POINTS_PER_CIRCLE); + float numGroups = floor(numCircles / NUM_CIRCLES_PER_GROUP); + float cu = circleId / numCircles; + float gv = groupId / numGroups; + float cgId = mod(circleId, NUM_CIRCLES_PER_GROUP); + float cgv = cgId / NUM_CIRCLES_PER_GROUP; + float ncgv = 1. - cgv; + + + float tm = time - cgv * 0.2; + + float su = mix(0.01, 0.2, abs(t2m1(cu))); + float sv = 0.; + float s = texture2D(sound, vec2(su, sv)).a; + + + vec3 pos; + float inner = 0.; + float start = 0.; + float end = 1.; + getCirclePoint(NUM_EDGE_POINTS_PER_CIRCLE, pointId, inner, start, end, pos); + pos.z = pos.x * -0.1 + pos.y * -0.1;//cu * 0.001; + pos.x *= cos(pos.y) * mix(.25, .75, abs(sin(time * 0.131))); + + vec3 eye = vec3(sin(time * 0.), sin(time * 0.) * 0.25, 1.); + vec3 target = vec3(0); + vec3 up = vec3(0, 1, 0); + +// mat4 mat = persp(120. * PI / 180., resolution.x / resolution.y, 0.1, 10.); + mat4 mat = ident(); + mat *= scale(0.25 * vec3(1, resolution.x / resolution.y, 1)); + mat *= cameraLookAt(eye, target, up); + mat *= rotZ(time * 0.1 + t2m1(cu) * PI);// * sin(time* 0.1)); + mat *= trans(vec3(t5p5(sin(time * 0.273)), mix(0.2, 1.5, t5p5(sin(time * 0.171))), 0)); + mat *= rotZ(t5p5(sin(time * 0.147))); + + gl_Position = mat * vec4(pos, 1); + + float hue = 1. + cu; + float sat = mix(.3, 1., abs(sin(time * 0.213))); + float val = 1.; + + float colorMix = abs(cu * 2.0 - 1.0); + //vec3 hsv1 = rgb2hsv(color1); + //vec3 hsv2 = rgb2hsv(color2); + //if (abs(hsv1.x - hsv2.x) > 0.5) { + // if (hsv1.x > hsv2.x) { + // hsv2.x += 1.0; + // } else { + // hsv1.x += 1.0; + // } + //} + //vec3 color = hsv2rgb(mix(hsv1, hsv2, colorMix)); + vec3 color = mix(color1, color2, colorMix); + + v_color = //vec4(hsv2rgb(vec3(hue, sat, val)), mix(0.01, 0.2, s)); + vec4(color, 1.0); + v_color.a *= clamp(opacity * 2.0, 0.0, 1.0); + v_color.a += clamp((opacity - 0.5) * 2.0, 0.0, 1.0); + v_color.rgb *= v_color.a; + + if (cu < 0.0 || cu > 1.0) { + v_color = vec4(0, 1, 1, 1); + } +} + +` + }, + revisionId: "vkzqvZawTQrJbA4HY", + revisionUrl: "https://www.vertexshaderart.com/art/PkSbv7TufuWHiNRbd/revision/vkzqvZawTQrJbA4HY", + artUrl: "https://www.vertexshaderart.com/art/undefined", + origUrl: "https://www.vertexshaderart.com/art/qjkP6BDvEFyD6CfZC" +}; diff --git a/examples/js/index/effects/bwow.js b/examples/js/index/effects/bwow.js new file mode 100644 index 0000000..3078a92 --- /dev/null +++ b/examples/js/index/effects/bwow.js @@ -0,0 +1,328 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "6Yx2A7TQ6NnyHhFPQ", + createdAt: "2016-09-02T17:38:52.975Z", + modifiedAt: "2016-09-18T04:57:25.845Z", + origId: "qjkP6BDvEFyD6CfZC", + name: "bwow", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 10404, + mode: "TRIANGLES", + sound: "", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 1, + 1, + 1 + ], + shader: `/* + +Challenge: 01 + +*/ + + + + +#define PI radians(180.) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +mat4 rotX(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + 1, 0, 0, 0, + 0, c, s, 0, + 0, -s, c, 0, + 0, 0, 0, 1); +} + +mat4 rotY(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + +mat4 rotZ(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +// times 2 minus 1 +float t2m1(float v) { + return v * 2. - 1.; +} + +// times .5 plus .5 +float t5p5(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + +void getCirclePoint(const float numEdgePointsPerCircle, const float id, const float inner, const float start, const float end, out vec3 pos) { + float outId = id - floor(id / 3.) * 2. - 1.; // 0 1 2 3 4 5 6 7 8 .. 0 1 2, 1 2 3, 2 3 4 + float ux = floor(id / 6.) + mod(id, 2.); + float vy = mod(floor(id / 2.) + floor(id / 3.), 2.); // change that 3. for cool fx + float u = ux / numEdgePointsPerCircle; + float v = mix(inner, 1., vy); + float a = mix(start, end, u) * PI * 2. + PI * 0.0; + float s = sin(a); + float c = cos(a); + float x = c * v; + float y = s * v; + float z = 0.; + pos = vec3(x, y, z); +} + + +#define CUBE_POINTS_PER_FACE 6. +#define FACES_PER_CUBE 6. +#define POINTS_PER_CUBE (CUBE_POINTS_PER_FACE * FACES_PER_CUBE) +void getCubePoint(const float id, out vec3 position, out vec3 normal) { + float quadId = floor(mod(id, POINTS_PER_CUBE) / CUBE_POINTS_PER_FACE); + float sideId = mod(quadId, 3.); + float flip = mix(1., -1., step(2.5, quadId)); + // 0 1 2 1 2 3 + float facePointId = mod(id, CUBE_POINTS_PER_FACE); + float pointId = mod(facePointId - floor(facePointId / 3.0), 6.0); + float a = pointId * PI * 2. / 4. + PI * 0.25; + vec3 p = vec3(cos(a), 0.707106781, sin(a)) * flip; + vec3 n = vec3(0, 1, 0) * flip; + float lr = mod(sideId, 2.); + float ud = step(2., sideId); + mat4 mat = rotX(lr * PI * 0.5); + mat *= rotZ(ud * PI * 0.5); + position = (mat * vec4(p, 1)).xyz; + normal = (mat * vec4(n, 0)).xyz; +} + +void main() { + float pointId = vertexId; + + vec3 pos; + vec3 normal; + getCubePoint(pointId, pos, normal); + float cubeId = floor(pointId / 36.); + float faceId = mod(floor(pointId / 6.), 6.); + float numCubes = floor(vertexCount / 36.); + float down = floor(sqrt(numCubes)); + float across = floor(numCubes / down); + + float cx = mod(cubeId, across); + float cy = floor(cubeId / across); + + float cu = cx / (across - 1.); + float cv = cy / (down - 1.); + + float ca = cu * 2. - 1.; + float cd = cv * 2. - 1.; + + float tm = PI * 1.75;time * 0.1; + mat4 mat = persp(radians(60.0), resolution.x / resolution.y, 0.1, 1000.0); + vec3 eye = vec3(cos(tm) * 1., sin(tm * 0.9) * .1 + 0.7, sin(tm) * 1.); + vec3 target = vec3(0); + vec3 up = vec3(0,1,0); + + mat *= cameraLookAt(eye, target, up); + mat *= trans(vec3(ca, 0, cd) * .3); +// mat *= rotX(time + abs(ca) * 5.); +// mat *= rotZ(time + abs(cd) * 6.); + float d = length(vec2(ca, cd)); + mat *= scale(vec3( + 1, + mix(2., + 12., + pow(sin(time * -2. + d * PI * 1.) * 0.5 + 0.5, + 1.5 + (1. - d) * 2.)), + 1)); + mat *= uniformScale(0.03); + + + gl_Position = mat * vec4(pos, 1); + vec3 n = normalize((mat * vec4(normal, 0)).xyz); + + vec3 lightDir = normalize(vec3(3.3, 0.4, -1)); + + float hue = .15 + mod(faceId + 2., 6.) * 0.17; + float sat = 0.3; + float val = 1.; + vec3 color = hsv2rgb(vec3(hue, sat, val)) * 1.125; + v_color = vec4(color * (dot(n, lightDir) * 0.5 + 0.5), 1); +} + +` + }, + revisionId: "vWR26Fhpcy3b2KLme", + revisionUrl: "https://www.vertexshaderart.com/art/6Yx2A7TQ6NnyHhFPQ/revision/vWR26Fhpcy3b2KLme", + artUrl: "https://www.vertexshaderart.com/art/undefined", + origUrl: "https://www.vertexshaderart.com/art/qjkP6BDvEFyD6CfZC" +}; diff --git a/examples/js/index/effects/codez.js b/examples/js/index/effects/codez.js new file mode 100644 index 0000000..28b2b97 --- /dev/null +++ b/examples/js/index/effects/codez.js @@ -0,0 +1,636 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "d7anES7ef6WrrDwsy", + createdAt: "2017-01-28T04:48:49.529Z", + modifiedAt: "2017-01-28T05:56:37.779Z", + origId: "d7anES7ef6WrrDwsy", + name: "codez", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "TRIANGLES", + sound: "https://soundcloud.com/beatsfar/grand-mas-mandoline", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 0, + 0, + 1 + ], + shader: ` +/* + + ___ ___ _______ ________ _________ _______ ___ ___ +|\ \ / /|\ ___ \ |\ __ \|\___ ___|\ ___ \ |\ \ / /| +\ \ \ / / \ \ __/|\ \ \|\ \|___ \ \_\ \ __/| \ \ \/ / / + \ \ \/ / / \ \ \_|/_\ \ _ _\ \ \ \ \ \ \_|/__ \ \ / / + \ \ / / \ \ \_|\ \ \ \\ \| \ \ \ \ \ \_|\ \ / \/ + \ \__/ / \ \_______\ \__\\ _\ \ \__\ \ \_______\/ /\ \ + \|__|/ \|_______|\|__|\|__| \|__| \|_______/__/ /\ __\ + |__|/ \|__| + + + ________ ___ ___ ________ ________ _______ ________ +|\ ____\|\ \|\ \|\ __ \|\ ___ \|\ ___ \ |\ __ \ +\ \ \___|\ \ \\\ \ \ \|\ \ \ \_|\ \ \ __/|\ \ \|\ \ + \ \_____ \ \ __ \ \ __ \ \ \ \\ \ \ \_|/_\ \ _ _\ + \|____|\ \ \ \ \ \ \ \ \ \ \ \_\\ \ \ \_|\ \ \ \\ \| + ____\_\ \ \__\ \__\ \__\ \__\ \_______\ \_______\ \__\\ _\ + |\_________\|__|\|__|\|__|\|__|\|_______|\|_______|\|__|\|__| + \|_________| + + + ________ ________ _________ +|\ __ \|\ __ \|\___ ___\ +\ \ \|\ \ \ \|\ \|___ \ \_| + \ \ __ \ \ _ _\ \ \ \ + \ \ \ \ \ \ \\ \| \ \ \ + \ \__\ \__\ \__\\ _\ \ \__\ + \|__|\|__|\|__|\|__| \|__| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +*/ + +vec3 gSunColor = vec3(1.0, 1.2, 1.4) * 10.1; + +vec3 gSkyTop = vec3( 0.1, 0.2, 0.8 ) * 0.5; +vec3 gSkyBottom = vec3( 0.5, 0.8, 1.0 ) * 1.5; + +vec3 gCubeColor = vec3(1.0, 1.0, 1.0); +float gExposure = 0.3; + +float gCubeColorRandom = 0.0; + +#define MOVE_OUTWARDS + +float fAOAmount = 0.8; +float gFloorHeight = -1.0; +float g_cameraFar = 1000.0; + +#define PI radians( 180.0 ) + + +vec3 GetSunDir() +{ + return normalize( vec3( 20.0, 40.3, -10.4 ) ); +} + +struct SceneVertex +{ + vec3 vWorldPos; + vec3 vColor; + float fAlpha; +}; + + +float GetCosSunRadius() +{ + return 0.01; +} + + +float GetSunIntensity() +{ + return 0.001; +} + + +vec3 GetSkyColor( vec3 vViewDir ) +{ + return mix( gSkyBottom, gSkyTop, max( 0.0, vViewDir.y ) ); +} +const float g_cubeFaces = 6.0; +const float g_cubeVerticesPerFace = ( 2.0 * 3.0 ); +const float g_cubeVertexCount = ( g_cubeVerticesPerFace * g_cubeFaces ); + +// 6 7 +// +----------+ +// /| /| +// 2 / | 3/ | +// +----------+ | +// | | | | +// Y Z | 4| | 5| +// | +-------|--+ +// ^ / | / | / +// |/ 0|/ 1|/ +// +--> X +----------+ + +vec3 GetCubeVertex( float fVertexIndex ) +{ + float f = fVertexIndex / 8.0; + return vec3( + mix(-1., 1., step(0.5, fract(f * 4.))), + mix(-1., 1., step(0.5, fract(f * 2.))), + mix(-1., 1., step(0.5, fract(f)))); +} + + +void GetCubeVertex( const float vertexIndex, const mat4 mat, out vec3 vWorldPos, out vec3 vWorldNormal ) +{ + float fFaceIndex = floor( vertexIndex / g_cubeFaces ); + + vec3 v0, v1, v2, v3; + + if ( fFaceIndex < 0.5 ) + { + v0 = GetCubeVertex( 0.0 ); + v1 = GetCubeVertex( 2.0 ); + v2 = GetCubeVertex( 3.0 ); + v3 = GetCubeVertex( 1.0 ); + } + else if ( fFaceIndex < 1.5 ) + { + v0 = GetCubeVertex( 5.0 ); + v1 = GetCubeVertex( 7.0 ); + v2 = GetCubeVertex( 6.0 ); + v3 = GetCubeVertex( 4.0 ); + } + else if ( fFaceIndex < 2.5 ) + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 3.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 5.0 ); + } + else if ( fFaceIndex < 3.5 ) + { + v0 = GetCubeVertex( 4.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 2.0 ); + v3 = GetCubeVertex( 0.0 ); + } + else if ( fFaceIndex < 4.5 ) + { + v0 = GetCubeVertex( 2.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 3.0 ); + } + else + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 5.0 ); + v2 = GetCubeVertex( 4.0 ); + v3 = GetCubeVertex( 0.0 ); + } + v0 = (mat * vec4(v0, 1)).xyz; + v1 = (mat * vec4(v1, 1)).xyz; + v2 = (mat * vec4(v2, 1)).xyz; + v3 = (mat * vec4(v3, 1)).xyz; + + float fFaceVertexIndex = mod( vertexIndex, 6.0 ); + + if ( fFaceVertexIndex < 0.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 1.5 ) + { + vWorldPos = v1; + } + else if ( fFaceVertexIndex < 2.5 ) + { + vWorldPos = v2; + } + else if ( fFaceVertexIndex < 3.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 4.5 ) + { + vWorldPos = v2; + } + else + { + vWorldPos = v3; + } + + vWorldNormal = normalize( cross( v1 - v0, v2 - v0 ) ); +} + + +vec3 GetSunLighting( const vec3 vNormal ) +{ + vec3 vLight = -GetSunDir(); + + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + return gSunColor * NdotL; +} + + +vec3 GetSunSpec( const vec3 vPos, const vec3 vNormal, const vec3 vCameraPos ) +{ + vec3 vLight = -GetSunDir(); + + vec3 vView = normalize( vCameraPos - vPos ); + + vec3 vH = normalize( vView - vLight ); + + float NdotH = max( 0.0, dot( vNormal, vH ) ); + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + float f = mix( 0.01, 1.0, pow( 1.0 - NdotL, 5.0 ) ); + + return gSunColor * pow( NdotH, 20.0 ) * NdotL * f * 4.0; +} + + +vec3 GetSkyLighting( const vec3 vNormal ) +{ + vec3 vSkyLight = normalize( vec3( -1.0, -2.0, -0.5 ) ); + + float fSkyBlend = vNormal.y * 0.5 + 0.5; + + return mix( gSkyBottom, gSkyTop, fSkyBlend ); +} + + +void GenerateCubeVertex( const float vertexIndex, const mat4 mat, const vec3 vCubeCol, const vec3 vCameraPos, out SceneVertex outSceneVertex ) +{ + vec3 vNormal; + + GetCubeVertex( vertexIndex, mat, outSceneVertex.vWorldPos, vNormal ); + + outSceneVertex.vColor = vec3( 0.0 ); + + outSceneVertex.fAlpha = 1.0; + + float h = outSceneVertex.vWorldPos.y - gFloorHeight; + outSceneVertex.vColor += GetSkyLighting( vNormal ); + outSceneVertex.vColor *= mix( 1.0, fAOAmount, clamp( h, 0.0, 1.0 ) ); + + outSceneVertex.vColor += GetSunLighting( vNormal ); + + outSceneVertex.vColor *= vCubeCol; + + outSceneVertex.vColor += GetSunSpec( outSceneVertex.vWorldPos, vNormal, vCameraPos ); +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) +{ + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + + +mat4 rotY( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + + +mat4 rotZ( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + #if 0 + return mat4( + 1, 0, 0, trans[0], + 0, 1, 0, trans[1], + 0, 0, 1, trans[2], + 0, 0, 0, 1); + #else + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); + #endif +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + +float m1p1(float v) { + return v * 2. - 1.; +} + +float p1m1(float v) { + return v * .5 + .5; +} + +float inRange(float v, float minV, float maxV) { + return step(minV, v) * step(v, maxV); +} + +float at(float v, float target) { + return inRange(v, target - 0.1, target + 0.1); +} + +float easeInOutCubic(float pos) { + if (pos < 0.5) { + return 0.5 * pow(pos / 0.5, 3.); + } + pos -= 0.5; + pos /= 0.5; + pos = 1. - pos; + return (1. - pow(pos, 3.)) * 0.5 + 0.5; +} + +float inOut(float v) { + float t = fract(v); + if (t < 0.5) { + return easeInOutCubic(t / 0.5); + } + return easeInOutCubic(2. - t * 2.); +} + +const float perBlock = 4.; + +uniform vec3 color1; +uniform vec3 color2; + +void GetCubePosition( float fCubeId, float numCubes, out mat4 mat, out vec4 vCubeCol ) +{ + float fSeed = fCubeId; + float fPositionBase = fCubeId; + float fSize = 1.0; + + vec3 vCubeOrigin = vec3( 0.0, 0.0, 0.0 ); + + float across = 48.; + float down = floor(numCubes / across); + float uId = mod(fCubeId, across); + float vId = floor(fCubeId / across); + float u = uId / (across); + float v = vId / down; + float bxId = floor(uId / perBlock); + float bzId = floor(vId / perBlock); + float numRows = floor(numCubes / across); + float numBlocks = floor(numRows / perBlock); + + float uP = m1p1(u); + float vP = m1p1(v); + + float ll = length(vec2(uP, vP * 1.5)); + float snd = texture2D(sound, vec2(mix(0.001, 0.0199, uP), ll * 0.3)).a; + //float s2 = 0.;texture2D(sound, vec2(mix(0.02, 0.04, hash(u + v + 2.34)), hash(v) * 0.05)).a; + + vCubeOrigin.x += uP * across * 1.2 + bxId * 0. ; + float vSpace = numRows * 1.4 + numBlocks * 0.; + float z = vP * down * 1.4 + bzId * 0.; + vCubeOrigin.z += z; + float height = 1.; + //vCubeOrigin.y += pow(sin(time + v * 9.), 1.) * pow(cos(time + u * 8.17), 1.) * 4. * inOut(time * 0.1); + + mat = ident(); + mat *= trans(vCubeOrigin); + mat *= rotZ(p1m1(snd) * 10.); + mat *= rotY(p1m1(snd) * 10.); + mat *= uniformScale(mix(0., 3.0, pow(clamp(mix(-0.5, 1., snd), 0., 1.), 7.))); + + vec3 vRandCol; + + float st = step(0.9, snd); + float h = 0. + floor(time * 0.0) * 0.1 + easeInOutCubic(fract(time * 0.1)) * 0.1; + //vCubeCol.rgb = hsv2rgb(vec3(mix(h, h + 0.5, st), + // st,//pow(snd, 0.), + // 1)); + vCubeCol.rgb = color1; + //vCubeCol.rgb = mix(vCubeCol.rgb, vec3(1,0,0), step(0.9, snd)); + vCubeCol.rgb = mix(vCubeCol.rgb, color2, step(0.98, snd)); + vCubeCol.a = 0.;vCubeOrigin.z / vSpace; +} + +float goop(float t) { + return sin(t) * sin(t * 0.27) * sin(t * 0.13) * sin(t * 0.73); +} + + +void main() +{ + SceneVertex sceneVertex; + + float fov = 1.8; + +// vec3 vCameraTarget = vec3( 300, -400.6, 500.0 ); +// vec3 vCameraPos = vec3(-45.1, 20., -0.); + + vec3 vCameraTarget = vec3( 0, 0., 0.0 ); + vec3 vCameraPos = vCameraTarget + vec3(0, 100., 0); + float ca = 0.; + + // get sick! + ca = time * 0.1; + vec3 vCameraUp = vec3( 1, 0, 0 ); + // vec3 vCameraUp = vec3( 0, 0, 1 ); + + vec3 vCameraForwards = normalize(vCameraTarget - vCameraPos); + + float vertexIndex = vertexId; + + + float fCubeId = floor( vertexIndex / g_cubeVertexCount ); + float fCubeVertex = mod( vertexIndex, g_cubeVertexCount ); + float fNumCubes = floor( vertexCount / g_cubeVertexCount ); + + mat4 mCube; + vec4 vCubeCol; + + GetCubePosition( fCubeId, fNumCubes, mCube, vCubeCol ); + + GenerateCubeVertex( fCubeVertex, mCube, vCubeCol.xyz, vCameraPos, sceneVertex ); + + mat4 m = persp(radians(45.), resolution.x / resolution.y, 0.1, 1000.); + m *= cameraLookAt(vCameraPos, vCameraTarget, vCameraUp); + gl_Position = m * vec4(sceneVertex.vWorldPos, 1); + + // Final output color + float fExposure = gExposure;// min( gExposure, time * 0.1 ); + vec3 vFinalColor = sqrt( vec3(1.0) - exp2( sceneVertex.vColor * -fExposure ) ); + + v_color = mix(vec4(vFinalColor, 1), background, vCubeCol.a); + +} + +` + }, + revisionId: "d7anES7ef6WrrDwsy", + revisionUrl: "https://www.vertexshaderart.com/art/d7anES7ef6WrrDwsy/revision/d7anES7ef6WrrDwsy", + artUrl: "https://www.vertexshaderart.com/art/d7anES7ef6WrrDwsy", + origUrl: "https://www.vertexshaderart.com/art/d7anES7ef6WrrDwsy" +}; diff --git a/examples/js/index/effects/cyty.js b/examples/js/index/effects/cyty.js new file mode 100644 index 0000000..b8e7620 --- /dev/null +++ b/examples/js/index/effects/cyty.js @@ -0,0 +1,675 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "bbsF39W6bJo3j4R3j", + createdAt: "2016-01-09T08:24:22.209Z", + modifiedAt: "2016-01-25T18:24:26.127Z", + origId: "xvg4vyvfWjCvKZQfW", + name: "cyty", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "TRIANGLES", + sound: "https://soundcloud.com/stuart-king/kraftwerk-the-model-stuart", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 1, + 1, + 1 + ], + shader: `/* + + ___ ___ _______ ________ _________ _______ ___ ___ +|\ \ / /|\ ___ \ |\ __ \|\___ ___|\ ___ \ |\ \ / /| +\ \ \ / / \ \ __/|\ \ \|\ \|___ \ \_\ \ __/| \ \ \/ / / + \ \ \/ / / \ \ \_|/_\ \ _ _\ \ \ \ \ \ \_|/__ \ \ / / + \ \ / / \ \ \_|\ \ \ \\ \| \ \ \ \ \ \_|\ \ / \/ + \ \__/ / \ \_______\ \__\\ _\ \ \__\ \ \_______\/ /\ \ + \|__|/ \|_______|\|__|\|__| \|__| \|_______/__/ /\ __\ + |__|/ \|__| + + + ________ ___ ___ ________ ________ _______ ________ +|\ ____\|\ \|\ \|\ __ \|\ ___ \|\ ___ \ |\ __ \ +\ \ \___|\ \ \\\ \ \ \|\ \ \ \_|\ \ \ __/|\ \ \|\ \ + \ \_____ \ \ __ \ \ __ \ \ \ \\ \ \ \_|/_\ \ _ _\ + \|____|\ \ \ \ \ \ \ \ \ \ \ \_\\ \ \ \_|\ \ \ \\ \| + ____\_\ \ \__\ \__\ \__\ \__\ \_______\ \_______\ \__\\ _\ + |\_________\|__|\|__|\|__|\|__|\|_______|\|_______|\|__|\|__| + \|_________| + + + ________ ________ _________ +|\ __ \|\ __ \|\___ ___\ +\ \ \|\ \ \ \|\ \|___ \ \_| + \ \ __ \ \ _ _\ \ \ \ + \ \ \ \ \ \ \\ \| \ \ \ + \ \__\ \__\ \__\\ _\ \ \__\ + \|__|\|__|\|__|\|__| \|__| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +*/ + +vec3 gSunColor = vec3(1.0, 1.2, 1.4) * 10.; + +vec3 gSkyTop = vec3( 0.1, 0.2, 0.8 ) * 0.5; +vec3 gSkyBottom = vec3( 0.5, 0.8, 1.0 ) * 1.5; + +vec3 gCubeColor = vec3(1.0, 1.0, 1.0); +float gExposure = 0.3; + +float gCubeColorRandom = 0.0; + +#define MOVE_OUTWARDS + +float fAOAmount = 0.8; +float gFloorHeight = -1.0; +float g_cameraFar = 1000.0; + +#define PI radians( 180.0 ) + + +vec3 GetSunDir() +{ + return normalize( vec3( 20.0, 40.3, -10.4 ) ); +} + + +void GetQuadInfo( const float vertexIndex, out vec2 quadVertId, out float quadId ) +{ + float twoTriVertexIndex = mod( vertexIndex, 6.0 ); + float triVertexIndex = mod( vertexIndex, 3.0 ); + + if ( twoTriVertexIndex < 0.5 ) quadVertId = vec2( 0.0, 0.0 ); + else if ( twoTriVertexIndex < 1.5 ) quadVertId = vec2( 1.0, 0.0 ); + else if ( twoTriVertexIndex < 2.5 ) quadVertId = vec2( 0.0, 1.0 ); + else if ( twoTriVertexIndex < 3.5 ) quadVertId = vec2( 1.0, 0.0 ); + else if ( twoTriVertexIndex < 4.5 ) quadVertId = vec2( 1.0, 1.0 ); + else quadVertId = vec2( 0.0, 1.0 ); + + quadId = floor( vertexIndex / 6.0 ); +} + + +void GetQuadTileInfo( const vec2 quadVertId, const float quadId, const vec2 vDim, out vec2 vQuadTileIndex, out vec2 vQuadUV ) +{ + vQuadTileIndex.x = floor( mod( quadId, vDim.x ) ); + vQuadTileIndex.y = floor( quadId / vDim.x ); + + vQuadUV.x = floor(quadVertId.x + vQuadTileIndex.x); + vQuadUV.y = floor(quadVertId.y + vQuadTileIndex.y); + + vQuadUV = vQuadUV * (1.0 / vDim); +} + + +void GetQuadTileInfo( const float vertexIndex, const vec2 vDim, out vec2 vQuadTileIndex, out vec2 vQuadUV ) +{ + vec2 quadVertId; + float quadId; + GetQuadInfo( vertexIndex, quadVertId, quadId ); + GetQuadTileInfo( quadVertId, quadId, vDim, vQuadTileIndex, vQuadUV ); +} + + +void GetMatrixFromZY( const vec3 vZ, const vec3 vY, out mat3 m ) +{ + vec3 vX = normalize( cross( vY, vZ ) ); + vec3 vOrthoY = normalize( cross( vZ, vX ) ); + m[0] = vX; + m[1] = vOrthoY; + m[2] = vZ; +} + + +void GetMatrixFromZ( vec3 vZAxis, out mat3 m ) +{ + vec3 vZ = normalize(vZAxis); + vec3 vY = vec3( 0.0, 1.0, 0.0 ); + if ( abs(vZ.y) > 0.99 ) + { + vY = vec3( 1.0, 0.0, 0.0 ); + } + GetMatrixFromZY( vZ, vY, m ); +} + + +struct SceneVertex +{ + vec3 vWorldPos; + vec3 vColor; + float fAlpha; +}; + + +float GetCosSunRadius() +{ + return 0.01; +} + + +float GetSunIntensity() +{ + return 0.001; +} + + +vec3 GetSkyColor( vec3 vViewDir ) +{ + return mix( gSkyBottom, gSkyTop, max( 0.0, vViewDir.y ) ); +} +#define g_cubeFaces 6.0 +#define g_cubeVerticesPerFace ( 2.0 * 3.0 ) +#define g_cubeVertexCount ( g_cubeVerticesPerFace * g_cubeFaces ) + +// 6 7 +// +----------+ +// /| /| +// 2 / | 3/ | +// +----------+ | +// | | | | +// Y Z | 4| | 5| +// | +-------|--+ +// ^ / | / | / +// |/ 0|/ 1|/ +// +--> X +----------+ + +vec3 GetCubeVertex( float fVertexIndex ) +{ + vec3 fResult = vec3( 1.0 ); + + float f = fVertexIndex / 8.0; + if ( fract( f * 4.0 ) < 0.5 ) + { + fResult.x = -fResult.x; + } + + if ( fract( f * 2.0 ) < 0.5 ) + { + fResult.y = -fResult.y; + } + + if ( fract( f ) < 0.5 ) + { + fResult.z = -fResult.z; + } + + return fResult; +} + + +void GetCubeVertex( const float vertexIndex, const mat4 mat, out vec3 vWorldPos, out vec3 vWorldNormal ) +{ + float fFaceIndex = floor( vertexIndex / g_cubeFaces ); + + vec3 v0, v1, v2, v3; + + if ( fFaceIndex < 0.5 ) + { + v0 = GetCubeVertex( 0.0 ); + v1 = GetCubeVertex( 2.0 ); + v2 = GetCubeVertex( 3.0 ); + v3 = GetCubeVertex( 1.0 ); + } + else if ( fFaceIndex < 1.5 ) + { + v0 = GetCubeVertex( 5.0 ); + v1 = GetCubeVertex( 7.0 ); + v2 = GetCubeVertex( 6.0 ); + v3 = GetCubeVertex( 4.0 ); + } + else if ( fFaceIndex < 2.5 ) + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 3.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 5.0 ); + } + else if ( fFaceIndex < 3.5 ) + { + v0 = GetCubeVertex( 4.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 2.0 ); + v3 = GetCubeVertex( 0.0 ); + } + else if ( fFaceIndex < 4.5 ) + { + v0 = GetCubeVertex( 2.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 3.0 ); + } + else + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 5.0 ); + v2 = GetCubeVertex( 4.0 ); + v3 = GetCubeVertex( 0.0 ); + } + #if 0 + v0 = (vec4(v0, 1) * mat).xyz; + v1 = (vec4(v1, 1) * mat).xyz; + v2 = (vec4(v2, 1) * mat).xyz; + v3 = (vec4(v3, 1) * mat).xyz; + #else + v0 = (mat * vec4(v0, 1)).xyz; + v1 = (mat * vec4(v1, 1)).xyz; + v2 = (mat * vec4(v2, 1)).xyz; + v3 = (mat * vec4(v3, 1)).xyz; + #endif + float fFaceVertexIndex = mod( vertexIndex, 6.0 ); + + if ( fFaceVertexIndex < 0.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 1.5 ) + { + vWorldPos = v1; + } + else if ( fFaceVertexIndex < 2.5 ) + { + vWorldPos = v2; + } + else if ( fFaceVertexIndex < 3.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 4.5 ) + { + vWorldPos = v2; + } + else + { + vWorldPos = v3; + } + + vWorldNormal = normalize( cross( v1 - v0, v2 - v0 ) ); +} + + +vec3 GetSunLighting( const vec3 vNormal ) +{ + vec3 vLight = -GetSunDir(); + + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + return gSunColor * NdotL; +} + + +vec3 GetSunSpec( const vec3 vPos, const vec3 vNormal, const vec3 vCameraPos ) +{ + vec3 vLight = -GetSunDir(); + + vec3 vView = normalize( vCameraPos - vPos ); + + vec3 vH = normalize( vView - vLight ); + + float NdotH = max( 0.0, dot( vNormal, vH ) ); + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + float f = mix( 0.01, 1.0, pow( 1.0 - NdotL, 5.0 ) ); + + return gSunColor * pow( NdotH, 20.0 ) * NdotL * f * 4.0; +} + + +vec3 GetSkyLighting( const vec3 vNormal ) +{ + vec3 vSkyLight = normalize( vec3( -1.0, -2.0, -0.5 ) ); + + float fSkyBlend = vNormal.y * 0.5 + 0.5; + + return mix( gSkyBottom, gSkyTop, fSkyBlend ); +} + + +void GenerateCubeVertex( const float vertexIndex, const mat4 mat, const vec3 vCubeCol, const vec3 vCameraPos, out SceneVertex outSceneVertex ) +{ + vec3 vNormal; + + GetCubeVertex( vertexIndex, mat, outSceneVertex.vWorldPos, vNormal ); + + outSceneVertex.vColor = vec3( 0.0 ); + + outSceneVertex.fAlpha = 1.0; + + float h = outSceneVertex.vWorldPos.y - gFloorHeight; + outSceneVertex.vColor += GetSkyLighting( vNormal ); + outSceneVertex.vColor *= mix( 1.0, fAOAmount, clamp( h, 0.0, 1.0 ) ); + + outSceneVertex.vColor += GetSunLighting( vNormal ); + + outSceneVertex.vColor *= vCubeCol; + + outSceneVertex.vColor += GetSunSpec( outSceneVertex.vWorldPos, vNormal, vCameraPos ); +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) +{ + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + + +mat4 rotY( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + + +mat4 rotZ( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + #if 0 + return mat4( + 1, 0, 0, trans[0], + 0, 1, 0, trans[1], + 0, 0, 1, trans[2], + 0, 0, 0, 1); + #else + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); + #endif +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + +float m1p1(float v) { + return v * 2. - 1.; +} + +float p1m1(float v) { + return v * .5 + .5; +} + +float inRange(float v, float minV, float maxV) { + return step(minV, v) * step(v, maxV); +} + +float at(float v, float target) { + return inRange(v, target - 0.1, target + 0.1); +} + + +const float perBlock = 4.; + +void GetCubePosition( float fCubeId, float numCubes, out mat4 mat, out vec4 vCubeCol ) +{ + float fSeed = fCubeId; + float fPositionBase = fCubeId; + float fSize = 1.0; + + vec3 vCubeOrigin = vec3( 0.0, 0.0, 0.0 ); + + float across = 48.; + float down = 32.; + float uId = mod(fCubeId, across); + float vId = floor(fCubeId / across); + float u = uId / (across - .1); + float v = vId / down; + float bxId = floor(uId / perBlock); + float bzId = floor(vId / perBlock); + float numRows = floor(numCubes / across); + float numBlocks = floor(numRows / perBlock); + + float snd = texture2D(sound, vec2(mix(0.015, 0.015, u), v * 0.1)).a; + float s2 = texture2D(sound, vec2(mix(0.02, 0.04, hash(u + v + 2.34)), hash(v) * 0.05)).a; + + vCubeOrigin.x += m1p1(u) * across * 1.05 + bxId; + float vSpace = numRows * 2.05 + numBlocks * 2.; + float z = v * down * 2.05 + bzId * 2.; + vCubeOrigin.z += fract(-time * 0.2 + z / vSpace) * vSpace; + float height = mix(0.1, 0.5, hash(fCubeId)) + smoothstep(0.75, 1., s2) * 1.; + vCubeOrigin.y += height;; + + mat = ident(); + mat *= trans(vCubeOrigin); + mat *= scale(vec3(1, height, 1)); + + vec3 vRandCol; + + + vCubeCol.rgb = vec3(1);//mix(vec3(0.5), vec3(1,1,1), pow(s2, 40.0)); + vCubeCol.rgb = mix(vCubeCol.rgb, vec3(0,0.5,1), step(0.75,s2)); + //vCubeCol.rgb = vec3(1. - pow(s2, 3.)); + vCubeCol.a = vCubeOrigin.z / vSpace; +} + +float goop(float t) { + return sin(t) * sin(t * 0.27) * sin(t * 0.13) * sin(t * 0.73); +} + + +void main() +{ + SceneVertex sceneVertex; + + float fov = 1.8; + + vec3 vCameraTarget = vec3( 10, 5.6, 1.0 ); + vec3 vCameraPos = vec3(10.1, 6., -0.); + float ca = 0.; + + // get sick! + // ca = time + sin(time) * 2.; + vec3 vCameraUp = vec3( sin(ca), cos(ca), 0.0 ); + + vec3 vCameraForwards = normalize(vCameraTarget - vCameraPos); + + mat3 mCamera; + GetMatrixFromZY( vCameraForwards, normalize(vCameraUp), mCamera ); + + float vertexIndex = vertexId; + + + float fCubeId = floor( vertexIndex / g_cubeVertexCount ); + float fCubeVertex = mod( vertexIndex, g_cubeVertexCount ); + float fNumCubes = floor( vertexCount / g_cubeVertexCount ); + + mat4 mCube; + vec4 vCubeCol; + + GetCubePosition( fCubeId, fNumCubes, mCube, vCubeCol ); + + GenerateCubeVertex( fCubeVertex, mCube, vCubeCol.xyz, vCameraPos, sceneVertex ); + + mat4 m = persp(radians(45.), resolution.x / resolution.y, 0.1, 1000.); + m *= cameraLookAt(vCameraPos, vCameraTarget, vCameraUp); + gl_Position = m * vec4(sceneVertex.vWorldPos, 1); + + // Final output color + float fExposure = gExposure;// min( gExposure, time * 0.1 ); + vec3 vFinalColor = sqrt( vec3(1.0) - exp2( sceneVertex.vColor * -fExposure ) ); + + v_color = mix(vec4(vFinalColor, 1), background, vCubeCol.a); + +}` + }, + revisionId: "8z2whXqEmXfeJTPD8", + revisionUrl: "https://www.vertexshaderart.com/art/bbsF39W6bJo3j4R3j/revision/8z2whXqEmXfeJTPD8", + artUrl: "https://www.vertexshaderart.com/art/undefined", + origUrl: "https://www.vertexshaderart.com/art/xvg4vyvfWjCvKZQfW" +}; diff --git a/examples/js/index/effects/discus.js b/examples/js/index/effects/discus.js new file mode 100644 index 0000000..618f654 --- /dev/null +++ b/examples/js/index/effects/discus.js @@ -0,0 +1,247 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "yX9SGHv6RPPqcsXvh", + createdAt: "2017-01-28T04:48:49.529Z", + modifiedAt: "2017-01-28T05:56:37.779Z", + origId: "yX9SGHv6RPPqcsXvh", + name: "discus", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "TRIANGLES", + sound: "https://soundcloud.com/beatsfar/grand-mas-mandoline", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 0, + 0, + 1 + ], + shader: ` + + +#define PI radians(180.) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +mat4 rotY( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + + +mat4 rotZ( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +float m1p1(float v) { + return v * 2. - 1.; +} + +float p1m1(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + +uniform float numSides; +#define NUM_EDGE_POINTS_PER_CIRCLE numSides +#define NUM_POINTS_PER_CIRCLE (NUM_EDGE_POINTS_PER_CIRCLE * 6.) +#define NUM_CIRCLES_PER_GROUP 2. +void getCirclePoint(const float id, const float inner, const float start, const float end, out vec3 pos) { + float outId = id - floor(id / 3.) * 2. - 1.; // 0 1 2 3 4 5 6 7 8 .. 0 1 2, 1 2 3, 2 3 4 + float ux = floor(id / 6.) + mod(id, 2.); + float vy = mod(floor(id / 2.) + floor(id / 3.), 2.); // change that 3. for cool fx + float u = ux / NUM_EDGE_POINTS_PER_CIRCLE; + float v = mix(inner, 1., vy); + float a = mix(start, end, u) * PI * 2. + PI * 0.0; + float s = sin(a); + float c = cos(a); + float x = c * v; + float y = s * v; + float z = 0.; + pos = vec3(x, y, z); +} + +float goop(float t) { + return sin(t) + sin(t * 0.27) + sin(t * 0.13) + sin(t * 0.73); +} + +float easeInOutSine(float t) { + return (-0.5 * (cos(PI * t) - 1.)); +} + +float mixer(float t, float timeOff, float duration) { + t = mod(t, duration * 2.0); + t = t - timeOff; + if (t > duration) { + t = duration + 1. - t; + } + return easeInOutSine(clamp(t, 0., 1.)); +} + +uniform float speed; +uniform float brightness; +uniform vec3 color1; +uniform vec3 color2; +uniform float rotation; +uniform float split; + +void main() { + float circleId = floor(vertexId / NUM_POINTS_PER_CIRCLE); + float groupId = floor(circleId / NUM_CIRCLES_PER_GROUP); + float pointId = mod(vertexId, NUM_POINTS_PER_CIRCLE); + float sliceId = mod(floor(vertexId / 6.), 2.); + float side = mix(-1., 1., step(0.5, mod(circleId, 2.))); + float numCircles = floor(vertexCount / NUM_POINTS_PER_CIRCLE); + float numGroups = floor(numCircles / NUM_CIRCLES_PER_GROUP); + float cu = circleId / numCircles; + float gv = groupId / numGroups; + float cgId = mod(circleId, NUM_CIRCLES_PER_GROUP); + float cgv = cgId / NUM_CIRCLES_PER_GROUP; + float ncgv = 1. - cgv; + + + float tm = time - cgv * 0.2; + float su = hash(groupId); + float snd = texture2D(sound, vec2(mix(0.01, 0.14, su), gv * 0.05)).a; + + //snd = pow(snd, mix(2., 0.5, su)); + + + vec3 pos; + float inner = mix(0.0, 1. - pow(snd, 4.), cgId); + float start = 0.;//fract(hash(sideId * 0.33) + sin(time * 0.1 + sideId) * 1.1); + float end = 1.; //start + hash(sideId + 1.); + getCirclePoint(pointId, inner, start, end, pos); + pos.z = cgv; + +// float historyX = mix(0.01, 0.14, u); +// snd = pow(snd, mix(2., 0.5, u)); + + + + // ---- + float gDown = floor(sqrt(numGroups)); + float gAcross = floor(numGroups / gDown); + vec3 offset0 = vec3( + mod(groupId, gAcross) - (gAcross - 1.) / 2., + floor(groupId / gAcross) - (gDown - 1.) / 2., + 0) * 0.2; + + // ---- + float ang = gv * 10.0; + vec3 offset1 = vec3(cos(ang), sin(ang), 0) * gv * 0.5; + + // ---- + vec3 offset2 = (vec3(hash(groupId), hash(groupId * 0.37), 0) * 2. - 1.) * 0.8; + + // ---- + ang = gv * 20.0; + float rad = floor(groupId / pow(2., gv + 3.)); + vec3 offset3 = vec3(cos(ang), sin(ang), 0) * mix(0.3, 0.7, rad); + + // 0-6 + float m = 0.;tm; //mod(tm, 4. * 3.); + float mix01 = mixer(m, 0., 3.); + float mix23 = mixer(m, 0., 3.); + float mix0123 = mixer(m, 0., 6.); + vec3 offset = + mix( + mix(offset0, offset1, mix01), + mix(offset2, offset3, mix23), + mix0123); + +// vec3 offset = vec3(hash(groupId) * 0.8, m1p1(hash(groupId * 0.37)), cgv); +// offset.x += m1p1(pow(snd, 5.0) + goop(groupId + time * 0.) * 0.1); +// offset.y += goop(groupId + time * 0.) * 0.1; + vec3 aspect = vec3(1, resolution.x / resolution.y, 1); + + mat4 mat = ident(); + mat *= scale(aspect / gAcross * 12.); + mat *= trans(vec3(0.25,0,0)); + mat *= rotZ(rotation); + mat *= trans(offset); + mat *= rotZ(offset.x * offset.y); + float sp = pow(snd, 5.0); + + mat *= uniformScale(mix(sp, 1. - sp, cgId) * 0.1 + sliceId * 0.0); + gl_Position = vec4((mat * vec4(pos, 1)).xyz, 1); + gl_PointSize = 4.; + + float hue = tm * 0.0 + mix(0., 20.2, hash(groupId * 0.23)); + float sat = 1. - pow(snd, 5.); + float pump = step(snd, split); //pow(snd, 2.); + float val = pump * brightness;//ncgv;//1.;//mix(0.0, 0.0, fract(circleId * 0.79)) + sliceId * .65; +// v_color = vec4(mix(color1, hsv2rgb(vec3(hue, sat, val)), pump), 1); + v_color = vec4(mix(color1, color2, pump), 1); + v_color.rgb *= v_color.a; +} +` + }, + revisionId: "yX9SGHv6RPPqcsXvh", + revisionUrl: "https://www.vertexshaderart.com/art/yX9SGHv6RPPqcsXvh/revision/yX9SGHv6RPPqcsXvh", + artUrl: "https://www.vertexshaderart.com/art/yX9SGHv6RPPqcsXvh", + origUrl: "https://www.vertexshaderart.com/art/yX9SGHv6RPPqcsXvh" +}; diff --git a/examples/js/index/effects/dotto-chouhoukei.js b/examples/js/index/effects/dotto-chouhoukei.js new file mode 100644 index 0000000..04beb67 --- /dev/null +++ b/examples/js/index/effects/dotto-chouhoukei.js @@ -0,0 +1,391 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "JANswiNfyJnruo62E", + createdAt: "2017-07-07T14:54:01.007Z", + modifiedAt: "2017-07-11T03:19:45.238Z", + origId: "JRyewraYLfP9taa98", + name: "dotto-chouhoukei", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "POINTS", + sound: "https://soundcloud.com/ambient_space/4-ali-khan-sol", + lineSize: "NATIVE", + backgroundColor: [ + 0, + 0, + 0, + 1 + ], + shader: `/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +*/ + + + + +#define PI radians(180.) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +mat4 rotX(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + 1, 0, 0, 0, + 0, c, s, 0, + 0, -s, c, 0, + 0, 0, 0, 1); +} + +mat4 rotY(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + +mat4 rotZ(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +// times 2 minus 1 +float t2m1(float v) { + return v * 2. - 1.; +} + +// times .5 plus .5 +float t5p5(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + +void getCirclePoint(const float numEdgePointsPerCircle, const float id, const float inner, const float start, const float end, out vec3 pos) { + float outId = id - floor(id / 3.) * 2. - 1.; // 0 1 2 3 4 5 6 7 8 .. 0 1 2, 1 2 3, 2 3 4 + float ux = floor(id / 6.) + mod(id, 2.); + float vy = mod(floor(id / 2.) + floor(id / 3.), 2.); // change that 3. for cool fx + float u = ux / numEdgePointsPerCircle; + float v = mix(inner, 1., vy); + float a = mix(start, end, u) * PI * 2. + PI * 0.0; + float s = sin(a); + float c = cos(a); + float x = c * v; + float y = s * v; + float z = 0.; + pos = vec3(x, y, z); +} + + +#define CUBE_POINTS_PER_FACE 6. +#define FACES_PER_CUBE 6. +#define POINTS_PER_CUBE (CUBE_POINTS_PER_FACE * FACES_PER_CUBE) +void getCubePoint(const float id, out vec3 position, out vec3 normal) { + float quadId = floor(mod(id, POINTS_PER_CUBE) / CUBE_POINTS_PER_FACE); + float sideId = mod(quadId, 3.); + float flip = mix(1., -1., step(2.5, quadId)); + // 0 1 2 1 2 3 + float facePointId = mod(id, CUBE_POINTS_PER_FACE); + float pointId = mod(facePointId - floor(facePointId / 3.0), 6.0); + float a = pointId * PI * 2. / 4. + PI * 0.25; + vec3 p = vec3(cos(a), 0.707106781, sin(a)) * flip; + vec3 n = vec3(0, 1, 0) * flip; + float lr = mod(sideId, 2.); + float ud = step(2., sideId); + mat4 mat = rotX(lr * PI * 0.5); + mat *= rotZ(ud * PI * 0.5); + position = (mat * vec4(p, 1)).xyz; + normal = (mat * vec4(n, 0)).xyz; +} + +void main() { + float deep = floor(pow(vertexCount, 0.33333)); + float down = floor(deep); + float across = floor(vertexCount / down / deep); + + float cx = mod(vertexId, across); + float cy = mod(floor(vertexId / across), down); + float cz = floor(vertexId / across / down); + float cu = cx / (across - 1.); + float cv = cy / (down - 1.); + float cw = cz / (deep - 1.); + + float ca = cu * 2. - 1.; + float cd = cv * 2. - 1.; + float ce = cw * 2. - 1.; + + float tm = time * .1; + mat4 mat = persp(radians(60.0), resolution.x / resolution.y, .1, 1000.0); + float rad = 2.; + vec3 eye = vec3(cos(tm) * rad, sin(tm * 0.9) * rad * 1.1, sin(tm) * rad); + vec3 target = vec3(0); + vec3 up = vec3(0,1,0); + + mat *= cameraLookAt(eye, target, up); + mat *= trans(vec3(ca, ce, cd) * 2.); + + vec3 pos = vec3(0); + + gl_Position = mat * vec4(pos, 1); + + float sz = 1. - abs((gl_Position.z / gl_Position.w * .5 + .5)); + float st = time; //-0.5 * PI * 10.; + float minRez = min(resolution.x, resolution.y); + gl_PointSize = mix(minRez / 8000., pow(sz, 1.) * 120. * minRez / 1000., sin(st * .2) * .5 + .5); + gl_PointSize = max(gl_PointSize, 1.0); + + float z = gl_Position.w / gl_Position.z * .5 + .5; + float hue = 1.1;// + mix(.4, .9, sin(st * .1) * .5 + .5); + float sat = 1.; + float val = 1. ; + + v_color = vec4(hsv2rgb(vec3(hue, sat, val)), 1); +} + +` + }, + revisionId: "qRsQkY9R9zMTgAdsN", + revisionUrl: "https://www.vertexshaderart.com/art/JANswiNfyJnruo62E/revision/qRsQkY9R9zMTgAdsN", + artUrl: "https://www.vertexshaderart.com/art/undefined", + origUrl: "https://www.vertexshaderart.com/art/JRyewraYLfP9taa98" +}; diff --git a/examples/js/index/effects/hexit2.js b/examples/js/index/effects/hexit2.js new file mode 100644 index 0000000..abe9fef --- /dev/null +++ b/examples/js/index/effects/hexit2.js @@ -0,0 +1,224 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "d7anES7ef6WrrDwsy", + createdAt: "2017-01-28T04:48:49.529Z", + modifiedAt: "2017-01-28T05:56:37.779Z", + origId: "yey7qrMtmhZZhq2K6", + name: "hexit2", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "TRIANGLES", + sound: "https://soundcloud.com/beatsfar/grand-mas-mandoline", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 0, + 0, + 1 + ], + shader: ` +#define PI radians(180.0) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +mat4 rotY( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + + +mat4 rotZ( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +float m1p1(float v) { + return v * 2. - 1.; +} + +float p1m1(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + +uniform float numSides; + +#define NUM_EDGE_POINTS_PER_CIRCLE numSides +#define NUM_POINTS_PER_CIRCLE (NUM_EDGE_POINTS_PER_CIRCLE * 6.) +#define NUM_CIRCLES_PER_GROUP 1. +void getCirclePoint(const float id, const float inner, const float start, const float end, out vec3 pos) { + float outId = id - floor(id / 3.) * 2. - 1.; // 0 1 2 3 4 5 6 7 8 .. 0 1 2, 1 2 3, 2 3 4 + float ux = floor(id / 6.) + mod(id, 2.); + float vy = mod(floor(id / 2.) + floor(id / 3.), 2.); // change that 3. for cool fx + float u = ux / NUM_EDGE_POINTS_PER_CIRCLE; + float v = mix(inner, 1., vy); + float a = mix(start, end, u) * PI * 2. + PI * 0.0; + float s = sin(a); + float c = cos(a); + float x = c * v; + float y = s * v; + float z = 0.; + pos = vec3(x, y, z); +} + +float goop(float t) { + return sin(t) + sin(t * 0.27) + sin(t * 0.13) + sin(t * 0.73); +} + +float easeInOutSine(float t) { + return (-0.5 * (cos(PI * t) - 1.)); +} + +float mixer(float t, float timeOff, float duration) { + t = mod(t, duration * 2.0); + t = t - timeOff; + if (t > duration) { + t = duration + 1. - t; + } + return easeInOutSine(clamp(t, 0., 1.)); +} + +uniform float s1; +uniform float s2; +uniform float s3; +uniform float s4; + +void main() { + float circleId = floor(vertexId / NUM_POINTS_PER_CIRCLE); + float groupId = floor(circleId / NUM_CIRCLES_PER_GROUP); + float pointId = mod(vertexId, NUM_POINTS_PER_CIRCLE); + float sliceId = mod(floor(vertexId / 6.), 2.); + float side = mix(-1., 1., step(0.5, mod(circleId, 2.))); + float numCircles = floor(vertexCount / NUM_POINTS_PER_CIRCLE); + float numGroups = floor(numCircles / NUM_CIRCLES_PER_GROUP); + float cu = circleId / numCircles; + float gv = groupId / numGroups; + float cgId = mod(circleId, NUM_CIRCLES_PER_GROUP); + float cgv = cgId / NUM_CIRCLES_PER_GROUP; + float ncgv = 1. - cgv; + + + //snd = pow(snd, mix(2., 0.5, su)); + + + vec3 pos; + float inner = 0.;//mix(0.0, 1. - pow(snd, 4.), cgId); + float start = 0.;//fract(hash(sideId * 0.33) + sin(time * 0.1 + sideId) * 1.1); + float end = 1.; //start + hash(sideId + 1.); + getCirclePoint(pointId, inner, start, end, pos); + pos.z = cgv; + +// float historyX = mix(0.01, 0.14, u); +// snd = pow(snd, mix(2., 0.5, u)); + + + + // ---- + float gDown = floor(sqrt(numGroups)); + float gAcross = floor(numGroups / gDown); + float gx = mod(groupId, gAcross); + float gy = floor(groupId / gAcross); + vec3 offset = vec3( + gx - (gAcross - 1.) / 2. + mod(gy, 2.) * 0.5, + gy - (gDown - 1.) / 2., + 0) * 0.17; + + float tm = time - cgv * 0.2; + float su = hash(groupId); + float snd = texture2D(sound, vec2(mix(0.001, 0.015, su), length(offset) * 0.125)).a; + + + +// vec3 offset = vec3(hash(groupId) * 0.8, m1p1(hash(groupId * 0.37)), cgv); +// offset.x += m1p1(pow(snd, 5.0) + goop(groupId + time * 0.) * 0.1); +// offset.y += goop(groupId + time * 0.) * 0.1; + vec3 aspect = vec3(1, resolution.x / resolution.y, 1); + + mat4 mat = ident(); + mat *= scale(aspect * (0.2 / 3.0) * numSides); + mat *= trans(vec3(0.25,0,0)); + mat *= rotZ(-time * 0. + snd * .0); + mat *= trans(offset); + float sp = pow(snd, 5.0); + + mat *= rotZ(time * 0.01 + sin(gx * s1 * 0.1) + cos(gy * s2 * 0.1)); + mat *= uniformScale(0.1 * pow(snd, 0.));// + -sin((time + 0.5) * 6.) * 0.01); + //mat *= uniformScale(mix(sp, 1. - sp, cgId) * 0.1 + sliceId * 0.0); + gl_Position = vec4((mat * vec4(pos, 1)).xyz, 1); + gl_PointSize = 4.; + + float hue = tm * 0.05 + fract(snd * 2.5) * 0.2 + 0.3 + mix(0., .02, length(offset)); + float sat = pow(snd, 5.); + float val = mix(hash(groupId), 1.0, step(0.98, snd));//ncgv;//1.;//mix(0.0, 0.0, fract(circleId * 0.79)) + sliceId * .65; + v_color = vec4(hsv2rgb(vec3(hue, sat, val)), 1); + v_color.rgb *= v_color.a; +} +` + }, + revisionId: "yey7qrMtmhZZhq2K6", + revisionUrl: "https://www.vertexshaderart.com/art/yey7qrMtmhZZhq2K6/revision/yey7qrMtmhZZhq2K6", + artUrl: "https://www.vertexshaderart.com/art/yey7qrMtmhZZhq2K6", + origUrl: "https://www.vertexshaderart.com/art/yey7qrMtmhZZhq2K6" +}; diff --git a/examples/js/index/effects/loop-test.js b/examples/js/index/effects/loop-test.js new file mode 100644 index 0000000..14f5b7d --- /dev/null +++ b/examples/js/index/effects/loop-test.js @@ -0,0 +1,323 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "ZFSiQpx33DLDg9hmd", + createdAt: "2018-06-06T08:31:10.941Z", + modifiedAt: "2018-06-06T08:31:10.941Z", + origId: null, + name: "loop-test", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "TRIANGLES", + sound: "https://soundcloud.com/greggman/testing-1-2-3", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 1, + 1, + 1 + ], + shader: `/* + +VertexShaderArt Boilerplate Library + +*/ + + + + +#define PI radians(180.) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +mat4 rotX(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + 1, 0, 0, 0, + 0, c, s, 0, + 0, -s, c, 0, + 0, 0, 0, 1); +} + +mat4 rotY(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + +mat4 rotZ(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +// times 2 minus 1 +float t2m1(float v) { + return v * 2. - 1.; +} + +// times .5 plus .5 +float t5p5(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + +void getCirclePoint(const float numEdgePointsPerCircle, const float id, const float inner, const float start, const float end, out vec3 pos) { + float outId = id - floor(id / 3.) * 2. - 1.; // 0 1 2 3 4 5 6 7 8 .. 0 1 2, 1 2 3, 2 3 4 + float ux = floor(id / 6.) + mod(id, 2.); + float vy = mod(floor(id / 2.) + floor(id / 3.), 2.); // change that 3. for cool fx + float u = ux / numEdgePointsPerCircle; + float v = mix(inner, 1., vy); + float a = mix(start, end, u) * PI * 2. + PI * 0.0; + float s = sin(a); + float c = cos(a); + float x = c * v; + float y = s * v; + float z = 0.; + pos = vec3(x, y, z); +} + + +#define CUBE_POINTS_PER_FACE 6. +#define FACES_PER_CUBE 6. +#define POINTS_PER_CUBE (CUBE_POINTS_PER_FACE * FACES_PER_CUBE) +void getCubePoint(const float id, out vec3 position, out vec3 normal) { + float quadId = floor(mod(id, POINTS_PER_CUBE) / CUBE_POINTS_PER_FACE); + float sideId = mod(quadId, 3.); + float flip = mix(1., -1., step(2.5, quadId)); + // 0 1 2 1 2 3 + float facePointId = mod(id, CUBE_POINTS_PER_FACE); + float pointId = mod(facePointId - floor(facePointId / 3.0), 6.0); + float a = pointId * PI * 2. / 4. + PI * 0.25; + vec3 p = vec3(cos(a), 0.707106781, sin(a)) * flip; + vec3 n = vec3(0, 1, 0) * flip; + float lr = mod(sideId, 2.); + float ud = step(2., sideId); + mat4 mat = rotX(lr * PI * 0.5); + mat *= rotZ(ud * PI * 0.5); + position = (mat * vec4(p, 1)).xyz; + normal = (mat * vec4(n, 0)).xyz; +} + +#if 1 +void main() { + float pointId = vertexId; + + vec3 pos; + vec3 normal; + getCubePoint(pointId, pos, normal); + float cubeId = floor(pointId / 36.); + float numCubes = floor(vertexCount / 36.); + float down = floor(sqrt(numCubes)); + float across = floor(numCubes / down); + + float cx = mod(cubeId, across); + float cy = floor(cubeId / across); + + float cu = cx / (across - 1.); + float cv = cy / (down - 1.); + + float ca = cu * 2. - 1.; + float cd = cv * 2. - 1.; + + float tm = time * 0.1; + mat4 mat = persp(radians(60.0), resolution.x / resolution.y, 0.1, 1000.0); + vec3 eye = vec3(cos(tm) * 1., sin(tm * 0.9) * .1 + 0.5, sin(tm) * 1.); + vec3 target = vec3(-eye.x, -1, -eye.z) * 5.5; + vec3 up = vec3(0,1,0); + + mat *= cameraLookAt(eye, target, up); + mat *= trans(vec3(ca, 0, cd) * 2.); + mat *= rotX(time + abs(ca) * 5.); + mat *= rotZ(time + abs(cd) * 6.); + mat *= uniformScale(0.03); + + + gl_Position = mat * vec4(pos, 1); + vec3 n = normalize((mat * vec4(normal, 0)).xyz); + + vec3 lightDir = normalize(vec3(0.3, 0.4, -1)); + + float snd = texture2D(sound, vec2(mix(0.1, 0.5, abs(atan(ca, cd)) / PI), length(vec2(ca,cd))) * .5).a; + + float hue = abs(ca * cd) * 2.; + float sat = pow(snd, 5.); + float val = mix(1., 0.5, abs(cd)); + vec3 color = hsv2rgb(vec3(hue, sat, val)); + v_color = vec4(color * (dot(n, lightDir) * 0.5 + 0.5), pow(snd, 2.)); + v_color.rgb *= v_color.a; +} +#endif + +` + }, + revisionId: "2a6NsC49zwe5Z6NZ6", + revisionUrl: "https://www.vertexshaderart.com/art/ZFSiQpx33DLDg9hmd/revision/2a6NsC49zwe5Z6NZ6", + artUrl: "https://www.vertexshaderart.com/art/undefined" +}; diff --git a/examples/js/index/effects/pookymelon.js b/examples/js/index/effects/pookymelon.js new file mode 100644 index 0000000..597e610 --- /dev/null +++ b/examples/js/index/effects/pookymelon.js @@ -0,0 +1,388 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "A8Zc7NFQdTdeKQimv", + createdAt: "2017-09-30T17:14:27.900Z", + modifiedAt: "2017-09-30T17:14:27.900Z", + origId: "7TrYkuK4aHzLqvZ7r", + name: "pookymelon", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 97200, + mode: "TRIANGLES", + sound: "https://soundcloud.com/mixmag-1/premiere-michael-klein-pan-pot-haze-effect", + lineSize: "NATIVE", + backgroundColor: [ + 0, + 0, + 0, + 1 + ], + shader: `/* + +┬ ┬┌─┐┬─┐┌┬┐┌─┐─┐ ┬┌─┐┬ ┬┌─┐┌┬┐┌─┐┬─┐┌─┐┬─┐┌┬┐ +└┐┌┘├┤ ├┬┘ │ ├┤ ┌┴┬┘└─┐├─┤├─┤ ││├┤ ├┬┘├─┤├┬┘ │ + └┘ └─┘┴└─ ┴ └─┘┴ └─└─┘┴ ┴┴ ┴─┴┘└─┘┴└─┴ ┴┴└─ ┴ + +*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#define PI radians(180.0) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +mat4 rotX(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + 1, 0, 0, 0, + 0, c, s, 0, + 0, -s, c, 0, + 0, 0, 0, 1); +} + +mat4 rotY(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + +mat4 rotZ(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +// times 2 minus 1 +float t2m1(float v) { + return v * 2. - 1.; +} + +// times .5 plus .5 +float t5p5(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + + +#define NUM_EDGE_POINTS_PER_CIRCLE 100. +#define NUM_POINTS_PER_DIVISION (NUM_EDGE_POINTS_PER_CIRCLE * 6.) +#define NUM_POINTS_PER_CIRCLE (NUM_SUBDIVISIONS_PER_CIRCLE * NUM_POINTS_PER_DIVISION) +void getCirclePoint(const float id, const float inner, const float start, const float end, out vec3 pos, out vec4 uvf, out float snd) { + float NUM_SUBDIVISIONS_PER_CIRCLE = floor(vertexCount / NUM_POINTS_PER_DIVISION); + float edgeId = mod(id, NUM_POINTS_PER_DIVISION); + float ux = floor(edgeId / 6.) + mod(edgeId, 2.); + float vy = mod(floor(id / 2.) + floor(id / 3.), 2.); // change that 3. for cool fx + float sub = floor(id / NUM_POINTS_PER_DIVISION); + float subV = sub / (NUM_SUBDIVISIONS_PER_CIRCLE - 1.); + float level = subV + vy / (NUM_SUBDIVISIONS_PER_CIRCLE - 1.); + float u = ux / NUM_EDGE_POINTS_PER_CIRCLE; + float v = 1.;//mix(inner, 1., level); + float ringId = sub + vy; + float ringV = ringId / NUM_SUBDIVISIONS_PER_CIRCLE; + float numRings = vertexCount / NUM_SUBDIVISIONS_PER_CIRCLE; + float a = mix(start, end, u) * PI * 2. + PI * 0.0; + float skew = 1. - step(0.5, mod(ringId - 2., 3.)); + float su = fract(abs(u * 2. - 1.) + time * 0.1); + + a += 1. / NUM_EDGE_POINTS_PER_CIRCLE * PI * 2.;// * 20. * sin(time * 1.) + snd * 1.5; + float s = sin(a); + float c = cos(a); + float z = mix(inner, 2., level) - vy / NUM_SUBDIVISIONS_PER_CIRCLE * 0.; + float x = c * v * z; + float y = s * v * z; + pos = vec3(x, y, 0.); + uvf = vec4(floor(edgeId / 6.) / NUM_EDGE_POINTS_PER_CIRCLE, subV, floor(id / 6.), sub); +} + +float goop(float t) { + return sin(t) + sin(t * 0.27) + sin(t * 0.13) + sin(t * 0.73); +} + +float modStep(float count, float steps) { + return mod(count, steps) / steps; +} + + +void main() { + float numQuads = floor(vertexCount / 6.); + float around = 180.; + float down = numQuads / around; + float quadId = floor(vertexId / 6.); + + float qx = mod(quadId, around); + float qy = floor(quadId / around); + + // 0--1 3 + // | / /| + // |/ / | + // 2 4--5 + // + // 0 1 0 1 0 1 + // 0 0 1 0 1 1 + + float edgeId = mod(vertexId, 6.); + float ux = mod(edgeId, 2.); + float vy = mod(floor(edgeId / 2.) + floor(edgeId / 3.), 2.); + + float qu = (qx + ux) / around; + float qv = (qy + vy) / down; + + float r = sin(qv * PI); + float x = cos(qu * PI * 2.) * r; + float z = sin(qu * PI * 2.) * r; + + vec3 pos = vec3(x, cos(qv * PI), z); + vec3 nrm = vec3( + cos((qx + .5) / around * PI * 2.), + cos((qy + .5) / down * PI), + sin((qx + .5) / around * PI * 2.) + ); + + float tm = time * 1.1; + float rd = mix(2., 3.5, t5p5(sin(time * 0.11))); + mat4 mat = persp(PI * 0.25, resolution.x / resolution.y, 0.1, 100.); + vec3 eye = vec3(cos(tm) * rd, sin(tm * 0.9) * .0 + 0., sin(tm) * rd); + vec3 target = vec3(0); + vec3 up = vec3(0,sin(tm),cos(tm)); + + float s = texture2D(sound, vec2(mix(0.1, .25, abs(qu * 2. - 1.)), mix(0., .12, qv))).a; + + mat *= cameraLookAt(eye, target, up); + mat *= uniformScale(mix(0.5, 2.5, pow(s + .15, 5.))); + + gl_Position = mat * vec4(pos, 1); + gl_PointSize = 4.; + + float odd = mod(floor(quadId / 2.), 2.); + float hue = time * .1 +s * .15; + float sat = mix(0., 3., pow(s, 5.)); + float val = mix(0.1, 1., pow(s + .4, 15.)); + v_color = vec4(hsv2rgb(vec3(hue, sat, val)), 1.); + + + v_color.rgb *= v_color.a; + + + +}` + }, + revisionId: "8TbPNzy7gAKpNs7Hj", + revisionUrl: "https://www.vertexshaderart.com/art/A8Zc7NFQdTdeKQimv/revision/8TbPNzy7gAKpNs7Hj", + artUrl: "https://www.vertexshaderart.com/art/undefined", + origUrl: "https://www.vertexshaderart.com/art/7TrYkuK4aHzLqvZ7r" +}; diff --git a/examples/js/index/effects/rollin.js b/examples/js/index/effects/rollin.js new file mode 100644 index 0000000..576cbed --- /dev/null +++ b/examples/js/index/effects/rollin.js @@ -0,0 +1,629 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "FPFBuCexgLQpriEoS", + createdAt: "2016-01-17T01:42:37.484Z", + modifiedAt: "2016-01-23T14:53:24.281Z", + origId: "bbsF39W6bJo3j4R3j", + name: "rollin", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "TRIANGLES", + sound: "https://soundcloud.com/chill/ed-sheeran-i-see-fire-kalev-remix", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 1, + 1, + 1 + ], + shader: `/* + + ___ ___ _______ ________ _________ _______ ___ ___ +|\ \ / /|\ ___ \ |\ __ \|\___ ___|\ ___ \ |\ \ / /| +\ \ \ / / \ \ __/|\ \ \|\ \|___ \ \_\ \ __/| \ \ \/ / / + \ \ \/ / / \ \ \_|/_\ \ _ _\ \ \ \ \ \ \_|/__ \ \ / / + \ \ / / \ \ \_|\ \ \ \\ \| \ \ \ \ \ \_|\ \ / \/ + \ \__/ / \ \_______\ \__\\ _\ \ \__\ \ \_______\/ /\ \ + \|__|/ \|_______|\|__|\|__| \|__| \|_______/__/ /\ __\ + |__|/ \|__| + + + ________ ___ ___ ________ ________ _______ ________ +|\ ____\|\ \|\ \|\ __ \|\ ___ \|\ ___ \ |\ __ \ +\ \ \___|\ \ \\\ \ \ \|\ \ \ \_|\ \ \ __/|\ \ \|\ \ + \ \_____ \ \ __ \ \ __ \ \ \ \\ \ \ \_|/_\ \ _ _\ + \|____|\ \ \ \ \ \ \ \ \ \ \ \_\\ \ \ \_|\ \ \ \\ \| + ____\_\ \ \__\ \__\ \__\ \__\ \_______\ \_______\ \__\\ _\ + |\_________\|__|\|__|\|__|\|__|\|_______|\|_______|\|__|\|__| + \|_________| + + + ________ ________ _________ +|\ __ \|\ __ \|\___ ___\ +\ \ \|\ \ \ \|\ \|___ \ \_| + \ \ __ \ \ _ _\ \ \ \ + \ \ \ \ \ \ \\ \| \ \ \ + \ \__\ \__\ \__\\ _\ \ \__\ + \|__|\|__|\|__|\|__| \|__| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +*/ + +vec3 gSunColor = vec3(1.0, 1.2, 1.4) * 10.1; + +vec3 gSkyTop = vec3( 0.1, 0.2, 0.8 ) * 0.5; +vec3 gSkyBottom = vec3( 0.5, 0.8, 1.0 ) * 1.5; + +vec3 gCubeColor = vec3(1.0, 1.0, 1.0); +float gExposure = 0.3; + +float gCubeColorRandom = 0.0; + +#define MOVE_OUTWARDS + +float fAOAmount = 0.8; +float gFloorHeight = -1.0; +float g_cameraFar = 1000.0; + +#define PI radians( 180.0 ) + + +vec3 GetSunDir() +{ + return normalize( vec3( 20.0, 40.3, -10.4 ) ); +} + +struct SceneVertex +{ + vec3 vWorldPos; + vec3 vColor; + float fAlpha; +}; + + +float GetCosSunRadius() +{ + return 0.01; +} + + +float GetSunIntensity() +{ + return 0.001; +} + + +vec3 GetSkyColor( vec3 vViewDir ) +{ + return mix( gSkyBottom, gSkyTop, max( 0.0, vViewDir.y ) ); +} +const float g_cubeFaces = 6.0; +const float g_cubeVerticesPerFace = ( 2.0 * 3.0 ); +const float g_cubeVertexCount = ( g_cubeVerticesPerFace * g_cubeFaces ); + +// 6 7 +// +----------+ +// /| /| +// 2 / | 3/ | +// +----------+ | +// | | | | +// Y Z | 4| | 5| +// | +-------|--+ +// ^ / | / | / +// |/ 0|/ 1|/ +// +--> X +----------+ + +vec3 GetCubeVertex( float fVertexIndex ) +{ + float f = fVertexIndex / 8.0; + return vec3( + mix(-1., 1., step(0.5, fract(f * 4.))), + mix(-1., 1., step(0.5, fract(f * 2.))), + mix(-1., 1., step(0.5, fract(f)))); +} + + +void GetCubeVertex( const float vertexIndex, const mat4 mat, out vec3 vWorldPos, out vec3 vWorldNormal ) +{ + float fFaceIndex = floor( vertexIndex / g_cubeFaces ); + + vec3 v0, v1, v2, v3; + + if ( fFaceIndex < 0.5 ) + { + v0 = GetCubeVertex( 0.0 ); + v1 = GetCubeVertex( 2.0 ); + v2 = GetCubeVertex( 3.0 ); + v3 = GetCubeVertex( 1.0 ); + } + else if ( fFaceIndex < 1.5 ) + { + v0 = GetCubeVertex( 5.0 ); + v1 = GetCubeVertex( 7.0 ); + v2 = GetCubeVertex( 6.0 ); + v3 = GetCubeVertex( 4.0 ); + } + else if ( fFaceIndex < 2.5 ) + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 3.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 5.0 ); + } + else if ( fFaceIndex < 3.5 ) + { + v0 = GetCubeVertex( 4.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 2.0 ); + v3 = GetCubeVertex( 0.0 ); + } + else if ( fFaceIndex < 4.5 ) + { + v0 = GetCubeVertex( 2.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 3.0 ); + } + else + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 5.0 ); + v2 = GetCubeVertex( 4.0 ); + v3 = GetCubeVertex( 0.0 ); + } + v0 = (mat * vec4(v0, 1)).xyz; + v1 = (mat * vec4(v1, 1)).xyz; + v2 = (mat * vec4(v2, 1)).xyz; + v3 = (mat * vec4(v3, 1)).xyz; + + float fFaceVertexIndex = mod( vertexIndex, 6.0 ); + + if ( fFaceVertexIndex < 0.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 1.5 ) + { + vWorldPos = v1; + } + else if ( fFaceVertexIndex < 2.5 ) + { + vWorldPos = v2; + } + else if ( fFaceVertexIndex < 3.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 4.5 ) + { + vWorldPos = v2; + } + else + { + vWorldPos = v3; + } + + vWorldNormal = normalize( cross( v1 - v0, v2 - v0 ) ); +} + + +vec3 GetSunLighting( const vec3 vNormal ) +{ + vec3 vLight = -GetSunDir(); + + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + return gSunColor * NdotL; +} + + +vec3 GetSunSpec( const vec3 vPos, const vec3 vNormal, const vec3 vCameraPos ) +{ + vec3 vLight = -GetSunDir(); + + vec3 vView = normalize( vCameraPos - vPos ); + + vec3 vH = normalize( vView - vLight ); + + float NdotH = max( 0.0, dot( vNormal, vH ) ); + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + float f = mix( 0.01, 1.0, pow( 1.0 - NdotL, 5.0 ) ); + + return gSunColor * pow( NdotH, 20.0 ) * NdotL * f * 4.0; +} + + +vec3 GetSkyLighting( const vec3 vNormal ) +{ + vec3 vSkyLight = normalize( vec3( -1.0, -2.0, -0.5 ) ); + + float fSkyBlend = vNormal.y * 0.5 + 0.5; + + return mix( gSkyBottom, gSkyTop, fSkyBlend ); +} + + +void GenerateCubeVertex( const float vertexIndex, const mat4 mat, const vec3 vCubeCol, const vec3 vCameraPos, out SceneVertex outSceneVertex ) +{ + vec3 vNormal; + + GetCubeVertex( vertexIndex, mat, outSceneVertex.vWorldPos, vNormal ); + + outSceneVertex.vColor = vec3( 0.0 ); + + outSceneVertex.fAlpha = 1.0; + + float h = outSceneVertex.vWorldPos.y - gFloorHeight; + outSceneVertex.vColor += GetSkyLighting( vNormal ); + outSceneVertex.vColor *= mix( 1.0, fAOAmount, clamp( h, 0.0, 1.0 ) ); + + outSceneVertex.vColor += GetSunLighting( vNormal ); + + outSceneVertex.vColor *= vCubeCol; + + outSceneVertex.vColor += GetSunSpec( outSceneVertex.vWorldPos, vNormal, vCameraPos ); +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) +{ + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + + +mat4 rotY( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + + +mat4 rotZ( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + #if 0 + return mat4( + 1, 0, 0, trans[0], + 0, 1, 0, trans[1], + 0, 0, 1, trans[2], + 0, 0, 0, 1); + #else + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); + #endif +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + +float m1p1(float v) { + return v * 2. - 1.; +} + +float p1m1(float v) { + return v * .5 + .5; +} + +float inRange(float v, float minV, float maxV) { + return step(minV, v) * step(v, maxV); +} + +float at(float v, float target) { + return inRange(v, target - 0.1, target + 0.1); +} + +float easeInOutCubic(float pos) { + if (pos < 0.5) { + return 0.5 * pow(pos / 0.5, 3.); + } + pos -= 0.5; + pos /= 0.5; + pos = 1. - pos; + return (1. - pow(pos, 3.)) * 0.5 + 0.5; +} + +float inOut(float v) { + float t = fract(v); + if (t < 0.5) { + return easeInOutCubic(t / 0.5); + } + return easeInOutCubic(2. - t * 2.); +} + +const float perBlock = 4.; + +uniform vec3 baseColor; +uniform float heightMult; +uniform float period1; +uniform float period2; +uniform float p1; +uniform float p2; + +float spow(float v, float p) { + return pow(abs(v), p) * sign(v); +} + +void GetCubePosition( float fCubeId, float numCubes, out mat4 mat, out vec4 vCubeCol ) +{ + float fSeed = fCubeId; + float fPositionBase = fCubeId; + float fSize = 1.0; + + vec3 vCubeOrigin = vec3( 0.0, 0.0, 0.0 ); + + float across = 48.; + float down = 32.; + float uId = mod(fCubeId, across); + float vId = floor(fCubeId / across); + float u = uId / (across); + float v = vId / down; + float bxId = floor(uId / perBlock); + float bzId = floor(vId / perBlock); + float numRows = floor(numCubes / across); + float numBlocks = floor(numRows / perBlock); + + float snd = 1.;texture2D(sound, vec2(mix(0.015, 0.015, u), v * 0.1)).a; + float s2 = 0.;texture2D(sound, vec2(mix(0.02, 0.04, hash(u + v + 2.34)), hash(v) * 0.05)).a; + + vCubeOrigin.x += m1p1(u) * across * 1.0 + bxId * 0. ; + float vSpace = numRows * 2.0 + numBlocks * 0.; + float z = v * down * 2.0 + bzId * 0.; + vCubeOrigin.z += z; + float height = 1.; + vCubeOrigin.y += spow(sin(time + v * period1), p1) * spow(cos(time + u * period2), p2) * heightMult * inOut(time * 0.1); + + mat = ident(); + mat *= trans(vCubeOrigin); + mat *= scale(vec3(1, height, 1) * snd); + + vec3 vRandCol; + + + vCubeCol.rgb = hsv2rgb(vec3( + 0.2 + floor(time * 0.1) * 0.1 + easeInOutCubic(fract(time * 0.1)) * 0.1, + 0.95, + 1)); + vCubeCol.rgb = baseColor; + vCubeCol.a = vCubeOrigin.z / vSpace; +} + +float goop(float t) { + return sin(t) * sin(t * 0.27) * sin(t * 0.13) * sin(t * 0.73); +} + + +void main() +{ + SceneVertex sceneVertex; + + float fov = 1.8; + + vec3 vCameraTarget = vec3( 600, -400.6, 1000.0 ); + vec3 vCameraPos = vec3(-45.1, 6., -0.); + float ca = 0.; + + // get sick! + // ca = time + sin(time) * 2.; + vec3 vCameraUp = vec3( sin(ca), cos(ca), 0.0 ); + + vec3 vCameraForwards = normalize(vCameraTarget - vCameraPos); + + float vertexIndex = vertexId; + + + float fCubeId = floor( vertexIndex / g_cubeVertexCount ); + float fCubeVertex = mod( vertexIndex, g_cubeVertexCount ); + float fNumCubes = floor( vertexCount / g_cubeVertexCount ); + + mat4 mCube; + vec4 vCubeCol; + + GetCubePosition( fCubeId, fNumCubes, mCube, vCubeCol ); + + GenerateCubeVertex( fCubeVertex, mCube, vCubeCol.xyz, vCameraPos, sceneVertex ); + + mat4 m = persp(radians(45.), resolution.x / resolution.y, 0.1, 1000.); + m *= cameraLookAt(vCameraPos, vCameraTarget, vCameraUp); + gl_Position = m * vec4(sceneVertex.vWorldPos, 1); + + // Final output color + float fExposure = gExposure;// min( gExposure, time * 0.1 ); + vec3 vFinalColor = sqrt( vec3(1.0) - exp2( sceneVertex.vColor * -fExposure ) ); + + v_color = mix(vec4(vFinalColor, 1), background, vCubeCol.a); + +}` + }, + revisionId: "rThcGALqhF88J2BET", + revisionUrl: "https://www.vertexshaderart.com/art/FPFBuCexgLQpriEoS/revision/rThcGALqhF88J2BET", + artUrl: "https://www.vertexshaderart.com/art/undefined", + origUrl: "https://www.vertexshaderart.com/art/bbsF39W6bJo3j4R3j" +}; diff --git a/examples/js/index/effects/starfield.js b/examples/js/index/effects/starfield.js new file mode 100644 index 0000000..20cdb36 --- /dev/null +++ b/examples/js/index/effects/starfield.js @@ -0,0 +1,317 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "pfa9757K3NJx6euhN", + createdAt: "2019-02-21T11:38:22.742Z", + modifiedAt: "2019-02-26T06:41:10.489Z", + origId: null, + name: "starfield", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "POINTS", + sound: "", + lineSize: "NATIVE", + backgroundColor: [ + 0, + 0, + 0, + 1 + ], + shader: `#define PI radians(180.0) + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + + +mat4 rotX(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + 1, 0, 0, 0, + 0, c, s, 0, + 0, -s, c, 0, + 0, 0, 0, 1); +} + +mat4 rotY(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + +mat4 rotZ(float angleInRadians) { + float s = sin(angleInRadians); + float c = cos(angleInRadians); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) { + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +// times 2 minus 1 +float t2m1(float v) { + return v * 2. - 1.; +} + +// times .5 plus .5 +float t5p5(float v) { + return v * 0.5 + 0.5; +} + +float inv(float v) { + return 1. - v; +} + + +void main() { + + float near = 0.01; + float far = 25.0; + mat4 pmat = persp(radians(60.0), resolution.x / resolution.y, near, far); + mat4 cmat = ident(); + cmat *= rotX(mouse.y * PI); + cmat *= rotY(mouse.x * -PI); + mat4 vmat = inverse(cmat); + + vec3 pos = vec3( + hash(vertexId * 0.123), + hash(vertexId * 0.357), + // fract(hash(vertexId * 0.531) - time * .01)) * vec3(2, 2, -40) - vec3(1, 1, -20); + fract(hash(vertexId * 0.531) + time * .05)) * 2. - 1.; + float d = length(pos); + pos *= vec3(2); + + vec3 boxMin = (cmat * vec4(-1, -1, 0, 1)).xyz; + vec3 boxMax = (cmat * vec4(1, 1, -20, 1)).xyz; + + + + + /* + + +--------+--------+--------+--------+ + | | | | | + | |\ | | | + | | \ | | | + | | \ | | | + +--------+--------+--------+--------+ + | | \ | | | + | | \ | | | + | | \ | | | + | | \| | | + +--------+--------c--------+--------+ + | | /| | | + | | / | | | + | | / | | | + | | / | | | + +--------+--------+--------+--------+ + | | / | | | + | | / | | | + | |/ | | | + | | | | | + +--------+--------+--------+--------+ + + */ + + + //mat[2][2] /= far; + //mat[2][3] /= far; + + gl_Position = pmat * vmat * vec4(pos, 1); + // gl_Position.z = gl_Position.z * gl_Position.w / far; + + + /* +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + + rangeInv = 1.0 / (near - far) + rangnInv = 1.0 / (0.01 - 25.0) + rangeInv = 1.0 / -24.99 + rangeInv = -0.040016006402561027 + + -0.1 * (0.1 + 25.0) * -0.04001 + 1 * (0.1 * 25.0 * -0.04001) * 2 = -0.000996 + -20 * (0.1 + 25.0) * -0.04001 + 1 * (0.1 * 25.0 * -0.04001) * 2 = 0.1988 + + + */ + + vec4 f = gl_Position; + float depth = f.z * .5 + .5; + + gl_PointSize = mix(10.0, 1.0, depth); + v_color = vec4(hsv2rgb(vec3(hash(vertexId * 0.237), 0.25, 1)), 1. - d); + v_color.rgb *= v_color.a; +// v_color = vec4(hsv2rgb(vec3(depth, 1, 1)), 1); +}` + }, + revisionId: "oTpAmrwEQsSFL3L3y", + revisionUrl: "https://www.vertexshaderart.com/art/pfa9757K3NJx6euhN/revision/oTpAmrwEQsSFL3L3y", + artUrl: "https://www.vertexshaderart.com/art/undefined" +}; diff --git a/examples/js/index/effects/ung.js b/examples/js/index/effects/ung.js new file mode 100644 index 0000000..f68da90 --- /dev/null +++ b/examples/js/index/effects/ung.js @@ -0,0 +1,621 @@ +/* eslint-disable require-trailing-comma/require-trailing-comma */ +/* eslint-disable no-useless-escape */ +export default { + _id: "9mqwFjEipb8pPtcPw", + createdAt: "2016-01-25T18:48:08.828Z", + modifiedAt: "2018-03-30T01:58:37.742Z", + origId: "FPFBuCexgLQpriEoS", + name: "ung", + username: "gman", + avatarUrl: "https://secure.gravatar.com/avatar/dcc0309895c3d6db087631813efaa9d1?default=retro&size=200", + settings: { + num: 100000, + mode: "TRIANGLES", + sound: "https://soundcloud.com/substruk-records/sub032-sixis-orbital-substruk", + lineSize: "NATIVE", + backgroundColor: [ + 1, + 1, + 1, + 1 + ], + shader: `/* + + ___ ___ _______ ________ _________ _______ ___ ___ +|\ \ / /|\ ___ \ |\ __ \|\___ ___|\ ___ \ |\ \ / /| +\ \ \ / / \ \ __/|\ \ \|\ \|___ \ \_\ \ __/| \ \ \/ / / + \ \ \/ / / \ \ \_|/_\ \ _ _\ \ \ \ \ \ \_|/__ \ \ / / + \ \ / / \ \ \_|\ \ \ \\ \| \ \ \ \ \ \_|\ \ / \/ + \ \__/ / \ \_______\ \__\\ _\ \ \__\ \ \_______\/ /\ \ + \|__|/ \|_______|\|__|\|__| \|__| \|_______/__/ /\ __\ + |__|/ \|__| + + + ________ ___ ___ ________ ________ _______ ________ +|\ ____\|\ \|\ \|\ __ \|\ ___ \|\ ___ \ |\ __ \ +\ \ \___|\ \ \\\ \ \ \|\ \ \ \_|\ \ \ __/|\ \ \|\ \ + \ \_____ \ \ __ \ \ __ \ \ \ \\ \ \ \_|/_\ \ _ _\ + \|____|\ \ \ \ \ \ \ \ \ \ \ \_\\ \ \ \_|\ \ \ \\ \| + ____\_\ \ \__\ \__\ \__\ \__\ \_______\ \_______\ \__\\ _\ + |\_________\|__|\|__|\|__|\|__|\|_______|\|_______|\|__|\|__| + \|_________| + + + ________ ________ _________ +|\ __ \|\ __ \|\___ ___\ +\ \ \|\ \ \ \|\ \|___ \ \_| + \ \ __ \ \ _ _\ \ \ \ + \ \ \ \ \ \ \\ \| \ \ \ + \ \__\ \__\ \__\\ _\ \ \__\ + \|__|\|__|\|__|\|__| \|__| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +*/ + +vec3 gSunColor = vec3(1.0, 1.2, 1.4) * 10.; + +vec3 gSkyTop = vec3( 0.1, 0.2, 0.8 ) * 0.5; +vec3 gSkyBottom = vec3( 0.5, 0.8, 1.0 ) * 1.5; + +vec3 gCubeColor = vec3(1.0, 1.0, 1.0); +float gExposure = 0.3; + +float gCubeColorRandom = 0.0; + +#define MOVE_OUTWARDS + +float fAOAmount = 0.8; +float gFloorHeight = -1.0; +float g_cameraFar = 1000.0; + +#define PI radians( 180.0 ) + + +vec3 GetSunDir() +{ + return normalize( vec3( 20.0, 40.3, -10.4 ) ); +} + +struct SceneVertex +{ + vec3 vWorldPos; + vec3 vColor; + float fAlpha; +}; + + +float GetCosSunRadius() +{ + return 0.01; +} + + +float GetSunIntensity() +{ + return 0.001; +} + + +vec3 GetSkyColor( vec3 vViewDir ) +{ + return mix( gSkyBottom, gSkyTop, max( 0.0, vViewDir.y ) ); +} +const float g_cubeFaces = 6.0; +const float g_cubeVerticesPerFace = ( 2.0 * 3.0 ); +const float g_cubeVertexCount = ( g_cubeVerticesPerFace * g_cubeFaces ); + +// 6 7 +// +----------+ +// /| /| +// 2 / | 3/ | +// +----------+ | +// | | | | +// Y Z | 4| | 5| +// | +-------|--+ +// ^ / | / | / +// |/ 0|/ 1|/ +// +--> X +----------+ + +vec3 GetCubeVertex( float fVertexIndex ) +{ + float f = fVertexIndex / 8.0; + return vec3( + mix(-1., 1., step(0.5, fract(f * 4.))), + mix(-1., 1., step(0.5, fract(f * 2.))), + mix(-1., 1., step(0.5, fract(f)))); +} + + +void GetCubeVertex( const float vertexIndex, const mat4 mat, out vec3 vWorldPos, out vec3 vWorldNormal ) +{ + float fFaceIndex = floor( vertexIndex / g_cubeFaces ); + + vec3 v0, v1, v2, v3; + + if ( fFaceIndex < 0.5 ) + { + v0 = GetCubeVertex( 0.0 ); + v1 = GetCubeVertex( 2.0 ); + v2 = GetCubeVertex( 3.0 ); + v3 = GetCubeVertex( 1.0 ); + } + else if ( fFaceIndex < 1.5 ) + { + v0 = GetCubeVertex( 5.0 ); + v1 = GetCubeVertex( 7.0 ); + v2 = GetCubeVertex( 6.0 ); + v3 = GetCubeVertex( 4.0 ); + } + else if ( fFaceIndex < 2.5 ) + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 3.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 5.0 ); + } + else if ( fFaceIndex < 3.5 ) + { + v0 = GetCubeVertex( 4.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 2.0 ); + v3 = GetCubeVertex( 0.0 ); + } + else if ( fFaceIndex < 4.5 ) + { + v0 = GetCubeVertex( 2.0 ); + v1 = GetCubeVertex( 6.0 ); + v2 = GetCubeVertex( 7.0 ); + v3 = GetCubeVertex( 3.0 ); + } + else + { + v0 = GetCubeVertex( 1.0 ); + v1 = GetCubeVertex( 5.0 ); + v2 = GetCubeVertex( 4.0 ); + v3 = GetCubeVertex( 0.0 ); + } + v0 = (mat * vec4(v0, 1)).xyz; + v1 = (mat * vec4(v1, 1)).xyz; + v2 = (mat * vec4(v2, 1)).xyz; + v3 = (mat * vec4(v3, 1)).xyz; + + float fFaceVertexIndex = mod( vertexIndex, 6.0 ); + + if ( fFaceVertexIndex < 0.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 1.5 ) + { + vWorldPos = v1; + } + else if ( fFaceVertexIndex < 2.5 ) + { + vWorldPos = v2; + } + else if ( fFaceVertexIndex < 3.5 ) + { + vWorldPos = v0; + } + else if ( fFaceVertexIndex < 4.5 ) + { + vWorldPos = v2; + } + else + { + vWorldPos = v3; + } + + vWorldNormal = normalize( cross( v1 - v0, v2 - v0 ) ); +} + + +vec3 GetSunLighting( const vec3 vNormal ) +{ + vec3 vLight = -GetSunDir(); + + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + return gSunColor * NdotL; +} + + +vec3 GetSunSpec( const vec3 vPos, const vec3 vNormal, const vec3 vCameraPos ) +{ + vec3 vLight = -GetSunDir(); + + vec3 vView = normalize( vCameraPos - vPos ); + + vec3 vH = normalize( vView - vLight ); + + float NdotH = max( 0.0, dot( vNormal, vH ) ); + float NdotL = max( 0.0, dot( vNormal, -vLight ) ); + + float f = mix( 0.01, 1.0, pow( 1.0 - NdotL, 5.0 ) ); + + return gSunColor * pow( NdotH, 20.0 ) * NdotL * f * 4.0; +} + + +vec3 GetSkyLighting( const vec3 vNormal ) +{ + vec3 vSkyLight = normalize( vec3( -1.0, -2.0, -0.5 ) ); + + float fSkyBlend = vNormal.y * 0.5 + 0.5; + + return mix( gSkyBottom, gSkyTop, fSkyBlend ); +} + + +void GenerateCubeVertex( const float vertexIndex, const mat4 mat, const vec3 vCubeCol, const vec3 vCameraPos, out SceneVertex outSceneVertex ) +{ + vec3 vNormal; + + GetCubeVertex( vertexIndex, mat, outSceneVertex.vWorldPos, vNormal ); + + outSceneVertex.vColor = vec3( 0.0 ); + + outSceneVertex.fAlpha = 1.0; + + float h = outSceneVertex.vWorldPos.y - gFloorHeight; + outSceneVertex.vColor += GetSkyLighting( vNormal ); + outSceneVertex.vColor *= mix( 1.0, fAOAmount, clamp( h, 0.0, 1.0 ) ); + + outSceneVertex.vColor += GetSunLighting( vNormal ); + + outSceneVertex.vColor *= vCubeCol; + + outSceneVertex.vColor += GetSunSpec( outSceneVertex.vWorldPos, vNormal, vCameraPos ); +} + + + +// hash function from https://www.shadertoy.com/view/4djSRW +float hash(float p) +{ + vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427)); + p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137)); + return fract(p2.x * p2.y * 95.4337); +} + +vec3 hsv2rgb(vec3 c) { + c = vec3(c.x, clamp(c.yz, 0.0, 1.0)); + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + + +mat4 rotY( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c, 0,-s, 0, + 0, 1, 0, 0, + s, 0, c, 0, + 0, 0, 0, 1); +} + + +mat4 rotZ( float angle ) { + float s = sin( angle ); + float c = cos( angle ); + + return mat4( + c,-s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 trans(vec3 trans) { + #if 0 + return mat4( + 1, 0, 0, trans[0], + 0, 1, 0, trans[1], + 0, 0, 1, trans[2], + 0, 0, 0, 1); + #else + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + trans, 1); + #endif +} + +mat4 ident() { + return mat4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +} + +mat4 uniformScale(float s) { + return mat4( + s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0, + 0, 0, 0, 1); +} + +mat4 scale(vec3 s) { + return mat4( + s[0], 0, 0, 0, + 0, s[1], 0, 0, + 0, 0, s[2], 0, + 0, 0, 0, 1); +} + +mat4 persp(float fov, float aspect, float zNear, float zFar) { + float f = tan(PI * 0.5 - 0.5 * fov); + float rangeInv = 1.0 / (zNear - zFar); + + return mat4( + f / aspect, 0, 0, 0, + 0, f, 0, 0, + 0, 0, (zNear + zFar) * rangeInv, -1, + 0, 0, zNear * zFar * rangeInv * 2., 0); +} + +mat4 trInv(mat4 m) { + mat3 i = mat3( + m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); + vec3 t = -i * m[3].xyz; + + return mat4( + i[0], t[0], + i[1], t[1], + i[2], t[2], + 0, 0, 0, 1); +} + +mat4 transpose(mat4 m) { + return mat4( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3]); +} + +mat4 lookAt(vec3 eye, vec3 target, vec3 up) { + vec3 zAxis = normalize(eye - target); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + eye, 1); +} + +mat4 inverse(mat4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return mat4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +mat4 cameraLookAt(vec3 eye, vec3 target, vec3 up) { + #if 1 + return inverse(lookAt(eye, target, up)); + #else + vec3 zAxis = normalize(target - eye); + vec3 xAxis = normalize(cross(up, zAxis)); + vec3 yAxis = cross(zAxis, xAxis); + + return mat4( + xAxis, 0, + yAxis, 0, + zAxis, 0, + -dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1); + #endif + +} + + +float m1p1(float v) { + return v * 2. - 1.; +} + +float p1m1(float v) { + return v * .5 + .5; +} + +float inRange(float v, float minV, float maxV) { + return step(minV, v) * step(v, maxV); +} + +float at(float v, float target) { + return inRange(v, target - 0.1, target + 0.1); +} + +float easeInOutCubic(float pos) { + if (pos < 0.5) { + return 0.5 * pow(pos / 0.5, 3.); + } + pos -= 0.5; + pos /= 0.5; + pos = 1. - pos; + return (1. - pow(pos, 3.)) * 0.5 + 0.5; +} + +float inOut(float v) { + float t = fract(v); + if (t < 0.5) { + return easeInOutCubic(t / 0.5); + } + return easeInOutCubic(2. - t * 2.); +} + +const float perBlock = 4.; + +void GetCubePosition( float fCubeId, float numCubes, out mat4 mat, out vec4 vCubeCol ) +{ + float fSeed = fCubeId; + float fPositionBase = fCubeId; + float fSize = 1.0; + + vec3 vCubeOrigin = vec3( 0.0, 0.0, 0.0 ); + + float across = 48.; + float down = 32.; + float uId = mod(fCubeId, across); + float vId = floor(fCubeId / across); + float u = uId / (across); + float v = vId / down; + float bxId = floor(uId / perBlock); + float bzId = floor(vId / perBlock); + float numRows = floor(numCubes / across); + float numBlocks = floor(numRows / perBlock); + + float a = atan(u - 0.5, v - .5); + float r = length(vec2(u - 0.5, v - .5)); + float snd = texture2D(sound, vec2(mix(0.0, 0.0135, abs(a / PI)), r * 0.3)).a; + float s2 = 0.;texture2D(sound, vec2(mix(0.02, 0.04, hash(u + v + 2.34)), hash(v) * 0.05)).a; + + vCubeOrigin.x += m1p1(u) * across * 1.0 + bxId * 0. ; + float vSpace = numRows * 2.0 + numBlocks * 0.; + float z = v * down * 2.0 + bzId * 0.; + vCubeOrigin.z += z; + float height = 0.1 + pow(snd, 5.) * 7.0; + vCubeOrigin.y += height;pow(sin(time + v * 9.), 1.) * pow(cos(time + u * 8.17), 1.) * 4. * inOut(time * 0.1); + + mat = ident(); + mat *= trans(vCubeOrigin); + mat *= scale(vec3(1, height, 1)); + + vec3 vRandCol; + + + vCubeCol.rgb = mix( + hsv2rgb(vec3(time * 0.1,0.7,0.8)), hsv2rgb(vec3(time * 0.1 + 0.5,1,1)), smoothstep(0.50,1., snd)); + // hsv2rgb(vec3( + // mix(1., 1.5, pow(snd, 5.)) + fract(time * 0.1), // + 0.2 + floor(time * 0.1) * 0.1 + easeInOutCubic(fract(time * 0.1)) * 0.1, + // 0.5 + snd * 0.5, + // 1)); + vCubeCol.a = vCubeOrigin.z / vSpace; +} + +float goop(float t) { + return sin(t) * sin(t * 0.27) * sin(t * 0.13) * sin(t * 0.73); +} + + +void main() +{ + SceneVertex sceneVertex; + + float fov = 1.8; + + vec3 vCameraTarget = vec3( sin(time) * 700., -600.6 + cos(time) * 100., 1000.0 ); + vec3 vCameraPos = vec3(sin(time) * -45.1, 40., -10.); + float ca = 0.; + + // get sick! + // ca = time + sin(time) * 2.; + vec3 vCameraUp = vec3( sin(ca), cos(ca), 0.0 ); + + vec3 vCameraForwards = normalize(vCameraTarget - vCameraPos); + + float vertexIndex = vertexId; + + + float fCubeId = floor( vertexIndex / g_cubeVertexCount ); + float fCubeVertex = mod( vertexIndex, g_cubeVertexCount ); + float fNumCubes = floor( vertexCount / g_cubeVertexCount ); + + mat4 mCube; + vec4 vCubeCol; + + GetCubePosition( fCubeId, fNumCubes, mCube, vCubeCol ); + + GenerateCubeVertex( fCubeVertex, mCube, vCubeCol.xyz, vCameraPos, sceneVertex ); + + mat4 m = persp(radians(45.), resolution.x / resolution.y, 0.1, 1000.); + m *= cameraLookAt(vCameraPos, vCameraTarget, vCameraUp); + gl_Position = m * vec4(sceneVertex.vWorldPos, 1); + + // Final output color + float fExposure = gExposure;// min( gExposure, time * 0.1 ); + vec3 vFinalColor = sqrt( vec3(1.0) - exp2( sceneVertex.vColor * -fExposure ) ); + + v_color = mix(vec4(vFinalColor, 1), background, vCubeCol.a); + +}` + }, + revisionId: "bF76cKMgYSz9qXQGS", + revisionUrl: "https://www.vertexshaderart.com/art/9mqwFjEipb8pPtcPw/revision/bF76cKMgYSz9qXQGS", + artUrl: "https://www.vertexshaderart.com/art/undefined", + origUrl: "https://www.vertexshaderart.com/art/FPFBuCexgLQpriEoS" +}; diff --git a/examples/js/index/index.js b/examples/js/index/index.js new file mode 100644 index 0000000..2620286 --- /dev/null +++ b/examples/js/index/index.js @@ -0,0 +1,293 @@ +import * as twgl from '../../3rdParty/twgl-full.module.js'; +import VSAEffect from './VSAEffect.js'; +import effects from './effects.js'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import GUI, { helpers, Direction, TextNumber } from '../../../src/esm.js'; + +const canvas = document.querySelector('#bg'); +const gl = canvas.getContext('webgl'); + +const elements = []; + +function render(time) { + time *= 0.001; + + twgl.resizeCanvasToDisplaySize(canvas); + + canvas.style.transform = `translateX(${window.scrollX}px) translateY(${window.scrollY}px)`; + + for (const {render, elem} of elements) { + const rect = elem.getBoundingClientRect(); + if (rect.bottom < 0 || rect.top > gl.canvas.clientHeight || + rect.right < 0 || rect.left > gl.canvas.clientWidth) { + continue; // it's off screen + } + + const width = rect.right - rect.left; + const height = rect.bottom - rect.top; + const left = rect.left; + const bottom = gl.canvas.clientHeight - rect.bottom; + + render(gl, { + time, + width, + height, + left, + bottom, + }); + } + requestAnimationFrame(render); +} +requestAnimationFrame(render); + +//const eff = Object.values(effects); +// eslint-disable-next-line no-underscore-dangle +//console.log(eff.map(e => `https://www.vertexshaderart.com/art/${e._id}`).join(' ')); + +const sections = { + basic({uiElem}) { + const gui = new GUI(uiElem); + const vsaEffect = new VSAEffect(gl); + const vsa = effects.discus; + + const settings = { + numSides: 4, + speed: 0, + brightness: 0.1, + opacity: 1, + run: true, + rotation: 0, + split: 0.96, + s1: 1, + s2: 1, + s3: 10, + s4: 10, + color1: [0.439, 0.463, 0.78], + color2: [1, 1, 0], + }; + gui.add(settings, 'run'); + gui.add(settings, 'numSides', { + keyValues: { + '△ triangle': 3, + '□ square': 4, + '⭔ pentagon': 5, + '⬡ hexagon': 6, + '○ circle': 48, + }, + }).name('shape'); + //gui.add(settings, 'brightness', 0, 1); + //gui.add(settings, 's1', 0, 1); + //gui.add(settings, 's2', 0, 1); + //gui.add(settings, 's3', 0, 50); + //gui.add(settings, 's4', 0, 50); + const degToRad = d => d * Math.PI / 180; + const radToDeg = r => r * 180 / Math.PI; + //gui.add(new Direction(settings, 'rotation', { + // converters: { + // to: v => { return radToDeg(v); }, + // from: v => { const outV = degToRad(v); console.log(outV); return [true, outV]; }, + // }, + //})); + gui.add(settings, 'rotation', { + min: -180, + max: 180, + converters: { + to: radToDeg, + from: v => [true, degToRad(v)], + }, + }); + gui.add(settings, 'split', 0, 1); + //gui.add(settings, 'count', 1, 100, 1); + gui.addColor(settings, 'color1'); + gui.addColor(settings, 'color2'); + + vsaEffect.setSettings(vsa); + + let time = 0; + let then = 0; + return function (gl, inputs) { + const deltaTime = settings.run ? (inputs.time - then) : 0; + then = inputs.time; + time += deltaTime; + vsaEffect.render(gl, { + ...inputs, + ...settings, + time, + }, { + getTime() { + return time * 44100 | 0; + }, + getDesiredSampleRate() { + return 44100; + }, + }, [ + { + frequencyBinCount: 4096, + getByteFrequencyData(b) { + const {s1, s2, s3, s4} = settings; + for (let i = 0; i < b.length; ++i) { + b[i] = (Math.sin(time * s1 + i * s3) + Math.sin(time * s2 + i * s4)) * 0.5 * 127 + 127; + } + }, + }, + ]); + }; + }, + float({uiElem}) { + const gui = new GUI(uiElem); + gui.setTheme('float'); + const vsaEffect = new VSAEffect(gl); + const vsa = effects.rollin; + + const settings = { + period1: 9, + period2: 8.17, + p1: 1, + p2: 1, + heightMult: 4, + baseColor: [0.02, 0.396, 1], + }; + gui.add(settings, 'period1', 0.1, 20); + gui.add(settings, 'period2', 0.1, 20); + gui.add(settings, 'p1', 0.1, 20); + gui.add(settings, 'p2', 0.1, 20); + gui.add(settings, 'heightMult', 1, 10); + gui.addColor(settings, 'baseColor'); + + vsaEffect.setSettings(vsa); + + return function (gl, inputs) { + vsaEffect.render(gl, { + ...inputs, + ...settings, + }, { + getTime() { + return inputs.time * 44100 | 0; + }, + getDesiredSampleRate() { + return 44100; + }, + }, [ + { + frequencyBinCount: 4096, + getByteFrequencyData(b) { + for (let i = 0; i < b.length; ++i) { + b[i] = Math.sin(inputs.time * 10 + i * 0.1) * 0.2 * 127 + 127; + } + }, + }, + ]); + }; + }, + form({uiElem}) { + const s = { + name: "Jane Cheng", + address1: "B 1, No. 5, Xuzhou R", + address2: "Taipei 100218", + email: "jane_c@notreally.notcom", + receipt: true, + currency: '$', + }; + + const gui = new GUI(uiElem).name(''); + gui.setTheme('form'); + gui.add(s, 'name'); + gui.add(s, 'address1'); + gui.add(s, 'address2'); + gui.add(s, 'email'); + gui.add(s, 'receipt'); + gui.add(s, 'currency', ['$', '¥', '€', '£', '₣']); + gui.addButton('submit', () => {}); + }, +}; + +document.querySelectorAll('[data-section]').forEach(elem => { + const uiElem = elem.querySelector('.ui'); + const effectElem = elem.querySelector('.effect'); + const fn = sections[elem.dataset.section]; + if (!fn) { + console.error(`no effect: '${elem.dataset.section}'`); + return; + } + const render = fn({elem, uiElem, effectElem}); + if (render) { + elements.push({ + elem: effectElem, + render, + }); + } +}); + +const getNextId = (() => { + let nextId = 0; + return function getNextId() { + return `gui-${nextId++}`; + }; +})(); + +window.GUI = GUI; +window.TextNumber = TextNumber; +window.randElem = (arr) => arr[Math.random() * arr.length | 0]; +window.helpers = helpers; + +function getSupportCode({logId, code}) { + return ` +${code} + +function log(...args) { + const logElem = document.querySelector('#${logId}'); + logElem.className = 'log'; + const lineNo = parseInt(logElem.dataset.lineNo || 1); + const lines = logElem.textContent.split('\\n'); + lines.push(\`\${lineNo}: \${args.join(' ')}\`); + if (lines.length > 3) { + lines.shift(); + } + logElem.textContent = lines.join('\\n'); + logElem.dataset.lineNo = lineNo + 1; +} +`; +} + +document.querySelectorAll('[data-example]').forEach(elem => { + const pre = elem.querySelector('pre'); + const div = document.createElement('div'); + const id = getNextId(); + div.id = id; + div.className = 'ui'; + elem.appendChild(div); + + const logElem = document.createElement('pre'); + const logId = getNextId(); + logElem.id = logId; + elem.appendChild(logElem); + + const extra = elem.dataset.extraCode || ''; + const code = elem.querySelector('code').textContent + .replace('GUI()', `GUI(document.querySelector('#${id}'))`) + .replace(/import(.*?)'(\/.*?)'/g, `import$1'${window.location.origin}$2'`); + const script = document.createElement('script'); + script.type = 'module'; + script.text = getSupportCode({logId, code: `${code}\n${extra}`}); + pre.appendChild(script); +}); + +/* global hljs */ +document.querySelectorAll('pre>code').forEach(elem => { + elem.textContent = elem.textContent.trim(); +}); +hljs.highlightAll(); + +// show min/max + +// show slider +// show direction +// show vec2 +// show folder +// show onChange + // show onChange of folder +// make button function so no need for prop + +// save/restore? +// show float +// show form diff --git a/examples/js/index-umd.js b/examples/js/lots-umd.js similarity index 67% rename from examples/js/index-umd.js rename to examples/js/lots-umd.js index 6033f92..69d0d6c 100644 --- a/examples/js/index-umd.js +++ b/examples/js/lots-umd.js @@ -1,5 +1,6 @@ - -import {cube} from './cube.js'; +/* eslint-disable no-constant-condition */ +/* global GUI */ +import {model} from './model.js'; import Logger from './logger.js'; import { getCSSRulesBySelector, @@ -13,9 +14,11 @@ const ColorChooser = GUI.ColorChooser; // from '../../src/controllers/ColorChoos const RadioGrid = GUI.RadioGrid; // from '../../src/controllers/RadioGrid.js'; const Slider = GUI.Slider; // from '../../src/controllers/Slider.js'; const Select = GUI.Select; // from '../../src/controllers/Select.js'; -const Range = GUI.Range; // from '../../src/controllers/Range.js'; +//const Range = GUI.Range; // from '../../src/controllers/Range.js'; const TextNumber = GUI.TextNumber; // from '../../src/controllers/TextNumber.js'; +/* cut-here */ + const uiElem = document.querySelector('#ui'); const logElem = document.querySelector('#log'); @@ -33,17 +36,18 @@ const log = (...args) => logImpl('inherit', ...args); // Using an invisible GUI to get the colors // In a real app we'd just use the GUI we created // but I don't want to clutter the other examples. -let uiColors; -const updateUIColors = (() => { +let uiCSSColorVariableNames; +const getListOfUIColorCSSVariableNames = (() => { const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI(div).hide(); return function updateUIColors() { - uiColors = gui.getColors(); + uiCSSColorVariableNames = gui.getColors(); }; })(); -updateUIColors(); +getListOfUIColorCSSVariableNames(); +// eslint-disable-next-line no-constant-condition if (false) { const s = { speed: 0.5, @@ -56,8 +60,9 @@ if (false) { gui.addColor(s, 'color'); } -if (true) { -{ +// eslint-disable-next-line no-constant-condition +const showUI = true; +if (showUI) { const s = { speed: 0.5, direction: 45, @@ -131,7 +136,6 @@ if (true) { thicksColor: 'transparent', })); - gui.addDivider(); gui.add(s, 'run'); gui.addLabel('Pet'); @@ -143,6 +147,7 @@ if (true) { document.body.style.backgroundColor = v; }).listen(); gui.add(s, 'show', {name: 'Show Current Values'}); + gui.add({updateDisplay: () => gui.updateDisplay()}, 'updateDisplay'); if (i === 2) { gui.name('Disabled'); @@ -157,34 +162,37 @@ if (true) { f.add(s, 'hobby').onFinishChange(e => log(new Date(), e.value)); f.add(s, 'propertyWithLongName', ['longNamedEnumThatWillPushSizeTooFar']); f.addController(new Direction(s, 'direction')).listen(); - f.addController(new Direction(s, 'hour', {step: 360 / 12, conversion: { - to: v => { - const newV = (v - 3) * 360 / 12; - console.log('to:', v, newV); - return newV; - }, - from: v => { - const newV = v * 12 / 360 + 3; - console.log('from:', v, newV); - return [true, newV]; + f.addController(new Direction(s, 'hour', { + step: 360 / 12, conversion: { + to: v => { + const newV = (v - 3) * 360 / 12; + console.log('to:', v, newV); + return newV; + }, + from: v => { + const newV = v * 12 / 360 + 3; + console.log('from:', v, newV); + return [true, newV]; + }, }, - }})).listen(); + })).listen(); f.addController(new Vec2(s, 'vec', {range: 100})).listen(); - f.addController(new ColorChooser(s, 'c2')).listen(); + f.addController(new ColorChooser(s, 'c2'));//.listen(); const ctx = c.canvas.getContext('2d'); let lastY = 0; let lTime1 = 0; let lTime2 = 0; let then = 0; - function draw(now) { + // eslint-disable-next-line no-loop-func + const draw = (now) => { const elapsedTime = now - then; then = now; lTime1 += elapsedTime * s.period1; lTime2 += elapsedTime * s.period2; const res = 2; resizeCanvasToDisplaySize(ctx.canvas, res); - + const width = ctx.canvas.width; const height = ctx.canvas.height; if (width && height) { @@ -196,7 +204,7 @@ if (true) { 0, 0, width - res, height); ctx.clearRect(width - res, 0, res, height); ctx.globalCompositeOperation = 'source-over'; - ctx.strokeStyle = uiColors.color; + ctx.strokeStyle = uiCSSColorVariableNames.color; const s1 = Math.sin(lTime1 * 0.01); const s2 = Math.sin(lTime2 * 0.01); const newY = height / 2 + (s1 + s2) * (height - 1) / 4; @@ -207,13 +215,13 @@ if (true) { lastY = newY; } requestAnimationFrame(draw); - } + }; requestAnimationFrame(draw); } } // Using Sliders -{ +if (showUI) { const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI({parent: div, title: 'Sliders'}); @@ -254,7 +262,7 @@ if (true) { } // Using TextNumber -{ +if (showUI) { const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI({parent: div, title: 'Numbers'}); @@ -296,7 +304,7 @@ if (true) { logger.setController(gui.addLabel('')); } -{ +if (showUI) { const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI({parent: div, title: 'Callbacks'}); @@ -319,7 +327,7 @@ if (true) { gui.add({func() {}}, 'func').onChange(change).onFinishChange(finishChange); } -{ +if (showUI) { const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI(div).name('Colors'); @@ -341,7 +349,7 @@ if (true) { addColor('"RGB"', '8F8'); addColor('"rgb(r, g, b)"', 'rgb(170,68,240)'); addColor('"hsl(h, s, l)"', 'hsl(170,100%,50%)'); - addColor('0xRRGGBB', 0xFEA956, undefined, v => `0x${v.toString(16).padStart(6, '0')}`); + addColor('0xRRGGBB', 0xFEA956, 'uint32-rgb', v => `0x${v.toString(16).padStart(6, '0')}`); addColor('[r(u8), b(u8), c(u8)]', [255, 192, 255], 'uint8-rgb'); addColor('Uint8Array(3)', new Uint8Array([75, 150, 225]), undefined, v => `[${v.join(', ')}]`); // note: Because it's Float32Array, if we just use map it won't work because @@ -350,15 +358,20 @@ if (true) { addColor('Float32Array(3)', new Float32Array([0.9, 0.7, 0.5]), undefined, v => `[${Array.from(v).map(v => f3(v)).join(', ')}]`); addColor('[r(f), g(f), b(f)]', [0.2, 0.9, 0.5], undefined, v => `[${v.map(v => f3(v))}]`); addColor('{r, g, b}', {r: 0, g: 0, b: 1}, undefined, v => `{r: ${f3(v.r)}, g: ${f3(v.g)}, b: ${f3(v.b)}}`); + gui.addLabel('rgba'); + addColor('#RRGGBBAA', '#5438a180'); + addColor('0xRRGGBBAA', 0xEF569A80, 'uint32-rgba'); + addColor('rgba(r, g, b, a)', 'rgba(64, 128, 255, 0.25)'); + addColor('hsl(h, s, l / a)', 'hsl(180 100% 50% / 0.75)'); logger.setController(gui.addLabel('')); } -{ +if (showUI) { const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI(div).name('Material'); - const s = cube(gui.addCanvas('canvas').canvas); + const s = model(gui.addCanvas('canvas').canvas); gui.addColor(s.material, 'color').name('material color'); gui.add(s.material, 'shininess', {min: 0, max: 300}); gui.addColor(s.light, 'color').name('light color'); @@ -366,7 +379,7 @@ if (true) { gui.add(s.camera, 'fov', {min: 1, max: 179}).name('field of view'); } -{ +if (showUI) { const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI({parent: div, title: 'Add/Remove'}); @@ -374,19 +387,19 @@ if (true) { const controllers = []; const periods = []; - function addRow() { + const addRow = () => { const id = controllers.length; periods.push(Math.random() * 2.5 + 0.5); controllers.push(gui.add(periods, id, 0, 3).name(`input ${id + 1}`)); - } + }; - function delRow() { + const delRow = () => { const row = controllers.pop(); if (row) { periods.pop(); gui.remove(row); } - } + }; const s = {separate: true}; gui.add(s, 'separate'); @@ -402,7 +415,7 @@ if (true) { const lastYs = []; const times = []; - function draw(now) { + const draw = (now) => { ++ticks; const elapsedTime = now - then; then = now; @@ -426,9 +439,9 @@ if (true) { 0, 0, width - res, height); ctx.globalCompositeOperation = 'source-over'; const x = width - res; - ctx.fillStyle = ticks % 16 === 0 ? uiColors.menuSepColor : uiColors.menuBgColor; + ctx.fillStyle = ticks % 16 === 0 ? uiCSSColorVariableNames.menuSepColor : uiCSSColorVariableNames.menuBgColor; ctx.fillRect(x, 0, res, height); - ctx.fillStyle = uiColors.menuSepColor; + ctx.fillStyle = uiCSSColorVariableNames.menuSepColor; for (let y = 8; y < height; y += 16) { ctx.fillRect(x, y, 1, 1); } @@ -457,18 +470,18 @@ if (true) { } } requestAnimationFrame(draw); - } + }; requestAnimationFrame(draw); } -{ - function makeGUI(title, num) { +if (showUI) { + const makeGUI = (title, num) => { const gui = new GUI({title}).hide(); for (let i = 0; i < num; ++i) { gui.add([Math.random()], '0', {min: 0, max: 1}).name(`value ${i}`); } return gui; - } + }; const guis = { short: makeGUI('Short', 5), @@ -486,22 +499,42 @@ if (true) { }); } -const updateAppearance = function() { - - const themeElem = document.createElement('style'); - document.head.appendChild(themeElem); - const styleElem = document.createElement('style'); - document.head.appendChild(styleElem); - +{ + const pageCSS = ` + #ui-helper { + display: grid; + grid-template-columns: repeat(auto-fit, 250px); /* as as column width */ + gap: 10px; /* same as column gap */ + } + #ui { + columns: 250px; + column-gap: 10px; + orphans: 1; + widows: 1; + grid-column: 1 / -1; /* take all the columns of the grid*/ + } + #ui>div { + break-inside: avoid-column; + margin-bottom: 1em; + display: inline-block; + } + `; const themes = { - default: '', - 'default-mono': ` + default: { + muigui: '/* empty */', + page: '', + }, + 'default-mono': { + muigui: ` .muigui { --font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace; } - `, - light: ` - .muigui { + `, + page: pageCSS, + }, + light: { + muigui: ` + .muigui-colors { --bg-color: #f6f6f6; --color: #3d3d3d; --value-color: #2b95a1; @@ -513,9 +546,12 @@ const updateAppearance = function() { --invalid-color: #FF0000; --selected-color: rgba(0, 0, 0, 0.1); } - `, - 'solarized-light': ` - .muigui { + `, + page: '', + }, + 'solarized-light': { + muigui: ` + .muigui-colors { --bg-color: #fdf6e3; --color: #657b83; --value-color: #2aa0f3; @@ -527,9 +563,12 @@ const updateAppearance = function() { --invalid-color: #FF0000; --selected-color: rgba(0, 0, 0, 0.1); } - `, - 'solarized-dark': ` - .muigui { + `, + page: pageCSS, + }, + 'solarized-dark': { + muigui: ` + .muigui-colors { --bg-color: #002b36; --color: #b2c2c2; --value-color: #5abaff; @@ -540,13 +579,93 @@ const updateAppearance = function() { --hover-bg-color: #0a6277; --invalid-color: #FF6666; } - `, - 'bubble-dark': ` + `, + page: '', + }, + 'bubble-dark': { + muigui: ` .muigui { --border-radius: 1em; } - `, - 'form': ` + `, + page: pageCSS, + }, + 'float': { + muigui: ` + :root { + color-scheme: light dark, + } + + .muigui { + --width: 400px; + --bg-color: inherit; + --color: inherit; + --label-width: 25%; + } + + input { + text-shadow: + -1px -1px 0 #FFF, + 1px -1px 0 #FFF, + -1px 1px 0 #FFF, + 1px 1px 0 #FFF; + } + .muigui-label-controller>label { + text-shadow: + -1px -1px 0 #000, + 1px -1px 0 #000, + -1px 1px 0 #000, + 1px 1px 0 #000; + } + + .muigui-root>*:nth-child(1) { + display: none; + } + + .muigui-range input[type=range]::-webkit-slider-thumb { + border-radius: 1em; + } + + .muigui-range input[type=range]::-webkit-slider-runnable-track { + -webkit-appearance: initial; + appearance: none; + border: 1px solid rgba(0, 0, 0, 0.25); + height: 2px; + } + + .muigui-colors { + --value-color: #000000; + --value-bg-color: rgba(0, 0, 0, 0.1); + --disabled-color: #cccccc; + --menu-bg-color: rgba(0, 0, 0, 0.1); + --menu-sep-color: #bbbbbb; + --hover-bg-color: rgba(0, 0, 0, 0); + --invalid-color: #FF0000; + --selected-color: rgba(0, 0, 0, 0.3); + --range-color: rgba(0, 0, 0, 0.125); + } + `, + page: ` + #ui-helper { + display: block; + } + #ui { + columns: none; + } + #ui>div { + break-inside: avoid-column; + margin-bottom: 1em; + display: block; + } + + body { + background: rgb(34,193,195); + background: linear-gradient(209deg, rgba(34,193,195,1) 0%, rgba(253,187,45,1) 100%); + } + `, + }, + 'form': { + muigui: ` :root { color-scheme: light dark, } @@ -558,7 +677,9 @@ const updateAppearance = function() { --font-size-mono: medium; --bg-color: inherit; --color: inherit; + } + .muigui-colors { --value-color: #2b95a1; --value-bg-color: #e8e8e8; --disabled-color: #cccccc; @@ -567,81 +688,120 @@ const updateAppearance = function() { --hover-bg-color: #f0f0f0; --invalid-color: #FF0000; --selected-color: rgba(0, 0, 0, 0.1); - } - `, + `, + page: pageCSS, + }, }; + const cssColorRE = /^\s*(#|rgb|hsl|lab|hwb|lab|lch|oklch|oklab)/; + const looksLikeCSSColor = s => cssColorRE.test(s); + + const cssColorToRGBA8 = (() => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', {willReadFrequently: true}); + return cssColor => { + ctx.clearRect(0, 0, 1, 1); + ctx.fillStyle = cssColor; + ctx.fillRect(0, 0, 1, 1); + return Array.from(ctx.getImageData(0, 0, 1, 1).data); + }; + })(); + + const cssStringToHexColor = s => `#${cssColorToRGBA8(s).slice(0, 3).map(v => v.toString(16).padStart(2, '0')).join('')}`; + + + // --------------- [ get list of CSS variables that affect GUI ] ----------------- + const selectors = ['.muigui', '.muigui-colors']; + const varNamesBySelector = selectors.map(selector => ({ + selector, + vars: getCSSRulesBySelector(selector, GUI.getBaseStyleSheet()) + .map(rule => Object.values(rule.style) + .filter(s => s.startsWith('--') && !rule.style.getPropertyValue(s).trim().startsWith('var')) + .map(s => ({key: s, rule}))).flat(), + })); + + const showStyles = false; + const div = document.createElement('div'); uiElem.appendChild(div); const gui = new GUI(div).name('Appearance'); gui.addController(new Select({theme: 'default'}, 'theme', {keyValues: [...Object.keys(themes)]})).onChange(v => { - themeElem.textContent = themes[v]; - styleElem.textContent = ''; - updateAppearance(); + GUI.setUserStyles(themes[v].muigui); + document.querySelector('#theme').innerText = themes[v].page; + if (showStyles) { + updateGUIValuesWithCurrentCSSValues(); + } }); - const cssStringToHexColor = s => s.length === 7 - ? s - : `#${s[1]}${s[1]}${s[2]}${s[2]}${s[3]}${s[3]}`; - - const fns = { - '--width': (v) => { - uiElem.style.columnWidth = v; - uiElem.parentElement.style.gridTemplateColumns = `repeat(auto-fit, ${v})`; - }, - }; - - const folder = gui.addFolder('Style'); - const rule = getCSSRulesBySelector('.muigui')[0]; // assuming the first one - const varNames = Object.values(rule.style).filter(s => s.startsWith('--')); - const obj = {}; const controllersByKey = {}; + if (showStyles) { + const fns = { + '--width': (v) => { + uiElem.style.columnWidth = v; + uiElem.parentElement.style.gridTemplateColumns = `repeat(auto-fit, ${v})`; + }, + }; - const updateStyles = () => { - styleElem.textContent = `.muigui {\n${ - [...Object.entries(obj)].map(([key, value]) => { - return `${key}: ${value};`; - }).join('\n')}\n}`; - updateUIColors(); - }; + // --------------- [ make a GUI for each CSS variable that affects GUI ] ----------------- + const obj = {}; - for (const key of varNames) { - const value = rule.style.getPropertyValue(key).trim(); - if (value.startsWith('#')) { - obj[key] = cssStringToHexColor(value); - controllersByKey[key] = folder.addColor(obj, key).onChange(updateStyles); - } else if (!value.startsWith('var')){ - obj[key] = value; - controllersByKey[key] = folder.add(obj, key).onChange(v => { - const fn = fns[key]; - if (fn) { - fn(v); + const folder = gui.addFolder('Style'); + for (const {vars} of varNamesBySelector) { + for (const {key, rule} of vars) { + const value = rule.style.getPropertyValue(key).trim(); + if (looksLikeCSSColor(value)) { + obj[key] = cssStringToHexColor(value); + controllersByKey[key] = folder.addColor(obj, key).onChange(updateMuiguiCSSStyles); + } else if (!value.startsWith('var')){ + obj[key] = value; + controllersByKey[key] = folder.add(obj, key).onChange(v => { + const fn = fns[key]; + if (fn) { + fn(v); + } + updateMuiguiCSSStyles(); + }); } - updateStyles(); - }); + } } + + // -------------- + + const updateMuiguiCSSStyles = () => { + const css = varNamesBySelector.map(({selector, vars}) => ` + ${selector} { + ${ + vars.map(({key}) => `${key}: ${obj[key]};`).join('\n') + } + } + `).join('\n'); + GUI.setUserStyles(css); + }; } - return function() { + // -------------- + const updateGUIValuesWithCurrentCSSValues = () => { const map = new Map(); - for (const rule of getCSSRulesBySelector('.muigui')) { - const varNames = Object.values(rule.style).filter(s => s.startsWith('--')); - for (const key of varNames) { - const value = rule.style.getPropertyValue(key).trim(); - map.set(key, value); + for (const selector of selectors) { + for (const rule of getCSSRulesBySelector(selector, GUI.getBaseStyleSheet())) { + const varNames = Object.values(rule.style).filter(s => s.startsWith('--')); + for (const key of varNames) { + const value = rule.style.getPropertyValue(key).trim(); + map.set(key, value); + } } + map.forEach((value, key) => { + const controller = controllersByKey[key]; + if (controller) { + controller.setValue(looksLikeCSSColor(value) ? cssStringToHexColor(value) : value); + } else { + console.warn(`no setting in this theme for: ${key}`); + } + }); } - map.forEach((value, key) => { - const controller = controllersByKey[key]; - if (controller) { - controller.setValue(value); - } else { - console.warn(`no setting in this theme for: ${key}`); - } - }); - updateUIColors(); + getListOfUIColorCSSVariableNames(); }; -}(); - } diff --git a/examples/js/index.js b/examples/js/lots.js similarity index 97% rename from examples/js/index.js rename to examples/js/lots.js index 263e0b3..4592881 100644 --- a/examples/js/index.js +++ b/examples/js/lots.js @@ -1,6 +1,6 @@ import {GUI} from '../../src/muigui.js'; -import {cube} from './cube.js'; +import {model} from './model.js'; import Logger from './logger.js'; import { getCSSRulesBySelector, @@ -17,6 +17,8 @@ import Select from '../../src/controllers/Select.js'; // import Range from '../../src/controllers/Range.js'; import TextNumber from '../../src/controllers/TextNumber.js'; +/* cut-here */ + const uiElem = document.querySelector('#ui'); const logElem = document.querySelector('#log'); @@ -182,7 +184,8 @@ if (showUI) { let lTime1 = 0; let lTime2 = 0; let then = 0; - function draw(now) { + // eslint-disable-next-line no-loop-func + const draw = (now) => { const elapsedTime = now - then; then = now; lTime1 += elapsedTime * s.period1; @@ -212,7 +215,7 @@ if (showUI) { lastY = newY; } requestAnimationFrame(draw); - } + }; requestAnimationFrame(draw); } } @@ -228,6 +231,7 @@ if (showUI) { angleDeg: 180, tempC: 20, tempF: 72, + ticks: 7, }; const logger = new Logger(3); const log = logger.log; @@ -254,7 +258,6 @@ if (showUI) { gui.add(s, 'tempF', {min: 0, max: 100, step: 0.1, converters: {to: fToC, from: v => [true, cToF(v)]}}) .name('F° ↔ C°') .onChange(v => log(`${v}F°`)); - logger.setController(gui.addLabel('')); } @@ -308,7 +311,10 @@ if (showUI) { const changes = { onChange: 0, onFinishChange: 0 }; const change = () => changes.onChange++; - const finishChange = () => changes.onFinishChange++; + const finishChange = () => { + console.log('fiinsh change'); + changes.onFinishChange++; + }; const folder = gui.addFolder('Counts'); folder.add(changes, 'onChange').disable().listen(); @@ -368,7 +374,7 @@ if (showUI) { uiElem.appendChild(div); const gui = new GUI(div).name('Material'); - const s = cube(gui.addCanvas('canvas').canvas); + const s = model(gui.addCanvas('canvas').canvas); gui.addColor(s.material, 'color').name('material color'); gui.add(s.material, 'shininess', {min: 0, max: 300}); gui.addColor(s.light, 'color').name('light color'); @@ -384,19 +390,19 @@ if (showUI) { const controllers = []; const periods = []; - function addRow() { + const addRow = () => { const id = controllers.length; periods.push(Math.random() * 2.5 + 0.5); controllers.push(gui.add(periods, id, 0, 3).name(`input ${id + 1}`)); - } + }; - function delRow() { + const delRow = () => { const row = controllers.pop(); if (row) { periods.pop(); gui.remove(row); } - } + }; const s = {separate: true}; gui.add(s, 'separate'); @@ -412,7 +418,7 @@ if (showUI) { const lastYs = []; const times = []; - function draw(now) { + const draw = (now) => { ++ticks; const elapsedTime = now - then; then = now; @@ -467,18 +473,18 @@ if (showUI) { } } requestAnimationFrame(draw); - } + }; requestAnimationFrame(draw); } if (showUI) { - function makeGUI(title, num) { + const makeGUI = (title, num) => { const gui = new GUI({title}).hide(); for (let i = 0; i < num; ++i) { gui.add([Math.random()], '0', {min: 0, max: 1}).name(`value ${i}`); } return gui; - } + }; const guis = { short: makeGUI('Short', 5), @@ -767,7 +773,7 @@ if (showUI) { // -------------- - function updateMuiguiCSSStyles() { + const updateMuiguiCSSStyles = () => { const css = varNamesBySelector.map(({selector, vars}) => ` ${selector} { ${ @@ -776,11 +782,11 @@ if (showUI) { } `).join('\n'); GUI.setUserStyles(css); - } + }; } // -------------- - function updateGUIValuesWithCurrentCSSValues() { + const updateGUIValuesWithCurrentCSSValues = () => { const map = new Map(); for (const selector of selectors) { for (const rule of getCSSRulesBySelector(selector, GUI.getBaseStyleSheet())) { @@ -800,5 +806,5 @@ if (showUI) { }); } getListOfUIColorCSSVariableNames(); - } + }; } diff --git a/examples/js/cube.js b/examples/js/model.js similarity index 95% rename from examples/js/cube.js rename to examples/js/model.js index c1bb760..c1f49e3 100644 --- a/examples/js/cube.js +++ b/examples/js/model.js @@ -1,7 +1,8 @@ +/* eslint-disable no-constant-condition */ import * as THREE from '../3rdParty/threejs/build/three.module.js'; import {TrackballControls} from '../3rdParty/threejs/examples/jsm/controls/TrackballControls.js'; -export function cube(canvas) { +export function model(canvas) { const renderer = new THREE.WebGLRenderer({canvas, alpha: true}); const scene = new THREE.Scene(); @@ -30,7 +31,7 @@ export function cube(canvas) { const meshes = []; const material = new THREE.MeshPhongMaterial({ - color: 'red', + color: 'red', shininess: 150, flatShading: true, }); @@ -43,7 +44,7 @@ export function cube(canvas) { meshes.push(mesh); } - if(0){ + if (0) { const geometry = new THREE.SphereGeometry(0.8, 12, 6); const mesh = new THREE.Mesh(geometry, material); mesh.position.x = -1.5; @@ -51,7 +52,7 @@ export function cube(canvas) { meshes.push(mesh); } - if(0){ + if (0) { const geometry = new THREE.TorusGeometry(0.4, 0.3, 6, 12); const mesh = new THREE.Mesh(geometry, material); mesh.position.x = 1.5; @@ -68,7 +69,7 @@ export function cube(canvas) { controls.handleResize(); controls.update(); renderer.render(scene, camera); - }; + } function resizeRendererToDisplaySize(renderer, mult = 1) { const canvas = renderer.domElement; diff --git a/examples/layout/layout.js b/examples/layout/layout.js index 4c7ac32..2976792 100644 --- a/examples/layout/layout.js +++ b/examples/layout/layout.js @@ -1,17 +1,17 @@ -import { - Column, - Frame, - Grid, - Row, -} from '../../src/muigui.js'; - -const elem = document.querySelector('#ui'); - - -const root = new Column(); -const topRow = root.add(new Row()); -const midRow = root.add(new Row()); -const botRow = root.add(new Row()); +//import { +// Column, +// Frame, +// Grid, +// Row, +//} from '../../src/muigui.js'; +// +//const elem = document.querySelector('#ui'); +// +// +//const root = new Column(); +//const topRow = root.add(new Row()); +//const midRow = root.add(new Row()); +//const botRow = root.add(new Row()); /* @@ -19,7 +19,7 @@ const botRow = root.add(new Row()); |+-[Row]------------------------ ||+-[Frame(fixed)]-++-[Frame(stretch-h)]- ||| || -||+-- +||+-- | +--- diff --git a/index-umd.html b/examples/lots-umd.html similarity index 95% rename from index-umd.html rename to examples/lots-umd.html index 9778b2a..efd8e7e 100644 --- a/index-umd.html +++ b/examples/lots-umd.html @@ -89,10 +89,10 @@

muigui

- + \ No newline at end of file diff --git a/examples/lots.html b/examples/lots.html new file mode 100644 index 0000000..c8fe0d4 --- /dev/null +++ b/examples/lots.html @@ -0,0 +1,99 @@ + + + + + + muigui + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

muigui

+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/images/muigui-screenshot.png b/images/muigui-screenshot.png index ddc2b0904700de521f703289b38dcdffd7107b6f..61b88918a823cde50eb222927a00f2722045a17b 100644 GIT binary patch literal 29056 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 P4Uv;pdR{DP9PqyYxxhE= literal 80026 zcmeFYRa9Kh-uDT?0>L3b2o~Jkt#Nk=65QS0I!N%~?!gHO9the&g1bAx-L;|Vp3eWA z^E}Txv)+qYGZ%9)d#$3XtLj&^OLy)4`4Xd{CXak zJSIA>B@Y1s)5Ts|T0>D%Uyl(-s|fU3Fdu zd!85a*h00>RL;Z@>_Yx1(fU^sA%M4D*h~3wTB;Zdhu;w5etb8Hw*D(>Bvn!0-F*sS z_|NnC)fv46;l1NHMh$QrrZ=_u%1RU=$sO1B%DN*cS{?DD>mS8Z6a?JY0o6<>_$UQP z^)-a3FE1TX#@}xlW8_u!4WK%u;4k8~yeN{}^(b3Huv-lekbB4R_R20Oa#44bI0kW& z4BH(+eQ;O$TXe8r2$U9uJ!+9+S(z&G62WHAH*X2JJwdj$@6i}l$6br4`3i4{)_>I= zW@`^^+1VdL3tsGze62)-PYCWMT_4UTEc>Ms-Tph9t3K9H8Y0=JH&2d`Mx7>4%W|qo zP!NxGj8-TlVGLePVvJU$!Y0`NEmM7yZBWdK-RIU)q%Dh*M;ndx&V)AU6a81GW(5Yi z%AhYl47B)_%Rs-=`0xR0ssx?NF zIagCw%4f9bvra)#^akk`a;TuF{!rp;8^vCHojW>kLw8U;n-m^{+$S8Om#Nfgx7|5@ ztDz6(?E2Lbqe>Jzc!T{iID0+B5fRLu0|l@8hGLita8knlAnzLHQ4hswFKuUpb+~<6 z$G5;SFfVpsE6_p^s7RrlNFnT_W7_VE^Z1$UKJ0g~OGR2I`O*wQh%DO-e-N=a=if>|~-Ot`uakU|=ofY{*Pq5xrqqGERV%9kwC9 zbj-WHmlh;bhywjcZU9kIlkh)oz1cq}%qTWa(ACkMBjh9AMqu}x#uWQcQx=n92~z>H zz7l0`EWBv>lvm)#d4{v}j;AK^Et2gj(xdri=wu_qY=f>l%h#TV&?nb7LHE2mK300% zO8iu4$)`Z0s?Ewxp}ykE+xuJ1{v074*SpElMCj6nZXwROCcw}lu1>2gPkVhRAk5;u^gv#yz|F|H|0_e2S+LWvC@D4@-z ze{KEh6$$Hu4=$&mMZt($WNvltTZCBO&sXQi&X8Xs$WyM+@?4k*0+iwD=_xT}Mz#R? z&qo1KsC?JqNj8FAHIm!rOLcZOog=s3pAcYlyqk(VFKm8cEcOPiek8s?lB6P(3DZwP zp8kbQ(usTK$&~fN=3{FSNm|&h8J0c{f4H+5@!~7&Fkv^$Jk&l1jT~Ov94|R$ywtH%N4n{hEX{ zh_}P*foCu6LW7gczJqmz{#%3jYg|ro^TErsn1)G4UUc$Ao08NiYA?h#LN;#$S0{^!@!7^NhQi@!1rs~zy&{NYCsf(4Ae|6_{I8;0H;^GEp)Za;1Vy7tT85!^l4 zJ?1?Iei_2(=g~67;!_C+SQ8ecTv3AgKO=r7|4j6YU6cz_IiX8dkfUWt0Wf9s(Y;QJ zRXkP*RA5llQ_L^LaX50=b8vAmcQ|yg_~Gwh?a)4_R%xsoSUxX5PrZ^9JXCKb?oaCf z#$Tj0H0aZ+;#rBE_6Z|2jaCWUn!PMfOIk>|Ro=h4rpBe}tc0SLU8}Ifq^8UCIqXsT zHc^NCD^0p8xqP~Irk1akx~8l4#WE`Yt=)FlXWD{=>#z*N%M3Vc}@5+%a)BVQzfE zq`33LQ}LZAc}l`}wMuML+t6|Td>-M%Lz1=F@$&0~>%)~p+r#`e8DkOS1eXN(eVVKh ztx<@Pi{W$Pb>I3>957kf#+-Ppg@>lFpY+QwpeNXd`JOWK%t+mgSv2Gln!OyH`D?o&z#F;L?v5 zl@lt7nX)vuz%zf>vgj~nF=cCSo9!et;Ze97%o6*0hIz!{hi-{(;*Zu_yW=9_BUjP98L=te`@5GVszpRQ-(dXH_}n;-@r`k@@m}j}YX_;h z7BFPvbIYSIGUp5K7tP3C$cD%sNGwQ{C zmO^zN`hohjVaDNQ-BIBijloMiOBGUeNf${eNf{dXlRJ~QUvPR@dmDPc_6GEb^;Sd` z#!|`1$bO5q+t2dw%VSnkFZJCS9V};b(6N|(tdyThn3_I_oH{rdoT`@Fh^vpm8<_na zrmuGLb@9pF$31mBp`T!Tdy8eOkUm}|E7?svxj>N1-FK_K^iQd^qHpSH>h92IrW~ei zt*=_^6_KSiDyJko7NetFnKSV-GWNHJr8j9e(gQVbR)oeqjV^!YZlCt6lLOtu zE+ab72N)dGcGN`EBnK777V|H&-;R9WxwG-$7O=XzSnT-GkqM!KI)r5YGOg3PU>yNC zTF+lQ!A^9SjC&-^v+F+e5q&4_9FG}X%DWa9;PyjW2nH3m0-31I$5}^{lCk)9-;ohCpIj!2N z8k-@jU@N%$#`x_Z^YFoI{igp75zpSZpI|DV=P|3*`@L`dOYa+rN6+#I#BCRhhF4cx zL1UizEgtKp*V_96tenQ2w%yx>J;1N*^NblpEgUx=e){8eDKu4D*FSA}$AK~~l-bkU zGBVObOnN?e9PTFrGGVJAUPt>8?po{I41&zK%nc*FpB4*Br|GgRl(nRtUw!y2y@!rK z^D0K3^`j+D*M`G};N^s?gR4jH`Qwb*rw)^!P&rw*-(6VrZ;4#}K*^xXqw*qEzFbv- zOc!XAY}4-i{KfYl>CNfZE72<$En;g04bKpcQPZzJBVsY%bvPJz))f|ZtPW267RZ8+-r@oT7Hm=pbEf9 zD{fY;`m~B*-g~xUu7x~Cbb9g6g4;vo$W;CSYl1G>f=Jg1@@`)k!81dg+Fe0P-jR5I z@T2>7Uw^x8e_rc4;l`{7|Ix`OPxJlpJllMLe>beBKCX*6(a6H&Yx{|JYx7bg_`lObN z(+#GM8DHOVv7XM9C&T*@iY(De$lB(8Fu4i&0A-}8Q%Ksw!I|aycBZTR(;~JJcvG+9kz8*w&^cmv!e#Wm!6S-je z*d1zPjd)?hfY8K?a8T!360ds~h7`v5w19{VC3t@qhqQ$vfdvUkJdZRLI7K+wz+T}P ztVIu;6C_1Y6i4v(r6grewr*`_YOSnOe~zUVU;7YrsN%6*!=6 zVU6<@m-^&Qb6@b#=mauMF75fyR|x8d7W-24SK>Vokq#}Hhry*{4*miXYpt(nqpFI) z3=h9VKt?1*K!Jx4;Z7X!?SF;k5E&7W{)vBqfDmPmfc)<~YH~QxZT{sWr9>j2 z!GGbyonO(5|Kxr_Uxf6ZFroxJ4M9>{T2T@1Yg>9)Tf2DLxq3ZugIVAa=xz!Io(Kp; zbblS9q89B1y!?549epo-RTW`NS7&x}D_09^c0XsgzvUo^`U%5>&emS$RDRA*E}p`E zV$}cS5Qc~UMsrY8{gcJZQH)w&Rf9^})x(;KpPiGPlUf{uii%3q!^%cjOGfVB=I~!) z)OKE8Zo(WKzP`TfzC7%%9=04@LPA0uoZKAT+-&e1Y@YruUgmymE}k_1D&#-q$XI(? zdf2;p*}J+>{Vmtr!qwYLjGFpyMgMjE>prdh?Ekwa7ten;3*JDEzbPDC?3^6`RW{sI z^lz-NhP|J)lYxxAGrZ5>b%^tDbBg|x|NoNm-!=XZOa1@0nNUt=bYf&Lh}2_Hr>dl_{d zxDTIX|6E1zzl?DA*N400D+Gl=A_N2p1VtH19Y4eqW3-RDzvsl;z1}h_)OWwII45nV zzcYbGlYYjq`xc{#{Q4~hbIyS)uO^LteI_77=0r?W0}oMFLO;IKx9t20be@+TxW9hC z-tcOqp~q-3up%$pb3fN}JWqt@zAM()ckKt2to$d!i`t&D)FS+foMDX8cfVjL5iD6H znpHAc_VzEN_#P~UmB4Mhl=iQSeoW`2h{!_mV2nT$+e!vaSn+eroj?LWdF0{4COH9i z#0B+e=to)BS;9X~2&jew_!P*8d?1+uPhAZSF#;n49_&dXW_Q(;&lT1N`iIo8XkZ$s z5;z5wd3rlgSmpsyZCeYP%FEpJxJ@aT9nuhZVgIQpnnr*F`LK?K9We9-N9!sY;+(;V zln}1UamciVlT-}(^k}V>YL}h))<_kQniuc)DY+7;2|L;3O~T-iS7<=fQNEZ?TlQty zp6Lu#x=zh2x^m(iHcbO*K(%5NrIV`36k0{GUxflv6!bNPGD}_zbC!x!2~}zjh51QX z^X**ybC&?^&lg6e0_;3Tlx(O8cEIB2TT4C8^2!|KOKP#<-QSnCQ;7gYN|L)8G{4Qw z*9NJ^6f?oNdM-Sd;SuV0U?O!b1FaFmH<<;k$avFoP#Xn8qNvZk8j|u_eSl%pSpc)F zLq_p4A_*==BT49*8(<-KTf~%aqhf zi&L|4idtCjd{NDtK<I0Q*`_dWxT1+T?);}Z&rlT_ ziQGN|_NypgL>=kTD?i~pYN#f(7@Dq?U}RXSJOwSi%lP>x`Ysd4>nwU(J(UzFH8)40 zM6k-7c+8n@o!2u~V;rf!(PZ^I_l?05XWCZG2-zOD$V$d7CK{O6CtkF2iwuO|q&C9rmO-xPAK5aR0+!gUIhjDXQF)bdm>if%%`G_OJ|JWVZ0$cIT z=LUPItwN4EGF~W}gNz1{fsPr6mOmYE4<1TOn{Z_Q*-12E9by+mv^;$_JjSfcg+gf z8*Q}PF-0{;VO(XSEdKh3>)lpiXqh1XOJiJG<1|35`Ye2->2{K?l+Z}B0}d;oeMU>P z17bxr?Eg9-LW#p4p0{{Yq`sD|VkM4Z>`pi&iY^C@K|s?;8{kIrr`PIINg@!}bny7a z`x2GTqZ@NXg;ri)m=r7zPJE<1kSp?%*2TTP!PHOEyVe9>wf z$2_8utj;*}m&!bCe?(-)Q2D!B?E|)5W2V-I9RFa@$|(NgW{dUY4o;zQ^L`lm!zqA? z_Ki1dLU~J(>Wbk7D%v<6P~hb*a$g^^;F6bP*4s#O1COD7x=UKKQlj5NTa=f242%p^ znoz>fzgw^y7w2pOXCBGAj45Ps&vVopvjI=1#Br`P{av3I#hFyix;TTE;xC2k{o<3s z!kX&vn1esj4@d;5X*wpju~)WNc+twU03P|6JX*wXW+3};!X3kMp&c+kM?=JowfvHy zBsV*H?S21$1(@yTC7h<`8ufvjgTC2JJ=O^tQ%0=8n_^wE!PS1kK z_;;V_UO#C3uwKt*>Gm@>yOy8->x{mTfybj+w2x_U3pL6m+>+2pLZGESfhRD6@hnrag@m-*NDc$j-Um8Bvj#s|mz z{g7K030MIAX}hiOKHfNZw2f~;J7-8&`m2)5b{dge8M*OS4R&(g!Q~2B z`aCqi-b!9*zOZ-F9-HByZD9y|qwRze=S&w>1f$b>m%MP`E!QU#b;(#%8fc_~JtWR* z-JIyM<#37-{$MM9{$hUX!xwm4U$z7#vivi}Sh&qJY!vs3p2;COsQw21SA|uL;yY!r zoh0dpWqoNyew)^!0dW^RxCKjlOu%w9V<2p(3_xhGd?R}2Fv{3IOq##N`+ zJPAD5WZI_XKRI>Ya#$^52@EzkXP_v~XJ0;fxO93)U{VBq0j(J6&Z91*eC)5-8RXHF zFUjO|lCj4ky1KMX5R)@(abTMefBL49_rM?Rts5A+T-e;|0$Dg((v}l{tZcr%nK{f7 zovnn#1@gvy9$-xVj=2t2Slr`u@&dO_`{^f^J&FQ9L$qn7ni|aimQ8la@Pa9fNNM|B z>{3S>J=Uk$rMi+SWfK0cO{lNRF6%O!Oq5b1rH-5yrw-^a<)JcEvXfHwqB2~$nbW0T zl7!#-@CKmw%B9bnec`2;PZ?9TpVm;w#}Xm!jM$W&0Q_v{txO1>M@y32FJzFXT$7*0 z+C0#XNllPCJ1RugSDm&Vtxjq`Z~ZVXv`^-!y5z|P3%*{zuf+M6w)q z4?4p2K3SE_Fzy#(F}v>n>3)^l8$#2#KZ^YzV$&sQ?axz^1q?35Mn5CWlEDc7uz;Gg%S9U zC|0fs-~ze5A~0#RdnViEa7L7}H+`}KzJ4QogD(W1k;ccT->q&{nUN%ls)H=sQElmu z_2Zcf0*(}gpbrH2r%H}k!_-_mAeG#C?!DXk=?3dpbfkPo)X) zSLHTAJ`+E7@C51mK&F7vEYTaYlB@e@u;Vb z^ZM$rqHxe>#g&6kpI=F2;-Sg8y}0A*$j*NKTWiquns38Wd2S>bx0;f*b(vH9n$Oj# zz{X$%y6Y9{$d&8V*RqU!5l8GAUOwu#E=^y)&HL-Vc^~B?4fOZ6raJsRtG+qWd+v`Vla9Wq7vW#CvNY&a*7Jw9?(aOg zg81~4wl6ELf6Q?Brl4>4k3_kse-4k+rN8ef%NwXm>y3auKMo=352GKZkyPBB>Lq`# zQ{i`Z_@R<>(>x_8)p-%od)@MK+r&?+Kq)HqOKDnx(TvjN!t{?nwHBd<)UZD-f(TZ9 zfb>R~eU%HEK*ZiZw_vL8B~&BnmZi-1&&&ym;^6O%Z%EHC^FrYT$f3euT^Edba9+b#~*s zoAQNt>H2IiQp_+@@5XMe-doU$^x9F)Z2pCIo06d-W2<>HAPIkrAD4?K%tFYf* zc%QbspbqCCqi#v~DQhpENKuy1{ZpWSsJgb3TK@iwhAqd^=B4!`&H)FGnR)_%z5Rq6 zJXae+$I{|xTUTNL7<)h;@1qq0@1%aZH;)pEbu{mn$@I`zIDCGxWExno*3a`8X7bpI zVKAfrn!Zl@e(0mS-#pC?zFS%uE^)YCY=GqQxzg(z zSEoT!)y0!3LmrqmCtCa?O@wD5$i5}-b5`q4A{67pv4u6(g9vyS1%uX`?B{Y|d^URT z4ee#w)E||;FIDc17SO!4EVrCz?MR8U98MdW#%z3N{=|p0Q&A9*1G(Oe;u8+Iu@j^} z)pRLua`scv);j}Kdy6}U!S&YuzMXWcCW>)5v*7{=e_p>mu0>JEqW+B1D||OU#W{;MvUYd zl6Z9&m68{L_Jy1t>Y9QBCg!12C33{&@6~mo=N;E-Uw|;^rvk@&)?Wrptc{}$hI`*a zZLJ^9+b6_P1kFBu7Fho2c0DG*04emp%fj>`T;g|&)psJIXT4ajXauIk5sBWZFb&d%{8ZYubpE5=h7p9&m zUq%>2TqVQDZdRC)3^p_$VQX%}_O^B;fF=Pl7~|3MVta7_)NhP#O^hvdHG(?3#UfvL z4Zvr`^B-{_cqBhI?feGuIaLyJ6H;OO;O16~3TxRYC>@UKgWwy6pr-K@VUd$Tn9l-CT$iDc{xpdOkar+ebMy3N$1{Y0eM|=b~;qJs?+L017 zO>A6aavw{$b_&HUM;cu(({GLIlZZa#CR{h-JO8uc?nRss=%EpshcMmQd3HtNIHULa zptW%P@VS2x4;nUE)@X-Q;~2lai3GuPd!*GTgxik0Wyhl|x5yGQ;0azgf~oP(?QxM5 z#OzyecHz@G2t*6ZGz~FWd7M_}pxX_~6||H>b6%|5Y!yYKR2Iqs+}+l*16H8#zZ=p) z(6C5#Qh=E?#`xc!?oO+3lK>{f^Ilg2+=e}%54x|Xg+} zFr_6P4iQBYJI@}sCZIzc=^`}O?NRAkZ$s#dg{Q_f_Di%|2Lb6Kd*L`O<3;zV(>TnE zTIJf-1T65~>54p>%lyC+!E_Wv?EBonJ%2}7*@8{_>mlxOQ`lY0R-ikiFz`&s`Bi>a zS|TlEj*GE-Bg2z(5G2|b4d}8g&cb~A-i8S+0o_(vE`cn2HPaQTw*9P4xd%wex>2NQe9v)JR6?1JGVU^nxwVvZP0Y)Np*LFZUD&CN}+%TX`(Ma6#=GG}RXSqXgi zK2miS)bWkbGHuzNLp`Q3^NlI@wwmAtm63VRK1&OePw6fpxDfW3iS3~cCNyzY-&!~D z-~2?pYL+oyCXiN5(>i1(K?_^+Sy4US(}sN(SdDIr1xH!;G9VVNzve++z3vI-e15#; zp=0fasg0&hCi~eA6UtlOk2WX4el?Hz?r)kdcTSoU0@k^5<+s2MG@&a}Dh=ld>m6J9Aw2Q5OG zQW@T=d7l6i8;w1m^Im>n??i@n70CRgft5}~D+)bd|CEK;gFHNlcGayb?fiLs~XetG{fJewxz%Nmqv$M(H7UmiPA_ zd0^vR^$3pqaBdHq`&{w3Z|bLZ{%)f1{`5Rm{mEI+F3!XG)mU!Jq*qWQa(MIU?a#es z$E5c;uSJkfg}{8qcu7jDaTyMMs0yWZ8BhYjgyw>3na=ffb_S< z)7q{18*t)7;F8j*Vj3Vyb{1v_BPx7WN5f<;CGGqb?N6t>E$=%0R%BB2vM*Km01^d4TeDW7ZWoJ$wr#;4l2smz{}r21|-(5aEluuXjhjqM?350#1fGz+9^wksU*2J z4-ZC0=GFe*`*nd#-mLwV^ZTqk?|B2owsHE_JHTC5XLdNpv|&ittGkL0Bv#J2zOh;; zMep%}o?I1=84vyMQ`b4}HA`;4i$5ulcAwM8r{?Uh>%ot-Na^EQzYgC4T|%(H^qXYR zD9RAOFutzoSC|d=eI8|xfGQ3F4TndmJD|Sr4&`Oyl{^}cBT$+goqVnmh|RKChFe0L z*9cS$FoX5-MwUSM+92r%q5^}4wrPXD8yy8xcPoomfc6gJ#(uk8a2O$7!_y^Jjan`A~~(QCEuNeaJAS zy5dN&Nf4_lxbV~GpF_c|K0HwPD(HUG@VOKW@mnm}|Jzqy zLEI2GS4$Jh5`A~eZ|5{XkiQ`%2X`c*_^TDz4jy=+h64|#L)oEHzVOYH{K!;EyIk~! z1OB-gex8P}g-fL@T`S#nY7{=wQ%-EMLEv7tt(U|$CQ>FN_pT8bLZv&*nHHb~#2#UV zVr5;NH`1GWz{?hVfr@J3w>Py&t2%hKO7dmT=f zxk16~2COYs079;e5wCx$?FJ{x+Nv<)=WhK$TgpZmk5@!~qn_v~bJtz??_5 z%|*+^-}p1J52%XQ5#x7RI>%aShWv4$Gaf|XI*i553S0P~Na~d!;fJk2<{+$`dwJ+; zMDG0N`mm%hc)Qn~y|&nGOOb(2Z5dPtVDz%NK#Dt3s2^8mZxyVnU6fQ@Q7-_8PPG7- zT9Td%XOT>Z5+JXAxA5Q-Ci5V(Wz$FXhJI*bnaGu+$C2qNcb4FmW0^9&tiKUNqO6m( zDMI@W*`K&6_-t^uK6>IeL7Q1oFRSGzvyHI$p8ff2w1#*J=^!mnjf!bBclEihU=jbF z|SgVGS&Ko01W=ZATmp=UoqZAdA%I z!if0bOE7W6wwegNX#pLKLM-r4iwA{XEc9&QQw)$!yaN8{7O-ly&O}U`4+&{)Mgi$4 zvubWJ1cAL1#qQD)0gsFBbsu=3MD#cl8@u$x8&KMA6rv_rYCwFM9L+y`XBJ8?940Xf zvhqSV4<#?}`%}69kg9`!nus)M^^NN$F>le9pXJXz5vS_RTD1nditw|iwL-7B>-@Jj z{Q3O8-VY6}!r=|{4C8UW-mlAq3chnGyN&$-_Iiwq2={&o1PIc6tO)G7dhB0Zs9*9~ zD8l*;!4bKs>(N#hw^tTt?A=XNOr&ErY=6%t4kL8JHNZlvDHRUO?%?5Vy%a18i!A-!6PvNgP5(ChA82DNG z?mX|J11;V=w0Oj}Zi9$2norij@3C!FrYq<|D6RXPyMw>5PpkDiO+VkSWd?b_UpZd> z_N-O>Y=Zr5LxnxXt%{$`3?>gXDVPc2^>4aCzLtOnb?u_;E}|XessvPZS>%*2sKPo; zXz#VYjxWMupz@G+rt9qKDd~(rr>0sgK zIo*AZjJy)IUXb_5{DX1UsrBiPh5p2+AIS>?3B9%Cun#s6-kJ2ez{WODZ&ZlyFV~SE z_y>rvg>d6mGUqo?-lp!KzqJ&4;T@YhzO`g7tbcpgn~9ufAQ&2VU31cm{4yw3>& z|0ZS(Rr+yEgb5q3_Q_xq*pM=Ldo3J7btw(x`PquV3alRf3O!Z-%B)FO-E5VaJxPl= zVT?|U3>&1x)nZeUP;z5ivZm)%{7CCV#k57a3+lS#NN&fcmhEo%S8j$NIg(x1!xWGX zhF2GhmxfmBV1$HTXxYa}tiheAbcMp+S?^lt`o7a!jG+eA6Ew9d4~A`HYga>HfB_p&lbOKTbJKahHz z!tYhe8;izlcA``Dww-LgTJgwg)RO1V+c;_Tm-F zjQcg}*eU4VIve<4XQ4{&8Sq|lgx9?wJbRC$se6%ydpYq-iwr%2{bdUKFy-&R)DvXZ z{7#38QK1Q7T^imWF5d)-lwR^Q^NI_TMYndW$DFJCJ4;lw{Wy!2Z27D05I+HYhy{4Yak>`CBDjF<)U0Q#5tc@B)Rqk96uW zR-NwOKwS5Aty;X54)YNuu6wg;Xbhb8YzRVme_Xco9hjUX!10uXb0Lqrf=ao%2eKTh zaPAp~XKx*iGCR0~wg8zLNNwi!hwRc<%}q@rPev9_sRw>XYY6w$5v1;<{AF0b6yR{{ zFSL6UEg*m+JHk+udXNF_n77)WCd1I5fe@vbeD0KA^a@^SH;>tqbclM^XIg3GV5A8I zjjggGQY|Kvmt6Vs5)_vLg7|qUA0^WP#MW>cenoscQHA~kNxlg%iQY(9)hWTaY?_)V z%L^^l*G9eE2a_yJ+mDVcx|ufUpopu#G5{VmDtB2LFhHq+FVZQ>IL%%903_0#J88%) z3Nn*<0>o5Fp}$blMyE=2NO`E?M6)j{<_hieN9uH)3@W_tN}$XzqNFtbDURkOO%fr4 zk~xOrm3!fz>9_{v3{8`Oe=t>FinmbM37xe@gGvthdsA*Q`iyTZBZBHRc}n!lVi5*( zz2+7>@Q=?NIGV7c*N4CKkku9QxzF`Fcfmp*2S@!x5?wpPHDK=w7Q%+dye@Mlsb#i(lh7YhOtgc3@^tHk~Nzf}2F z*D(AO93Cn2bCfAczw_olvAe;KqybVVQQN_(PjS}&q(0^)N{)3Jq&SX4du6=#jHP#* z|LARg*^goPX`@t0T55i@b`Vsxu6;vIo8Igu4WN9RC7}_6OCxGeJ$*CG`~4$gX>x|Y zl9QrfY7b>H;3E1#I;a>T`y6gvvoDPc53JmDmc?cR3o<7a*DNR)X6}&`h>D6w9O)*Ot|6^ z4}RE%6Wi?vB+I&p1kmfXHt(pllALY-^l>DMBOQHQ0-8Zh21Im-xyn03k z3Zg|!^?gxzQ7~xyPGWCCFszhyTd>mpwa`7XK@ejCga+#6R07d_r(&#POVWbukQ|vJ zAu(X~_x+_(YF$hI>DVg@!}1Ytps;Y_A?{78%e<#rlDC`;$|~lUWy$_2dSSerTKZ`l z#mbk59nl0Yc4ndL-KneH!S3} z|0tWb9&&~0LkLSJXA~!I$-LiGqTlgKk$SfYI;DIpDSNAeS5iDH_(PJH+<*^1uhM8y z^n*bin^+D3m}MNp@L%Gd3Yg@b2Flxs5(I{@@d#4Ye6IQ%h(Y%-Z8;Os))MpN zPhnPtSa|PhLb>k-s!`{dj!c^XQ_%iPTYFOA92ffMA|YI(-#e@d0d99CMQ<;&TB+HM6~=W}#Z9MYZ9KtG=4RQr}1RVxBlEr?ulwo1?r7urWH;LT)i9_`;VpfKkrw@L=1uQc{pPebfr>;#koEVayetigSj_~&lzDokkfNy;^;#5X;BsI{Axwqf4X{4Vl2SkX z;i&tmRHGt}C#R@O39I9!vDvS&WBT{rW=)Ax-8XjMn;!9R1aFY&oEpGh?+L2qG3>@_ zgsqHhcGRi{32F$p*T;K=wK&)5M0??o>%nc#Z7L1CfG1io@ z*$gYYkL*!_`6S`2IAYpG+(V^}kU@ak#!JOMfPe3Ze;r}TPV|+Y!1M9#D)MjEIY5M$ zRA}4&O=3V5&YLsD7qpP0;v<3k^mL6YlmWn1Ef#FyiK3F8>-UDYHZ_N#^V19X)BYjAm~`3oF>0^D(PJQG7J78#z{@29)%B|GL7Sfh z-?2&|zrZhz!YDQ&Wzmq1c@m@IrDN>+8pTzC^vu_ocuziHfoUfc=~Pn7}d7&?C^>ofK}&pHYbx&kUwO87T81 zwxBDl|3*xLt;|p{5kQH6m^*|b)fImivw4`p+5^|d0f~`dM~5VJ_-IQzwSg^P%gUe0 zm{adKP$6&Q08dLJ01>_2Jkt=}FXfyc7^O?;nKNxay=JoQW*v3Sn*CGA#Wf=zSB{E7 zONzQedQo-J?i|b~MA0F36$3$3!Oo2aDMk_Fyo`xeN&{KI`}rhd6zN5j;2a>}^_hlr z5q8w!2RqumYT!5N-BjX>1u+e1zUb`!ZJ{oU?2hSMsO2NYjs~^aJf(ufWKUn#;a9{P zqBpytCxk#xs~aN*h$jDlCG?IMlb8#3bYyRrjD=sov_JsK15H>nzGYxmd84hiVlVqWh? zy~e-#)#^JkrtG?LgPi*0MxVN>JVbKKD^#st|% z+o1sVDj-JNQMGrdn9t9%kHgd(L#$HPH-*oUD)=(c2sIoW6!W2N7^$twY;q$j-IQ50 zkY)sCu{FUIB8HH*0Q6Q7Z06m2Xv|tJTm;eO0r|)XT$LdYdYYfg$aHbrzUaK%cd}wd z$MZmq+{otSn6r|L^E=+QV?~qIDZ-U*d*;VZk3$=;jKVlD37PZTQ8#)?6xf%f^^+Qk ziuN0>F73QI$35fHOuoW-A@m&nP4o7)6p4B_0bR5M6W>qfI1cnW267w<%d*5qFzMT{ zOf-`|0Gz~%y=)MlU0b~KMSSqoE+wym=z5=$@hwzm=^Ck4GEtCO+3@Lg`|^hNe|)x;B59Pf)WmMPn&x^rw246mE$>YtYIZ0L<+$pR%VzV0kAVcP zu<2=79v4#sU`R_XOo}mHe5%a8<%3`ziu+JiQeE%u$GXZ-rS`>fTR04OKi@thx2pRz zlo9L7*>DnpMeOidsi7v^g!m#t^-3sMm2A6L3&&vhuVQ7l6F6RKZBp-8s)6Mr*1H@B z*r#6%FB2hSQwoY0SJT3u7*<^T( zicMi1UQYpJg)4wMlS%`os;E!>+1Oue0S+_3e97$~q(_XCv14U?v!8~-H5_m_v zk-4dY{ir?}A*eTHGL+K9IN7&p}U0iDr=6%CAQWim%G4SZ=6s zE2cL0bZR(wa-%?BR}jN6AgIzrE*G8+&qBh;c`J~t-u}FHnG{@loogUd{T_8A`ek9T^M0M7(PnJ+ z{U4nxeWO#;;M=*~y#?^XU)Vu6ywjwj_hs3v#XWTHbrLKqiUj{S;?gnC>V0oD zx4aND-nJo%T@DGX{k%(W`FjWcvfexCC===l(QB2ZyYsr<1P}NqFr6;h7ShyqKE@VH z3%Mwrnl{2km?ZqGKkO?-KlAhH!Y3%$aqy1vO0)}-GXwa5;b8Wx-Rs<@hEk~tr2#H4 zO+Q?J&x<^PY2EoI|G{A@>Es<~GJgcM1qjo{Y^5!lo^jPnqv0U?(|x{ltzY$Mcn^A2 zs;cYz1N3RBapyAu&R9I4>-n^0MX~Kp?8nZ7_Vvs?x4Q-)`+3)Pc-(XHr5cM%*LN>K z6=1Q=ohJ#_v)anNJN#;=J!Vqu&eQUs5RR+13N3P}PgY$0U-3f&A$M_P6iM{ly5+BvIW|*0@7cia$6DrKf1;f6+P#d&+0Xgry zr!W{2qW64f1rj>p1n;f5@(7%+fW*jBuTk?WPALU1$oy}AOsO_J8-HyZ#OjS=na?x{ zs1k(>CrNEgOU2fBFHDzrYu~NZ^3Xf*<|oXT0|}AIcEKfehOgQeYn66xDbxRe4nZ?l zgOndF$_OD(;pY7-0NhsJB;4ZhN6Qw``|7P1ZTRw)lXc4W|#-lE&9 z!@DO$t)&iKY9L>u&EO(Ih;{@pD*rx(FC98?`MOlS`!M zv(Ea8=0w=1%6FoKfj$gkGMV2H@j1=xE3xnGby}U0_^_b&>z*y&R%?PidS~i{_8+$2 zMcc`DJ&QPjkZe@O7w8Lk+=}4hJ;%SD+wPNY?xqqAn;ePk;p&b@f1*7tpbrPoC4OZ8 zezlNvdVc$@Gd*<<@OlA!0}5#^jfbw(@L(4iJo_?lr+U69?~F}d<~ZG4-f=zLff*Je z>0IqIz$kiIp`UGmZ^L0tM~AXkdb+wOc17=!*kXxSOf?Odj31#U%dYK>J>59I4a@{vB z=;|PxF+TyAYZRENQ|vSrPiZwRYdbWW2$;-$x6z#I%qFHL{_0*Y^i8V3PW}kmmv8G; z?E=HFonGUeeK#?=I*Z0R7_N7qs8yrlUM(W zGX;j(ouf9`&VKto z&+Ga9vp=`9*SYWOT=(_)ygz5pE{76f;F0BSL+y#uE>cgT0C}<;J%2?G*JN@2YO34L zvEc5{ev8fWD8#wNAzGA>&q~$X!r&Fgv0rS($5VN~ohsVj3fm7XBHD>GKk4q0!~K3r z`St&-uh+Ojo*SwIrG}0$VI{#X&|3A~^OJ7)z?n+8@N9DbDPWS`Um2$ZB$*GY}`-a zrD|`Eq#1-=8*nQx^_vr#_|`dGK&T>Vr6I#M2|VHTh$VyKy^8h#HygI1uSMw93yiF* z*RY(_o?5F#d)k{vtafa+pA3fnl!`e2S?Qc|#PY$LuX3KO)ByE~*BtH`K)9UU@8<2+iES zX@NtqEyhs*v&gn+6U~&l+FHX?2B-RfOz)9~iB=Qou2PK5q!ztf`%|ymBV{_YKt0~k z+!yJzSC0RT1(EWS*k;!PwF5CjL_vyK@`Dj+`0-+~#=^zzDX^p_ zLLFKQS5;WR@-YqMtURVvK$%e@UAaSjqemImjSDdm3GzBBx5|o&A4%oxcDc3>{i~27 zya*^SaMLJwmd{6Ddh9g!T>ej-o*w$(DYi6`$mc;Nl&mK_Lx`+QN&ZO*fYqXK~ zIdCv^kOu3ezS49Ctspqh@BO=@y!dl9b=BgCY$!G82L3IWjLVhjjJaV957uAzB7Y zap9ufAcfdBD9-+lU3mN=wtssT58|r&SeW4F#9r5Hw{1Lcexz7^ZuQPcmK{01>7&Ba zR-rGYq_l!<*?3&j5?38~i%|Gqj^#v`!h`OPdu})i8tXljt16eBWBE6hGu!8mH8m|G zEP-0^UdlHDo!Ce&Q3TF4F_`UrL`*b=w4&BzVv!9P$`IF!es!hKR5Pv6O{S~+GGXyc zla5rI+=ri&hU2oEd-0_E1yrXekjVqJMTmf{s;;4z4bE(=u{mP|juRPS{DX!e(JH9n zN2yOpkta2i>Mq9(JC4$$vJ4^|`U7WZC0PU)W5TvD&Vf7T9LQ&sgkTZgw4DEbP&U;* z=XlamgBgN7B)IuUJLVOG>*EQx%aUMslxf?s)uXb(8(b543ZbL`;kTd7G7gU!1LUHM z!f*~BAq$L|-&sM8BbO`S5i-_5^aI zu;Stm+ZlEF#`SstbmY37iuM9pv1Lo~gRogw)P=Ix6*E)&npoP8HFIno=||HN6<&qYO&d3p*+?#S_UF7!x%!Fj2NGk%X$3U5WU z?^3Pyov9vapsvKtTFac=y2(BSgwC^YXe9Qhkh@)f^Z>Fc?|rpi1c88=(L6vD13=5O z%gZ*AqgM#h-uwZh$7&x>l?M!g&lxReL_0!JF zT0`A>?&QxnenL1}S(rvexKr?<>{%C8)l$`9pWiLh(@{8R3=8|Wp+S~BPa`a%5zStaIEzMYno(=M+xOvZp)x1qg)>fi6@RZT|fqo2f`6N04 z3tYp>jf0mu=@P#2_H(j8c$ApE@{L32LWac`RZ-XjGi-cGc_T^9H;^>$dgcVhG~okz zR(H0MAcR(ikeAH`7Y?KuGbao?;*^~#XH|Ido-v{2x+f|;xzm4yF5#%|&EtztC!({) z&tqf|VU_@_En9_K=Kib_iyv1YAz23o#=F>-*6?t|zc*)uoZ=r$g@$h{7n6;38tQr2 zi}N|DN_m*-EH*q}kk5u&>>Z7DlFPBU&=IS=X+xDupCsA{-F9uL2eJ4(JSaDxI#>;? zjqwy;dg`;w8aj`l`l7xV;Qb6D6(fMYedC49gILb*GD&bJA&xxYd9+4({;Ls!yDtYg zT|!)yqNTX|s~+16ER_z}eFwbI)PLABVZ*7kfbwnl-w{v2hj;~A>oGNN!a*oSKoMW* z2?T@S?e^1JhdSI-$R}Axok#o@x&+Ij6DYv*S$p#WTf1fJiH2dNz%}x@t*Y2|RKKb( zZ*TIbIq{uaqjF5irPO<=qd<01b0Ockq&H9o?`&qt6_rTpg#iS^muHU5Uw^%HT&AyP zueMo774?;l%C^7SzBsY_fqhm7E647o&fzO&p&RI^I6?&Uwa)AL$)7=hozw6S67=-%~;YnyZa zRYkHlSwFx@GCbH@nBLQT%HJYye0X;zHDo*eeS>N~O}__DTCtsY%ZAE;=Kzb%dRO=W z?%1-Mni*4dPm)N41KNC3jNrsoh#IHy52hhjE;xk78c7ux8A2Lj^`n6CP+;CD>po5a ziTx}z+1AvuSIDqA(sV*7uuYwh;W=7kTM8CrY@Tu1i&F+Ys`P}EgIH!(kDuA6bwWv(l; zpNyVk*uH+wtSD!>FO8_eAXqP!ZIj6@*0-_>WINW=D)dCOtzBOFAN-5=lxA!wi_dEy zq5xF)`NK&vNd_~i(QTToZO@IF8NbJo9;M#Ud7aCQpRE^F_jgahpFW)c=jB9Oj<;%9 zsP|aOb3n0Y%o59>%K>rk1RW}i4#t73W6Rsnn>paE)4o2~fP?R89rI*FO?hx4wz~@= zb#JVsP^ymND|`g(d@u5v-H-cg z2e7u{ulyPEz7<^U-2Md*-qx9Nipcsg^m`n34>~HA`lp`C z`I9sHPK~EdBl%aKkiG=>vD1*XQ=NIx*J&6&4^5Lfi;%yDd%$W;D$AO&0MSGp7;O8D zB5BV%_g+p*Nq-!EZ|9z$=3IM|8J3|8d)m=g5H*9B*ZSVCr_Pcw=#8H;xN`U zw=}U6;vM8e7}_p&|C4>gb+)(r-j>2)%kFZKI3=(3tck}z-zTe(4rR`Pmrln+EY~ZM zF1%&=85S`hKw@ijZ2;_txtP@0tW%;SkPyyr;)4L^)DFgeXn<(XeYahTH$TIyK{e3( z6@#~`sqfDWGkZmcDIxpu=7K1{U=_)o?Rl#n>o6&f>a~lb>d_Tq2>I@k)ejyU80I=5 z$99O6G`-L2IZMJee@6SG3^oX|^Mnem6>wN}@WN%rAXAplT>0pwQ%LYRKDxnR4)y~5 zL`*P;gs6w5D@R|T+KItyw>>oRgaGULy1XUXJFKE6s6}wmLSV?4ulF#ZpvDI)-b;up zqn)9`k- zQ{rUPG+U%dVhTuYFe}*_Xvyy0*0Z!Sw;!ZRWhD1We~J9ms2oY4$o!!*hn&P4e@|wQ zkV)xJxEDGt40NTl3D$r3f{`TU9zXLcR!SUJ_2AC!>=?pqD92BhHNcytR9 z)RnApDjmVkwqxuki$xGhu5lx&fKc6UOYeA735s+WgcF@zNMHT@ zYMZgkw{HHNxtICjRlBP|GZ&53*tGW=Q|i`iQ^V2BVujn7R#s+UCFv@~i>+8}%XLG5 z+RoAt)zNYhg{|RJ<4+@BnvQx%&L}ztZtwLoc`W65^Y5l!?D@Vlz9T_wm&Go9(j1A{ zG*Yx>tmXQln?0x{V{3`C3gN*4@73L!z)r+jk@0}gPL#tU42w5!74xblKE;%|AVb^( zSztEs$Xyi~AbLJ@Pn|Z|r9#=`<&}5l;1;uGo_2T-1lPnlS&48stIA*>yr|dw2mfZ2 z7O2+a-TuftCpFTxv!^dE#+SV$3OM!%6l^vu_8aGy+vy(2wSnjPMtIOWgUf}Ky3ee!e&l898Na|`X zLNPg=AnqOg@8}dZ+=62{S%8K;Y*Yk9jz$%6T9LtHu29g~MD&%7f%u;mwB02Lp?A6y zhyF^N@l1Nhs=@8xB%QE#R zODrjCeFL;bPIbz6iN&X6k)!5*5jNT+i%;aFbNkgn5mmz7sOLjj-p@nn2S@ zBd-&Oi>Clz_$rgfN_0T=@8%fHlNRsmnF~i~lkWGcHVRqR9$Rk6Se1J6Wc9NE+NieU zrjz6vY->{`sunYV5E6qiV-|n6DJW_4y9k^k&qO~;ZFaO9j(Rzhdy3obZO`hNVDz6M z$nPe*jP#U7tU$lcoX191Bvwz0rFx~6;ksySJMCEAvV}CCodt)D#!&uUwAWxv?#h!? z_g_{n?ZmK#E^Z}cz6c6d+T8M&*3lf7SK5LX!{PJqd?b8XY~)k`%aMsj9*k&tTetH^9RDN zK2)MBp?x4Y;DZf4;xt37wTo?SL9MX@?P!Xg59DWKUpi{9t`yGmG=b0TuTM^uxOLYr zK}ERi3CJdh5H56f<zfp8E-~rtyeAKN*cm>l3NE%V@ z-DKhkUe!w}W~^4LoFE)=G(2*9(xc9twrTB#d^YSk&Re zeyBE}@1U6BB6-!O(I7d_vO28VJ;=bokD8p%dF_8n&^me=ybh2z*T>5ej^)!8+7I7R z%;NKIkR|zEE$jJJZY5XYu<5mTbdT-@d8@7XUYk5F=`xM!twrPZ9#^2`r^)AI8JqVk ze5kK*Jnk$!4}}vrD!*2xNZD*+rxG;&YR-LV6Ko>tg;Ch5`USQ}*B<@jwN;I38DA|G z;V5xSq^RV0#~E_hZo|qBw%}zK^uUGKG~g0lCP@3EP_%g?t=evX@vVSma&H}cZo(6pWV)^ z-g|8w8k(0vn#2zY0N0vB`((XO5>96e7@g>|B5$rI)GE0lD`D`Dj^NvRI;vHbdI)Z= z87XKb4`7_ls5n-`>6G-o__eHk|Jt`AS++ebXt4Zo{2Gs%K=+6F}<>n#-1d0>9m1qxAVhxUHGip2iFyx=G zfBLHvgt)F?0MKl{E^NZaENFWxpQ2yt(?q5ZN9I|E5&2{@Sh8N&_l25gsEvaTI)=6O z_ZM*FHFBe24n0ukf()qb9QX&Ta#t}p`Q@0e(?p)j-3I}qGJMXS^*m#K5C$3i#$==5 zr+2UMyuS~dKykvNl?<8CQG1BJ_Zi~5rIF&|a)kRZ=44B_ze^)9Q=@h>M$Y;rm_113 z^e1U+yIjt0UMNd^3HEz!$Vq3<6!lpRru}x#>W*Cp8L?rUZp>ZsV*WE8>gzI6+O}65 zn?Hu3p5CEMUMzn1W5DP2c?wY9+YTWV86#EfF?nwgz<&JB%jIb!lgP_VA=E>-@>&$} z!II5I!O#m{=OFbJ6`0IvWh?VNQ6S1OIt((}V=qIGu*oCJ#m2~CcXFxYWwr15d)pl_c6;_LirqO*r2M7Yl0 zdyR~~7xEB3(5^}VH(j9GbMolJJ{tP=r!#OicC>vZ$;~wPsnOcyMr4Tbk6Z3OdrU>5 zNPsu#UGSE9Pmnk0;Z;V^`H>kp)E*Q@*7@ldnqc<8Erz(Y&gJY4BGSyMK!nBHYWsN% zq>tszS54u&a4`$%Rdb6TYmJfAT+7;+_nlOdag<8_AbX!^Q@YTWJgVRBpVDfugJ*UI zuk@MY3gTdX@vSpg1RsBy1c7d2`|gOxfXb04*?>Hn-{e3mqUI2dlcE*SW+#F00oIi+ zCI}rm3+=jVldaTHxdp34YCy|hIDqU__d6i`FShE3p;j6l4`}d&p;)x~Y$FZ&%|dA_ zhyRN{Z;w?YE{&K{YAiEn7Wd$Vv4-vHwMn6AzgpGRC?B)8%4zrfzp8$n=NBs=Z$u6P zSQby-%()UKq27Z}Okx`o6C5G?sh<3~eSv?>uznK_+ICrF4TKuA4w>%={^}D#v9cFq zo%CL3aO?~_*|+{J2vF@5MBxz^rGdfaD}X{?t;hd?-QfY|8qh9MduFvv*D%B>0(u~FpVLmVZ zOS;9L_?1~ruzjKIo`iukoBdJyBDXo*j-?GDewP=;B~TZ11&SKnUK&-9sUZs}n*HAL z4Lah)GJL5g4#d!>uX#kBE1}<7_26KVuLog9Hag7_(gcI1|6#H0h^U(d_fMQ2@UP+n zDpkE*3z2mOr#C0x^as`s8kel%cfcYX{5Dg6QZA3UbtFEjY|T-Ma5N?cdcr2xQdfVw z$~1mE;_0kRRPYP-x+jT=n%o-x3jXC_8BVYVX+Q{gUebd>dDsRIo0rKEo{Z>&z^x#v zXg##jlGL4Q)9112>o8K;^lxX~G@S+x+|PwJgejq7=VP@= z6ZOi|`#%7?@66a($eiDoaYeFkf~)B}2^Woz&u|jea4K~zORmnk*%4A2FY?sx^C9Oh zi=BpKJkPPQdg*f@4x)_ibv}1|wFMuPxP*-$I|0!|fS(7Lo_qXP=_zEn@mt`o)?e*g z?Fg8k`A_HrD{Ssas=k`CZw>Y!Tk>Oaa6ww6|%9naSM z_4SM-XaA6fZ2s=S+L@U5YPppuhPr^VL-g4$dD`*w9SmlInU4Fl6aYv;{0b`~`p zb3@bavEXptE1XSb>=_<^LNEt8v|->_76@7^i_)*e z+QjekV|JoUq1P*IZ}sWxae(_nDCtJ65iPG@?`Coac>KhgFHob9#d8e*=8b+UzM%KE z(~uP73%JiUzqRVT6*m!xC-k(%v&2f`D)n>>L%Iqt(g6EjCfPSx2!!1Uu6XiBdN;Ln z;!!lQ?ALM;(HSw+ZS8Eop`%3(v3^vJp!%04jF=C#duD0n0{zX_)a7Zo2X5@F0V;!= zu|odku;_0fri=6kQ2ZE@48BSAN)7)9Zr$6ykvewa<%6Od*t!ZBN3rtalY$g`-Y(&xq?mw4B};97yR5fg z&v{!5_fb>=t$s3hef0BL#9*!A!_ZAQHE6w;oy(UX&{xpz$<^KEAaS3!0}dr+97>h~ z!(xk0zpsJ+Qb}-4I|-3(_7&D;kiP`}V(nUW&abuM{8WJgH_6TT+?tjtv`T95cX=S9 z1Lf(S4pmCn37+GvekBGQ3E(@d6=&q@zPGO8kJoHc`q>L*IX#d#c2Wp)Bpp@s-bZ z?}X3Npr~+jF-J*sT6tTO$^=VW^!v)!$ZE5mU(epWFVT%EUmV?~Sf{V`Ark_w^CK5_-s}Ivjpmh&|4-XJR zjO9Ag9=cnV3Z| z%lg)bq*p2%+zg`UfT{)EJ5G5$$Rf<>#W-0cz z4r8P^m|1i!l3efqjUDl12!%~f5TAIQ|33BMC9-_xdaBdZ%M39V_p7Soajp~FeM*yb z)N~>{H+SP`;9fgDU1@<~w1#)j>Oir#aG_2_h`X?e^C{vYL1X{YPl98XqRAB1_@T<3EDHpewGCKAd)#3~c) zbm<&fv4GuYcq^MV+jQLe07f)vD(ehJ#b#&MfJus!q!3>V+slUE(H1sfa=rvou)If(W5#m`)ImPY>SW=eoM~1OyBM^QVmb={Efs} z*Lipa^rk_1j~V(9#e2G!FeH%F0B_kq{;O~hB- z!)=^Zo%&7lIwnZ-(&uV@N#4=>|j7vgbu&<%;5d!J2sddQG^ zKQ3)O<@LsU_X6NttE6p?b4&f~Oz^aC>`U9km3Ju$C)4Jg&egUC1z-~`Jmv1`IS~Yn zW#s6~#ph10TK0uWJEJsP@7mS=ERTn%Gf5vX;ItQXT;aJaeIN+LQ>5>6mZaMGxBxr7 z+OrO=Nc+ZlU)ManMk(gFYQMO|O5soubx}P!a0LkiU7xsx{;uOQt=@n#K|(1`k`5p- z5N=>5<7XgtVgS3kv+{Z}YsUJ<>`}YD#hLh#i0_rVp(=~5eA7b|0WG*)M%MssCcXVM zRoPGj?)U|MKjLrTUPRimXr{^{2o}m!F-V7=q~8W(1vLc-0WmAfjhH&n6%!Tw3xvH; zPWll+F)c(whHx+P59YJ3iGrc~E}O^-M9&t2YPiz0LSP%N|FbDaqA7e$Xj_Vy{ubvV z_JefY`#Lf^#yK_bKEBWS=kQ)Uic=?2(qfEM$)Cmax7E6XtxfT7x3HIou8D10LZbz^ zAh;j2Z*fe97Wq?(k5r5w6I^bJGR%}Ub+M(t6h#Jia~7^YAc(#*)M!$W!IsI& z5#Y*5l3Zzh`{w#)(LyNzI6-N=X1si$OAVe)snaHGH<=y*9IjSXl&-~x(D`8G;sEB7U8x0ezrT$D7T=%&Fq2K7gcBzz&$tR;wj}O;i)OzaMw5r zwp9hZmlz_;!sl;`HxhHe!%x?=C4=?JCMF zyZ)xspiS?j-9>3*{_Q<1doIIY4=4e(Yoo6?4oe?Ha$6r_PL6nsr@lK>!wPO8XJ-(P zn~P_tUeE4iy!a3nNV?&z8ukeb@Ut6d4)#Ms+fpv3ME}_dIlO)yul?}yL!1V~+d#Sn zzGPL?!(UI@kY{QFuExzo>O4A+jQfd&QXZoi-u{<=93HuVcjHmv*V}cFQ=BE;Q1cAq z`dyi4lm&m^8@~+`RII1BtEuhebny-J@#@o zcs}J&wN8_X(q3Q(@rUl?UFcI%;UT(YdUQ2{FI@3{0zFqjWhT8k)$Q^>-Is__3#a?i zt_g#YxLnba65wn$Sb-=&>hDbviAF*GOF4l{`_9ebn#47!J{De0)aJb#sCO@#gK68{}DYcYP2-u;y}P55|Hv9N53;`E5NZ^6+zu5jjF2bVw^{!F(goK2M-WV9&(eRq!Z6e! zcQ@n%Yi6}v@3U8_MZ0Y~ZR9>JG@EX@{jrA~ zt-uhYBZ+Z~7Ya7p+N2QS&`JCtqQn7JXMakn?(beKPFz%Xa4s4-#ic>o8K~t;+{XSv z>(8@7A=MiB?>)*V8urg2G2pJ8Q6&yW9xL@^8Cfkr_2~T`oE3?1^t}+6hHGL4CD&h% ztmn7|JyAhsyyrAzL>1Y7^}7NO33>8z%9uZNoQBL=EEq9+K;FDkH4{WHtMR=B_ER^J zdOGe8#*`Tv+5VX^q&q@%vB^r9Q^RMtS81H+dA{fW z{j!UcXh#4K|-5Co@iK@8pm z9G?<6s`8aV{G)gxAS9+-);5=;`#ijm!_ZChtr_k(2=}dC6wD8mgiPv&H`en37A#d} zS)u95R}mk20EcT)eBfVikjIzLg>3W82{+Lod#|!Xy9qxX6=^TB=|#?GDj%?%EEBH( z2QS24=aib*V<(8s20x3Pvri=+uE9N^>Byj@AIQgJ~% zMcm`n<|F_AL5iGKkDU(hkEnDYjkI*8nG&8bJ{qqYi!@&pl6P_CnN3L>?lhY|!jrq_ z7x$9Mmy}m95e_MivxdZ*EPYpLhqebHNV_f13&HwSPzdQdhNJ{>Av9}>02Ky!g z?WoNp8)5sS5TFW5l9!TrcwyrtMNA$lB{r0Mz6QOYEKwuTSF!1|rQbti^#PYQL~*Yp z^f$WTJLUiX!VUIbjr#<8EX`$8yua9^a|V$mIr-2w>8^X2NB5S*vIt4@3Uj2+4gViVGnYXNJ0#;NEl-g5R$(-%Ae5d$ z@f8`g)%bs*%^kZ}fJ;wT6Ls-L&Cju~88W}Cii&gQ@bW83^-Lw2It1j?Ckem%#HX8v zOELBB&)!_U;g%;lGh1x-c7ZOV$V3ShXqq~rh>64j z%4Q?muK8gbqZ2QI1!gKYX$pEpdWBb%kdAv*G`_{q_RX;2@;3jmPC=TP0ZuzA9(VPJ zsjo?p2ny zSaL`^Z-B#Hs~5{Jk~7Ah#?6hLowkz6OFR~g>|%My?$6~c@dmZAlz&7Rd85R~^$Z<()q7Z0$2$(tGmiu5Kk^G-ikwP( zty~H!4CrMMw_4xfIV4>Ayn5_;%AK9??w^OE-J8>h3NHuGv`6?E4jcRkb9+z{<;-TM zV6>6X!vp+%n zUym4a{F7KP!+xUaWl4&Et?3uN0j}s}`xMTDSL8eWDiC_dBanb_y2IoX`-esQaM{7g z`}Up{wtj3}82!h2zaDfl;z&!v@-+)wJ1cqnWDDGW8IyBr`U#_LViI-3g5tdsISjnT zEy&mATKzeg2)A!&y~< zhsQRB4Flbs^d)fAiUMf?>B(rd4Bf0a$O6o*C+N`yt+X20Xx7+?BFsIXj_Xpox$@a7 zWpqHj2e>Am`Xaq(+VZenP2Z$7)fAUR1lsCuu|vHm7p;!0qB^o)HVhXs=H55TE%A`H}X*ofoh zrmxd)o5r(CryS<{C7(vIktE%{BgO8leVQ%IJ$OfA*Z;JnVl{EzuIKP`&Becw|4oExD8f3gU>TO0-YIw?u&|{B6W<+`Rk2xm7?#+O{_dxMU-l<>jbr(+48Pu}T)6JI(|zk7E_G1g*)M8!oilsr;8Uds1J z(=ShaGx6dsLh3suO7f9-U}4-AkRHzsQ$z(yXe#ahg)A4ZrfyQK&d1)Q6rZk-<62ND z&#&|FFi2Oua?(D_%O z-1lXZFYYCszX&2G*7EnSdA3eCHuP^sPD$q<%zZ#UQ4W1-W+s*UP& z59c|tVPgKLT>JUmDD|>|fW;`{vOK?>H1!ZB2NfS$^&pJAVARhXrOTjp>RQj8`GWtW z@$D%8hw8UU#Ig9){eCSBBcQ~>)|;K{R6b^mt1VtiU(T}1WBN(p4f@p`+%_mj>u6+{ zz6AbSQPRsDye@udCpV#x;)r~?ITb0w=I{l1m(bDveW-DYQ{>BhJ7RF^VX=LmWfpx; zKi8}OUD`WS3hvf&m!q;3$@>YjBJM6v!hyUGbK#}9qm*gRbAV^$%fF>yhABV^b=$B9 zf0-pDWRUB(yZ<1?MWQ7V+Fe3mVK)CV(&oK26n}9PTtt4CyOh$DZa}?2&|T zpvS)<)LJiU7sUABqZSCYA%Grx^;P6<(r`YCWbk)9N!t0*EFA{?4;?X4T19z%#^fjT zL_q9d@+Zu(4s64U3S{L8x-7Ctc&1e!u zt3oL!3w74>hEUgjsfSN@4@2Ya_4mA7)JXzOv1gqMrL#(O<}7C+|Np2jKn@J@!!pr` z6zTrLj4vFo8ZTqt)6RMnswa#0w6c!M+(x1C0!I`wVqZp827@6xBP9c2i*Iwwe>9`E zjV4ZFidcghQ=Xxz=ep;xDt92u=;CL}^U9ad9e>uUrACHhPn( zCs8{s&r@UN-#aaGDzEYHPSGxilu@1sy8;k(Gq$V?o7~dIH6KtGno8M zslK}cgJT=xaDHx;o){LhDZqWkR7q^n(iL@f%d&}+eii*Ni`c;|2)i8xZXzv58r}zWe4UE}{JR!4kk*UN1khTUGcUih@{j9kub~ z>qlA{8y5e^*ToRU#3N?Uha#;}?lT_I{bxL*ZudVjd|lV0(SfCn;o**d%FvZDED7D@ zEnd|`#Iz6{&L2sti_^fPqx+w&p3F@JdlgMyj`9XUf zf~i=WC@X${a`5j_UH|9jZ$Eka-p1^CM=@Sybk<-_VAlZ`dy7ho@_JFjbk03^^S-mo zwHTZVl_55!iSep|*q>n8|6+7>mfsJUjf%XOpi7v~@#O($yQ9&U8a9hHQ;%u(@mnq_ zIOzHdBX%xeo!LZv^nN`-Dw2jd?;PtAJJaE)LGz*1=8%1rIhF!5XW&5@Bo1~!b5V0} zcyoa(=^wJjDI>l3L{s8~H%=(|Ak&kmM&}XiYE-zTf|X?+Y1}z|{$RQz$u)PIc1s#^S1Yb8TOgWiGm%kZ&QwwGxbgPz8+x(ZM7{AA`E-YV8&P8SBcR~QUmqG8=FmF*d)3F zL*h=3ec|{mPIOkEfHpb>XJ%ISs`)hj!D}c>oaWj#l{ehgFI*QL|THCf+ zT5bEaoylloJBu%YmqYD)CHrYF(X?yKwea}{h4pc1&PTt}ov0AB^kI8JrfeT?Ux{x; z;%_DZduT%396dc_7TOs{nnoVHnM+EyK7*0JJg_ZYnh0{)cqh*DCGTBGppjn4r`WYv zLdr(v@L#PbdgF>As>|zPW7Y#?bmVX>Y-Z);HZw($j{a&}X7v2n{;1{3&=G2PRC`U( z%~qTEkx7CcW+6oPw%a<7ca*;LNr6y}WP`bdWUW)W56q#!`UEAn=1A`%%QC3F!e%Fd!fT0NdQ5WV$xc>rwu64;jQ%T*>`{A*|o^>DG`UA zn~fG5Z|Ow8C;GgEuSB>#vlJfc0k@uoB>Qfs73I4m4d75`nu>cBBd=p$&&fz0bEjRP z+3aUZ)7%c{#&0t`;d=y~vWu&6tS4s)EdvPhRc!RTXC4z{W zt^aU#XZOck%&aHuRvfjs7(o-^zC79J>i=xZS;BKSQk(& z#EcE!IFUO3g1bpMab2)vi>4*yK^4BCJ<8KgQdP8%Y8C5)K7a04c$yb|AEVcp5<#5o zBIe8QC>*L>pngs4(VO~Lfz5mNg@H6cJb$&eq_7U#%@K&J5{GkmA-)<=Sp|b8;8)Zv zgT=kfiI^r2$5NJ^_=?m-`?&JXMnTN}9J0vVzGfltx%>RC$R)00^1AqOrlH=?Y4;CC z^|_3-p?#3_uqS&s!}_4(+Pc%#ipeM0xhibf!s9Z;F$kbb3j|)y^BYyVn8ng*+{N5O z(q{W(6F9Jb_b%$_&p%pXhfzA5_XW^S!cQaBvxN;Jp71*`MoY#Fym85v5ehLwoLSbA z=Yk(9bHzA&O%_gU9hZA{fK{dFhe?x56+Lg6JaG7^Z^ZZ1+|>5uxp|)Z|2i#dGz0ED z(ID>d=W|Q;J*qXBs8^=qFSw(@9yMJ>14iP)7-ore?Nsqp-;c0URXk2G6c#1SnQkzw z^`cA7-)TK37iA0{{chKC!&6G>Wn*?_y0_FI@@?Ix@Ra+CRu%7;>m%eLWVYO-fO}zQ zP3cx6l7yd^)K}zB>XgD)E~oihcDm#z6xikKm6X;NZ^zboS6hYqzhCWMSLAi#wXed2 z?8vj@H(_(81{JSayOpl+^^0RuXxY&?mua8QtTDg0$B7oY;TK{`Tce+@K*bRwCKCeb zfHzpBY<4TglETxy&bO7{!bpdE-wzw0PBC`26gm2Z^6f74_HSxsy{#!y86Y5eNctfU z+3C-HQl|W%z`fBtp0~Ki=skVa$1%i6(CrHThd(av^DsM#T|xmoFS$TkUMA{jq6Y!3 zpg?M?+lfEa3Y#_iJIcXL!j>-wwJy-3J6RPk%NfV0rvo^aktrV|m5uTv_{Itt86f9E z0q496jSh1l8wP$35|-5jSCwh}nD?z83dYkvVU>mbgM^J%a(HuMn9~VbcVJd;A)j2; zkxJ1JIAj!Zh}D{e__Lhm1OgDVi(Z;fAgmWE;Ulw(SgzgZChDA>Y&X z(1|8Ju;3Ivx7W=cqOX%erEy!=9-gvtR1V78VVbf|&N9nQhIuU2PH7IUW-@1*sbE&w!zwbQnK z*||W92}$qqdXB!jZbQ|^4fKXw2+0WtTfd-2|MD%-gSC>FUtyUfMq7ogLVQBD z$~R>iD*1wJs2``lTIA-aHcbc(m34ZW>(d=h|<+JS!`>Xhh$;VF)=&5J(6#gXv;&i0hwmV2~L`N4ZN*Ma(lT4klOrt0>u zEV{b^4^J4f0wBd$-M1y<`;@m(vR{< z4-|d#%Pg_-6{&~4`mO_JBH!wrZg*cv;@LEJnUyD2m9@Es!E61>N_SmTX4=qeOi$$~s^ z>(FC8FY)<9=}(foG`hb_|FRuXTNFN9SDa*_w~T+$MuDWbpxJ_nI+wjm#NrAdXL4Wh zK-a3C@9|_&jIq!78=m_a9VGET#hsrNKIPK-b=OA#P?u!ah@$5<5|l)EovyNesMb|; z$zF=F37`O>H8(y7$mN>XBrq8LlgB6vpEVHQTzwgLtwyx9JPB6DI6Z42bZyr$nL62nTD0z-*ZeLUS1+`FN;(FKDkgUcRr_0Jv> zuFawnxU~+)_*Bsfc}_wY^ax3#oNof!C7PGHzpncKr^#O17+0lvzF z&yYfQ{-eiKA#ceTiiLwekp+!&{?3_#n&}-_F*F$zwo!NDD%n;eLwO35ghueC2tW2OY6}OV%7fxpp@?v|<0)=J$V{n$W>36L?}&-> z%4dAz6H9LNJQ5`NEi*CjgxqS%QodX9cJ$h{OUn4^{JqFYwyuY*VqKg~IeuumqcbQ) z`Y6essA(3j{Ue8cvQx+tfOqwvBeVlMzbv_z^FW3rb~=WltE!Jkj4fJ|cV$_LL=Q^# zhTTZE@p54fnR4PB^H`E)fQZohP0mP_V<(MNL^d$8hZ5k{tR#uAwz0T%Ok%tb2h(gL z1wPF#-N!%U)~9?$Bg?^vo$jnK@#L<1FbUuK_*c~O*A?ovRAXxrf7#^%M8oGT8e;qY z7=4fZHq@kQ^IIRa?k}>h9v;#kv5+W$a_^dR4^DlGp*Rh21Cirn-;)ObQT%e`p@~=n z1IH-q*W#&`hiN0waMkXxi+`WDaA)ifT`vr4-T}mBR48H=%O+yiTx=J}XHccs=pI<{RdhJ}XaAG=ZHS=RaTBa) z=6JGR(N!Vx$-;UDFk{$?x^dJaX*+`;rno=UywjSmuxP1y(=^``k|G+5o4Yx3N`Kqs zDyd{tKt7I=RSk&O&j0iXR?n_JQ+=eojht8)4an!JbMl3@@=u(Sg>L~+;wOV;bl0!kxcX)w_Kr7yJ7 z&w=JIkRUG1~WO$_vVQ7&R!u#|WtSD9(~N0`!QL*iw&GF#5ptR#ft zTZ|zrK#dzLcD_@F%Tr9Eq1%vsxs??E+0~#Uvx*L_S%_Gh;Va{S5si!3Mof~#EQB_r z!o%4oI-h+8wd>l@)H98vnpiSi^g4+lBB4f)8pvK@x@QYysm>dRfzZb3qmLC z-hp{eT~?1tDv`AQ;8u1OKflg3&z<-*HF3()B1NUv-!WwDs!mQ-XZDUce+{sW5*gl> zqNkCm_PYqmHgjdPTRt!HY24;I^co;-Gj8T4%EzRQ083`ncZld7cV9O=?a_(D~c74*iKVS4ixY*{|({zAYdGYnJ^ofjydD=%8X|^Ah zGa-q1Jd!%~alRo`ANihZaWoAH`S6z|ulq1wo*i=mNur&nK} zt6IpjxR?Qm0eY{Q-;NQ=>2dKPt3gz7elWiTx~ObH2Q!k#PfsB z#R1Vr=sjCwMJxc566gW?N5ZeV6A|2*DrhGM8iKXky=4wG}w-n3m zUz!a}55|tZ$Evx$>S`olSL$8bizM^TpDP??uJQLP4R{i(3Bqm3N=x`eiQ>GNhF?yb zrl?7jT+&LjX$o2)ns`@LoJ#D!oilT2{==HW!V*ipAV{lcN%tqQPpb*KkzH;(90*T% zRWUdC%3S_zV6MO*x{Z^m>oC2HN-E&52bN*2K|LNSE+FqU3V}P4JCq|Fnh2C88W~-R z&p=)7Rc@a3Lx~FuIn%t~?HRLOZZk{u{wgK=X`Ye$)|NE^#pGg>-FRB^<<7|QwTDqT zH4x#rr`28kjxCwxHsrhUPqu(JO=T)O!ynLT@CvK4Hr?=R_)t5c`uXKxWOA0Z95kLr zEP*~Y>8>sTa_lc3cP(xoAtMjh53?)~8ULo4>|!hXPdRN7n_<;Snv?Dz#sg4%zO z-1Xf$l3&gSDY#(7^pd!5V*@+x|9;jk{H>`V@(U#;D(cp*_A~b1k&gP@#Lwm$^q6h% zuiVA=fZU*>tV5kt#CTZ`JJwq}RZrsyc}nWnd}Lq8jGKHX>~D{Yp1I(~>OS4Ib0ukd zdu3=z!&&|y525~1t3Q^~=O7@^5ZD@Nqnh)Qm3ZkbDbiEZ_9}T3h!0!=0}<#!nvZX2 zV1|>Z75o#V7n(kkjm7ic3y5Godb2cY)hmS{SghnuKkGIe0du}ceXFgmV;NB`=-GY6 zcZJaLAWC6fd)=69nY5Zt%?hoxoX``&{aV#oY$Zz8DKd7~`@eJ#9JZ0#@WgE(X^-{dYh}_3!Al$`2VVIXh?z}b zFF=zX&Pa@Wtj)#kIh`?9-?X_JKmob07>tH@pS?RgZ&{&KeP^UDj+p3d(;W)Ga7xT6 z-|4_~hzXFesk#Eaf|W{%o1ndc2K8P|y6H8|Dad9{)f&JwGfRVF>(Mwm)>2GAQ+- z3Y)i3@Ny%~8!J?jc#~tcAO$>1~wQN)Y3}f zHkL@Pp=qdWc`i(D|j_MtSonN(?$qOnyoI+ZPQSW}N%Rp^h!S{v3Ob_b@Lc(l1o2A{jRBe7*=MaYM6Z&V3R2mI>3+l< zMz%;InaR%%6GmAcsJ@O_{3aZ$ek@cUGwlu!K#mDL*lP1DF1yZs4FS;sV=d*R(&k0N{NBGIoGu ze=@@;vOl4H$Tesk;Bdwmc5d4L2hM?1dUV0Hsw^l57VM!ad=0|?%O5UeZ4rB8_2X2V zB>c!*^!S@(gvWk5>6H55guR3Wcp&8Sjb3-`#c|yN*(YFA0;eSvpJzf5))Ky>OTg(%sS; z()o2bg8~3}$fVPmsN)t$vr$0R{G-a~IM^=EHlFFKE8xq@7DMp2kO!&h?tov+MFNJh z@-M$a{oOoa*>>aGEKAe2P*)DaLpylvKeY{M>PIQegw8}MA-d@m)`)tb>(N|Ay;=Ak z)gM$tr8D3XdvUe4UN4&F^-#O}?{+@(&e1D7wM&C25dg#m1kJMSauxe!;kZI|&_suU zq+^oAD#?1xTGC07U9{ux{U-UvT_J{9noydT*&$zFQ_N+B5F1PBpoFg#-)DkKRkFUU;CU&2HCkqcApXZuv~VkBlH%+-f!vwl1I#%R0om!>u&({1NH*G%i0WCyUX zWpq8@28KwlhMq$m;^-eQGqk9(oT~Iv)HiiBWAu!i#8g*ra*{vDIqZ(U_uJ;qH1*MY zLt<*$V%zweai8G?x5{Md@qReR#JJh=JK`#_EC$6Mee*Aw9}y?om!K>9H%ahQEMvwHm6a<3|z(q4pu({>hVtqjnx0y z82+;0*+X4!-4%ZX@tymHhFH#QiqVpnUyvnJS_*D?2j0Zt59$_@A(kfHbn?IAWx8*g z_9KL~@N3M;*fj=!Rn7(IHxQntu8m2FW&jSis1I~^Lsh4RO@$h2vqK!6ZD4&t{xJ6b zd#D2`4oLwSbIy0Sjt_ZfXT_qk_Zw)6y~8xmH_5z}Lcy(B9Ol6^%uwJ+AUC@g%UeJM zx^FbHUvNla@F~j`cAZ(xp}*;>x-xte*mRfuzUj*)z#XlJsbZmydv9f(@5j}y{M%)x zp-uG9bT=tdBjJpf@`5NkOpOsBw$iNOfCL+?7DPE*M+ZctpPg|>G}vW3t~RJ&?-AzO zU`TTr)t0Ayn$gshD2Z#c8EC<~THw~Txj_Xv{)@cCyNv;*g%x7NpUp?cbYNq5BY@k3 z1==q8UI5iDNxT4sry(wGDwJm5+%XG{BAo=^|8l^v{;qNPsYob+2Yi#PbSXx{7A{gm zK;WIsV)J}XSztwyPIZ`M#Zmk38#G94r1-b>wj-yX-$}4V2nz0Y0#XvZJqIa@L?u$b zG+_sPIi!kSR_f>J%2>z}=^LzRQEmG2?Nx%R7YoTU0c~ZBp=2Y zD(^vkOJGfhxjI7TSn27$NSauBPB5gP@uWaCyfL6P2r+mTGQDO}FKqh5uhWWNthYupe`j3k3qY-0>?DV*&@YgcYEu57q6wWd9{-w(RH0`r{`; zX}H#``}nP2^mHKx)508)y9GP<*It9b4nsK!xT0t#1ydHf zq6Paxqe_7M^6q!Q|FzF5oV{PbD*p3E{RQ5)=~u=QV!>0xv>l)>o7VOKSL#%(vM3G@ z0U11`X%p%OqU7CVy;v39JATTIk{g=6Tr~I3OXJg}If@I{!Hlpy?QC_eqhpPw;FYz& zXG9q+TlcRVRR~3Pxl`3^NEB8KwtbqzA^XP37RP25kgs@7)?l7RkxI1Gv(%;``7u5M z1KKlOD2r(&QHd3Zp%CV`Y{Bz+)YRo?8GF@=tc}DI2!jmzJ1T1Y2-?9wPTJ2Ba96ND z;<6>;v$$@)1|Tx#-!@0$!B7q1OtIJP$;DEb*bO}+FF(K{pKaZr#oHCCHJDRnhq8%Z>(qGr7eMEhk^eXv$@hP!+0}9Fc!Qe*N6a5Uxz#!wfh92U;GYGrnCNOY<5TI)ZnB@`8h$8&TsL;(_%6dFsS<60P-)9&RT&X2Qfc&0w zIMER{GRhcM&uS*!)reCa3%T@BhVm$7`ReGDzIt?(OykLa)k;@Dn4`HsYk-F|$UOvHw*U3_|TTcawzMg#*Kc+LV(WD;Jt&dTKB6qpTSYL)0%bKDG$ zUkW`+vRB5w6Y|7&e|u??3XUwC6`DLpWr{sN@n{mH%A+-`AB?uZB0VQHWaJlGQTwP4 z@<%vb^EJOX2>$u&3(jI@pM?d(31W`Ik>}FK+aN0N)nrT&vZbXt*h43+qRJ)&-1OR4 ztRGoLjuzJ+a|NlyLS>=I#vP;#7{ZR27&pN*w&oX*1Zsb^EDjB4nG@K2uTLRWH8nQ! zvDkt`Gtl`a+pgAWBsf_?|BYT{Uuvqc+a7C*U@wZpUmtQ#MHIr!_eC+m@DAae+uNm) zXXUY@R;K_Q0rx3Ed1SOsMmMuq!^3C3&R`HkT~@q3S$u~yn|*qZxc(Hs{t0$_5VMJ- zGK&(PU5QBpqDzw|K!U*o@`aGpKCqrTPcQ{NQYk=PD&&zT*M1VH(C+n*B|?gnCSigv z_C_V>tNZV?o1;1kU`=ds%Bx&~K-`NRF2?0u=qBVW0-TY5f1i?;rc2xp1o<6l=fsdu zG4MlweR}UtIgEtP0m;ea9^Sz!y8m^o3QPQxvVt*ga^rYj5u!{bo`oQs8SYb?*yC-a zkqiz9VaC+lYgF;&6meT_EQay+#zDIwRqWl0d91F=djK{UdGw4jMRAKY9lyxds}C0C zf|tKv_5y}AnGi>7CMAkQm64~jYm#u@Tw6*$GY&Ori?}?wWhQ?>J<%sb0Bhul^%v(`j+QKk&{7>1M%|Tzpjz)iDlQa~zEk_Rd4W0|x4k zpAmz+Ji=wbxB z2DOoILU1RZ_K%x(&{X8% zB1(1}%1m~^x&{~lsg;8Rm+4@1WC$YY4J-X=IFO^UPPRB0S=jeI76LUvEw`2i4Gjn`SjCZ2K%{n9h)16zN8p zfz#ti7mECjO}&yFq<*2raG&0E8g+m)GN{r(M+j0Oga11syokB7Tr5N)KMH1g7*A#K z>|dS`=8Yz6|0FM)Yqusvd#w0NTc-p{m2qd2w<-G4-@bdw#eTUYjd|9O>SZclYPM`@ zk@x)fC}0@!M%fQ|z{rf)nOCZNYmC}n01WW>1iwImSXm~KZbRYBQ^vnP@;wU`oWi)2 zln_c(#kRM_`IVuW-OG<(1?L!arm_C=i0fSu9DeQ0C;oj2Uvk^V_p(pAGag-*uJXe{V|}MJs>_0`E``)Ad?fyc)EA7=3}urUm1_wd40{L~93tRl zQ9aAzO)0FUnhSX_YvG+0fK0U;%u*@rJnNIZrKX&4^lt6JLcKLb20x-3CG3Tc(Yg?% zo(a|i*{(|#I0%fI1G|6tyC9q;fW5?7UoM!{WVsrAdxELpkKG^ht|DJRtb#M*2-Z*h z8h==I`6P6M@R9~~P*D3kOd5jhm{(ZdEK^JZa>>4Y6O+LNP8WIA3~+nCU$C(Xt6q(e z7X7j^;$3_QxDr0=bpm6qnEbtB` z>S7X0;tE}Qhcy)X)6zwRn~B|0sqAQdc^ZF-fW=c!k|S>yoS(gZ?+@X}!;0JNy!3%z}k%F%EYmJiEP58Cm8q}cmXoA=Wvomgd*@BDMNdaR9@~4O2jQ`d81OpEH&rYYLHgYP0*B=AVd`SRA7T z1|rI$BP%&}LwkOF58n8ofUn4ge?)u82%RR<{=fCTjstcLLe&yuR&ZJj+t&{ZR zU$IW%Xzh;_v2NbCoKNA^R| zVYmR|L}!QpPnP8+H&N6mw4qOCM46t+Ij&)-YP6zWMA7oSc){~#x5o0aEqu0ZH2Dx~ z37795a5T2arl|J^K)sBp7ohbYuaL->j7Sy#9m{CJeQ`3KED{S&J6w?G3)7ew)FYk> z`_LC%(CZ$Fld2~?dsawHDFVZw&9$|2n=t|B>w!T4u18eI_4x1E?h zqx{RsNt!K&2&|L;MFJzho`6dzjhbAu>jw*Y$;l)Sd0D`2BMEx>E96}U1ofK&sj8R% z?eQSAASYGV5*9VWl4@4`HQ`a?6w{8ufsW}F;|l*er!ZH)g7S;sYwFkC2SS&kjjsV? zqw?gA6a>P?FMn=7zo2~=m!z2V-)5|GftQVqO- z!frsD5Fj>k#zw~y7F+KAfmz(#Aym%pkhz4Vm4%A_KJ)_%e_hFKUGivU25#Oc-n~Z} zY3tT}T(MPT zXe4wnWz5!Y^3NE^{egE3@`?~je}oCgM6ymy|6&76rjs4pwvlwX3pvt%=PP{w4Ebtj zh15Cg@($x{A08ct1AJz3bU5xVl54`QXxQH5q$v5eI(k)F%jBf9I4@OLdk1-lHy1sh<{nHel^SL~MeO(Hs?bMU zx~?FLUB}2o#-^p){Q3FJOn)3cl+1wckQ5cR=lA1`#MbYNiW`E1y+TosPc_Tma~1+K>011P@s;){Yk7*hECeliP8Y4qbKl z{H6O&#TIM3j5>=ORD8o;g5@v2U?AUXS~m^VhrD>uO^g|SL(NJ=YF!E&*wcdObSL2c zZ%Nn>m?Y3kFq_w&cxz!Y9kPV+QrIyhCG0h(p&h++<;TpgM1M*7Y_I=#VU5YN3;4+y z4KptQ!rnn2!()LboUGJnsL(>4S5{82advi+l&Zfr zg2FnbKi>rAjlZW)p+bI&$73e_{!D`BgEn`l*4fL4a)x9naiz&FbenJw*k`d(G${Ah z4^BpXi(uutebQaRv*D5d`zDQzGX}Y1q}&2V8H?n+yt7~c*nc;H7yiRU$Vm80X#_ie z&^x7SR`vB!hbiZGH&a8aQ#vJ5(WRe?kCn4t;_u4~E_|5g833-Z4OX-z#S%g_mMJq4 zPv_uZp@WvAIShE8dG6$(tX(nR(X&N0y3Ws5ST$_GKIh&f)|Ws9u7&650@X+5qTqnt6alZUK$@_4@EGX zi2U9)yj$u?Ysh|I0orDT5(+B_mky_97t*y77W|Cen~sO<$wn!!&S|B;y{}=_uhL6i zfYfFT#ZpeBy=I?C#v8=9R33DH@w^Sv>0oSEXn^9s26-NB#PO_hEDr_6zM75 z1#XhukigoTM?spJe4a6ZB9(zMyxU;zD6WX)yRlFu^C?xk47%?o0nV`H7gUg`T#Pu@ zs^ub8BCTKcDpdT9abO`B5v@pyEDBECy6$cGs-gU{_x{Vr#qnAcgpV=s2Bfr-@)11u z^FBF)*L2(k0!L|LUwti3&^;aw!Q4Y8h|BE&p__p}wuVFAki)0)C@MPK5BUbbtTRD; zLA*MM?wW0j>Zv20_CSYpI`zu$GT(tvw2X2UT%>zPj!^APmBU$5Sx9 zlk#yArprZs7oLn?W0v>s^<3}SHngYvfxmkJ0~`(yc9eQrSOdZjpkb#79sb!EQW z;0U-%Y8$kAua_=j6+IUPq(s0;Q2tJx*Pl7{@mm$1j<6md4hn3Suk3Vw=-5@7ceUA; zX6i^@*<8*jF(w;YNi~qOE+DF(?ov_OxF(m3{x^;I5}L@)*5lDn-fIa^ksoKB=tAJX z-Oq>WA#UN3=U?G2fl$aaQbc_;)iecS@<}tyY8G4KowRNu9_xH7qt*-{iqd^|_45_u z1>i9Z5c+X$sJ=KK2i4MlWBX6nX==$hJ!`Uel?nEd^GbT50 z5VsS-XNEO3A;Lz%fN+MQqKJ1o(O;HJkE34Wo3MA?&8bHjk9phLw`j3+UXWrPTGQxj>Phg5BX8)qBAzA{e7 zO@LU+HR(9Pty&+rzpNAhG}Tg3yM%+9MOA8Y_&)Fxf<;7Sm)~FhcO5P)R`^Y8GPY|O zKdE54l2XS|+HqWU=>8m*8D5V-5jw>tii%00i7jQvmQNEKli3n6l~#X(^*1HhR)7J0 zx;Mohd~G=4ZYbzQl47>;)zl(rqWB$ziLs|5tH3y*x638}U4_a-n8|pRJ~xWW5#)&v zc+F(};KM;=6AWE+SqlD;!VV&q-qkkl@`?|@&VBIBX^Bf8&%`03RWT@0&qnNd8n+R~ z-cspYRPzpE_=$Thlz9 zaeMrSZR`G&@ov!7asGR9=mY7e?(g>zD?e2w=A%xnhs2zhzMocTi#n$8-u`DjtuQw;unBJt;z#T($ zM81vptval0Dp7l-xeLYypW!`bu9N-kAMYCbmknh46Bzsqf96BngNe=)L_PkSj#r{d zll@&{liL(cMpBDT+0C#1ha4%M`7gpyQGVYLavSo%C5)h{VX25iMmwJVxo4=Trkp~e zu3bKkmk)D-&t4sj0G&vw*p|_>(n-kW_aa{FD@{hHKYIW5ilS>kB6PUI<|y=V9-7?d z6j5LuQ54KgN&kTKRTN>p!AgG6x0X+8=`Lx%$x$d)Lv(1KDoVsm1FTcZT z%-a=l%-*0Wj%Qlbc63p*+^-2MHwg$lMK-Ukv>w|+cLoIDLiyTgC|0;bxNe=9FSYQUM5T65sIwd_hCM%8HgA~RG>bpAqPy}G>^F!z z1pf8oK-G~D(F6auh!UV;3{oyv&wnw4{1yZ+y%o&rm*s2Qz@b=^Nlc%}RO|9OZIO;* zaF1T|qAhp--Jr(*L$BxI>`k$L=f&S*U*R8Amqb>2<#U^8GHs5R#qX~ERqwR^Mf;i? zbC*ajY;f26?VAe(N&KbY)la{hG!zJmLwkFp;d9=a_eS8=zNrf*LrQ4y4qPjm&>2#e zg`5<4c-+!>!$J+DJ$;yN2Z8{c``+)YZ%Cjjhs8$)F{u90YRB2%D*?wPxX>6{y`S}d z?FQ5J$Xn(zRR`r$;V!OvjXgc$5A+q_h)83d^V~BX&gPiXbT(iXpV3=z9ZYDC-1zFu zG#N(5xOJUxP+nt;;ZQ~aP*wba&-ZTkHI=9^V1sqag^}lIv!2yOD`kx|jQr^Q9ElZF zqJG0mg*tOudtiH9=nN4jyk50t>5B63`~i4TaD;vk%c+NOcenqR5UP23m6?&3H)Kq! z&m4pnZZIRT|Kp%^g~9(&7|^02z^Cf4NkG3xU9MHYXK4N<{bz70-aS-oWFp=04jlu- zPEm-{#b>xOEw1OV`0v$DqOeE|qun5q4ab$OE;OpxeQ&%jF3L)qO(U0MgwZ=7d_!pY z%iOTk(acUj_8S+zSHT1gvzMY`?z^~^G5kS^8~Dwdlg#edysyXJocB<+LM-5Z{}C2A ze@iqwsNG-x(Cxcu78M-7(ir%%XwD7>UNNq$Ju!BGEWmK0-R4fMkiMadYc0rVeyh`F zjP`TrGD3q%hVl0aH;sYve~4>3u+++tWkWajOYV&NB;l2UJ`M@2$g$J*0Rh=V|AmD^ z5@%{JiQ~m;_JK%}OhT$O8ant6G>VYn6@Sl7=xo7>e1OeJeEPaoR?QH~$C*V$lUgbW z>H4sjIk9+Q`>yX6GE(sUjoPahp#=>ANPn0r19#D_AOlzQhC|F5IwXZF9kIqYsa+)7 zcH*(a#N2VN;6>D#>D=~tD}d9mx~>VZnDxOGW@w*C({z5C*zXe}+b?9hl_u~J8rF0( zfMm)pU?=9-1sBlbs6;5nzbB6H;i{z&W1=;zOVT0d#_#d7%u>%-)&gb_c0EJz;{&&H zEYyZw$Z=NWF1UF>`Xfk{PXy2z#y`vN+m%Q-37?_r50aV`F62-$DjQWvh79T@kjWuQ z{h?b?6B@7AOPii9M;OPxVAcUr_tidigrK;3L6z@+O3IXtNgU)eLoA)5rg=>nIK2OU zq0FDP8gx!78i*X*9ZMCA*Lklg{qREKX|h@G@^{JaA{!+Xc_2nt4RW zN|5e`9`L>_(fYd0wI|p8AE*1+P-dZePaODE^gojZGvXEk3qVg&cMDp6_`yN^>%U1T zgxUnPLrdzM=Ev&2KLccLpQDH`qHDD2$4?CJPpdzwf2U3O9H@>Ci?XgdZd-MkleYeg znuQdnS*l%s7J6KED0BYd{)m{J;Qx>7`n@4h;*RQQp_#orOJKBcw>RYV7)timg&gaZ zpSoB5u(`5h6KSB&YcE!m4{F!H?9T1+iN-%ef4V30-Y9i?9~0x=P5ULZ+A9ZLpWb&5 z^)x=4bLWH|=-y~Peu_lY$O;YbwwqG}DIxZHRV-70w|r&eX}W(OkIH764)Zuu+JkCO zf-XpB3$G(K-Gp8r;)H^~in8S+jxOp>yr%_J_zhL|Ec;?hYz4cSbN;~C^hw0^Xgq)5 zI_{}hKWv?$H~s6Xzp%Y=Fu7$;+^Vk07gpPU`_xebyZl(G2h?>c@JcxG>g^jP==cL3?mI-UskqXzg{V)h zd#?+-0F_0`NxBP`h z>mhtK1-$(tgaEHCh;KTvS@x4yxo+o|)AF4tVh$7s-1KH1Ni8l*L<@0GGZR(ca?p(>N2Ie4~)lrb_JqC{eF=2g7#L1Gd)x9 z(Wc6P=C(tp3V!QiWY+m!`go=X4M{3@ZOWM5)Oze#a1ksTfsgU}(5q4pN$VAEMRR{m zz(gsCxV~|jbtu&P?1e^{w0AXRXD*_3#MLzsbpN&t4s^I7yPC+UcM9l6PAq(6n))nO z;ybpgYx`%;s2K;U(6_k<>40mM+dSa~e_8ztqeLaj0K}@_Ly6V)2qQmoUvMkubE9BH zFSoaKT(8_bA>VvyIP-Lho!VYkJtRF7FdiU%R? z2dxmPdGJwm>KkZyuBh4NWiiuteEG+AN|JbZN*mWY5Obr(RtDEvu{n~I%I2;9e6E7sj8{Ww<3bhlK}*}si}@^*Nua@iiy zzTZ#4uLskzsU16(RooI(?LF(`cS`1Kj_hUW6tqqLFx0D#|wchCZ<0 zy~bmTM$~p}whU!clqD^1x&9m9j0mZ3G~%9XTJN!q$3FHLf7}AM8Cjtr`<#46OhPH& z4X3>Q$6L`pR7Vsnx&Og|$B{2_;OF5~!<8U8q~}S~en1C0&EDwzUnr=@Mq!CD=0rEL zTM*2G@VZjB4`@>DjTm(pj+Oo(y0v>cBlF3EOhfAOM+?FB_1vW^R!Ur3Cv;@T&Gzlm zJa)%_Qg5>`;8!buRbUm_Zk4NbCG(P(gb@$aag;QI3y3T4vF=S(>tq*~&gXC3+*6>_ zJHSH~AJLb2u^U5r#EV%So7KaMpU%M~pOh{^z2}?_HoMa{BygldIr!J)8pb1tD7E8x z11ir5YwCyH5M^b2H*K$L)_6Yk^y$`#J{b4_)m?h!tJ7`~XexqlS)vH!X3h^9=X_Pg zHce%8?{@yPX(Q;#stN~m{g0^OrroFI&DG4Ykmr*2(6o1C-9@OUc+}q<5g+0Y&JA&4 z_+^rQH_B8x{^J2OYyQ`}3GbPc29p7I7pMjBwE@he$=n(EEL;X))z zBaA9avqqeo6`ppWsKN!yMOn#yKyTE@+|xAo!+dWRpHVWp6Lu)Ijy*veCeN_KEQpY)qtm-kWZXE54)YY|9_4sBV zsW~UE%GwH{r}%vrni;({JHeOg0(np@7%4*Nd)IR{yE~|m(0QMSxqw}qqdxmT9^tF~ z6#syGXXZVRRnqii~Ub-}sALE0g(2j+itk(&M$TVdI z&0>!V4U}4SU?>;9s9}jy`)TDZ15kcy6X_ejzyA01Lm>2zx+o-9$g0zieFf9tyJQ}N zif|#Dw`bIziFCoK*3^&vS%t4-E}fCPoT(S#zWzSykD$3kEPJtV1%mvrk>T?byd#aVyo>Sv|p{rS2ao!>(p!~1Rt@tMjnleOrCU~ zAPsjeF~~LrFtIf{cQ$p56+f8 zK#6JTv@X{sDrZaH+PxhQS|*9L6=nVP^VRK&cYpHTC(($xw>Md7br!mJ5Pxwfv(|nb z9ak*kEh$=v@G#Qud5cQ1cUF!KwI!>ka)3Q+zcx=r1kgB z^!^Q~mt=tNznSVdRNh>>1;O6~n+hLc(MNc82^3v(n`7&{oEf(!y`78rb)Fz(C;XpK zg8S}9;(UVNZMxxJvJ%6e1GnkK)GDK9L6l9jkAwhG(szkrqHY<%?gV;HJGIP=O5KVv zeZ%_&e9~Lnb%PwXod&4;k}D0{q?UPReS>7~>07p1(oc@Rg4}f_Zn7p({YrAXtA_P9 zB4Uo6HoK6^d3pQ2Nds7&9gP;fN~nNVH=J21{`V1E@fJ0+)b&7n0f`$7K8L3PF3Dp%l$K-|$x$B*as$C8p7X%o=6uH$!$S_@kzLMYC5W;WSmFPpsb%+YtNqFs zG<4mV)j#X9Kow+e6MEVo?oCc?v%^o=yf*ckBn^VNb#<2io3>lKm6(h`5_MTSOl|b~AO9G}Qv4i;?1r6wSwwAn|pM(|EvW6{im+PpGj<8eb`L zObdn0AWf$wyP^~f_=;FJfwv1^gMLlYB@H;@{In{)2Gk^b6)KB&@LHgW}>)soY-n$fp7Z2|D>o;_Ch2wTiZI?ZX*Rn=Qm|R zD{hXbCbiC3wyh^CRB#8g%RN8Hr2XMlSX;rd%#9S;Zr9Zn_in69k0L&;%PH{Yci1f* zS^v5B7e*@oxn$jW*N$fnL$3Z;gDPaZ`Tpl~Z699o@sdbtpLOo=6{@73&(xuutVY?7 z^z>TStH&nS=y-57^T(~8e49>>Dy+BwHzkx&ecxh(_LVcEwPDWHE)dpjnvcL$r)NA1 zOr z(#|nRx|CAW|3L{{{KpE;#@((CZXtDoR%R*CSGTgx>7OF6We-gPKf!$7GKNFkO^f8P ze-JpNpR9YjaL5y$!F0R{tbTayGB{J0qok_x-`?J&cJ7qEB7QFkZ<%wJ8Q5$ij@5YM zDMi^8kb&8(AHhKOjlUE61u8&4?>UY;b`yF?{BrlMOVJd<)< z3!h5mhd?prl$q_gyf7E4bxCmg^u>|3pi)bkquTb}gg1h$p*an8>NFo8kNW-L~to2Y7H!kJrb%|JF46+2Qe z4z9r*V4Okrz-yd)&v#?#b)w?{kD1+wW&MZ5NR=vtR#>&6hI|zZ+qco3!Qpa^y_f1X z0;&KsfkVFzkBQAgr|D`b+iF_kW$O!h+2fML;WM&;K&y)_O)c7v=OCt>3sZin*8^N7 zk1_BfcF1$2xbqf0ej=XRg&g(_{hZuEZ_-S?r;mE!oM&$-x&l;0y(2cd%e~X{sCX|L zB7(C)Dxg?pSdTu6N03#R9pfeyR;GKP3FXbbeI$;CX0nl61rt$AV&!LBM zlEozk#-|X>loz-$(H#}0d!H869AuRqB|e?TNV0{N;H`#&4K3VQgUAlKS!jdWAe!rv zSExeAYO>et$F^#!zBuo7T-)gl{I~pi^3AB)`84I{PXw2XmHL3FA65dP-0SV>0%R{W zp1h^Xw^6%^TxzswfVO_4k;@&A;r`H8z(59p>Q5WY;57f)B!iW;0e>K~zkQGB`N5G0 z{2OGiF{D*hb_ZNl5I_gZJ~~))MTzhm))$F%9R*4GJ+ea+JuQSCGSXar<)=CE;5HZ08tOyvmLTSz%oCd-zCxrj#dDggmy71(TuH#6k& z6S|@`@&E7ypFpTVymwD9Vx%gN{*4}JSvRdxGjGKmRe7q^uC%JZ|DgJl0jSF@*wc{ zIMr+7Sddkg534MeR9C4-h34p3Wv)%$l`A&-u)jKmC07NR*Qoeygny4-l@WD*WLE^x zdZcx>DkwM#6QwukYg%DpV3YUG>eOKkCA+~k!r;wAh|%G@~@~t z(dT>MZZKW89Ta;mh{5cR_7|ZK$c+-&C(jabJ2nAgWZ=TPha(R9{fQFY(n zrV&99knZl1&H?EVq(kWz5$R?K0qJf8q`N~xhHj-nM7n$E0fss6_v`lF zMDRgQh8X|Zu}$p%rxZUbGR!Llh4~TDLW_KZ*%M}nnp}W zZai*{`r${@`CIX&*Cj9Ta876fY^t+F-v;Huqq!f~oln}N+OR?n2F@Px)5@E@ap7Oq zXfNKLY8VTGTQ@<46NJm8{6BnSn-g(+pCF~w{RD34c2U;prsI$sVNUlm0h}g=gMFTq684liyG+Q= zUU-Oab0I@Z<_@E*2~oNv_NzqDR5FI;Z`1YHp;oDV3k?SDA(OOsHnM0y)9ZkO)`A(2 zkJep|WlnOhwbt!TxmS9iC1Nn?yhhvca@SW(N1ZO+gX{2FgAI@cfX;%eD>?7_0#Nhe zadUUuX{yK{XVtj;Q2Pic1huB*(IdQ`<;*`hGCADhBjc_1#oZ;TdQ9UqNOId5N4-@O z#%pVRygph?`Qv%G@7N_7il7hm{EL4Gn390N1Cy!mLlL%B^NDVrlp}w_FKt#f^OKJM z&J3nP8lkf3OFufQv(HcLb|8mA*y?`a(T$c%MAZ6|Yav#9TOeC9f|4q|v`1PWwe!g! zII8i*#xgh)PPPP;PcF2YJ7?F-fl$GrKmfpHj&*-_0T*@Oop2!S+s2T1MFy!1u}D@5 z-)O7SiE`*!A$4LT2&JH}XHV^)h}gE$SMN_FMPGHCs?Y6fu=#175RG%DvKDm?!AZc$ zDesJnusp%*tDQrb{s6o^9-1};?p7|!bPj)zV+<1{@{EI15N#?XKB`|p-usV@R}dFv zxOs)Du8&J?Vx#c;3b@vfeeP;sW9;wY`}xiT=2rJ?>-KdHbxr6o%Sf7>MF?@S4bMRD zS1??xy6oKs@eu2ZPf@LlymO=%v+gIz*Ul;*!_(IRo!qsAKY)y6w(5xUn)Cw>>Y7^q~l0I*s z*{*w4#Qi`+6KT$W-5xZ`r-MbC(HuLIh^tvud{9R;>4(<2iBNfLLjRLr44@%Set|;} z4d=I76X0BNl@`#tz-V!L;pq&j-U;!%nVwZ?&)htPbk6&xsuCw6cdkSq35FwyW)+rD znUPZ-(%qIQdo$4)=sZ2!jI&X$x1{OdVC z#bw{_wqZ$~%{HI(k7hlGDU~sM(WDEp6Hn=dT=@OtVxu2vE6(Or3y2b&bZ;+-ykUH= z0POp!;FCkRR)Q+(15@@`RCVz8mlsLAyrtFqnDlZfq1HmeU?EiTIihdGS)6~cGYDIz znaTs3Z{GB{#6G3u2)VWzTb_;*_{Vs~3U)!)&A!0TgN3nnd1~Q~sPCUDS{QBa+;w>( zOQXXFWS)A2_k2_N6O=F)!++g9hFM95jc5Nsll&$-ET@DUS(v~1w=TCnt`c+@SSJ~X zc-e~Q`G&l^LL!ry{TfJQQf!0-S@Naks1~)Dz(f{X)rneaG9W{$y5cv!1-Nc)^x$ZY zaG;$2>ek*vwgmp_nb^D~-iO7{a6wQTe@@5xKWGw2zcw!b!8JmF!$+|l@BW-v8y$zkTeoWbkDVNe_{UEA z1_~%)!V6?$=@D6GEOc@Bct{e=kovBlvXPnLZ#A4j`v(nSQA4?P2jktOy}*xeblfJa zIL=o@P|8ctUOb;(M4$TF7OoIIYGTc&dKTK~O{5H$8CMQv{Ed_gOGMXbui zG7|cffHshJHBdaYk839Za+}Ht79r`}Lb8*FxHgdo$iFWOez_J;3D&*i^In(;-7@!J z{-Nt#NmVgtRXJ7Ft%A+SH(!$V@{NDJn1jcgZx{B{6(lXw_^f-WMN$|M&wB?1E!!Oe zEs+GJT-q0d>9A?;seF$w=LYK#w2LxY;*yvYZ8ir1gL@=CS;Jh%gcei@IjIDYyr4%2 z@F5mKJeE(ZTBj3&8zCJJOeeq`rK}u&u2&ZJvw5EAH1tXqLWGKN4UBcve?J*jR+=X6 zd+Ec1;je;M{~t)HddZTU^gsO0F!>@QE$aYd+C~RNUtWAox7n(Vm|OT3+a%TRm5%IN z%{di78qC*0(0(s!u(}SygHzd4#R}dg%&NVXZTYP(sn3mIRJ7&zX8P*)NaBj{s zw{^zy>C^;HK2CWli+k2S;vGDgxQ&9x^sr4|XPYc|iuHelz5^B3fAqK${IwZ8y0wC3 z05xgy`x5^FWAevz${jgMXX2owy9Rx1BVwvH%E9ir%y4k?>n~cDog=|?+n+pGRbk|W zBmc)-;$2~vFov>kd=kiOntu}l>~k;N7Vmme}u(gxMrs?TV zJkNw4nGNbvL9xGaS1S9ONC$3J;arHxhIS@hj60?@+M9FOoiG$Lj1W2-jEnpdk!?>p zlGWK1u!bVeTXP5pQ&{)S&jPQlRms7K#UXQH4UdmsX1U%=SUg9Gd=OL_**>Xpr6k5BKn1ar?i1X6JD`N|jnK`7OQLi9yQBTErlYuj z8}|q7M>Or_kO+*ucORa8S)yX47ZOkW0;VTLs%hLvHEqCe^2tosH>-4In>uFAj4Mo6 z0_4$sRBMbV1PFy=J`!KKkb^%|??Ash#X6{guMdI|4r75e@4zcvvEFhi!0xC zzK-{-OJb}4o&7K6S5)%yxtSWX@YB3{1#Xe`NIA0oI*qc!Cm#rrmuNl(k^>^nBb6jx zFaqw)tC&M;&Bw>wey^wP;xXt7@7xAJ)`i= z%k^hPZ+f&UF_5cq*t_z?iUEwf7!MVV6S4UX_SEnHu9r{0oUVd#6=y5q=_v3UmXkT= zN^?M#>U*~+DVeK875gOT^xKUP9}We>hK-wsMSpeU7ozZ;q;1QlX3PXk7gW#_j7tn= z1_Ix){jX>LwwhKs1go7lnz{J7n+9_Bhjr*U>`Nv&;Mh2+9Sm^K_b*Z2*_#Hm2d{ZP z8Ku}a4+i4%#rv)-Vu41%CXZ`I-!F9Tl2-8Z{6$po=oE;JtqcWV!%I9d_)c*UoG z?%7n2MbL_=Rec&b^_vhKFJ;0Z7f~dxE#9mD7U#O+9T%M~&G&mb{5rcFV9rL?BTg_f zbZ@-A=1P=`lNYG0=D5%#!+^UYnf5wsR3G_-WW!Ug5wNqJ6jBZu9gDEED)tC)F2WwB zQ~Ctg{yotTd3C2nI1I~I3<6-pP#3C4$IRlHH7R7y^z@CnSF^6r%@_RQY1AQ0Fl!)D zJKkx8&Af8dZ-rRt^YuwBr38Bp+MUnETvqv zXL2J>k6i`G&1%OyCJ@%>3Zkco3&uc|XO=T$qr$nU3?KXZ#>lbW0FT3rhCip+GRR=0 zzom1CK^5}X>L6AW4`~yC*CEM?pjv^YWH`(A>Fs#F^3ZCG$1CQ=@Nsa@*}>`AaxLJ+ zdQZ29N4!J8FF=s}ITA$4lxl)GL}#PWy?xFmr$v?I@%uh(C_fnNbO6#tPP5w~2i!R$ zPggvy$VoE4z8qs4AE^2xR?q0*p+Ivqla&%y-u4+<5OOZHkzbarP~s2;9aj%aV_x`g zja#E*0uwh%DqWQAVQVKbvEJ9Sr^DqMil%mV@-K3!C%$WrfO}jzc&8vfaC_PmWV*!nl36okA&3AUo!WCllC|;`_hN=H=$s>gay8JKHf+BKI`O4z_XLzUtCA;&sOd7 zd_=vy=El_N_Ph8>k+SmN!<-JaUw*V}&R}Gqg5b(SUm7<;M4ocJKrZ0Qx!>?Mzklx9 z5MzbXamZ2pk+_>3tSh$GKzPjmrsD)3gD}{Z{Rm)8$VZC6j28=_$?vbAp2ajnG&NF% zd}YVRVzLq(-_5Mu9;Rz?d2zNdnqL)^4A}^`?b_e!t9eMfoW-JiXENt^$xGE zA^N@SKYQOr^~9@3f(;i_nG07^yjb$S?nJYN$2v&&$wb@9^k)@!laoOEq3D7C^pZz> z#o zq^f{qnpMKiHQ;3-O9D4|07hH{QBIdYC^Eh6f#`36 zHF?``%VNP-ndQ#1R)2JLScRE&W;A@7%ZR+Nf}yw|0ss#u<@qQF9VPon?WE5bQtX5L z84OeH-N3F0ru(e=?R5dfHPZ084UY^qf{PtY+$6ykNM8=q{Z*k)nA%c^t;SIz`i)sg z+4U}A=R3LVcxP1xSRV!7t%qO}<6ij#nKbj|+PPr9wi%kFTsIGoBv%gK{bYB%F*)k! zb}h0TGVZoz@&q`5ZS9{$n|O;+4{m|OYCLgaV6sO~L(S?0RX~W^D22|rgt`8j|8!(j zQ_=oB)j+1HiK1D{6jCg>avfhGn5xT+P!i*g0+DWm)AeCK1=E`=c2B?Fy}%{%dJXT? zUwJ*2#>EGzy?<>0+&dvx6i^zbN<>6W5(FoAY$+FB;Um#j{R#-YP~HgtjaC-r%DksI z3hqfb#kpE^40(Z&3>q3i+af4)YmETfL;;R&nh^kqf!Y7cb)0?GfM^@6(|eb6A!;pq znb?E(ec4KXd)APWsh&MoD`V-q(e%tG&+I6yXX6#$EJw44X;ojP53J==gL8=gs2mlU zsK;ds7i(m_e2H6IrUlC3JnO!VhhJPWIxDKSf;XvLkcrTackBJPJ3~}1dPFB~9ymq{LpOg!OgFOgB%l&cbSA&;g_I z^@?HRVGf^7f3z)o%@h;d6`{pvu3g#cz@cwK%}mlnIo_cN8Xv1G9gChsa2=)dEF>## zXmRPQafV=}<(y)7y|!5yE4esoGaut@_U^y1HCf;%i-R080Bj{(`bn>=z$qnkKWNgv z!LzQM+aKQ+g5N*5TVxjhp>xd29Q(HVMlh9TlP!_vuG&tIcA~$#zfojcaNWnAFnwB~ z)0kpc_|wD(NL>GrfCEFpCa=4$I9TalH#PWgz~xV!?f}dhH_H?7`Cx_(bX|G66eF%V z>cfsmE4Yt}*fP^*1e;E*pBc;Fun#bj1zPcY*X_xjSxptF zm+L_Skr@aRdHz@)0E?u_V`)Im?Yz9cZE1yF@}^P(VrEU8fCwVyAz3-tB%eR zy>K-g6_kVXNxIuuxX^}T@WA(smx#1FUGwbKPi@5+yvkEgs&UZ|82v!-#EsI}> zAkyoW-`t#nJ5wu-Mx)m$TQCT4*}Ca*hvGaOzo_))Yqv)WwQnj_^rU!(@VTr|X8CO_ z@gn`>!890B5z!r0Ij~!y5$9+7MnhC2yDU3ubT^`?ornrH0^=FZH%apB6L;#0OUqE zX->8q{Cp9dl|?NUsKRg3f9a>{X`i`WW4V6&zCy+iWUs zOrsP{D_#7%F{D4;QG+ZZtDUuWrq<~aXol#hMefYXq~~J0c;6X$M+7W6L&8`t3xjkx zi(-W_8hnoyvMrNe0pH&{`I_oqcZF=`*@qoB^yOOHjXadk-DyCmiUQ%T7jGv-E zL#4Q#vOdrR=QiH(=hmOsYfszo`}nZXrqw)xt=m9U2se_k@ff}?`V#ewh0@nKBCoM} zRE*oazP3E`1g!_7?<~A^Nout1?RsK89G|k$A9-+j<_vs}64H3N{YW5_n8TmeR5cCi zweDmE(rg~sdibaL()zY1M?Y4=v!uAVjJEF+a%8@>m zs^R51Q&6mXHUlNqytUh$tIuSH)+9)p(q2RoA$C7&ty8LWg!X!ETG(%Vl) zJL>Cp&9Ao>FZ#ctzk5m<48-wao6RNhxhvr(nXfOMZ+#g0sBgPQb(%7x?`??4S$%l7 z)NCg#7gl^QQ@=c@^Z3Q!G>pky1aVW9TB&Dz@zpX}4fy5?L;ilC?wO8vPFdr;~x_L6BTk)Eosvgl8D zG;Yw|Mu$@Av7=;wE@&>c=f z+oxgP>+5^WKi-KOBMu^8UQT!FiB|Hq#2iaPWxgr1g11<+{Ny@|&u@Fak%w6*)cpF& zu(s+((%WeP;}Uh|^*0Z!QktX@)(E;=JThr}Isabe(mw)So^qjpJBbdbn2q<9ke4UGqt?rK_{q**`ls$WOAOeJ@Yv>6fK1uh|8` z2s8>QoBDtooOjxv3hS-L#AGFG$6gEq6C;E(&5lUaDN$ZL<`ufmrS$oB%FEq$@E8YM zKIgwtN-u3UysRjpb*7yLwa95g|K?v1hOl$W_t?0lsike#BEK)l0BMb0I;*5suSXLK znGcy=5(tt& z=_IqA--P2lj4S>x$mcr--sPHpBm zJrYIu^=>RJ?>Oiov1LFr?K8r8iX<-%(xTKdyVFF=uTkF|Ok(*!;J3*VXe4uOoplF2 zsT9=!sF0aO??-~dBDmm~d2o?!S~i9q=kXD&ur_n&do+=elD?-(-jN};I1k^rFT>zp}`+;h~1&JA)f4BRZmczAYK1DpwD9!_u zT-Jh@sHdg>@jPO`QiL+sm?4M8X_>t99ZX}-?8yj5ds3iywn{c0O94`ViAO(FHA+74CD zvrbSkn|b$-12tnoCxi1VIvF*`fYd5e^9vD+M zj}NQoUs9{|$v!QP8V350-KUMG{8_74cc}>4ZcvLq``B(0G%lPFNSThS_ooWe3-`4! zksKh}Jy)9geaMEA6jC~qpKASOYmM`q?mJT z_UpgB^u4grpwdg#)f89!C2{m2yuon`EA@z7{oJYCz zaoQ;Jm~?*;CU*Shc3p@$(C87o+*~D^74cs6WpfB2S>fN0=#`W=(L>?UMCbV>b;-@s zW{LjeWx-%_3HxyJ-Ng_FGPhL^ACDLbbi##d_Oed2@t5l}7=R+^_pXOuotcI28NdFL z)WQ$RKz1a!jo80RdK>t3HNT&K8WH8I@w?M~Zz7^sMD2(072YG-ky%w-S2s}fWQ}$G zHo>NVrv>yX??U!)f5}fxsz@J0be+%jUJFU!(u$~qnRQgNvqp3A;>%)=!TE#NB`=Av z-YWP%`Mim~6@3h5#zMYN_u9?{85jI%vkOgc zL;Nk_i*VlKv2T`W38SKm=3T~!y1+4UoxSF!W&?5POYXok9yZ1W7YPfe%5R!{Z#6m3 zRx}Rtrd7wR3AvCi#LFjdUDw)_`0L2h8DWqavxl+O$B&Bv<1z?Yw}@4mSxBh!j6cJp zNN+IfT_z6f;F@e_kz!3XOS*ELHnOen#*zx%Fi84!(0A{3yPZ0mg;Bj;tKS2))Q0U= zBM{(A0~QJW52Y7M;5_(YS~wl}O66V%&!d@InB;oha3W6h9Uu5%If>G{4~K2UulltG z3B~)lat5-Vl%8+@Cj2ydR8WxL{&nXg4L>cjsQvLVIN-`$)9Hi0wX8NU=zn@EP;=Y zA1~TY9{;69ko^P?Pg3J}>6Q>WlGh3}BvykdJqEls4EQxNb+6So?%BY^cw`#kZ|-~_ z7dKCbkvJOfLcl~)oj_WV8S;hbC1T89G~>tpN;GG&rJ7AMw~uXX71L456c`CR*QeI# z^Qi*PJ=p7i1+>N+wLmI;`J7-^I7J$l`ekQ?)gw;VUs%uAAY-;RAK~^#3KA~$lHperQqq|twfAU1y6&chTOIKa%XmMvaVO4<-f-k^p-G;c{+x&b^DL(bLb2lm9 zU`Ci8%R)(4!*O>w3*wut!N9yAn z34F7nsUM-j`~;wjCm`xXX*mFyJ}~x$P)jfdk46H+({$3|0@Iq-O2u7Tqr^X=z4%ow8x+P=K*$j$Y!`y>0y2ZO}pv$XK8V)*$CICF>1qc zpgE^^)JHn0@;R1<_+)J}))&{FM%JMNg;(bPGu}WY5?<#yTeiPI`5OBogVy(uJDLP5 zzmmN9xvk;IKVx*=skscdW2~_yAJEaysuQrfeBggE=Z^6;1TA@j~fR)zj7J>Kr9D|vL0dbjhi`+CNirCF~rbs8aUXUt|FqcbM3WeK;Gp-g z9Bmq|)8SfMij@W%WeR_DYE#ds&AbHWZg_LuX9mUUMZZMirlb2{nHUKo zD_Zj2ed|;v1q?I`SyJh4Isz#(>Wav9Lhtbnmu*5IFmVdff;-lK4| z%&`#5&EtP8GvNaHi#^qqJ>AtymafySIa90)RPg! zO~2e}2=_oo*{P?~Di>kHb%co|bjtDP=91L`daKthW9esJWMuaB3c%Z?aw)oZK?z)A zgwV6bD-b>{@z*~w2Wt}(8ueJP=Tb!<C~X*XWTv1OZa?T#XVR{OajJClU)PLN`EvLV!D40~ zznGGdOjuv&+H?{X|M&SC+>94RD$kQ?9i8}h+%A8%jg{pG6@Jx*d^Ghv%qnZ9ein}W zLH3*HMl6>u32Ht{S%T7O%;DnhSmQqd5xj_wuS>j+xIH zD??2Mz34Cl{1?ijzVcrF6^b1}RxVjzXA5xz=XF1s>iU zEI|hGMA8|H9M6!>yhbbtnT8RYRj*TLCav*PN^ze*TPciGixMx=0NYQ)e8vClhr~*M zcxQ2VQLV;$Ej53$Gg-IXxL0_uCvRz%3c&kS!us)NXgPA_uj`tiQ6#C4x8Ysb^_Xp} zF?sAKg`hzwSq0s-4O=mKS77_+m&RL3AU_M4uFkha$cTz9sF4Zo;Jx{QRt+*a&=+BG zueI&61INGj&zlO0xdnYIJWWO4!7-x--uA;uDA0nYP(0SbQ={V$oi85ly|X6fY31CT zSd!_N%}Q7$oSR;D_sd?E%1^wvHVs>)+aDcgo;zv0Z$<|G^V?c=@^e&(pTrOM?XTss zLHhWOBP(+2YCBWIiK2fwNku};A}?(x7uY!FD8#C4?%2*4u(9qk5uzxF>>l&Sk)jf9 zvT92?WyHnVqRnZO5rOJ=URd|8Q;LkJYMR}{76%>MFU@rENxX&9@9z~($_SI91l2WhvC#+ZlXPH5RMXI91N_5aFE(Uj1}7r%P$*s-{(BKrI|hE|%lCyTym zPLdyombmoC!)a%Svwj2WQ)j{7&!c_jMzjxEj9LTQb3K*(2O~c_oFDymJuPS?529q< z>*KeqiWk2px5L(}qNywTI&4F`pyzS&H~fpo15{g?CR{H`a@`UNGbT&lFvsN9FbSI< z7Q)-#v1DE>?Sj9owvgh3AF!F~RiaQ>eo29*7^T%0q$N2mppcR_&FH?2LK0V)UCKrU zZ^;q%UvC}69j3bj{RdU=kxlOi90DV%k+m^YCC92g6>VFhLEC0A-3yGT-AN zG$r+J!DQH|Pj-kaW%2_^6a0r2nSZ#wf3G}+tS|)^@*`sQU1&-I-x>jL^Bb&*O{qrd z3VTl%5+?dUwoi6jdlrN9Z3K*=Hczj-1GXqIKSy1zxt<2MsL1xHXxnwFVhd+~xO*6#^J{5!pRTzPYuLo-9#wErh(zwJi97tk{026## zCP#8_gUPQfYrX#8?k5cwT0m8XbQNCvYcBvd>X~$O^bw5lmnO~{Q-{`1tL(VQZNB6N z`5G>btPNO3up2$(TtQxQS`+d>>_C!`uYJ6+08$k!b-Un?fr@+WkhAyi%l*mOSQHUN z0}ncaE$=}laLOaFpa#nP(oRoL#K36J3r#E8mf&dHv9zS1z=s1=8+b_$a$efM@g{{V zL%rqYl}^&TDu&$kLX}OZcv#oZ+J!4nkbF#L@&caLNXubC^y- z61h&1Kd9Z01?YL*lArfX%K6NdPj|5RAmDcrC-TBRQmuzK?a59?7nV}jiN+mA5uS1n zZZtc@BI>+N+gf zL_VuhQ)m%sE?{ba%4pl9!vkxfK_jE;-mK)rzJsxG0R$_DiefT5UuVD&)vi0Ehzdu{S?vMF@f{JXr zF!Fo3{>W9F4;F#DUK~;HL4xzQU+;p~02MivQefbN<_^D4<;Qp+#r@A)%Pad^9Xl&{ znaSwZ(gK12CXM-HfjbxQes;fHn`?s@f1kTEr~VRfHPn2DKSlr7enpEV1bS>E=L>N_ zActo;^;*9qaMBPXj&{r+iH-E(H?e{XKW6L$ zLu9uZD<-t~{C8r8JJh+Houtssi%9#P$!?EeJ!urDHz>}3!tD>lSzyIew_-tgj81!* z-j~>uJpuMVJ>zhGab{un z7dw$rqKW}@?g5k5sGR+`Yk^#3*8cpUlkY2;uqEF>WWpWgTwQ{@g56jcfy@`N{-x7c zubHD))qUo*tuXzN^;g;M*%8YLk`{!} z69~1Hgbi|p1&UM9OW85{vF5zC5l&obeETk1+J^v+_ zoqbd%TnFxVR$*$$#CoR$z=uiJk0;?w$Q>>*20&<_?_LuR89ZYBW-ALa}eTQVMe6hsAbnQKyXar^zSa zEc9v&Ql`wUy9>%7CfaIJka1v?tfVN@2cSIxjxW0**mQ|@4g*E@Hi7nA zl>TDD*e6?0>M-tyS*i^qUAxGed4HxSvbp*hA!5aeYw1MFpv@{Fh zk|p)OKCAfP0nl&#+n}?qxbEM|5}p!TTKg=Hc9U65d)AVT1j;S%S*W4 zWM8ctawPGFn~Zr=VP;HO^T3Yxf6AGhRlAo;yJ zcm}AGb|a*uByfvgKn;3bZiSA6qHNZ&ad1xe&L=k()ADB}U^m1ui=a5ZVN@rvVVl{G zd1!TRj8A;tTQ0!hRj@MrrqY(J=d`crgG z4?byq&IQJs%ny+hD7BnPvJWaCtwGHXYvxImeKC_yGiWOAf7nig91tr6$hCiwp)k!4lXY$qyR9A5&>oq=$s{^;3M*gQw+1h4!CwI+CZp)8Th~@yYpS zf-Vw8*&8bNZvG2O_(2i^d}xi5X@^kvV9jBd?bx(%zF1y8z@R*z#oyGO3NQ32RhUE!RK#>CJiQN#9!cA`Fea#A3}ZqfHO&_nh-=o?mSh2 ziZld45Hh020%1ddoK_)rNYyoFYDb-&C zH;WRUhlj7;yjuA#Kwy5+WHVwd5AFBYB_yt+lw!?9CLQnw(TIHbzNu^}yZglw^g1k=Mpku8UsKtT#&$3mVfVS~2n|5pc~mK?1$^mnjhy46dTn!z!;phi6~6mB z5LEB=CJ;Kh(h39p$XHWnWd75*L3MM(6PWQj9ZaqdbWGeLXP@AKIl zb|vqcq9yERGMtZre-98B?Cd+WpT>xj9?g(DGLxPczatSxPy5OBPqLi!vpH5MDhmL{9qY9~}kE#eX)!i^dEQkm1 zH$~?A$v(e$wXE0BFtF{5)IPKc&lu7%?p&6Ow9SgdJ6(d9W6WJf+CupdmGsN!1ex z!l(-hyT9PTm)+t!DD))Me6>wAME%UbH*^@M3Y#W&Yk^E1pEUnv9zPF_VNKNFM;y?3 zLjkGlv-#ww^$zg#zHUygxTYpg1AP*BOlgOBb&W=!RV~ zU${rDuTkDNAqBXbJpku7uSSPUJR((kA(q$r!o3o{yht{K;_!9{$s}h3=#RL2pwqGQ zt%OBjDa&|WdwcB|ChtR?^cN+%^H$O5X)*`N;2b~=NFg@QA(kBIb^dn|us|xf+gaW3 zQm4IK_Fd2mFhzA;^;CJohXI$}>bw-(jkRX^Kj!c5_qL($c&-SCeG=pE*?1%+W6Z2i zl;+jutYpNn)~k{v5bJ{NlFjM8p5jG~0m^S`(hKvxkhT0vUawF>rnA#)ywk9QeI!g} z42-6=x`P>ghAVcuwX%ahhd_vW&nyYaLoOohzY5*DerMuf04BmftPjr*5{-1;=druI z1L$=wecuHPyY~>h^2uIDu>C{-^W;2@*A#%G(K^zS^J$h%aJ&Gy9^)zl6Fo9RR@-1k zaoos@OCF77i?63h#=qxm2&gH8XzmnGfdtaFBxb0RI2Vt#;1#`cMTCzv2l4IVnNzIS zUKKlbS_k|^ws)i(82mc~aodB|8%%j2?CYYG|D1`J#7HdKg=$+1X}TW08%8E&1T

lsPrkZ!(x|4JcB}_kWZEQ;?Q4+Z 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 c+rMaRRM^R}D`HI*3-i;_&{wZlb%^ - + + + + - + +
+

muigui

-

muigui

-
-
-
-
- - - - - + +const pets = ['cat', 'dog', 'bird']; +const gui = new GUI(); +const a = gui.add(s, 'amount', 0, 50); +const n = gui.add(s, 'name'); +const p = gui.add(s, 'pet', pets); +gui.addButton('randomize', randomize); +gui.addButton('update amount', _ => a.updateDisplay()); +gui.addButton('update name', _ => n.updateDisplay()); +gui.addButton('update pet', _ => p.updateDisplay()); +gui.addButton('update all', _ => gui.updateDisplay()); + +
+ + +

Folder:

+

A way to make collapsable sections.

+ +
+

+const position = {
+  x: 5,
+  y: 20,
+  z: -15,
+};
+const rotation = {
+  x: 45,
+  y: 90,
+  z: -15,
+};
+
+const gui = new GUI();
+const p = gui.addFolder('position');
+p.add(position, 'x', -100, 100);
+p.add(position, 'y', -100, 100);
+p.add(position, 'z', -100, 100);
+const r = gui.addFolder('rotation');
+r.add(rotation, 'x', -100, 100);
+r.add(rotation, 'y', -100, 100);
+r.add(rotation, 'z', -100, 100);
+    
+
+ + + + +

Float Theme:

+

Useful when you want the UI over something

+ +
+
+
+

+const gui = new GUI();
+gui.setTheme('float');
+gui.add(settings, 'period1', 0.1, 20);
+gui.add(settings, 'period2', 0.1, 20);
+gui.add(settings, 'p1', 0.1, 20);
+gui.add(settings, 'p2', 0.1, 20);
+gui.add(settings, 'heightMult', 1, 10);
+gui.addColor(settings, 'baseColor');
+    
+  
+ + +

Form Theme:

+ +
+
+

+const s = {
+  name: "Jane Cheng",
+  address1: "B 1, No. 5, Xuzhou R",
+  address2: "Taipei 100218",
+  email: "jane_c@notreally.notcom",
+  receipt: true,
+  currency: '$',
+};
+
+const gui = new GUI();
+gui.setTheme('form');
+gui.add(s, 'name');
+gui.add(s, 'address1');
+gui.add(s, 'address2');
+gui.add(s, 'email');
+gui.add(s, 'receipt');
+gui.add(
+  s, 'currency',
+  ['$', '¥', '€', '£', '₣']);
+gui.addButton('submit', submit);
+
+
+
+
+
+
+
+
+//
+    
+  
+ + + + + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d9deaef..6957f6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "muigui", - "version": "0.0.12", + "version": "0.0.13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "muigui", - "version": "0.0.12", + "version": "0.0.13", "license": "MIT", "devDependencies": { "@rollup/plugin-node-resolve": "^15.0.1", @@ -16,7 +16,7 @@ "@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/parser": "^6.12.0", "chokidar": "^3.5.3", - "eslint": "^8.20.0", + "eslint": "^8.54.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-one-variable-per-var": "^0.0.3", "eslint-plugin-optional-comma-spacing": "0.0.4", @@ -28,6 +28,15 @@ "typescript": "5.2" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", @@ -189,14 +198,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -212,21 +221,21 @@ } }, "node_modules/@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -248,9 +257,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -721,6 +730,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -735,9 +750,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1607,27 +1622,28 @@ } }, "node_modules/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1635,22 +1651,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -1700,9 +1713,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -1710,6 +1723,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -1725,14 +1741,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1951,7 +1967,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastq": { @@ -2212,9 +2228,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2264,12 +2280,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2608,16 +2618,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2923,17 +2923,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -3174,9 +3174,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -4110,15 +4110,6 @@ "node": ">= 8" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -4229,6 +4220,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@babel/code-frame": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", @@ -4358,14 +4355,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -4375,18 +4372,18 @@ } }, "@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" } @@ -4398,9 +4395,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "@jridgewell/gen-mapping": { @@ -4713,6 +4710,12 @@ "eslint-visitor-keys": "^3.4.1" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4724,9 +4727,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true }, "acorn-jsx": { @@ -5347,27 +5350,28 @@ } }, "eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5375,22 +5379,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" } }, @@ -5425,9 +5426,9 @@ "requires": {} }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -5441,14 +5442,14 @@ "dev": true }, "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -5612,7 +5613,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastq": { @@ -5814,9 +5815,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -5851,12 +5852,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -6096,12 +6091,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6333,17 +6322,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "p-limit": { @@ -6521,9 +6510,9 @@ } }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "puppeteer": { @@ -7244,12 +7233,6 @@ "isexe": "^2.0.0" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 64a99ac..c515f63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "muigui", - "version": "0.0.12", + "version": "0.0.13", "description": "A Simple GUI", "main": "muigui.js", "module": "src/muigui.js", @@ -45,7 +45,7 @@ "@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/parser": "^6.12.0", "chokidar": "^3.5.3", - "eslint": "^8.20.0", + "eslint": "^8.54.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-one-variable-per-var": "^0.0.3", "eslint-plugin-optional-comma-spacing": "0.0.4", diff --git a/src/controllers/Button.js b/src/controllers/Button.js index 9c45bdd..efa096c 100644 --- a/src/controllers/Button.js +++ b/src/controllers/Button.js @@ -26,6 +26,9 @@ export default class Button extends Controller { })); this.setOptions({name: property, ...options}); } + name(name) { + this.#buttonElem.textContent = name; + } setOptions(options) { copyExistingProperties(this.#options, options); const {name} = this.#options; diff --git a/src/controllers/Canvas.js b/src/controllers/Canvas.js index b19b15d..c4c1114 100644 --- a/src/controllers/Canvas.js +++ b/src/controllers/Canvas.js @@ -5,8 +5,8 @@ import LabelController from './LabelController.js'; export default class Canvas extends LabelController { #canvasElem; - constructor() { - super('muigui-canvas'); + constructor(name) { + super('muigui-canvas', name); this.#canvasElem = this.add( new ElementView('canvas', 'muigui-canvas'), ).domElement; diff --git a/src/controllers/ColorChooser.js b/src/controllers/ColorChooser.js index e31f1f0..1bfb67e 100644 --- a/src/controllers/ColorChooser.js +++ b/src/controllers/ColorChooser.js @@ -16,7 +16,6 @@ export default class ColorChooser extends PopDownController { #colorView; #textView; #to; - #setKnobHelper; constructor(object, property, options = {}) { super(object, property, 'muigui-color-chooser'); @@ -28,20 +27,22 @@ export default class ColorChooser extends PopDownController { this.addTop(this.#textView); this.addBottom(this.#colorView); // WTF! FIX! - this.#setKnobHelper = () => { - if (this.#to) { - const hex6Or8 = this.#to(this.getValue()); - const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8)); - hsl[2] = (hsl[2] + 50) % 100; - const hex = uint8RGBToHex(hslToRgbUint8(hsl)); - this.setKnobColor(`${hex6Or8.substring(0, 7)}FF`, hex); - } - }; + this.___setKnobHelper = true; this.updateDisplay(); } + #setKnobHelper() { + if (this.#to) { + const hex6Or8 = this.#to(this.getValue()); + const alpha = hex6Or8.length === 9 ? hex6Or8.substring(7, 9) : 'FF'; + const hsl = rgbUint8ToHsl(hexToUint8RGB(hex6Or8)); + hsl[2] = (hsl[2] + 50) % 100; + const hex = uint8RGBToHex(hslToRgbUint8(hsl)); + this.setKnobColor(`${hex6Or8.substring(0, 7)}${alpha}`, hex); + } + } updateDisplay() { super.updateDisplay(); - if (this.#setKnobHelper) { + if (this.___setKnobHelper) { this.#setKnobHelper(); } } diff --git a/src/controllers/Folder.js b/src/controllers/Folder.js index ac5ee29..527c16e 100644 --- a/src/controllers/Folder.js +++ b/src/controllers/Folder.js @@ -11,6 +11,7 @@ export default class Folder extends Container { type: 'button', onClick: () => this.toggleOpen(), }, [this.#labelElem])); + this.pushContainer(new Container('muigui-open-container')); this.pushContainer(new Container()); this.name(name); this.open(); diff --git a/src/controllers/PopDownController.js b/src/controllers/PopDownController.js index 322a9c9..ec1c0e2 100644 --- a/src/controllers/PopDownController.js +++ b/src/controllers/PopDownController.js @@ -54,7 +54,10 @@ export default class PopDownController extends ValueController { })); this.#checkboxElem = checkboxElem; this.#valuesView = this.#top.add(new ElementView('div', 'muigui-pop-down-values')); - this.#bottom = this.add(new ElementView('div', 'muigui-pop-down-bottom')); + const container = new ElementView('div', 'muigui-pop-down-bottom muigui-open-container'); + this.#bottom = new ElementView('div'); + container.add(this.#bottom); + this.add(container); this.setOptions(options); } setKnobColor(bgCssColor/*, fgCssColor*/) { diff --git a/src/controllers/Text.js b/src/controllers/Text.js index 8b163c0..deb0f1c 100644 --- a/src/controllers/Text.js +++ b/src/controllers/Text.js @@ -3,7 +3,7 @@ import ValueController from './ValueController.js'; export default class Text extends ValueController { constructor(object, property) { - super(object, property, 'muigui-checkbox'); + super(object, property, 'muigui-text'); this.add(new TextView(this)); this.updateDisplay(); } diff --git a/src/controllers/TextNumber.js b/src/controllers/TextNumber.js index e494dfa..764b476 100644 --- a/src/controllers/TextNumber.js +++ b/src/controllers/TextNumber.js @@ -11,7 +11,7 @@ export default class TextNumber extends ValueController { #step; constructor(object, property, options = {}) { - super(object, property, 'muigui-checkbox'); + super(object, property, 'muigui-text-number'); this.#textView = this.add(new NumberView(this, options)); this.updateDisplay(); } diff --git a/src/controllers/create-controller.js b/src/controllers/create-controller.js index bf21ba1..20cd7e5 100644 --- a/src/controllers/create-controller.js +++ b/src/controllers/create-controller.js @@ -24,6 +24,9 @@ export function createController(object, property, ...args) { if (Array.isArray(arg1)) { return new Select(object, property, {keyValues: arg1}); } + if (arg1 && arg1.keyValues) { + return new Select(object, property, {keyValues: arg1.keyValues}); + } const t = typeof object[property]; switch (t) { diff --git a/src/esm.ts b/src/esm.ts index 8dba403..4525558 100644 --- a/src/esm.ts +++ b/src/esm.ts @@ -9,4 +9,12 @@ export { default as Slider } from './controllers/Slider.js'; export { default as TextNumber } from './controllers/TextNumber.js'; export { default as Vec2 } from './controllers/Vec2.js'; +import {graph} from './libs/graph.js'; +import {monitor} from './libs/monitor.js'; + +export const helpers = { + graph, + monitor, +}; + export default GUI; \ No newline at end of file diff --git a/src/libs/color-utils.js b/src/libs/color-utils.js index abd7430..a51e084 100644 --- a/src/libs/color-utils.js +++ b/src/libs/color-utils.js @@ -583,6 +583,50 @@ export const colorFormatConverters = { to: v => Array.from(v).map(v => f3(v)).join(', '), }, }, + 'float-hsv': { + color: { + from: v => [true, rgbFloatToHSV01(hexToFloatRGB(v))], + to: v => hsv01ToRGBFloat(floatRGBToHex(v)), + }, + text: { + from: strTo3Floats, + // need Array.from because map of Float32Array makes a Float32Array + to: v => Array.from(v).map(v => f3(v)).join(', '), + }, + }, + 'float-hsva': { + color: { + from: v => [true, rgbaFloatToHSVA01(hexToFloatRGB(v))], + to: v => hsva01ToRGBAFloat(floatRGBToHex(v)), + }, + text: { + from: strTo4Floats, + // need Array.from because map of Float32Array makes a Float32Array + to: v => Array.from(v).map(v => f3(v)).join(', '), + }, + }, + //'float-hsl': { + // color: { + // from: v => [true, rgbFloatToHsl01(hexToFloatRGB(v))], + // to: v => hsl01ToRGBFloat(floatRGBToHex(v)), + // }, + // text: { + // from: strTo3Floats, + // // need Array.from because map of Float32Array makes a Float32Array + // to: v => Array.from(v).map(v => f3(v)).join(', '), + // }, + //}, + //'float-hsla': { + // color: { + // from: v => [true, hexToFloatRGBA(v)], + // to: floatRGBAToHex, + // }, + // text: { + // from: strTo4Floats, + // // need Array.from because map of Float32Array makes a Float32Array + // to: v => Array.from(v).map(v => f3(v)).join(', '), + // }, + //}, 'object-rgb': { color: { from: v => [true, hexToObjectRGB(v)], diff --git a/src/libs/graph.js b/src/libs/graph.js new file mode 100644 index 0000000..e8feea9 --- /dev/null +++ b/src/libs/graph.js @@ -0,0 +1,42 @@ +const darkColors = { + main: '#ddd', +}; +const lightColors = { + main: '#333', +}; + +const darkMatcher = window.matchMedia('(prefers-color-scheme: dark)'); + +let colors; +let isDarkMode; + +function update() { + isDarkMode = darkMatcher.matches; + colors = isDarkMode ? darkColors : lightColors; +} +darkMatcher.addEventListener('change', update); +update(); + +export function graph(canvas, data, { + min = -1, + max = 1, + interval = 16, + color, + }) { + const ctx = canvas.getContext('2d'); + + function render() { + const {width, height} = canvas; + ctx.clearRect(0, 0, width, height); + ctx.beginPath(); + const range = max - min; + for (let i = 0; i < data.length; ++i) { + const x = i * width / data.length; + const y = (data[i] - min) * height / range; + ctx.lineTo(x, y); + } + ctx.strokeStyle = color || colors.main; + ctx.stroke(); + } + setInterval(render, interval); +} \ No newline at end of file diff --git a/src/libs/monitor.js b/src/libs/monitor.js new file mode 100644 index 0000000..d79633a --- /dev/null +++ b/src/libs/monitor.js @@ -0,0 +1,5 @@ +export function monitor(label, object, property, {interval = 200} = {}) { + setInterval(() => { + label.text(JSON.stringify(object[property], null, 2)); + }, interval); +} diff --git a/src/muigui.js b/src/muigui.js index 8a59469..066272b 100644 --- a/src/muigui.js +++ b/src/muigui.js @@ -61,6 +61,10 @@ export class GUIFolder extends Folder { addLabel(text) { return this.addController(new Label(text)); } + addButton(name, fn) { + const o = {fn}; + return this.add(o, 'fn').name(name); + } } class MuiguiElement extends HTMLElement { @@ -73,7 +77,7 @@ class MuiguiElement extends HTMLElement { customElements.define('muigui-element', MuiguiElement); const baseStyleSheet = new CSSStyleSheet(); -baseStyleSheet.replaceSync(css.default); +//baseStyleSheet.replaceSync(css.default); const userStyleSheet = new CSSStyleSheet(); function makeStyleSheetUpdater(styleSheet) { @@ -100,6 +104,11 @@ function makeStyleSheetUpdater(styleSheet) { const updateBaseStyle = makeStyleSheetUpdater(baseStyleSheet); const updateUserStyle = makeStyleSheetUpdater(userStyleSheet); +function getTheme(name) { + const { include, css: cssStr } = css.themes[name]; + return `${include.map(m => css[m]).join('\n')} : css.default}\n${cssStr || ''}`; +} + export class GUI extends GUIFolder { static converters = converters; static mapRange = mapRange; @@ -131,13 +140,14 @@ export class GUI extends GUIFolder { } if (parent) { const muiguiElement = createElem('muigui-element'); - muiguiElement.shadowRoot.adoptedStyleSheets = [baseStyleSheet, userStyleSheet, this.#localStyleSheet]; + muiguiElement.shadowRoot.adoptedStyleSheets = [this.#localStyleSheet, baseStyleSheet, userStyleSheet]; muiguiElement.shadow.appendChild(this.domElement); parent.appendChild(muiguiElement); } if (title) { this.title(title); } + this.#localStyleSheet.replaceSync(css.default); this.domElement.classList.add('muigui', 'muigui-colors'); } setStyle(css) { @@ -155,8 +165,11 @@ export class GUI extends GUIFolder { static getUserStyleSheet() { return userStyleSheet; } + setTheme(name) { + this.setStyle(getTheme(name)); + } static setTheme(name) { - GUI.setBaseStyles(`${css.default}\n${css.themes[name] || ''}`); + GUI.setBaseStyles(getTheme(name)); } } diff --git a/src/styles/muigui.css.js b/src/styles/muigui.css.js index f961386..3f1ce69 100644 --- a/src/styles/muigui.css.js +++ b/src/styles/muigui.css.js @@ -10,16 +10,24 @@ export default { --menu-bg-color: #f8f8f8; --menu-sep-color: #bbb; --hover-bg-color: #999; - --focus-color: #68C; - --range-color: #888888; + --focus-color: #8BF; + --range-color: #AAA; --invalid-color: #FF0000; --selected-color: rgb(255, 255, 255, 0.9); --button-bg-color: var(--value-bg-color); + --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==); + --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDQ0OyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICM0NDQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+); + --image-checkerboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjNDA0MDQwOyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9yZWN0PgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjODA4MDgwOyIgeD0iMCIgeT0iMCIgd2lkdGg9IjUwJSIgaGVpZ2h0PSI1MCUiPjwvcmVjdD4KICA8cmVjdCBzdHlsZT0iZmlsbDogIzgwODA4MDsiIHg9IjUwJSIgeT0iNTAlIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSI+PC9yZWN0Pgo8L3N2Zz4=); + --range-left-color: var(--value-color); --range-right-color: var(--value-bg-color); --range-right-hover-color: var(--hover-bg-color); + --button-image: + linear-gradient( + rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.2) + ); color: var(--color); background-color: var(--bg-color); @@ -36,7 +44,7 @@ export default { --menu-bg-color: #080808; --menu-sep-color: #444444; --hover-bg-color: #666666; - --focus-color: #88AAFF; + --focus-color: #458; /*#88AAFF*/; --range-color: #888888; --invalid-color: #FF6666; --selected-color: rgba(255, 255, 255, 0.3); @@ -46,9 +54,15 @@ export default { --range-left-color: var(--value-color); --range-right-color: var(--value-bg-color); --range-right-hover-color: var(--hover-bg-color); + --button-image: linear-gradient( + rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4) + ); color: var(--color); background-color: var(--bg-color); + + --image-closed: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iMjAlIiB5PSI0NSUiIHdpZHRoPSI2MCUiIGhlaWdodD0iMTAlIj48L3JlY3Q+Cjwvc3ZnPg==); + --image-open: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHN0eWxlPSJmaWxsOiAjREREOyIgeD0iNDUlIiB5PSIyMCUiIHdpZHRoPSIxMCUiIGhlaWdodD0iNjAlIj48L3JlY3Q+CiAgPHJlY3Qgc3R5bGU9ImZpbGw6ICNEREQ7IiB4PSIyMCUiIHk9IjQ1JSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSIxMCUiPjwvcmVjdD4KPC9zdmc+); } } @@ -57,7 +71,6 @@ export default { --label-width: 45%; --number-width: 40%; - --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; --font-size: 11px; --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace; @@ -150,6 +163,9 @@ export default { min-width: 0; min-height: var(--line-height); } +.muigui-root { + z-index: 1; +} .muigui-root, .muigui-menu { display: flex; @@ -174,8 +190,7 @@ export default { color: var(--color); background-color: var(--menu-bg-color); min-height: var(--line-height); - padding-top: 0.2em; - padding-bottom: 0.2em; + padding: 0.2em; cursor: pointer; border-radius: var(--border-radius); } @@ -196,7 +211,7 @@ export default { .muigui-controller>*:nth-child(1) { flex: 1 0 var(--label-width); min-width: 0; - white-space: pre; + /* white-space: pre; why?? */ } .muigui-controller>label:nth-child(1) { place-content: center start; @@ -238,32 +253,41 @@ export default { /* fix! */ .muigui-open>button>label::before, .muigui-closed>button>label::before { + content: "X"; + color: rgba(0, 0, 0, 0); + background-color: var(--range-color); + border-radius: 0.2em; width: 1.25em; - height: var(--line-height); + margin-right: 0.25em; + height: 1.25em; /*var(--line-height);*/ display: inline-grid; place-content: center start; pointer-events: none; } .muigui-open>button>label::before { - content: "ⓧ"; /*"▼";*/ + background-image: var(--image-open); } .muigui-closed>button>label::before { - content: "⨁"; /*"▶";*/ + background-image: var(--image-closed); } -.muigui-open>*:nth-child(2) { - transition: max-height 0.2s ease-out, - opacity 0.5s ease-out; - max-height: 100vh; + +.muigui-open>.muigui-open-container { + transition: all 0.1s ease-out; overflow: auto; - opacity: 1; + height: 100%; } - -.muigui-closed>*:nth-child(2) { - transition: max-height 0.2s ease-out, - opacity 1s; - max-height: 0; - opacity: 0; +.muigui-closed>.muigui-open-container { + transition: all 0.1s ease-out; overflow: hidden; + min-height: 0; +} +.muigui-open>.muigui-open-container>* { + transition: all 0.1s ease-out; + margin-top: 0px; +} +.muigui-closed>.muigui-open-container>* { + transition: all 0.1s ease-out; + margin-top: -100%; } /* ---- popdown ---- */ @@ -275,8 +299,12 @@ export default { .muigui-value>*:nth-child(1).muigui-pop-down-top { flex: 0; } -.muigui-pop-down-bottom { +.muigui-closed .muigui-pop-down-bottom { + max-height: 0; +} +.muigui-value .muigui-pop-down-bottom { + margin: 0; } .muigui-pop-down-values { @@ -298,6 +326,10 @@ export default { width: auto; color: var(--value-color); background-color: var(--value-bg-color); + background-image: var(--image-checkerboard); + background-size: 10px 10px; + background-position: 0 0, 0 5px, 5px -5px, -5px 0px; + cursor: pointer; display: grid; @@ -389,14 +421,16 @@ export default { .muigui-button { display: grid; - + padding: 2px 0 2px 0; } .muigui-button button { border: none; color: var(--value-color); background-color: var(--button-bg-color); + background-image: var(--button-image); cursor: pointer; place-content: center center; + height: var(--line-height); } /* ------ [ color ] ------ */ @@ -608,9 +642,9 @@ export default { border-bottom: 1px solid rgba(0,0,0,0.2); border-right: 1px solid rgba(0,0,0,0.2); background-color: var(--range-color); - margin-top: calc((var(--line-height) - 2px) / -2); - width: calc(var(--line-height) - 2px); - height: calc(var(--line-height) - 2px); + margin-top: calc((var(--line-height) - 6px) / -2); + width: calc(var(--line-height) - 6px); + height: calc(var(--line-height) - 6px); } .muigui-range input[type=range]::-webkit-slider-runnable-track { @@ -694,8 +728,14 @@ export default { `, themes: { - default: '', - float: ` + default: { + include: ['default'], + css: ` + `, + }, + float: { + include: ['default'], + css: ` :root { color-scheme: light dark, } @@ -752,5 +792,57 @@ themes: { --range-color: rgba(0, 0, 0, 0.125); } `, + }, + form: { + include: [], + css: ` + .muigui { + --width: 100%; + --label-width: 45%; + --number-width: 40%; + } + .muigui-root>button { + display: none; + } + .muigui-controller { + margin-top: 1em; + } + .muigui-label-controller { + display: flex; + flex-direction: column; + align-items: stretch; + margin-top: 1em; + } + .muigui-label-controller:has(.muigui-checkbox) { + flex-direction: row; + } + .muigui-value { + display: flex; + align-items: stretch; + } + .muigui-value>* { + flex: 1 1 auto; + min-width: 0; + } + .muigui-controller>*:nth-child(1) { + flex: 1 0 var(--label-width); + min-width: 0; + white-space: pre; + } + .muigui-controller>label:nth-child(1) { + place-content: center start; + display: inline-grid; + overflow: hidden; + } + .muigui-controller>*:nth-child(2) { + flex: 1 1 75%; + min-width: 0; + } + `, + }, + none: { + include: [], + css: '', + }, }, }; diff --git a/src/views/NumberView.js b/src/views/NumberView.js index 3b506dd..c6c63d5 100644 --- a/src/views/NumberView.js +++ b/src/views/NumberView.js @@ -22,15 +22,22 @@ export default class NumberView extends EditView { const wheelHelper = createWheelHelper(); super(createElem('input', { type: 'number', - onInput: () => this.#handleInput(setValue, true), - onChange: () => this.#handleInput(setFinalValue, false), + onInput: () => { + this.#handleInput(setValue, true); + }, + onChange: () => { + this.#handleInput(setFinalValue, false); + }, onWheel: e => { e.preventDefault(); const {min, max, step} = this.#options; const delta = wheelHelper(e, step); const v = parseFloat(this.domElement.value); const newV = clamp(stepify(v + delta, v => v, step), min, max); - setter.setValue(newV); + const [valid, outV] = this.#from(newV); + if (valid) { + setter.setValue(outV); + } }, })); this.setOptions(options); diff --git a/src/views/TextView.js b/src/views/TextView.js index a3cd8f6..61bb574 100644 --- a/src/views/TextView.js +++ b/src/views/TextView.js @@ -16,8 +16,12 @@ export default class TextView extends EditView { const setFinalValue = setter.setFinalValue.bind(setter); super(createElem('input', { type: 'text', - onInput: () => this.#handleInput(setValue, true), - onChange: () => this.#handleInput(setFinalValue, false), + onInput: () => { + this.#handleInput(setValue, true); + }, + onChange: () => { + this.#handleInput(setFinalValue, false); + }, })); this.setOptions(options); } diff --git a/tsconfig.json b/tsconfig.json index 42c165d..c433efe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,15 +12,15 @@ "src/**/*.ts", "src/**/*.js", "build/**/*.js", - //"examples/**/*.js", + "examples/**/*.js", "test/**/*.js", - //"build/**/*.js", - //".eslintrc.cjs", + ".eslintrc.cjs", "*.js", - //"test/tests/**/*.html", ], "exclude": [ - "examples/**/*.js", + "examples/3rdParty/**/*.js", "test/mocha.js", + "out/**/*.js", + "build/out/**/", ], } \ No newline at end of file