muigui 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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","../../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 white-space: nowrap;\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: -1000%;\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 return this;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n return this;\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 listen() {\n return this;\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 listen() {\n this.#controllers.forEach(c => {\n c.listen();\n });\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<svg class=\"muigui-checkered-background\" tabindex=\"0\" viewBox=\"0 0 64 48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <linearGradient data-src=\"muigui-color-chooser-light-dark\" x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\">\n <stop stop-color=\"rgba(0,0,0,0)\" offset=\"0%\"/>\n <stop stop-color=\"#000\" offset=\"100%\"/>\n </linearGradient>\n <linearGradient data-src=\"muigui-color-chooser-hue\">\n <stop stop-color=\"hsl(60 0% 100% / 1)\" offset=\"0%\"/>\n <stop stop-color=\"hsl(60 100% 50% / 1)\" offset=\"100%\"/>\n </linearGradient>\n\n <rect width=\"64\" height=\"48\" data-target=\"muigui-color-chooser-hue\"/>\n <rect width=\"64\" height=\"48\" data-target=\"muigui-color-chooser-light-dark\"/>\n <circle r=\"4\" class=\"muigui-color-chooser-circle\"/>\n</svg>\n<svg tabindex=\"0\" viewBox=\"0 0 64 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <linearGradient data-src=\"muigui-color-chooser-hues\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop stop-color=\"hsl(0,100%,50%)\" offset=\"0%\"/>\n <stop stop-color=\"hsl(60,100%,50%)\" offset=\"16.666%\"/>\n <stop stop-color=\"hsl(120,100%,50%)\" offset=\"33.333%\"/>\n <stop stop-color=\"hsl(180,100%,50%)\" offset=\"50%\"/>\n <stop stop-color=\"hsl(240,100%,50%)\" offset=\"66.666%\"/>\n <stop stop-color=\"hsl(300,100%,50%)\" offset=\"83.333%\"/>\n <stop stop-color=\"hsl(360,100%,50%)\" offset=\"100%\"/>\n </linearGradient>\n <rect y=\"1\" width=\"64\" height=\"4\" data-target=\"muigui-color-chooser-hues\"/>\n <g class=\"muigui-color-chooser-hue-cursor\">\n <rect x=\"-3\" width=\"6\" height=\"6\" />\n </g>\n</svg>\n<svg class=\"muigui-checkered-background\" tabindex=\"0\" viewBox=\"0 0 64 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <linearGradient data-src=\"muigui-color-chooser-alpha\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop stop-color=\"hsla(0,100%,100%,0)\" offset=\"0%\"/>\n <stop stop-color=\"hsla(0,100%,100%,1)\" offset=\"100%\"/>\n </linearGradient>\n <rect y=\"1\" width=\"64\" height=\"4\" data-target=\"muigui-color-chooser-alpha\"/>\n <g class=\"muigui-color-chooser-alpha-cursor\">\n <rect x=\"-3\" width=\"6\" height=\"6\" />\n </g>\n</svg>\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\nfunction camelCaseToSnakeCase(id) {\n return id\n .replace(/(.)([A-Z][a-z]+)/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\nfunction prepName(name) {\n return camelCaseToSnakeCase(name.toString()).replaceAll('_', ' ');\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).name(prepName(property));\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\n .addController(new ColorChooser(object, property, options))\n .name(prepName(property));\n } else {\n return this\n .addController(new Color(object, property, options))\n .name(prepName(property));\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(prepName(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<svg tabindex=\"0\" viewBox=\"-32 -32 64 64\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <!--<circle id=\"muigui-outline\" cx=\"0\" cy=\"0\" r=\"28.871\" class=\"muigui-direction-circle\"/>-->\n <path id=\"muigui-range\" class=\"muigui-direction-range\" />\n <g id=\"muigui-arrow\">\n <g transform=\"translate(-32, -32)\">\n <path d=\"M31.029,33.883c-1.058,-0.007 -1.916,-0.868 -1.916,-1.928c0,-1.065 0.864,-1.929 1.929,-1.929c0.204,0 0.401,0.032 0.586,0.091l14.729,-0l0,-2.585l12.166,4.468l-12.166,4.468l0,-2.585l-15.315,0l-0.013,0Z\" class=\"muigui-direction-arrow\"/>\n </g>\n </g>\n</svg>\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<svg tabindex=\"0\" viewBox=\"-32 -32 64 64\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <g id=\"muigui-orientation\">\n <g id=\"muigui-origin\">\n <g transform=\"translate(0, 4)\">\n <path id=\"muigui-ticks\" class=\"muigui-ticks\"/>\n <path id=\"muigui-thicks\" class=\"muigui-thicks\"/>\n </g>\n <g transform=\"translate(0, 14)\">\n <g id=\"muigui-number-orientation\">\n <g id=\"muigui-numbers\" transform=\"translate(0, -3)\" class=\"muigui-svg-text\"/>\n </g>\n </g>\n </g>\n <linearGradient id=\"muigui-bg-to-transparent\">\n <stop stop-color=\"var(--value-bg-color)\" offset=\"0%\"/>\n <stop stop-color=\"var(--value-bg-color)\" stop-opacity=\"0\" offset=\"100%\"/>\n </linearGradient>\n <linearGradient id=\"muigui-transparent-to-bg\">\n <stop stop-color=\"var(--value-bg-color)\" stop-opacity=\"0\" offset=\"0%\"/>\n <stop stop-color=\"var(--value-bg-color)\" offset=\"100%\"/> \n </linearGradient>\n <!--<circle cx=\"0\" cy=\"2\" r=\"2\" class=\"muigui-mark\"/>-->\n <!--<rect x=\"-1\" y=\"0\" width=\"2\" height=\"10\" class=\"muigui-mark\"/>-->\n <path d=\"M0 4L-2 0L2 0\" class=\"muigui-mark\"/>\n </g>\n <rect id=\"muigui-left-grad\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" fill=\"url(#muigui-bg-to-transparent)\"/>\n <rect id=\"muigui-right-grad\" x=\"48\" y=\"0\" width=\"20\" height=\"20\" fill=\"url(#muigui-transparent-to-bg)\"/>\n</svg>\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(`<text text-anchor=\"middle\" dominant-baseline=\"hanging\" x=\"${i >= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}</text>`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '<text>- </text>';\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<svg tabindex=\"0\" viewBox=\"-32 -32 64 64\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <path d=\"m-3200,0L3200,0M0,-3200L0,3200\" class=\"muigui-vec2-axis\"/>\n <path id=\"muigui-arrow\" d=\"\" class=\"muigui-vec2-line\"/>\n <g id=\"muigui-circle\" transform=\"translate(0, 0)\">\n <circle r=\"3\" class=\"muigui-vec2-axis\"/>\n </g>\n</svg>\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","prepName","camelCaseToSnakeCase","replaceAll","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":"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"}
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","../../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 white-space: nowrap;\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/* this shouldn't be needed! */\n.muigui-disabled label {\n color: var(--disabled-color) \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: -1000%;\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 return this;\n }\n setOptions(options) {\n copyExistingProperties(this.#options, options);\n const {name} = this.#options;\n this.#buttonElem.textContent = name;\n return this;\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 listen() {\n return this;\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 } else {\n this.#controllers.forEach(c => {\n c.remove(controller);\n });\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 listen() {\n this.#controllers.forEach(c => {\n c.listen();\n });\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<svg class=\"muigui-checkered-background\" tabindex=\"0\" viewBox=\"0 0 64 48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <linearGradient data-src=\"muigui-color-chooser-light-dark\" x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\">\n <stop stop-color=\"rgba(0,0,0,0)\" offset=\"0%\"/>\n <stop stop-color=\"#000\" offset=\"100%\"/>\n </linearGradient>\n <linearGradient data-src=\"muigui-color-chooser-hue\">\n <stop stop-color=\"hsl(60 0% 100% / 1)\" offset=\"0%\"/>\n <stop stop-color=\"hsl(60 100% 50% / 1)\" offset=\"100%\"/>\n </linearGradient>\n\n <rect width=\"64\" height=\"48\" data-target=\"muigui-color-chooser-hue\"/>\n <rect width=\"64\" height=\"48\" data-target=\"muigui-color-chooser-light-dark\"/>\n <circle r=\"4\" class=\"muigui-color-chooser-circle\"/>\n</svg>\n<svg tabindex=\"0\" viewBox=\"0 0 64 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <linearGradient data-src=\"muigui-color-chooser-hues\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop stop-color=\"hsl(0,100%,50%)\" offset=\"0%\"/>\n <stop stop-color=\"hsl(60,100%,50%)\" offset=\"16.666%\"/>\n <stop stop-color=\"hsl(120,100%,50%)\" offset=\"33.333%\"/>\n <stop stop-color=\"hsl(180,100%,50%)\" offset=\"50%\"/>\n <stop stop-color=\"hsl(240,100%,50%)\" offset=\"66.666%\"/>\n <stop stop-color=\"hsl(300,100%,50%)\" offset=\"83.333%\"/>\n <stop stop-color=\"hsl(360,100%,50%)\" offset=\"100%\"/>\n </linearGradient>\n <rect y=\"1\" width=\"64\" height=\"4\" data-target=\"muigui-color-chooser-hues\"/>\n <g class=\"muigui-color-chooser-hue-cursor\">\n <rect x=\"-3\" width=\"6\" height=\"6\" />\n </g>\n</svg>\n<svg class=\"muigui-checkered-background\" tabindex=\"0\" viewBox=\"0 0 64 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <linearGradient data-src=\"muigui-color-chooser-alpha\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop stop-color=\"hsla(0,100%,100%,0)\" offset=\"0%\"/>\n <stop stop-color=\"hsla(0,100%,100%,1)\" offset=\"100%\"/>\n </linearGradient>\n <rect y=\"1\" width=\"64\" height=\"4\" data-target=\"muigui-color-chooser-alpha\"/>\n <g class=\"muigui-color-chooser-alpha-cursor\">\n <rect x=\"-3\" width=\"6\" height=\"6\" />\n </g>\n</svg>\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\nfunction camelCaseToSnakeCase(id) {\n return id\n .replace(/(.)([A-Z][a-z]+)/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\nfunction prepName(name) {\n return camelCaseToSnakeCase(name.toString()).replaceAll('_', ' ');\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).name(prepName(property));\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\n .addController(new ColorChooser(object, property, options))\n .name(prepName(property));\n } else {\n return this\n .addController(new Color(object, property, options))\n .name(prepName(property));\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(prepName(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<svg tabindex=\"0\" viewBox=\"-32 -32 64 64\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <!--<circle id=\"muigui-outline\" cx=\"0\" cy=\"0\" r=\"28.871\" class=\"muigui-direction-circle\"/>-->\n <path id=\"muigui-range\" class=\"muigui-direction-range\" />\n <g id=\"muigui-arrow\">\n <g transform=\"translate(-32, -32)\">\n <path d=\"M31.029,33.883c-1.058,-0.007 -1.916,-0.868 -1.916,-1.928c0,-1.065 0.864,-1.929 1.929,-1.929c0.204,0 0.401,0.032 0.586,0.091l14.729,-0l0,-2.585l12.166,4.468l-12.166,4.468l0,-2.585l-15.315,0l-0.013,0Z\" class=\"muigui-direction-arrow\"/>\n </g>\n </g>\n</svg>\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<svg tabindex=\"0\" viewBox=\"-32 -32 64 64\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <g id=\"muigui-orientation\">\n <g id=\"muigui-origin\">\n <g transform=\"translate(0, 4)\">\n <path id=\"muigui-ticks\" class=\"muigui-ticks\"/>\n <path id=\"muigui-thicks\" class=\"muigui-thicks\"/>\n </g>\n <g transform=\"translate(0, 14)\">\n <g id=\"muigui-number-orientation\">\n <g id=\"muigui-numbers\" transform=\"translate(0, -3)\" class=\"muigui-svg-text\"/>\n </g>\n </g>\n </g>\n <linearGradient id=\"muigui-bg-to-transparent\">\n <stop stop-color=\"var(--value-bg-color)\" offset=\"0%\"/>\n <stop stop-color=\"var(--value-bg-color)\" stop-opacity=\"0\" offset=\"100%\"/>\n </linearGradient>\n <linearGradient id=\"muigui-transparent-to-bg\">\n <stop stop-color=\"var(--value-bg-color)\" stop-opacity=\"0\" offset=\"0%\"/>\n <stop stop-color=\"var(--value-bg-color)\" offset=\"100%\"/> \n </linearGradient>\n <!--<circle cx=\"0\" cy=\"2\" r=\"2\" class=\"muigui-mark\"/>-->\n <!--<rect x=\"-1\" y=\"0\" width=\"2\" height=\"10\" class=\"muigui-mark\"/>-->\n <path d=\"M0 4L-2 0L2 0\" class=\"muigui-mark\"/>\n </g>\n <rect id=\"muigui-left-grad\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" fill=\"url(#muigui-bg-to-transparent)\"/>\n <rect id=\"muigui-right-grad\" x=\"48\" y=\"0\" width=\"20\" height=\"20\" fill=\"url(#muigui-transparent-to-bg)\"/>\n</svg>\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(`<text text-anchor=\"middle\" dominant-baseline=\"hanging\" x=\"${i >= 0 ? i : (i - minusSize / 2) }\" y=\"0\">${f(i / unitSize * unit)}</text>`);\n }\n return texts.join('\\n');\n}\n\nfunction computeSizeOfMinus(elem) {\n const oldHTML = elem.innerHTML;\n elem.innerHTML = '<text>- </text>';\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<svg tabindex=\"0\" viewBox=\"-32 -32 64 64\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\">\n <path d=\"m-3200,0L3200,0M0,-3200L0,3200\" class=\"muigui-vec2-axis\"/>\n <path id=\"muigui-arrow\" d=\"\" class=\"muigui-vec2-line\"/>\n <g id=\"muigui-circle\" transform=\"translate(0, 0)\">\n <circle r=\"3\" class=\"muigui-vec2-axis\"/>\n </g>\n</svg>\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","prepName","camelCaseToSnakeCase","replaceAll","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":"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"}