From 30f4755c20a112b6e190689e435a1aa22545f65c Mon Sep 17 00:00:00 2001 From: lideming Date: Tue, 24 Dec 2024 15:03:32 +0000 Subject: [PATCH] deploy: dd8f1f57c74c83843012e7b519c70758c0d1cc17 --- dist/webfx.esm.js | 37 +++++++++++++++++++++++++++++++++-- dist/webfx.js | 37 +++++++++++++++++++++++++++++++++-- dist/webfx.min.js | 2 +- dist/webfx.min.js.map | 2 +- dist/webfxcore.min.esm.js | 2 +- dist/webfxcore.min.esm.js.map | 2 +- dist/webfxcore.min.js | 2 +- dist/webfxcore.min.js.map | 2 +- 8 files changed, 76 insertions(+), 10 deletions(-) diff --git a/dist/webfx.esm.js b/dist/webfx.esm.js index b898c9c..243b221 100644 --- a/dist/webfx.esm.js +++ b/dist/webfx.esm.js @@ -259,6 +259,15 @@ class CallbacksImpl { } } const Callbacks = CallbacksImpl; +let accessedRefs = null; +function beginRefCollect() { + accessedRefs = new Set(); +} +function endRefCollect() { + const result = accessedRefs; + accessedRefs = null; + return result; +} class Ref { constructor(value) { this._value = undefined; @@ -270,7 +279,11 @@ class Ref { this._onChanged = new Callbacks(); return this._onChanged; } - get value() { return this._value; } + get value() { + if (accessedRefs) + accessedRefs.add(this); + return this._value; + } set value(val) { this._value = val; if (this._onChanged) @@ -281,6 +294,26 @@ class Ref { ref._value = value; return ref; } + static computed(func) { + const ref = new Ref(); + let deps = null; + const updateValue = () => { + if (deps) { + for (const dep of deps) { + dep.onChanged.remove(updateValue); + } + } + beginRefCollect(); + const value = func(); + deps = endRefCollect(); + for (const dep of deps) { + dep.onChanged.add(updateValue); + } + ref.value = value; + }; + updateValue(); + return ref; + } } class Lazy { constructor(func) { @@ -1553,7 +1586,7 @@ function parseTemplate(template) { var i18n = new I18n(); const I = createStringBuilder(i18n); -const version = "1.10.3"; +const version = "1.10.4"; var css = ":root {\n --color-bg: white;\n --color-text: black;\n --color-text-gray: #666;\n --color-bg-selection: hsl(5, 100%, 85%);\n --color-primary: hsl(5, 100%, 67%);\n --color-primary-darker: hsl(5, 100%, 60%);\n --color-primary-dark: hsl(5, 100%, 40%);\n --color-primary-dark-depends: hsl(5, 100%, 40%);\n --color-primary-verydark: hsl(5, 100%, 20%);\n --color-primary-light: hsl(5, 100%, 83%);\n --color-primary-lighter: hsl(5, 100%, 70%);\n --color-fg-11: #111111;\n --color-fg-22: #222222;\n --color-fg-33: #333333;\n --color-bg-cc: #cccccc;\n --color-bg-dd: #dddddd;\n --color-bg-ee: #eeeeee;\n --color-bg-f8: #f8f8f8;\n --color-shadow: rgba(0, 0, 0, .5);\n}\n\n.no-selection {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n}\n\n/* listview item */\n\n.item {\n display: block;\n position: relative;\n padding: 10px;\n /* background: #ddd; */\n /* animation: showing .3s forwards; */\n text-decoration: none;\n line-height: 1.2;\n}\n\na.item {\n color: inherit;\n}\n\n.clickable, .item {\n cursor: pointer;\n transition: transform .3s;\n -webkit-tap-highlight-color: transparent;\n}\n\n.item:hover, .dragover {\n background: var(--color-bg-ee);\n}\n\n.keyboard-input .item:focus {\n outline-offset: -2px;\n}\n\n.dragover-placeholder {\n /* border-top: 2px solid gray; */\n position: relative;\n}\n\n.dragover-placeholder::before {\n content: \"\";\n display: block;\n position: absolute;\n transform: translate(0, -1px);\n height: 2px;\n width: 100%;\n background: gray;\n z-index: 100;\n pointer-events: none;\n}\n\n.clickable:active, .item:active {\n transition: transform .07s;\n transform: scale(.97);\n}\n\n.item:active {\n background: var(--color-bg-dd);\n}\n\n.item.no-transform:active {\n transform: none;\n}\n\n.item.active {\n background: var(--color-bg-dd);\n}\n\n.loading-indicator {\n position: relative;\n margin: .3em;\n margin-top: 3em;\n margin-bottom: 1em;\n text-align: center;\n white-space: pre-wrap;\n cursor: default;\n animation: loading-fadein .3s;\n}\n\n.loading-indicator-text {\n margin: 0 auto;\n}\n\n.loading-indicator.running .loading-indicator-inner {\n display: inline-block;\n position: relative;\n vertical-align: bottom;\n}\n\n.loading-indicator.running .loading-indicator-inner::after {\n content: \"\";\n height: 1px;\n margin: 0%;\n background: var(--color-text);\n display: block;\n animation: fadein .5s 1s backwards;\n}\n\n.loading-indicator.running .loading-indicator-text {\n margin: 0 .5em;\n animation: fadein .3s, loading-first .3s .5s cubic-bezier(0.55, 0.055, 0.675, 0.19) reverse, loading-second .3s .8s cubic-bezier(0.55, 0.055, 0.675, 0.19), loading .25s 1.1s cubic-bezier(0.55, 0.055, 0.675, 0.19) alternate-reverse infinite;\n}\n\n.loading-indicator.error {\n color: red;\n}\n\n.loading-indicator.fading-out {\n transition: max-height;\n animation: loading-fadein .3s reverse;\n}\n\n@keyframes loading-fadein {\n 0% {\n opacity: 0;\n max-height: 0;\n }\n 100% {\n opacity: 1;\n max-height: 200px;\n }\n}\n\n@keyframes fadein {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes loading-first {\n 0% {\n transform: translate(0, -2em) scale(1) rotate(360deg);\n }\n 100% {\n transform: translate(0, 0) scale(1) rotate(0deg);\n }\n}\n\n@keyframes loading-second {\n 0% {\n transform: translate(0, -2em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes loading {\n 0% {\n transform: translate(0, -1em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes showing {\n 0% {\n opacity: .3;\n transform: translate(-20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-top {\n 0% {\n opacity: .3;\n transform: translate(0, -20px)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-right {\n 0% {\n opacity: .3;\n transform: translate(20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n.overlay {\n background: rgba(0, 0, 0, .2);\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n animation: fadein .3s;\n z-index: 10001;\n overflow: hidden;\n contain: strict;\n will-change: transform;\n}\n\n.overlay.fixed {\n position: fixed;\n}\n\n.overlay.nobg {\n background: none;\n will-change: auto;\n}\n\n.overlay.centerChild {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.overlay.clickThrough {\n pointer-events: none;\n}\n\n.dialog * {\n box-sizing: border-box;\n}\n\n.dialog {\n font-size: 14px;\n position: relative;\n overflow: auto;\n background: var(--color-bg);\n border-radius: 5px;\n box-shadow: 0 0 12px var(--color-shadow);\n animation: dialogin .3s cubic-bezier(0,0,0,1);\n z-index: 10001;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n contain: content;\n will-change: transform;\n pointer-events: auto;\n}\n\n.dialog.resize {\n resize: both;\n}\n\n.fading-out .dialog {\n transition: transform .3s cubic-bezier(.5,0,1,1);\n transform: scale(.7);\n}\n\n.dialog-title, .dialog-content, .dialog-bottom {\n padding: 10px;\n}\n\n.dialog-title {\n background: var(--color-bg-ee);\n}\n\n.dialog-content {\n flex: 1;\n padding: 5px 10px;\n overflow: auto;\n}\n\n.dialog-content.flex {\n display: flex;\n flex-direction: column;\n}\n\n.dialog-bottom {\n padding: 5px 10px;\n}\n\n@keyframes dialogin {\n 0% {\n transform: scale(.5);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n.input-label {\n font-size: 80%;\n color: var(--color-text-gray);\n margin: 5px 0 3px 0;\n}\n\n.input-text {\n display: block;\n width: 100%;\n padding: 5px;\n border: solid 1px gray;\n background: var(--color-bg);\n color: var(--color-text);\n}\n\n.dialog .input-text {\n margin: 5px 0;\n}\n\ntextarea.input-text {\n resize: vertical;\n}\n\n.labeled-input {\n display: flex;\n flex-direction: column;\n}\n\n.labeled-input .input-text {\n flex: 1;\n}\n\n.labeled-input:focus-within .input-label {\n color: var(--color-primary-darker);\n}\n\n.input-text:focus {\n border-color: var(--color-primary-darker);\n}\n\n.input-text:active {\n border-color: var(--color-primary-dark);\n}\n\n.btn {\n display: block;\n text-align: center;\n transition: all .2s;\n padding: 0 .4em;\n min-width: 3em;\n line-height: 1.5em;\n background: var(--color-primary);\n color: white;\n text-shadow: 0 0 4px var(--color-primary-verydark);\n box-shadow: 0 0 3px var(--color-shadow);\n cursor: pointer;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n position: relative;\n overflow: hidden;\n}\n\n.btn:hover {\n transition: all .05s;\n background: var(--color-primary-darker);\n}\n\n.btn.btn-down, .btn:active {\n transition: all .05s;\n background: var(--color-primary-dark);\n box-shadow: 0 0 1px var(--color-shadow);\n}\n\n.btn.disabled {\n background: var(--color-primary-light);\n}\n\n.dialog .btn {\n margin: 10px 0;\n}\n\n.btn-big {\n padding: 5px;\n}\n\n.btn-inline {\n display: inline;\n}\n\n.textbtn {\n display: inline-block;\n color: var(--color-text-gray);\n margin: 0 5px;\n}\n\n.textbtn.active {\n color: var(--color-text);\n}\n\n*[hidden] {\n display: none !important;\n}\n\n.context-menu {\n position: absolute;\n overflow-y: auto;\n background: var(--color-bg);\n border: solid 1px #777;\n box-shadow: 0 0px 12px var(--color-shadow);\n min-width: 100px;\n max-width: 450px;\n outline: none;\n z-index: 10001;\n animation: context-menu-in .2s ease-out forwards;\n will-change: transform;\n}\n\n.context-menu .item.dangerous {\n transition: color .3s, background .3s;\n color: red;\n}\n\n.context-menu .item.dangerous:hover {\n transition: color .1s, background .1s;\n background: red;\n color: white;\n}\n\n@keyframes context-menu-in {\n 0% {\n transform: scale(.9);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n*.menu-shown {\n background: var(--color-bg-dd);\n}\n\n.menu-info {\n white-space: pre-wrap;\n color: var(--color-text-gray);\n padding: 5px 10px;\n /* animation: showing .3s; */\n cursor: default;\n}\n\n.toasts-container {\n position: fixed;\n bottom: 0;\n right: 0;\n padding: 5px;\n width: 300px;\n z-index: 10001;\n overflow: hidden;\n}\n\n.toast {\n margin: 5px;\n padding: 10px;\n border-radius: 5px;\n box-shadow: 0 0 10px var(--color-shadow);\n background: var(--color-bg);\n white-space: pre-wrap;\n animation: showing-right .3s;\n}\n\n.fading-out {\n transition: opacity .3s;\n opacity: 0;\n pointer-events: none;\n}\n\n.anchor-bottom {\n transform: translate(-50%, -100%);\n}\n\n.tooltip {\n position: absolute;\n background: var(--color-bg);\n box-shadow: 0 0 5px var(--color-shadow);\n border-radius: 5px;\n padding: .2em .25em;\n}\n"; diff --git a/dist/webfx.js b/dist/webfx.js index f16c9dd..afa66c4 100644 --- a/dist/webfx.js +++ b/dist/webfx.js @@ -265,6 +265,15 @@ } } const Callbacks = CallbacksImpl; + let accessedRefs = null; + function beginRefCollect() { + accessedRefs = new Set(); + } + function endRefCollect() { + const result = accessedRefs; + accessedRefs = null; + return result; + } class Ref { constructor(value) { this._value = undefined; @@ -276,7 +285,11 @@ this._onChanged = new Callbacks(); return this._onChanged; } - get value() { return this._value; } + get value() { + if (accessedRefs) + accessedRefs.add(this); + return this._value; + } set value(val) { this._value = val; if (this._onChanged) @@ -287,6 +300,26 @@ ref._value = value; return ref; } + static computed(func) { + const ref = new Ref(); + let deps = null; + const updateValue = () => { + if (deps) { + for (const dep of deps) { + dep.onChanged.remove(updateValue); + } + } + beginRefCollect(); + const value = func(); + deps = endRefCollect(); + for (const dep of deps) { + dep.onChanged.add(updateValue); + } + ref.value = value; + }; + updateValue(); + return ref; + } } class Lazy { constructor(func) { @@ -1559,7 +1592,7 @@ var i18n = new I18n(); const I = createStringBuilder(i18n); - const version = "1.10.3"; + const version = "1.10.4"; var css = ":root {\n --color-bg: white;\n --color-text: black;\n --color-text-gray: #666;\n --color-bg-selection: hsl(5, 100%, 85%);\n --color-primary: hsl(5, 100%, 67%);\n --color-primary-darker: hsl(5, 100%, 60%);\n --color-primary-dark: hsl(5, 100%, 40%);\n --color-primary-dark-depends: hsl(5, 100%, 40%);\n --color-primary-verydark: hsl(5, 100%, 20%);\n --color-primary-light: hsl(5, 100%, 83%);\n --color-primary-lighter: hsl(5, 100%, 70%);\n --color-fg-11: #111111;\n --color-fg-22: #222222;\n --color-fg-33: #333333;\n --color-bg-cc: #cccccc;\n --color-bg-dd: #dddddd;\n --color-bg-ee: #eeeeee;\n --color-bg-f8: #f8f8f8;\n --color-shadow: rgba(0, 0, 0, .5);\n}\n\n.no-selection {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n}\n\n/* listview item */\n\n.item {\n display: block;\n position: relative;\n padding: 10px;\n /* background: #ddd; */\n /* animation: showing .3s forwards; */\n text-decoration: none;\n line-height: 1.2;\n}\n\na.item {\n color: inherit;\n}\n\n.clickable, .item {\n cursor: pointer;\n transition: transform .3s;\n -webkit-tap-highlight-color: transparent;\n}\n\n.item:hover, .dragover {\n background: var(--color-bg-ee);\n}\n\n.keyboard-input .item:focus {\n outline-offset: -2px;\n}\n\n.dragover-placeholder {\n /* border-top: 2px solid gray; */\n position: relative;\n}\n\n.dragover-placeholder::before {\n content: \"\";\n display: block;\n position: absolute;\n transform: translate(0, -1px);\n height: 2px;\n width: 100%;\n background: gray;\n z-index: 100;\n pointer-events: none;\n}\n\n.clickable:active, .item:active {\n transition: transform .07s;\n transform: scale(.97);\n}\n\n.item:active {\n background: var(--color-bg-dd);\n}\n\n.item.no-transform:active {\n transform: none;\n}\n\n.item.active {\n background: var(--color-bg-dd);\n}\n\n.loading-indicator {\n position: relative;\n margin: .3em;\n margin-top: 3em;\n margin-bottom: 1em;\n text-align: center;\n white-space: pre-wrap;\n cursor: default;\n animation: loading-fadein .3s;\n}\n\n.loading-indicator-text {\n margin: 0 auto;\n}\n\n.loading-indicator.running .loading-indicator-inner {\n display: inline-block;\n position: relative;\n vertical-align: bottom;\n}\n\n.loading-indicator.running .loading-indicator-inner::after {\n content: \"\";\n height: 1px;\n margin: 0%;\n background: var(--color-text);\n display: block;\n animation: fadein .5s 1s backwards;\n}\n\n.loading-indicator.running .loading-indicator-text {\n margin: 0 .5em;\n animation: fadein .3s, loading-first .3s .5s cubic-bezier(0.55, 0.055, 0.675, 0.19) reverse, loading-second .3s .8s cubic-bezier(0.55, 0.055, 0.675, 0.19), loading .25s 1.1s cubic-bezier(0.55, 0.055, 0.675, 0.19) alternate-reverse infinite;\n}\n\n.loading-indicator.error {\n color: red;\n}\n\n.loading-indicator.fading-out {\n transition: max-height;\n animation: loading-fadein .3s reverse;\n}\n\n@keyframes loading-fadein {\n 0% {\n opacity: 0;\n max-height: 0;\n }\n 100% {\n opacity: 1;\n max-height: 200px;\n }\n}\n\n@keyframes fadein {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes loading-first {\n 0% {\n transform: translate(0, -2em) scale(1) rotate(360deg);\n }\n 100% {\n transform: translate(0, 0) scale(1) rotate(0deg);\n }\n}\n\n@keyframes loading-second {\n 0% {\n transform: translate(0, -2em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes loading {\n 0% {\n transform: translate(0, -1em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes showing {\n 0% {\n opacity: .3;\n transform: translate(-20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-top {\n 0% {\n opacity: .3;\n transform: translate(0, -20px)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-right {\n 0% {\n opacity: .3;\n transform: translate(20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n.overlay {\n background: rgba(0, 0, 0, .2);\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n animation: fadein .3s;\n z-index: 10001;\n overflow: hidden;\n contain: strict;\n will-change: transform;\n}\n\n.overlay.fixed {\n position: fixed;\n}\n\n.overlay.nobg {\n background: none;\n will-change: auto;\n}\n\n.overlay.centerChild {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.overlay.clickThrough {\n pointer-events: none;\n}\n\n.dialog * {\n box-sizing: border-box;\n}\n\n.dialog {\n font-size: 14px;\n position: relative;\n overflow: auto;\n background: var(--color-bg);\n border-radius: 5px;\n box-shadow: 0 0 12px var(--color-shadow);\n animation: dialogin .3s cubic-bezier(0,0,0,1);\n z-index: 10001;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n contain: content;\n will-change: transform;\n pointer-events: auto;\n}\n\n.dialog.resize {\n resize: both;\n}\n\n.fading-out .dialog {\n transition: transform .3s cubic-bezier(.5,0,1,1);\n transform: scale(.7);\n}\n\n.dialog-title, .dialog-content, .dialog-bottom {\n padding: 10px;\n}\n\n.dialog-title {\n background: var(--color-bg-ee);\n}\n\n.dialog-content {\n flex: 1;\n padding: 5px 10px;\n overflow: auto;\n}\n\n.dialog-content.flex {\n display: flex;\n flex-direction: column;\n}\n\n.dialog-bottom {\n padding: 5px 10px;\n}\n\n@keyframes dialogin {\n 0% {\n transform: scale(.5);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n.input-label {\n font-size: 80%;\n color: var(--color-text-gray);\n margin: 5px 0 3px 0;\n}\n\n.input-text {\n display: block;\n width: 100%;\n padding: 5px;\n border: solid 1px gray;\n background: var(--color-bg);\n color: var(--color-text);\n}\n\n.dialog .input-text {\n margin: 5px 0;\n}\n\ntextarea.input-text {\n resize: vertical;\n}\n\n.labeled-input {\n display: flex;\n flex-direction: column;\n}\n\n.labeled-input .input-text {\n flex: 1;\n}\n\n.labeled-input:focus-within .input-label {\n color: var(--color-primary-darker);\n}\n\n.input-text:focus {\n border-color: var(--color-primary-darker);\n}\n\n.input-text:active {\n border-color: var(--color-primary-dark);\n}\n\n.btn {\n display: block;\n text-align: center;\n transition: all .2s;\n padding: 0 .4em;\n min-width: 3em;\n line-height: 1.5em;\n background: var(--color-primary);\n color: white;\n text-shadow: 0 0 4px var(--color-primary-verydark);\n box-shadow: 0 0 3px var(--color-shadow);\n cursor: pointer;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n position: relative;\n overflow: hidden;\n}\n\n.btn:hover {\n transition: all .05s;\n background: var(--color-primary-darker);\n}\n\n.btn.btn-down, .btn:active {\n transition: all .05s;\n background: var(--color-primary-dark);\n box-shadow: 0 0 1px var(--color-shadow);\n}\n\n.btn.disabled {\n background: var(--color-primary-light);\n}\n\n.dialog .btn {\n margin: 10px 0;\n}\n\n.btn-big {\n padding: 5px;\n}\n\n.btn-inline {\n display: inline;\n}\n\n.textbtn {\n display: inline-block;\n color: var(--color-text-gray);\n margin: 0 5px;\n}\n\n.textbtn.active {\n color: var(--color-text);\n}\n\n*[hidden] {\n display: none !important;\n}\n\n.context-menu {\n position: absolute;\n overflow-y: auto;\n background: var(--color-bg);\n border: solid 1px #777;\n box-shadow: 0 0px 12px var(--color-shadow);\n min-width: 100px;\n max-width: 450px;\n outline: none;\n z-index: 10001;\n animation: context-menu-in .2s ease-out forwards;\n will-change: transform;\n}\n\n.context-menu .item.dangerous {\n transition: color .3s, background .3s;\n color: red;\n}\n\n.context-menu .item.dangerous:hover {\n transition: color .1s, background .1s;\n background: red;\n color: white;\n}\n\n@keyframes context-menu-in {\n 0% {\n transform: scale(.9);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n*.menu-shown {\n background: var(--color-bg-dd);\n}\n\n.menu-info {\n white-space: pre-wrap;\n color: var(--color-text-gray);\n padding: 5px 10px;\n /* animation: showing .3s; */\n cursor: default;\n}\n\n.toasts-container {\n position: fixed;\n bottom: 0;\n right: 0;\n padding: 5px;\n width: 300px;\n z-index: 10001;\n overflow: hidden;\n}\n\n.toast {\n margin: 5px;\n padding: 10px;\n border-radius: 5px;\n box-shadow: 0 0 10px var(--color-shadow);\n background: var(--color-bg);\n white-space: pre-wrap;\n animation: showing-right .3s;\n}\n\n.fading-out {\n transition: opacity .3s;\n opacity: 0;\n pointer-events: none;\n}\n\n.anchor-bottom {\n transform: translate(-50%, -100%);\n}\n\n.tooltip {\n position: absolute;\n background: var(--color-bg);\n box-shadow: 0 0 5px var(--color-shadow);\n border-radius: 5px;\n padding: .2em .25em;\n}\n"; diff --git a/dist/webfx.min.js b/dist/webfx.min.js index 59d43be..52e0bd0 100644 --- a/dist/webfx.min.js +++ b/dist/webfx.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).webfx={})}(this,(function(t){"use strict";var e=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{l(i.next(t))}catch(t){s(t)}}function a(t){try{l(i.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}l((i=i.apply(t,e||[])).next())}))};const n=Object.assign,i=Object.prototype.hasOwnProperty;function o(t,e,n=" "){for(;t.lengthn?n:t}function a(t,e){for(let n=0;n=0)){const i=e[n];t[n]=i}}return t}function m(t,e,n){if(e)for(const o in e)if(i.call(e,o)&&(!n||n.indexOf(o)>=0)){const n=e[o];o.startsWith("on")&&t[o]instanceof v?t[o].add(n):t[o]=n}return t}Array.prototype.remove=function(t){a(this,t)};const v=class{constructor(){this._cbs=void 0,this._cbs_invoking=void 0,this._hook=void 0,this._invoking=!1}get onChanged(){var t;return null!==(t=this._hook)&&void 0!==t||(this._hook=new v),this._hook}get length(){return this._cbs?this._cbs.size:0}invoke(...t){var e;if(this._cbs){if(this._invoking)throw new Error("Cannot invoke callbacks during invocation");if(this._invoking=!0,this._cbs.forEach((e=>{try{e.apply(this,t)}catch(t){console.error("Error in callback",t)}})),this._cbs_invoking)for(const t of this._cbs_invoking)this._cbs.add(t);null===(e=this._cbs_invoking)||void 0===e||e.clear(),this._invoking=!1}}add(t){var e,n;return void 0===this._cbs&&(this._cbs=new Set),this._invoking?(null!==(e=this._cbs_invoking)&&void 0!==e||(this._cbs_invoking=new Set),this._cbs_invoking.add(t)):this._cbs.add(t),null===(n=this._hook)||void 0===n||n.invoke(!0,t),t}remove(t){var e,n;void 0!==this._cbs&&(this._invoking&&(null===(e=this._cbs_invoking)||void 0===e||e.delete(t)),this._cbs.delete(t),null===(n=this._hook)||void 0===n||n.invoke(!1,t))}waitOnce(t){if(0===arguments.length)return new Promise(((t,e)=>{const n=(...e)=>{this.remove(n),t(e)};this.add(n)}));if(!t)throw new Error("Invalid callback");{const e=(...n)=>(this.remove(e),t(...n));this.add(e)}}};class g{constructor(t){this._value=void 0,this._onChanged=void 0,this._value=t}get onChanged(){return this._onChanged||(this._onChanged=new v),this._onChanged}get value(){return this._value}set value(t){this._value=t,this._onChanged&&this.onChanged.invoke(this)}static from(t){const e=new g;return e._value=t,e}}class p{constructor(e){this.parentView=void 0,this._position=void 0,this._domctx=new E,this._dom=void 0,this._baseView=void 0,this._mountState=t.MountState.Unmounted,this._onActive=void 0,this._childViews=void 0,this._domctx.view=this,e&&this.domExprCreated(e)}static getView(t){return t instanceof p?t:new p(t)}get position(){return this._position}get dom(){return this.ensureDom(),this._dom}get domCreated(){return!!this._dom}get baseView(){return this._baseView}get mountState(){return this._mountState}get hidden(){return this.dom.hidden}set hidden(t){this.dom.hidden=t}ensureDom(){if(!this._dom){var t=this.createDom();this.domExprCreated(t)}}domExprCreated(t){var e=O(t,this._domctx);e instanceof p?(this._baseView=e,this._dom=e.dom):this._dom=e,this.postCreateDom(),this.updateDom()}createDom(){return document.createElement("div")}postCreateDom(){p.debugging&&this.dom.dataset&&(this.dom.dataset.webfx=t.MountState[this._mountState])}updateDom(){this._domctx.update()}mountStateChanged(e){if(e!=this._mountState){if(this._mountState=e,p.debugging&&!this._baseView&&this.domCreated&&this.dom.dataset&&(this.dom.dataset.webfx==t.MountState[e]&&console.trace("mountState on the DOM is changed by other view",e,this),this.dom.dataset.webfx=t.MountState[e]),this._baseView)this._baseView.mountStateChanged(e);else if(this._childViews)for(const t of this._childViews)t.mountStateChanged(e)}else console.trace("mountState unchanged",e,this)}getDomById(t){var e,n;return this.ensureDom(),null!==(n=null===(e=this._domctx.dict)||void 0===e?void 0:e[t])&&void 0!==n?n:null}updateWith(t){u(this,t),this.updateDom()}updateAllWith(t){u(this,t),this.updateAll()}toggleClass(t,e){H(this.dom,t,e)}getDOM(){return this.dom}addChild(t){const e=O(t,this._domctx);e instanceof p?this.appendView(e):this.dom.appendChild(e)}get onActive(){return this._onActive||(this._onActive=new v,this.dom.addEventListener("click",(t=>{this._onActive.invoke(t)})),this.dom.addEventListener("keydown",(t=>{this.handleKeyDown(t)}))),this._onActive}handleKeyDown(t){var e;if("Enter"===t.code){const n=this.dom.getBoundingClientRect();null===(e=this._onActive)||void 0===e||e.invoke(new MouseEvent("click",{clientX:n.x,clientY:n.y,relatedTarget:this.dom})),t.preventDefault()}}get childViews(){return this._baseView?this._baseView.childViews:(this._childViews||(this._childViews=[]),this._childViews)}appendView(t){this.addView(t)}addView(e,n){this._registerChild(e,n,!1),this._mountState==t.MountState.Mounted&&e.mountStateChanged(t.MountState.Mounting),this._insertToDom(e,n),this._mountState!=t.MountState.Unmounted&&e.mountStateChanged(this._mountState)}_registerChild(e,n,i=!0){const o=this.childViews;if(e.parentView)throw new Error("the view is already in a container view");if(e.parentView=this,void 0===n)e._position=o.length,o.push(e);else{o.splice(n,0,e);for(let t=n;t{n.addChild(P(t,e,n._domctx))}:i=>{var o;const s=P(i,e,t);s instanceof p?(n.appendChild(s.dom),null===(o=null==t?void 0:t.view)||void 0===o||o._registerChild(s)):x(n,s)}),n}addChild(t){null==this.child&&(this.child=[]),this.child.push(t)}}function P(t,e,n){if(e--<0)throw new Error("ran out of TTL");if(t instanceof p)return t;var i=S(t,n);if(i)return i;if(t instanceof F)return t.buildView(n,e);throw console.error("Unknown node type",t),new Error("Unknown node type")}function B(t,e,...n){if("string"==typeof t)return new F(t,e,n);{const i=(null==e?void 0:e.args)?new t(...e.args):new t;return new F(i,e,n)}}const z=B;function N(t){for(;t.lastChild;)t.removeChild(t.lastChild)}function H(t,e,n){var i=t.classList;return i.toggle?i.toggle(e,n):(void 0===n&&(n=!i.contains(e)),n?i.add(e):i.remove(e),n)}function U(t,e){const{className:n="fading-out",duration:i=500,remove:o=!0}=e||{};t.classList.add(n);var s=null,r=(e=!0)=>{r&&(r=null,t.removeEventListener("transitionend",a),t.classList.remove(n),o&&e&&t.remove(),e&&(null==s||s()))},a=function(t){t.eventPhase===Event.AT_TARGET&&(null==r||r())};return t.addEventListener("transitionend",a),setTimeout(r,i),{get finished(){return!r},onFinished(t){return r?s=t:t(),this},cancel(t=!1){null==r||r(t)}}}class j{constructor(t){this.callback=t,this.cancelFunc=void 0}timeout(t){this.tryCancel();var e=setTimeout(this.callback,t);this.cancelFunc=()=>window.clearTimeout(e)}interval(t){this.tryCancel();var e=setInterval(this.callback,t);this.cancelFunc=()=>window.clearInterval(e)}animationFrame(){this.tryCancel();var t=requestAnimationFrame(this.callback);this.cancelFunc=()=>cancelAnimationFrame(t)}tryCancel(){this.cancelFunc&&(this.cancelFunc(),this.cancelFunc=void 0)}}function R(t,e,n){var i=!1,o=function(t){if("track"===e({type:"mouse",ev:t,point:t,action:"down"})){var n=function(t){e({type:"mouse",ev:t,point:t,action:"move"})},i=function(t){document.removeEventListener("mousemove",n,!0),document.removeEventListener("mouseup",i,!0),e({type:"mouse",ev:t,point:t,action:"up"})};document.addEventListener("mousemove",n,!0),document.addEventListener("mouseup",i,!0)}},s=function(o){var s=o.changedTouches[0],r=e({type:"touch",touch:"start",ev:o,point:s,action:i?"move":"down"});if(!i&&"track"===r){i=!0;var a=function(t){var n=t.changedTouches[0];e({type:"touch",touch:"move",ev:t,point:n,action:"move"})},l=function(n){0===n.touches.length&&(i=!1,t.removeEventListener("touchmove",a),t.removeEventListener("touchend",l),t.removeEventListener("touchcancel",l));var o=n.changedTouches[0];e({type:"touch",touch:"end",ev:n,point:o,action:i?"move":"up"})};t.addEventListener("touchmove",a,n),t.addEventListener("touchend",l,n),t.addEventListener("touchcancel",l,n)}};return t.addEventListener("mousedown",o,n),t.addEventListener("touchstart",s,n),{remove:()=>{t.removeEventListener("mousedown",o,n),t.removeEventListener("touchstart",s,n)}}}function K(t,e,n){return t.addEventListener(e,n),{remove:()=>t.removeEventListener(e,n)}}function W(t,e,n){return e.forEach((e=>t.addEventListener(e,n))),{remove:()=>e.forEach((e=>t.removeEventListener(e,n)))}}function $(t,e){var n,i;(null!==(n=null==e?void 0:e.parent)&&void 0!==n?n:document.head).appendChild(M({tag:null!==(i=null==e?void 0:e.tag)&&void 0!==i?i:"style",text:t}))}class q{constructor(){this.data={},this.curLang="en",this.missing=new Map}get(t,e){return this.get2(t,e)||t}get2(t,e,n){n=n||this.curLang;var i=this.data[n];if(!i)return console.log("i18n missing lang: "+n),null;var o=i[t];if(!o)return this.missing.has(t)||(this.missing.set(t,1),console.log("i18n missing key: "+t)),null;if(e)for(const t in e)if(e.hasOwnProperty(t)){const n=e[t];o=o.replace("{"+t+"}",n)}return o}add2dArray(t){const e=[],n=t[0];for(const t of n)e.push(this.data[t]=this.data[t]||{});for(let n=1;n{for(const n of t.childNodes)if(n.nodeType===Node.TEXT_NODE){var e=this.get2(n.beforeI18n||n.textContent);e?(n.beforeI18n=n.beforeI18n||n.textContent,n.textContent=e):(n.beforeI18n&&(n.textContent=n.beforeI18n),console.log("missing key for node",n))}}))}static detectLanguage(t){var e=null,n=-1,i=[];return(navigator.languages||[navigator.language]).forEach((t=>{i.push(t),t.indexOf("-")>0&&i.push(t.substr(0,t.indexOf("-")))})),t.forEach((t=>{var o=i.indexOf(t);(!e||-1!==o&&o"number"==typeof t?o[t]:t))}}var G=new q;const J=Y(G);var Q=':root {\n --color-bg: white;\n --color-text: black;\n --color-text-gray: #666;\n --color-bg-selection: hsl(5, 100%, 85%);\n --color-primary: hsl(5, 100%, 67%);\n --color-primary-darker: hsl(5, 100%, 60%);\n --color-primary-dark: hsl(5, 100%, 40%);\n --color-primary-dark-depends: hsl(5, 100%, 40%);\n --color-primary-verydark: hsl(5, 100%, 20%);\n --color-primary-light: hsl(5, 100%, 83%);\n --color-primary-lighter: hsl(5, 100%, 70%);\n --color-fg-11: #111111;\n --color-fg-22: #222222;\n --color-fg-33: #333333;\n --color-bg-cc: #cccccc;\n --color-bg-dd: #dddddd;\n --color-bg-ee: #eeeeee;\n --color-bg-f8: #f8f8f8;\n --color-shadow: rgba(0, 0, 0, .5);\n}\n\n.no-selection {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n}\n\n/* listview item */\n\n.item {\n display: block;\n position: relative;\n padding: 10px;\n /* background: #ddd; */\n /* animation: showing .3s forwards; */\n text-decoration: none;\n line-height: 1.2;\n}\n\na.item {\n color: inherit;\n}\n\n.clickable, .item {\n cursor: pointer;\n transition: transform .3s;\n -webkit-tap-highlight-color: transparent;\n}\n\n.item:hover, .dragover {\n background: var(--color-bg-ee);\n}\n\n.keyboard-input .item:focus {\n outline-offset: -2px;\n}\n\n.dragover-placeholder {\n /* border-top: 2px solid gray; */\n position: relative;\n}\n\n.dragover-placeholder::before {\n content: "";\n display: block;\n position: absolute;\n transform: translate(0, -1px);\n height: 2px;\n width: 100%;\n background: gray;\n z-index: 100;\n pointer-events: none;\n}\n\n.clickable:active, .item:active {\n transition: transform .07s;\n transform: scale(.97);\n}\n\n.item:active {\n background: var(--color-bg-dd);\n}\n\n.item.no-transform:active {\n transform: none;\n}\n\n.item.active {\n background: var(--color-bg-dd);\n}\n\n.loading-indicator {\n position: relative;\n margin: .3em;\n margin-top: 3em;\n margin-bottom: 1em;\n text-align: center;\n white-space: pre-wrap;\n cursor: default;\n animation: loading-fadein .3s;\n}\n\n.loading-indicator-text {\n margin: 0 auto;\n}\n\n.loading-indicator.running .loading-indicator-inner {\n display: inline-block;\n position: relative;\n vertical-align: bottom;\n}\n\n.loading-indicator.running .loading-indicator-inner::after {\n content: "";\n height: 1px;\n margin: 0%;\n background: var(--color-text);\n display: block;\n animation: fadein .5s 1s backwards;\n}\n\n.loading-indicator.running .loading-indicator-text {\n margin: 0 .5em;\n animation: fadein .3s, loading-first .3s .5s cubic-bezier(0.55, 0.055, 0.675, 0.19) reverse, loading-second .3s .8s cubic-bezier(0.55, 0.055, 0.675, 0.19), loading .25s 1.1s cubic-bezier(0.55, 0.055, 0.675, 0.19) alternate-reverse infinite;\n}\n\n.loading-indicator.error {\n color: red;\n}\n\n.loading-indicator.fading-out {\n transition: max-height;\n animation: loading-fadein .3s reverse;\n}\n\n@keyframes loading-fadein {\n 0% {\n opacity: 0;\n max-height: 0;\n }\n 100% {\n opacity: 1;\n max-height: 200px;\n }\n}\n\n@keyframes fadein {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes loading-first {\n 0% {\n transform: translate(0, -2em) scale(1) rotate(360deg);\n }\n 100% {\n transform: translate(0, 0) scale(1) rotate(0deg);\n }\n}\n\n@keyframes loading-second {\n 0% {\n transform: translate(0, -2em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes loading {\n 0% {\n transform: translate(0, -1em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes showing {\n 0% {\n opacity: .3;\n transform: translate(-20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-top {\n 0% {\n opacity: .3;\n transform: translate(0, -20px)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-right {\n 0% {\n opacity: .3;\n transform: translate(20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n.overlay {\n background: rgba(0, 0, 0, .2);\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n animation: fadein .3s;\n z-index: 10001;\n overflow: hidden;\n contain: strict;\n will-change: transform;\n}\n\n.overlay.fixed {\n position: fixed;\n}\n\n.overlay.nobg {\n background: none;\n will-change: auto;\n}\n\n.overlay.centerChild {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.overlay.clickThrough {\n pointer-events: none;\n}\n\n.dialog * {\n box-sizing: border-box;\n}\n\n.dialog {\n font-size: 14px;\n position: relative;\n overflow: auto;\n background: var(--color-bg);\n border-radius: 5px;\n box-shadow: 0 0 12px var(--color-shadow);\n animation: dialogin .3s cubic-bezier(0,0,0,1);\n z-index: 10001;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n contain: content;\n will-change: transform;\n pointer-events: auto;\n}\n\n.dialog.resize {\n resize: both;\n}\n\n.fading-out .dialog {\n transition: transform .3s cubic-bezier(.5,0,1,1);\n transform: scale(.7);\n}\n\n.dialog-title, .dialog-content, .dialog-bottom {\n padding: 10px;\n}\n\n.dialog-title {\n background: var(--color-bg-ee);\n}\n\n.dialog-content {\n flex: 1;\n padding: 5px 10px;\n overflow: auto;\n}\n\n.dialog-content.flex {\n display: flex;\n flex-direction: column;\n}\n\n.dialog-bottom {\n padding: 5px 10px;\n}\n\n@keyframes dialogin {\n 0% {\n transform: scale(.5);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n.input-label {\n font-size: 80%;\n color: var(--color-text-gray);\n margin: 5px 0 3px 0;\n}\n\n.input-text {\n display: block;\n width: 100%;\n padding: 5px;\n border: solid 1px gray;\n background: var(--color-bg);\n color: var(--color-text);\n}\n\n.dialog .input-text {\n margin: 5px 0;\n}\n\ntextarea.input-text {\n resize: vertical;\n}\n\n.labeled-input {\n display: flex;\n flex-direction: column;\n}\n\n.labeled-input .input-text {\n flex: 1;\n}\n\n.labeled-input:focus-within .input-label {\n color: var(--color-primary-darker);\n}\n\n.input-text:focus {\n border-color: var(--color-primary-darker);\n}\n\n.input-text:active {\n border-color: var(--color-primary-dark);\n}\n\n.btn {\n display: block;\n text-align: center;\n transition: all .2s;\n padding: 0 .4em;\n min-width: 3em;\n line-height: 1.5em;\n background: var(--color-primary);\n color: white;\n text-shadow: 0 0 4px var(--color-primary-verydark);\n box-shadow: 0 0 3px var(--color-shadow);\n cursor: pointer;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n position: relative;\n overflow: hidden;\n}\n\n.btn:hover {\n transition: all .05s;\n background: var(--color-primary-darker);\n}\n\n.btn.btn-down, .btn:active {\n transition: all .05s;\n background: var(--color-primary-dark);\n box-shadow: 0 0 1px var(--color-shadow);\n}\n\n.btn.disabled {\n background: var(--color-primary-light);\n}\n\n.dialog .btn {\n margin: 10px 0;\n}\n\n.btn-big {\n padding: 5px;\n}\n\n.btn-inline {\n display: inline;\n}\n\n.textbtn {\n display: inline-block;\n color: var(--color-text-gray);\n margin: 0 5px;\n}\n\n.textbtn.active {\n color: var(--color-text);\n}\n\n*[hidden] {\n display: none !important;\n}\n\n.context-menu {\n position: absolute;\n overflow-y: auto;\n background: var(--color-bg);\n border: solid 1px #777;\n box-shadow: 0 0px 12px var(--color-shadow);\n min-width: 100px;\n max-width: 450px;\n outline: none;\n z-index: 10001;\n animation: context-menu-in .2s ease-out forwards;\n will-change: transform;\n}\n\n.context-menu .item.dangerous {\n transition: color .3s, background .3s;\n color: red;\n}\n\n.context-menu .item.dangerous:hover {\n transition: color .1s, background .1s;\n background: red;\n color: white;\n}\n\n@keyframes context-menu-in {\n 0% {\n transform: scale(.9);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n*.menu-shown {\n background: var(--color-bg-dd);\n}\n\n.menu-info {\n white-space: pre-wrap;\n color: var(--color-text-gray);\n padding: 5px 10px;\n /* animation: showing .3s; */\n cursor: default;\n}\n\n.toasts-container {\n position: fixed;\n bottom: 0;\n right: 0;\n padding: 5px;\n width: 300px;\n z-index: 10001;\n overflow: hidden;\n}\n\n.toast {\n margin: 5px;\n padding: 10px;\n border-radius: 5px;\n box-shadow: 0 0 10px var(--color-shadow);\n background: var(--color-bg);\n white-space: pre-wrap;\n animation: showing-right .3s;\n}\n\n.fading-out {\n transition: opacity .3s;\n opacity: 0;\n pointer-events: none;\n}\n\n.anchor-bottom {\n transform: translate(-50%, -100%);\n}\n\n.tooltip {\n position: absolute;\n background: var(--color-bg);\n box-shadow: 0 0 5px var(--color-shadow);\n border-radius: 5px;\n padding: .2em .25em;\n}\n';function Z(){return Q}let tt=!1;class et extends p{constructor(){super(...arguments),this._text="",this.textFunc=null}get text(){var t,e;return null!==(e=null===(t=this.dom)||void 0===t?void 0:t.textContent)&&void 0!==e?e:this._text}set text(t){"function"==typeof t?(this._text=t(),this.textFunc=t):(this._text=t,this.textFunc=null),this.domCreated&&(this.dom.textContent=this._text)}postCreateDom(){super.postCreateDom(),this._text&&(this.dom.textContent=this._text)}updateDom(){super.updateDom(),this.textFunc&&(this.dom.textContent=this.textFunc())}}class nt extends et{constructor(t){super(),this.clickable=!0,this.active=!1,this.right=!1,m(this,t)}createDom(){return{tag:"span.textbtn.no-selection"}}updateDom(){super.updateDom(),this.dom.tabIndex=this.clickable?0:-1,this.toggleClass("clickable",this.clickable),this.toggleClass("active",this.active),this.dom.style.float=this.right?"right":"left"}}const it=nt;function ot(t,e){let{x:n=0,y:i=0,anchor:o="bottom"}=e;t.style.left=n+"px",t.style.top=i+"px",t.classList.contains("anchor-"+o)||(t.classList.forEach((e=>{e.startsWith("anchor-")&&t.classList.remove(e)})),t.classList.add("anchor-"+o))}var st=new class{constructor(){this._currentItem=null,this._currentArray=null,this.onDragStart=new v,this.onDragEnd=new v}get currentItem(){var t,e,n;return null!==(n=null!==(t=this._currentItem)&&void 0!==t?t:null===(e=this._currentArray)||void 0===e?void 0:e[0])&&void 0!==n?n:null}get currentArray(){return this._currentItem?[this._currentItem]:this._currentArray}start(t){this._currentItem=t,console.log("drag start",t),this.onDragStart.invoke()}startArray(t){this._currentArray=t,console.log("drag start array",t),this.onDragStart.invoke()}end(){this._currentItem=null,this._currentArray=null,console.log("drag end"),this.onDragEnd.invoke()}};t.FlagsInput=void 0,function(t){t.FlagsInput=class extends k{constructor(t){super(),null==t||t.forEach((t=>{var n=t instanceof e?t:new e({text:Object.prototype.toString.call(t)});this.addView(n)}))}createDom(){return{tag:"div.flags-input"}}};class e extends et{get parentInput(){return this.parentView}constructor(t){super(),m(this,t)}createDom(){return{tag:"div.flags-input-item"}}}t.Flag=e}(t.FlagsInput||(t.FlagsInput={}));class rt extends p{createDom(){return{tag:"div.overlay"}}setCenterChild(t){return this.setFlags({centerChild:t})}setNoBg(t){return this.setFlags({nobg:t})}setFixed(t){return this.setFlags({fixed:t})}setFlags(t){for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&this.toggleClass(e,t[e]);return this}}var at=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{l(i.next(t))}catch(t){s(t)}}function a(t){try{l(i.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}l((i=i.apply(t,e||[])).next())}))};class lt extends p{get domheader(){return this.header.dom}static get defaultParent(){return lt._defaultParent||(lt._defaultParent=new dt),lt._defaultParent}static set defaultParent(t){lt._defaultParent=t}get width(){return this.dom.style.width}set width(t){this.dom.style.width=t}get contentFlex(){return this.content.dom.classList.contains("flex")}set contentFlex(t){this.content.toggleClass("flex",!!t)}get resizable(){return this.dom.classList.contains("resize")}set resizable(t){this.toggleClass("resize",!!t)}constructor(){super(),this.parent=lt.defaultParent,this.overlay=(new rt).setFlags({centerChild:!0,nobg:!0}),this.header=new p({tag:"div.dialog-title.clearfix"}),this.content=new p({tag:"div.dialog-content"}),this.shown=!1,this.btnTitle=new nt({active:!0,clickable:!1}),this.btnClose=new nt({text:J`Close`,right:!0}),this.title="Dialog",this.allowClose=!0,this.showCloseButton=!0,this.onShown=new v,this.onClose=new v,this.focusTrap=new p({tag:"div.focustrap",tabIndex:0}),this.btnClose.onActive.add((()=>this.allowClose&&this.close()))}createDom(){return{tag:"div.dialog",tabIndex:0,style:"width: 300px",child:[this.header,this.content,this.focusTrap]}}postCreateDom(){super.postCreateDom(),this.addBtn(this.btnTitle),this.addBtn(this.btnClose),this.overlay.appendView(this),this.overlay.dom.addEventListener("mousedown",(t=>{this.allowClose&&0===t.button&&t.target===this.overlay.dom&&(t.preventDefault(),this.close())})),this.overlay.dom.addEventListener("keydown",(t=>{if(this.allowClose&&27===t.keyCode)t.preventDefault(),this.close();else if(t.target===this.dom&&"Tab"===t.code&&t.shiftKey){t.preventDefault();let e=this.dom.querySelectorAll("a, [tabindex]");e.length>=2&&e[e.length-2].focus&&e[e.length-2].focus()}}));{let t;R(this.header.dom,(e=>{if("down"===e.action){if(e.ev.target!==this.header.dom&&e.ev.target!==this.btnTitle.dom)return;e.ev.preventDefault();const n=this.overlay.dom.getBoundingClientRect(),i=this.dom.getBoundingClientRect();return t={x:e.point.pageX-n.x-i.x,y:e.point.pageY-n.y-i.y},"track"}if("move"===e.action){e.ev.preventDefault();const n=this.overlay.dom.getBoundingClientRect(),i=r(e.point.pageX,n.left,n.right),o=r(e.point.pageY,n.top,n.bottom);this.setOffset(i-t.x,o-t.y)}}))}this.focusTrap.dom.addEventListener("focus",(t=>{this.dom.focus()}))}updateDom(){super.updateDom(),this.btnTitle.updateWith({text:this.title}),this.btnTitle.hidden=!this.title,this.btnClose.hidden=!(this.allowClose&&this.showCloseButton)}addBtn(t){this.ensureDom(),this.header.appendView(t)}addContent(t,e){this.ensureDom(),e&&this.content.removeAllView(),this.content.addChild(t)}addChild(t){this.addContent(t)}setOffset(t,e){this.dom.style.left=t?t+"px":"",this.dom.style.top=e?e+"px":"",this.overlay.setCenterChild(!1)}getOffset(){return{x:this.dom.style.left?parseFloat(this.dom.style.left):0,y:this.dom.style.top?parseFloat(this.dom.style.top):0}}center(){this.setOffset(0,0),this.overlay.setCenterChild(!0)}show(t){var e;this.shown||(this.shown=!0,null===(e=this._cancelFadeout)||void 0===e||e.call(this,!0),this.ensureDom(),this.parent.onDialogShowing(this),this.setTransformOrigin(t),this.dom.focus(),(this.autoFocus||this).dom.focus(),this.onShown.invoke())}setTransformOrigin(t){if(t){const e=this.dom.getBoundingClientRect();this.dom.style.transformOrigin=`${t.x-e.x}px ${t.y-e.y}px`}else this.dom.style.transformOrigin=""}close(){this.shown&&(this.shown=!1,this.setTransformOrigin(void 0),this.onClose.invoke(),this._cancelFadeout=U(this.overlay.dom).onFinished((()=>{var t;return null===(t=this.overlay.parentView)||void 0===t?void 0:t.removeView(this.overlay)})).cancel,lt.defaultParent.onDialogClosing(this))}waitClose(){return new Promise((t=>{var e=this.onClose.add((()=>{this.onClose.remove(e),t()}))}))}}lt._defaultParent=null;class dt{constructor(e=document.body){this.bgOverlay=new rt,this.dialogCount=0,this.fixed=!1,this._cancelFadeout=null,this.view=p.getView(e),e===document.body&&(this.fixed=!0,this.view.mountStateChanged(t.MountState.Mounted))}onDialogShowing(t){var e;0==this.dialogCount++&&(null===(e=this._cancelFadeout)||void 0===e||e.call(this,!0),this.bgOverlay.setFlags({fixed:this.fixed,clickThrough:!0}),this.view.appendView(this.bgOverlay)),t.overlay.setFlags({fixed:this.fixed}),this.view.appendView(t.overlay)}onDialogClosing(t){0==--this.dialogCount&&(this._cancelFadeout=U(this.bgOverlay.dom).onFinished((()=>this.view.removeView(this.bgOverlay))).cancel)}}class ht extends p{get value(){return this.dom.value}set value(t){this.dom.value=t}constructor(t){super(),this.multiline=!1,this.type="text",this.placeholder="",m(this,t)}createDom(){return this.multiline?{tag:"textarea.input-text"}:{tag:"input.input-text"}}updateDom(){super.updateDom(),this.dom instanceof HTMLInputElement&&(this.dom.type=this.type,this.dom.placeholder=this.placeholder)}}class ct extends p{get dominput(){return this.input.dom}constructor(t){super(),this.label="",m(this,t)}createDom(){return{tag:"div.labeled-input",child:[{tag:"div.input-label",text:()=>this.label},this.input]}}updateDom(){super.updateDom(),this.input.domCreated&&this.input.updateDom()}}class ut extends p{constructor(){super(...arguments),this.dragging=void 0,this._selected=!1,this.onSelectedChanged=new v,this.enterctr=0,this.dragoverPlaceholder=null}get listview(){return this.parentView instanceof mt?this.parentView:null}get selectionHelper(){var t;return null===(t=this.listview)||void 0===t?void 0:t.selectionHelper}get dragData(){return this.dom.textContent}get selected(){return this._selected}set selected(t){this._selected=t,this.domCreated&&this.updateDom(),this.onSelectedChanged.invoke()}remove(){this.listview&&this.listview.remove(this)}postCreateDom(){super.postCreateDom(),this.dom.setAttribute("role","listitem"),this.dom.addEventListener("click",(t=>{var e,n,i;(null===(e=this.listview)||void 0===e?void 0:e.selectionHelper.handleItemClicked(this,t))||null===(i=null===(n=this.listview)||void 0===n?void 0:n.onItemClicked)||void 0===i||i.call(n,this)})),this.dom.addEventListener("keydown",(t=>{var e,n,i,o,s,r;if("Enter"===t.code){if(t.altKey){const t=this.dom.getBoundingClientRect(),o=new MouseEvent("contextmenu",{clientX:t.left,clientY:t.top,relatedTarget:this.dom});null===(i=null!==(e=this.onContextMenu)&&void 0!==e?e:null===(n=this.listview)||void 0===n?void 0:n.onContextMenu)||void 0===i||i(this,o)}else{if(null===(o=this.listview)||void 0===o?void 0:o.selectionHelper.handleItemClicked(this,t))return;null===(r=null===(s=this.listview)||void 0===s?void 0:s.onItemClicked)||void 0===r||r.call(s,this)}t.preventDefault()}else if(!this.listview||"ArrowUp"!==t.code&&"ArrowDown"!==t.code)if(!this.listview||"PageUp"!==t.code&&"PageDown"!==t.code)!this.listview||"Home"!==t.code&&"End"!==t.code?this.listview&&this.listview.selectionHelper.handleItemKeyDown(this,t):(this.listview.get("Home"==t.code?0:this.listview.length-1).dom.focus(),t.preventDefault());else{const e="PageUp"===t.code?-1:1,n=this.listview.scrollBox,i=e>0?this.dom.offsetTop+n.offsetHeight:this.dom.offsetTop+this.dom.offsetHeight-n.offsetHeight,o=this.listview.length;let s=this;for(;e>0?i>s.dom.offsetTop+s.dom.offsetHeight:i=o)break;s=this.listview.get(t)}s&&s!==this&&(s.dom.focus(),t.preventDefault())}else{const e="ArrowUp"===t.code?-1:1,n=this.listview.get(this.position+e);n&&(n.dom.focus(),t.preventDefault())}})),this.dom.addEventListener("contextmenu",(t=>{var e,n,i;null===(i=null!==(e=this.onContextMenu)&&void 0!==e?e:null===(n=this.listview)||void 0===n?void 0:n.onContextMenu)||void 0===i||i(this,t)})),this.dom.addEventListener("dragstart",(t=>{var e,n;if(null!==(e=this.dragging)&&void 0!==e?e:null===(n=this.listview)||void 0===n?void 0:n.dragging){var i=[];this.selected&&this.selectionHelper?(i=[...this.selectionHelper.selectedItems]).sort(((t,e)=>t.position-e.position)):i=[this],st.startArray(i),t.dataTransfer.setData("text/plain",i.map((t=>t.dragData)).join("\r\n")),i.forEach((t=>t.dom.style.opacity=".5"))}else t.preventDefault()})),this.dom.addEventListener("dragend",(t=>{var e=st.currentArray;st.end(),t.preventDefault(),e.forEach((t=>t.dom.style.opacity=""))})),this.dom.addEventListener("dragover",(t=>{this.dragHandler(t,"dragover")})),this.dom.addEventListener("dragenter",(t=>{this.dragHandler(t,"dragenter")})),this.dom.addEventListener("dragleave",(t=>{this.dragHandler(t,"dragleave")})),this.dom.addEventListener("drop",(t=>{this.dragHandler(t,"drop")}))}dragHandler(t,e){var n,i,o,s,r,a,l,d;const h=st.currentItem;let c=st.currentArray;const u="drop"===e,m={source:h,target:this,sourceItems:c,event:t,drop:u,accept:!1};if(h instanceof ut&&(null===(n=this.listview)||void 0===n?void 0:n.moveByDragging)&&h.listview===this.listview){t.preventDefault();const e=c.indexOf(this)>=0,n=t.clientY-this.dom.getBoundingClientRect().top>this.dom.offsetHeight/2;if(e&&u||(m.accept=n?"move-after":"move"),u){if(-1===c.indexOf(this)){let t=this.position;n&&t++;for(const e of c)e!==this&&(t>e.position&&t--,this.listview.move(e,t),t++)}}else t.dataTransfer.dropEffect="move"}const v=null!==(i=this.onDragover)&&void 0!==i?i:null===(o=this.listview)||void 0===o?void 0:o.onDragover;!m.accept&&v&&(v(m),(u||m.accept)&&t.preventDefault());const g=null!==(s=this.onContextMenu)&&void 0!==s?s:null===(r=this.listview)||void 0===r?void 0:r.onContextMenu;if(!m.accept&&c&&c.indexOf(this)>=0&&g&&(u?g(this,t):t.preventDefault()),"dragenter"===e||"dragover"==e||"dragleave"===e||u){"dragenter"===e?this.enterctr++:"dragleave"===e?this.enterctr--:"drop"===e&&(this.enterctr=0);let t=this.enterctr>0;this.toggleClass("dragover",t);let n=t&&("move"===m.accept||"move-after"===m.accept)&&m.accept;if(n!=(null!==(l=null===(a=this.dragoverPlaceholder)||void 0===a?void 0:a[1])&&void 0!==l&&l)&&(null===(d=this.dragoverPlaceholder)||void 0===d||d[0].remove(),this.dragoverPlaceholder=null,n)){this.dragoverPlaceholder=[M({tag:"div.dragover-placeholder"}),n];var p=this.dom;"move-after"===m.accept&&(p=p.nextElementSibling),this.dom.parentElement.insertBefore(this.dragoverPlaceholder[0],p)}}}}class mt extends k{get scrollBox(){return this._scrollBox||this.dom}set scrollBox(t){this._scrollBox=t}constructor(t){super(t),this.onItemClicked=null,this.dragging=!1,this.moveByDragging=!1,this.selectionHelper=new vt,this._scrollBox=null,this.onItemMoved=null,this.onDragover=null,this.onContextMenu=null,this.selectionHelper.itemProvider=this}postCreateDom(){super.postCreateDom(),this.dom.setAttribute("role","list")}add(t,e){this.addView(t,e),this.dragging&&(t.dom.draggable=!0)}remove(t,e){t=this._ensureItem(t),!e&&t.selected&&this.selectionHelper.toggleItemSelection(t),this.removeView(t)}move(t,e){var n;t=this._ensureItem(t),this.remove(t,!0),this.add(t,e),null===(n=this.onItemMoved)||void 0===n||n.call(this,t,t.position)}removeAll(){for(;this.length;)this.remove(this.length-1)}clear(){this.removeAll(),N(this.dom)}ReplaceChild(t){this.clear(),this.dom.appendChild(t.getDOM())}}class vt{constructor(){this._enabled=!1,this.onEnabledChanged=new v,this.itemProvider=null,this.ctrlForceSelect=!1,this.selectedItems=[],this.onSelectedItemsChanged=new v,this.lastToggledItem=null}get enabled(){return this._enabled}set enabled(t){if(!!t!=!!this._enabled){for(this._enabled=t;this.selectedItems.length;)this.toggleItemSelection(this.selectedItems[0],!1);this.lastToggledItem=null,this.onEnabledChanged.invoke()}}get count(){return this.selectedItems.length}handleItemClicked(t,e){if(!this.enabled){if(!this.ctrlForceSelect||!e.ctrlKey)return!1;this.enabled=!0}if(e.shiftKey&&this.lastToggledItem&&this.itemProvider){var n=!!this.lastToggledItem.selected,i=t.position,o=this.lastToggledItem.position;i>o&&([i,o]=[o,i]);for(let t=i;t<=o;t++)this.toggleItemSelection(this.itemProvider.get(t),n);this.lastToggledItem=t}else this.toggleItemSelection(t);return e.preventDefault(),!0}handleItemKeyDown(t,e){if(!this.enabled)return!1;if(this.itemProvider&&e.ctrlKey&&"KeyA"===e.code){const t=this.itemProvider.length;for(let e=0;e{this.parentView instanceof ft&&(this.keepOpen||this.parentView.keepOpen||this.parentView.close())}))}updateDom(){super.updateDom(),this.dom.textContent=this.text,this.cls!==this._lastcls&&(this._lastcls&&this.dom.classList.remove(this._lastcls),this.cls&&this.dom.classList.add(this.cls))}}class ft extends mt{get visible(){return this._visible}constructor(t){super({tag:"div.context-menu",tabIndex:0}),this.keepOpen=!1,this.useOverlay=!0,this._visible=!1,this.overlay=null,this.onClose=new v,this._originalFocused=null,null==t||t.forEach((t=>this.add(t)))}postCreateDom(){super.postCreateDom(),this.dom.addEventListener("focusout",(t=>{!this.dom.contains(t.relatedTarget)&&this.close()})),this.dom.addEventListener("keydown",(t=>{"Escape"===t.code&&(t.preventDefault(),this.close())}))}show(t){this._visible?console.trace("[ContextMenu] show() called when it's already visible."):("ev"in t&&(t={x:t.ev.clientX,y:t.ev.clientY}),this._visible=!0,this.useOverlay?(this.overlay||(this.overlay=(new rt).setFixed(!0),this.overlay.dom.style.background="rgba(0, 0, 0, .1)",this.overlay.dom.addEventListener("mousedown",(t=>{t.eventPhase===Event.AT_TARGET&&(t.preventDefault(),this.close())}))),this.overlay.appendView(this),_(document.body,this.overlay)):_(document.body,this),this._originalFocused=document.activeElement,this.setPosition(t),this.dom.focus())}setPosition(t){if(this._visible){this.dom.style.left="0",this.dom.style.top="0";var e=document.body.offsetWidth,n=document.body.offsetHeight;if(this.useOverlay){const t=this.overlay.dom;e=t.offsetWidth,n=t.offsetHeight}this.dom.style.maxHeight=n+"px";var i=this.dom.offsetWidth,o=this.dom.offsetHeight,s=t.x,r=t.y;s+i>e&&(s-=i),r+o>n&&(r-=o),s<0&&(s=t.x>e/2?0:e-i),r<0&&(r=t.y>n/2?0:n-o),this.dom.style.left=s+"px",this.dom.style.top=r+"px",this.dom.style.transformOrigin=`${t.x-s}px ${t.y-r}px`}else console.trace("[ContextMenu] setPosition() called when it's not visible.")}close(){var t,e;this._visible&&(this._visible=!1,this.onClose.invoke(),null===(e=null===(t=this._originalFocused)||void 0===t?void 0:t.focus)||void 0===e||e.call(t),this._originalFocused=null,this.overlay&&U(this.overlay.dom).onFinished((()=>C(document.body,this.overlay))),U(this.dom).onFinished((()=>!this.overlay&&C(document.body,this))))}}class wt extends et{constructor(t){super(),m(this,t)}createDom(){return{tag:"div.section-action.clickable",tabIndex:0}}}class bt extends p{constructor(){super(...arguments),this.parentDom=null,this.toasts=[]}createDom(){return{tag:"div.toasts-container"}}addToast(t){0===this.toasts.length&&this.show(),this.toasts.push(t)}removeToast(t){this.toasts.remove(t),0===this.toasts.length&&this.remove()}show(){(this.parentDom||document.body).appendChild(this.dom)}remove(){this.dom.remove()}}bt.default=new bt;class xt extends p{constructor(t){super(),this.text="",this.shown=!1,this.timer=new j((()=>this.close())),m(this,t),this.container||(this.container=bt.default)}show(t){this.shown||(this.container.addToast(this),this.container.appendView(this),this.shown=!0),t?this.timer.timeout(t):this.timer.tryCancel()}close(){this.shown&&(this.shown=!1,U(this.dom).onFinished((()=>this.container.removeToast(this))))}createDom(){return{tag:"div.toast"}}updateDom(){super.updateDom(),this.dom.textContent=this.text}static show(t,e){var n=new xt({text:t});return n.show(e),n}}t.AutoResetEvent=class{constructor(){this._whenNotify=null,this._callback=null}wait(){return this._whenNotify||(this._whenNotify=new Promise((t=>{this._callback=()=>{this._callback=this._whenNotify=null,t()}}))),this._whenNotify}set(){this._callback&&this._callback()}},t.BuildDOMCtx=E,t.ButtonView=class extends et{constructor(t){super(),this.disabled=!1,this.type="normal",m(this,t),this.updateDom()}createDom(){return{tag:"div.btn",tabIndex:0}}updateDom(){super.updateDom(),this.toggleClass("disabled",this.disabled),this.toggleClass("btn-big","big"===this.type),this.toggleClass("btn-inline","inline"===this.type)}},t.Callbacks=v,t.CancelToken=class{constructor(){this.cancelled=!1,this.onCancelled=new v}cancel(){this.cancelled||(this.cancelled=!0,this.onCancelled.invoke())}throwIfCancelled(){if(this.cancelled)throw new Error("operation cancelled.")}},t.ContainerView=k,t.ContextMenu=ft,t.DataUpdatingHelper=class{update(t){const e=this.items;var n={};for(const e of t)n[this.dataSelectId(e)]=e;var i={},o=[];for(const t of e){const e=this.selectId(t);void 0!==n[e]?i[e]=t:o.push(t)}for(let t=o.length-1;t>=0;t--)this.removeItem(o[t]);var s=0;for(const e of t){const t=i[this.dataSelectId(e)];void 0!==t?this.updateItem(t,e):this.addItem(e,s),s++}}updateOrRebuildAll(t){this.update(t),this.isSame(t)||this.rebuildAll(t)}isSame(t){var e=this.items[Symbol.iterator]();for(const i of t){var n=e.next();if(n.done)return!1;if(this.selectId(n.value)!==this.dataSelectId(i))return!1}return!!e.next().done}rebuildAll(t){var e=this.items;if(e instanceof Array)for(let t=e.length-1;t>=0;t--)this.removeItem(e[t]);else for(const t of e)this.removeItem(t);let n=0;for(const e of t)this.addItem(e,n++)}selectId(t){return t.id}dataSelectId(t){return t.id}addItem(t,e){}updateItem(t,e){}removeItem(t){}},t.Dialog=lt,t.DialogParent=dt,t.EditableHelper=class{constructor(t){this.editing=!1,this.beforeEdit=null,this.onComplete=null,this.element=t}startEdit(t){if(!this.editing){this.editing=!0;var e=this.element,n=this.beforeEdit=e.textContent;H(e,"editing",!0);for(var i=M({tag:"input",type:"text",value:n});e.firstChild;)e.removeChild(e.firstChild);e.appendChild(i),i.select(),i.focus();var o=()=>{var n;this.editing=!1,H(e,"editing",!1),s.forEach((t=>t.remove())),i.remove(),null===(n=this.onComplete)||void 0===n||n.call(this,i.value),null==t||t(i.value)},s=[K(i,"keydown",(t=>{"Enter"===t.code&&(o(),t.preventDefault())})),K(i,"focusout",(t=>{o()}))]}}startEditAsync(){return new Promise((t=>this.startEdit(t)))}},t.EventRegistrations=class{constructor(){this.list=[]}add(t,e){return this.list.push({event:t,func:e}),t.add(e),e}removeAll(){for(;this.list.length;){var t=this.list.pop();t.event.remove(t.func)}}},t.I=J,t.I18n=q,t.InputStateTracker=class{constructor(t){this.dom=t,this.state={mouseDown:!1,mouseIn:!1,focusIn:!1},this._removeEvents=null,this._removePointerEvents=null,this.onChanged=new v,this._removeEvents=W(t,["mouseenter","mouseleave","focusin","focusout"],(t=>{switch(t.type){case"mouseenter":this.stateChanged("mouseIn",!0);break;case"mouseleave":this.stateChanged("mouseIn",!1);break;case"focusin":this.stateChanged("focusIn",!0);break;case"focusout":this.stateChanged("focusIn",!1)}})).remove,this._removePointerEvents=R(t,(t=>{if("down"==t.action)return this.stateChanged("mouseDown",!0),"track";"up"==t.action&&this.stateChanged("mouseDown",!1)})).remove}stateChanged(t,e){this.state[t]=e,this.onChanged.invoke(t)}removeListeners(){var t,e;null===(t=this._removeEvents)||void 0===t||t.call(this),null===(e=this._removePointerEvents)||void 0===e||e.call(this),this._removePointerEvents=this._removeEvents=null}},t.InputView=ht,t.ItemActiveHelper=class{constructor(t){this.funcSetActive=(t,e)=>t.toggleClass("active",e),this.current=null,m(this,t)}set(t){this.current!==t&&(this.current&&this.funcSetActive(this.current,!1),this.current=t,this.current&&this.funcSetActive(this.current,!0))}},t.JsxNode=F,t.LabeledInput=class extends ct{get value(){return this.dominput.value}set value(t){this.dominput.value=t}constructor(t){super(),m(this,t),this.input||(this.input=new ht)}updateDom(){this.input.type=this.type,super.updateDom()}},t.LabeledInputBase=ct,t.Lazy=class{constructor(t){this._func=t,this._value=void 0}get computed(){return!this._func}get rawValue(){return this._value}get value(){return this._func&&(this._value=this._func(),this._func=void 0),this._value}},t.LazyListView=class extends mt{constructor(){super(...arguments),this._loaded=0,this._lazy=!1,this._slowLoading=null,this._autoLoad=null}get loaded(){return this.loaded}get slowLoading(){return this._slowLoading}get autoLoad(){return this._autoLoad}get lazy(){return this._lazy}set lazy(t){this._lazy=t,t||this.ensureLoaded(this.length-1)}ensureLoaded(t){for(t>=this.length&&(t=this.length-1);this._loaded<=t;)this.dom.appendChild(this.items[this._loaded].dom),this._loaded++}loadNext(t=50){return this._loaded=this.length?Promise.resolve(!0):this._slowLoading=new Promise((n=>{var i,o,s=()=>{this._slowLoading&&this.loadNext(e)?o():(this.lazy=!!this._autoLoad,i(),n(!!this._slowLoading),this._slowLoading=null)};if(-1==t&&window.requestIdleCallback){let t;i=()=>window.cancelIdleCallback(t),(o=()=>{t=window.requestIdleCallback(s)})()}else{-1==t&&(t=30);let e=setInterval(s,t);i=()=>clearInterval(e),o=()=>{}}}))}enableAutoLoad(t=30,e=50){this._autoLoad={interval:t,batchSize:e},this.slowlyLoad(t,e)}stopLoading(){this._slowLoading=null,this._autoLoad=null}unload(){this.stopLoading();for(let t=this._loaded-1;t>=0;t--)this.items[t].dom.remove();this.lazy=!0,this._loaded=0}_insertToDom(t,e){!this.lazy||ethis.toggleClass(e,t===e)))}get content(){return this._text}set content(t){this._text=t,this.ensureDom(),this._textdom.textContent=t}reset(){this.state="running",this.content=J`Loading`,this.onclick=null}error(t,e){this.state="error",this.content=J`Oh no! Something just goes wrong:`+"\r\n"+t,e&&(this.content+="\r\n"+J`[Click here to retry]`),this.onclick=e}action(t){return gt(this,void 0,void 0,(function*(){try{yield t()}catch(e){this.error(e,(()=>this.action(t)))}}))}createDom(){return{tag:"div.loading-indicator",child:[{tag:"div.loading-indicator-inner",child:[{tag:"div.loading-indicator-text",_id:"text"}]}],onclick:t=>{var e;return null===(e=this.onclick)||void 0===e?void 0:e.call(this,t)}}}postCreateDom(){this._textdom=this.getDomById("text"),this.reset()}},t.MenuInfoItem=class extends pt{constructor(t){super(t),this.text="",this.keepOpen=!0,m(this,t)}createDom(){return{tag:"div.menu-info"}}updateDom(){super.updateDom(),this.dom.textContent=this.text}},t.MenuItem=pt,t.MenuLinkItem=class extends pt{constructor(t){super(t),this.link="",this.download="",m(this,t)}createDom(){var t=super.createDom();return t.tag="a.item.no-selection",t.target="_blank",t}updateDom(){super.updateDom(),this.dom.href=this.link,this.dom.download=this.download}},t.MessageBox=class extends lt{constructor(){super(...arguments),this.allowClose=!1,this.title="Message",this.result="none"}addResultBtns(t){for(const e of t)this.addBtnWithResult(new nt({text:G.get("msgbox_"+e),right:!0}),e);return this}setTitle(t){return this.title=t,this.domCreated&&this.updateDom(),this}addText(t){return this.addContent(new et({tag:"div.messagebox-text",text:t})),this}allowCloseWithResult(t,e){return this.result=t,this.allowClose=!0,this.showCloseButton=!!e,this.domCreated&&this.updateDom(),this}addBtnWithResult(t,e){return t.onActive.add((()=>{this.result=e,this.close()})),this.addBtn(t),this}showAndWaitResult(){return at(this,void 0,void 0,(function*(){return this.show(),yield this.waitClose(),this.result}))}},t.Overlay=rt,t.Ref=g,t.Section=class extends p{constructor(t){super(),this.titleView=new et({tag:"span.section-title"}),this.headerView=new p({tag:"div.section-header",child:[this.titleView]}),this.ensureDom(),t&&(t.title&&this.setTitle(t.title),t.content&&this.setContent(t.content),t.actions&&t.actions.forEach((t=>this.addAction(t))))}createDom(){return{tag:"div.section",child:[this.headerView]}}setTitle(t){this.titleView.removeAllView(),this.titleView.addChild(t)}setContent(t){this.content&&this.removeView(this.content),this.content=p.getView(t),this.appendView(this.content)}addAction(t){var e=t instanceof p?t:new wt({text:t.text,onActive:t.onclick});this.headerView.appendView(e)}},t.SectionAction=wt,t.SelectionHelper=vt,t.Semaphore=class{constructor(t){this.queue=new Array,this.maxCount=1,this.runningCount=0,m(this,t)}enter(){if(this.runningCount===this.maxCount){var t,e=new Promise((e=>{t=e}));return this.queue.push(t),e}return this.runningCount++,Promise.resolve()}exit(){this.runningCount===this.maxCount&&this.queue.length?window.queueMicrotask?window.queueMicrotask(this.queue.shift()):setTimeout(this.queue.shift(),0):this.runningCount--}run(t){return e(this,void 0,void 0,(function*(){yield this.enter();try{yield t()}finally{this.exit()}}))}},t.TabBtn=it,t.TextBtn=nt,t.TextCompositionWatcher=class{get isCompositing(){return this._isCompositing}set isCompositing(t){this._isCompositing=t,this.onCompositingChanged.invoke()}constructor(t){this.onCompositingChanged=new v,this._isCompositing=!1,this.dom=w(t),this.dom.addEventListener("compositionstart",(t=>{this.isCompositing=!0})),this.dom.addEventListener("compositionend",(t=>{this.isCompositing=!1}))}},t.TextView=et,t.Timer=j,t.Toast=xt,t.ToastsContainer=bt,t.ToolTip=class extends et{constructor(){super(...arguments),this._shown=!1,this._timer=new j((()=>this.close())),this._cancelClose=null}createDom(){return{tag:"div.tooltip"}}get shown(){return this._shown}show(t){var e;if(this.shown)return;this._shown=!0,null===(e=this._cancelClose)||void 0===e||e.call(this);let{parent:n=document.body,timeout:i}=t;i&&this._timer.timeout(i);const o=this.dom;ot(o,t),n.appendChild(o)}close(t){this.shown&&(this._timer.tryCancel(),this._shown=!1,this._cancelClose=U(this.dom,t).cancel)}},t.View=p,t.ViewToggle=class{constructor(t){this.shownKeys=[],this.toggleMode="remove",this.container=null,m(this,t),this.setShownKeys(this.shownKeys)}add(t,e){const n=this.items[t];n?n instanceof Array?this.items[t].push(e):this.items[t]=[n,e]:this.items[t]=e,this.toggleView(e,this.shownKeys.indexOf(t)>=0)}setShownKeys(t){this.shownKeys=t;const e=this.items;for(const n in e){const i=t.indexOf(n)>=0;if(Object.prototype.hasOwnProperty.call(e,n)){const t=e[n];if(t)if(t instanceof Array)for(const e of t)this.toggleView(e,i);else t&&this.toggleView(t,i)}}}toggleView(t,e,n){if(n||(n=this.toggleMode),"display"==n)t.dom.style.display=e?"":"none";else if("hidden"==n)t.dom.hidden=!e;else{if("remove"!=n)throw new Error("Unknown toggle mode");e!=!!t.parentView&&(e?this.container.appendView(t):this.container.removeView(t))}}},t.addChild=x,t.appendView=b,t.arrayFind=c,t.arrayForeach=d,t.arrayInsert=function(t,e,n){void 0===n?t.push(e):t.splice(n,0,e)},t.arrayMap=l,t.arrayRemove=a,t.arraySum=function(t,e){var n=0;return d(t,(t=>{var i=e(t);i&&(n+=i)})),n},t.base64EncodeUtf8=function(t){return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode("0x"+e)})))},t.buildDOM=M,t.buildView=O,t.clearChildren=N,t.createArrayBuilder=X,t.createName=function(t,e){for(let n=0;;n++){let i=t(n);if(!e(i))return i}},t.createStringBuilder=Y,t.dragManager=st,t.fadeout=U,t.foreachFlaten=h,t.formatDateTime=function(t){var e=new Date;return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()?t.toLocaleTimeString():t.toLocaleString()},t.formatDuration=function(t){if("number"!=typeof t||isNaN(t))return"--:--";t=Math.round(t);var e=Math.floor(t/60);return t%=60,o(e.toString(),2,"0")+":"+o(t.toString(),2,"0")},t.formatFileSize=function(t){if("number"!=typeof t||isNaN(t))return"NaN";for(var e=0;e=1024;)e++,t/=1024;return(e>0?t.toFixed(2):t)+" "+s[e]},t.getDOM=w,t.getWebfxCss=Z,t.i18n=G,t.injectCss=$,t.injectWebfxCss=function(t){tt||($(Z(),Object.assign(Object.assign({},t),{tag:"style.webfx-injected-style"})),tt=!0)},t.jsx=z,t.jsxBuild=function(t,e){return P(t,64,e||new E)},t.jsxFactory=B,t.listenEvent=K,t.listenEvents=W,t.listenPointerEvents=R,t.mod=function(t,e){return t<0&&(t=e+t),t%e},t.mountView=_,t.numLimit=r,t.objectApply=u,t.objectInit=m,t.readBlobAsDataUrl=function(t){return new Promise(((e,n)=>{var i=new FileReader;i.onload=t=>{e(i.result)},i.onerror=t=>n(),i.readAsDataURL(t)}))},t.replaceChild=function(t,e){N(t),e&&t.appendChild(e)},t.setPosition=ot,t.sleepAsync=function(t){return new Promise((e=>{setTimeout(e,t)}))},t.startBlockingDetect=function(t=20){var e=Date.now(),n=Date.now();setInterval((()=>{var i=Date.now();i-n>=t&&console.info(`[Blocking] ${(i-e)/1e3}s: blocked for ${i-n} ms`),n=i}),1)},t.strPadLeft=o,t.toggleClass=H,t.tryGetDOM=f,t.unmountView=C,t.version="1.10.3",Object.defineProperty(t,"__esModule",{value:!0})})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).webfx={})}(this,(function(t){"use strict";var e=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{l(i.next(t))}catch(t){s(t)}}function a(t){try{l(i.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}l((i=i.apply(t,e||[])).next())}))};const n=Object.assign,i=Object.prototype.hasOwnProperty;function o(t,e,n=" "){for(;t.lengthn?n:t}function a(t,e){for(let n=0;n=0)){const i=e[n];t[n]=i}}return t}function m(t,e,n){if(e)for(const o in e)if(i.call(e,o)&&(!n||n.indexOf(o)>=0)){const n=e[o];o.startsWith("on")&&t[o]instanceof v?t[o].add(n):t[o]=n}return t}Array.prototype.remove=function(t){a(this,t)};const v=class{constructor(){this._cbs=void 0,this._cbs_invoking=void 0,this._hook=void 0,this._invoking=!1}get onChanged(){var t;return null!==(t=this._hook)&&void 0!==t||(this._hook=new v),this._hook}get length(){return this._cbs?this._cbs.size:0}invoke(...t){var e;if(this._cbs){if(this._invoking)throw new Error("Cannot invoke callbacks during invocation");if(this._invoking=!0,this._cbs.forEach((e=>{try{e.apply(this,t)}catch(t){console.error("Error in callback",t)}})),this._cbs_invoking)for(const t of this._cbs_invoking)this._cbs.add(t);null===(e=this._cbs_invoking)||void 0===e||e.clear(),this._invoking=!1}}add(t){var e,n;return void 0===this._cbs&&(this._cbs=new Set),this._invoking?(null!==(e=this._cbs_invoking)&&void 0!==e||(this._cbs_invoking=new Set),this._cbs_invoking.add(t)):this._cbs.add(t),null===(n=this._hook)||void 0===n||n.invoke(!0,t),t}remove(t){var e,n;void 0!==this._cbs&&(this._invoking&&(null===(e=this._cbs_invoking)||void 0===e||e.delete(t)),this._cbs.delete(t),null===(n=this._hook)||void 0===n||n.invoke(!1,t))}waitOnce(t){if(0===arguments.length)return new Promise(((t,e)=>{const n=(...e)=>{this.remove(n),t(e)};this.add(n)}));if(!t)throw new Error("Invalid callback");{const e=(...n)=>(this.remove(e),t(...n));this.add(e)}}};let g=null;class f{constructor(t){this._value=void 0,this._onChanged=void 0,this._value=t}get onChanged(){return this._onChanged||(this._onChanged=new v),this._onChanged}get value(){return g&&g.add(this),this._value}set value(t){this._value=t,this._onChanged&&this.onChanged.invoke(this)}static from(t){const e=new f;return e._value=t,e}static computed(t){const e=new f;let n=null;const i=()=>{if(n)for(const t of n)t.onChanged.remove(i);g=new Set;const o=t();n=function(){const t=g;return g=null,t}();for(const t of n)t.onChanged.add(i);e.value=o};return i(),e}}class p{constructor(e){this.parentView=void 0,this._position=void 0,this._domctx=new V,this._dom=void 0,this._baseView=void 0,this._mountState=t.MountState.Unmounted,this._onActive=void 0,this._childViews=void 0,this._domctx.view=this,e&&this.domExprCreated(e)}static getView(t){return t instanceof p?t:new p(t)}get position(){return this._position}get dom(){return this.ensureDom(),this._dom}get domCreated(){return!!this._dom}get baseView(){return this._baseView}get mountState(){return this._mountState}get hidden(){return this.dom.hidden}set hidden(t){this.dom.hidden=t}ensureDom(){if(!this._dom){var t=this.createDom();this.domExprCreated(t)}}domExprCreated(t){var e=F(t,this._domctx);e instanceof p?(this._baseView=e,this._dom=e.dom):this._dom=e,this.postCreateDom(),this.updateDom()}createDom(){return document.createElement("div")}postCreateDom(){p.debugging&&this.dom.dataset&&(this.dom.dataset.webfx=t.MountState[this._mountState])}updateDom(){this._domctx.update()}mountStateChanged(e){if(e!=this._mountState){if(this._mountState=e,p.debugging&&!this._baseView&&this.domCreated&&this.dom.dataset&&(this.dom.dataset.webfx==t.MountState[e]&&console.trace("mountState on the DOM is changed by other view",e,this),this.dom.dataset.webfx=t.MountState[e]),this._baseView)this._baseView.mountStateChanged(e);else if(this._childViews)for(const t of this._childViews)t.mountStateChanged(e)}else console.trace("mountState unchanged",e,this)}getDomById(t){var e,n;return this.ensureDom(),null!==(n=null===(e=this._domctx.dict)||void 0===e?void 0:e[t])&&void 0!==n?n:null}updateWith(t){u(this,t),this.updateDom()}updateAllWith(t){u(this,t),this.updateAll()}toggleClass(t,e){U(this.dom,t,e)}getDOM(){return this.dom}addChild(t){const e=F(t,this._domctx);e instanceof p?this.appendView(e):this.dom.appendChild(e)}get onActive(){return this._onActive||(this._onActive=new v,this.dom.addEventListener("click",(t=>{this._onActive.invoke(t)})),this.dom.addEventListener("keydown",(t=>{this.handleKeyDown(t)}))),this._onActive}handleKeyDown(t){var e;if("Enter"===t.code){const n=this.dom.getBoundingClientRect();null===(e=this._onActive)||void 0===e||e.invoke(new MouseEvent("click",{clientX:n.x,clientY:n.y,relatedTarget:this.dom})),t.preventDefault()}}get childViews(){return this._baseView?this._baseView.childViews:(this._childViews||(this._childViews=[]),this._childViews)}appendView(t){this.addView(t)}addView(e,n){this._registerChild(e,n,!1),this._mountState==t.MountState.Mounted&&e.mountStateChanged(t.MountState.Mounting),this._insertToDom(e,n),this._mountState!=t.MountState.Unmounted&&e.mountStateChanged(this._mountState)}_registerChild(e,n,i=!0){const o=this.childViews;if(e.parentView)throw new Error("the view is already in a container view");if(e.parentView=this,void 0===n)e._position=o.length,o.push(e);else{o.splice(n,0,e);for(let t=n;t{n.addChild(B(t,e,n._domctx))}:i=>{var o;const s=B(i,e,t);s instanceof p?(n.appendChild(s.dom),null===(o=null==t?void 0:t.view)||void 0===o||o._registerChild(s)):y(n,s)}),n}addChild(t){null==this.child&&(this.child=[]),this.child.push(t)}}function B(t,e,n){if(e--<0)throw new Error("ran out of TTL");if(t instanceof p)return t;var i=T(t,n);if(i)return i;if(t instanceof P)return t.buildView(n,e);throw console.error("Unknown node type",t),new Error("Unknown node type")}function z(t,e,...n){if("string"==typeof t)return new P(t,e,n);{const i=(null==e?void 0:e.args)?new t(...e.args):new t;return new P(i,e,n)}}const N=z;function H(t){for(;t.lastChild;)t.removeChild(t.lastChild)}function U(t,e,n){var i=t.classList;return i.toggle?i.toggle(e,n):(void 0===n&&(n=!i.contains(e)),n?i.add(e):i.remove(e),n)}function j(t,e){const{className:n="fading-out",duration:i=500,remove:o=!0}=e||{};t.classList.add(n);var s=null,r=(e=!0)=>{r&&(r=null,t.removeEventListener("transitionend",a),t.classList.remove(n),o&&e&&t.remove(),e&&(null==s||s()))},a=function(t){t.eventPhase===Event.AT_TARGET&&(null==r||r())};return t.addEventListener("transitionend",a),setTimeout(r,i),{get finished(){return!r},onFinished(t){return r?s=t:t(),this},cancel(t=!1){null==r||r(t)}}}class R{constructor(t){this.callback=t,this.cancelFunc=void 0}timeout(t){this.tryCancel();var e=setTimeout(this.callback,t);this.cancelFunc=()=>window.clearTimeout(e)}interval(t){this.tryCancel();var e=setInterval(this.callback,t);this.cancelFunc=()=>window.clearInterval(e)}animationFrame(){this.tryCancel();var t=requestAnimationFrame(this.callback);this.cancelFunc=()=>cancelAnimationFrame(t)}tryCancel(){this.cancelFunc&&(this.cancelFunc(),this.cancelFunc=void 0)}}function K(t,e,n){var i=!1,o=function(t){if("track"===e({type:"mouse",ev:t,point:t,action:"down"})){var n=function(t){e({type:"mouse",ev:t,point:t,action:"move"})},i=function(t){document.removeEventListener("mousemove",n,!0),document.removeEventListener("mouseup",i,!0),e({type:"mouse",ev:t,point:t,action:"up"})};document.addEventListener("mousemove",n,!0),document.addEventListener("mouseup",i,!0)}},s=function(o){var s=o.changedTouches[0],r=e({type:"touch",touch:"start",ev:o,point:s,action:i?"move":"down"});if(!i&&"track"===r){i=!0;var a=function(t){var n=t.changedTouches[0];e({type:"touch",touch:"move",ev:t,point:n,action:"move"})},l=function(n){0===n.touches.length&&(i=!1,t.removeEventListener("touchmove",a),t.removeEventListener("touchend",l),t.removeEventListener("touchcancel",l));var o=n.changedTouches[0];e({type:"touch",touch:"end",ev:n,point:o,action:i?"move":"up"})};t.addEventListener("touchmove",a,n),t.addEventListener("touchend",l,n),t.addEventListener("touchcancel",l,n)}};return t.addEventListener("mousedown",o,n),t.addEventListener("touchstart",s,n),{remove:()=>{t.removeEventListener("mousedown",o,n),t.removeEventListener("touchstart",s,n)}}}function W(t,e,n){return t.addEventListener(e,n),{remove:()=>t.removeEventListener(e,n)}}function $(t,e,n){return e.forEach((e=>t.addEventListener(e,n))),{remove:()=>e.forEach((e=>t.removeEventListener(e,n)))}}function q(t,e){var n,i;(null!==(n=null==e?void 0:e.parent)&&void 0!==n?n:document.head).appendChild(O({tag:null!==(i=null==e?void 0:e.tag)&&void 0!==i?i:"style",text:t}))}class Y{constructor(){this.data={},this.curLang="en",this.missing=new Map}get(t,e){return this.get2(t,e)||t}get2(t,e,n){n=n||this.curLang;var i=this.data[n];if(!i)return console.log("i18n missing lang: "+n),null;var o=i[t];if(!o)return this.missing.has(t)||(this.missing.set(t,1),console.log("i18n missing key: "+t)),null;if(e)for(const t in e)if(e.hasOwnProperty(t)){const n=e[t];o=o.replace("{"+t+"}",n)}return o}add2dArray(t){const e=[],n=t[0];for(const t of n)e.push(this.data[t]=this.data[t]||{});for(let n=1;n{for(const n of t.childNodes)if(n.nodeType===Node.TEXT_NODE){var e=this.get2(n.beforeI18n||n.textContent);e?(n.beforeI18n=n.beforeI18n||n.textContent,n.textContent=e):(n.beforeI18n&&(n.textContent=n.beforeI18n),console.log("missing key for node",n))}}))}static detectLanguage(t){var e=null,n=-1,i=[];return(navigator.languages||[navigator.language]).forEach((t=>{i.push(t),t.indexOf("-")>0&&i.push(t.substr(0,t.indexOf("-")))})),t.forEach((t=>{var o=i.indexOf(t);(!e||-1!==o&&o"number"==typeof t?o[t]:t))}}var J=new Y;const Q=X(J);var Z=':root {\n --color-bg: white;\n --color-text: black;\n --color-text-gray: #666;\n --color-bg-selection: hsl(5, 100%, 85%);\n --color-primary: hsl(5, 100%, 67%);\n --color-primary-darker: hsl(5, 100%, 60%);\n --color-primary-dark: hsl(5, 100%, 40%);\n --color-primary-dark-depends: hsl(5, 100%, 40%);\n --color-primary-verydark: hsl(5, 100%, 20%);\n --color-primary-light: hsl(5, 100%, 83%);\n --color-primary-lighter: hsl(5, 100%, 70%);\n --color-fg-11: #111111;\n --color-fg-22: #222222;\n --color-fg-33: #333333;\n --color-bg-cc: #cccccc;\n --color-bg-dd: #dddddd;\n --color-bg-ee: #eeeeee;\n --color-bg-f8: #f8f8f8;\n --color-shadow: rgba(0, 0, 0, .5);\n}\n\n.no-selection {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n}\n\n/* listview item */\n\n.item {\n display: block;\n position: relative;\n padding: 10px;\n /* background: #ddd; */\n /* animation: showing .3s forwards; */\n text-decoration: none;\n line-height: 1.2;\n}\n\na.item {\n color: inherit;\n}\n\n.clickable, .item {\n cursor: pointer;\n transition: transform .3s;\n -webkit-tap-highlight-color: transparent;\n}\n\n.item:hover, .dragover {\n background: var(--color-bg-ee);\n}\n\n.keyboard-input .item:focus {\n outline-offset: -2px;\n}\n\n.dragover-placeholder {\n /* border-top: 2px solid gray; */\n position: relative;\n}\n\n.dragover-placeholder::before {\n content: "";\n display: block;\n position: absolute;\n transform: translate(0, -1px);\n height: 2px;\n width: 100%;\n background: gray;\n z-index: 100;\n pointer-events: none;\n}\n\n.clickable:active, .item:active {\n transition: transform .07s;\n transform: scale(.97);\n}\n\n.item:active {\n background: var(--color-bg-dd);\n}\n\n.item.no-transform:active {\n transform: none;\n}\n\n.item.active {\n background: var(--color-bg-dd);\n}\n\n.loading-indicator {\n position: relative;\n margin: .3em;\n margin-top: 3em;\n margin-bottom: 1em;\n text-align: center;\n white-space: pre-wrap;\n cursor: default;\n animation: loading-fadein .3s;\n}\n\n.loading-indicator-text {\n margin: 0 auto;\n}\n\n.loading-indicator.running .loading-indicator-inner {\n display: inline-block;\n position: relative;\n vertical-align: bottom;\n}\n\n.loading-indicator.running .loading-indicator-inner::after {\n content: "";\n height: 1px;\n margin: 0%;\n background: var(--color-text);\n display: block;\n animation: fadein .5s 1s backwards;\n}\n\n.loading-indicator.running .loading-indicator-text {\n margin: 0 .5em;\n animation: fadein .3s, loading-first .3s .5s cubic-bezier(0.55, 0.055, 0.675, 0.19) reverse, loading-second .3s .8s cubic-bezier(0.55, 0.055, 0.675, 0.19), loading .25s 1.1s cubic-bezier(0.55, 0.055, 0.675, 0.19) alternate-reverse infinite;\n}\n\n.loading-indicator.error {\n color: red;\n}\n\n.loading-indicator.fading-out {\n transition: max-height;\n animation: loading-fadein .3s reverse;\n}\n\n@keyframes loading-fadein {\n 0% {\n opacity: 0;\n max-height: 0;\n }\n 100% {\n opacity: 1;\n max-height: 200px;\n }\n}\n\n@keyframes fadein {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes loading-first {\n 0% {\n transform: translate(0, -2em) scale(1) rotate(360deg);\n }\n 100% {\n transform: translate(0, 0) scale(1) rotate(0deg);\n }\n}\n\n@keyframes loading-second {\n 0% {\n transform: translate(0, -2em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes loading {\n 0% {\n transform: translate(0, -1em);\n }\n 100% {\n transform: translate(0, 0);\n }\n}\n\n@keyframes showing {\n 0% {\n opacity: .3;\n transform: translate(-20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-top {\n 0% {\n opacity: .3;\n transform: translate(0, -20px)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n@keyframes showing-right {\n 0% {\n opacity: .3;\n transform: translate(20px, 0)\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0)\n }\n}\n\n.overlay {\n background: rgba(0, 0, 0, .2);\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n animation: fadein .3s;\n z-index: 10001;\n overflow: hidden;\n contain: strict;\n will-change: transform;\n}\n\n.overlay.fixed {\n position: fixed;\n}\n\n.overlay.nobg {\n background: none;\n will-change: auto;\n}\n\n.overlay.centerChild {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.overlay.clickThrough {\n pointer-events: none;\n}\n\n.dialog * {\n box-sizing: border-box;\n}\n\n.dialog {\n font-size: 14px;\n position: relative;\n overflow: auto;\n background: var(--color-bg);\n border-radius: 5px;\n box-shadow: 0 0 12px var(--color-shadow);\n animation: dialogin .3s cubic-bezier(0,0,0,1);\n z-index: 10001;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n contain: content;\n will-change: transform;\n pointer-events: auto;\n}\n\n.dialog.resize {\n resize: both;\n}\n\n.fading-out .dialog {\n transition: transform .3s cubic-bezier(.5,0,1,1);\n transform: scale(.7);\n}\n\n.dialog-title, .dialog-content, .dialog-bottom {\n padding: 10px;\n}\n\n.dialog-title {\n background: var(--color-bg-ee);\n}\n\n.dialog-content {\n flex: 1;\n padding: 5px 10px;\n overflow: auto;\n}\n\n.dialog-content.flex {\n display: flex;\n flex-direction: column;\n}\n\n.dialog-bottom {\n padding: 5px 10px;\n}\n\n@keyframes dialogin {\n 0% {\n transform: scale(.5);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n.input-label {\n font-size: 80%;\n color: var(--color-text-gray);\n margin: 5px 0 3px 0;\n}\n\n.input-text {\n display: block;\n width: 100%;\n padding: 5px;\n border: solid 1px gray;\n background: var(--color-bg);\n color: var(--color-text);\n}\n\n.dialog .input-text {\n margin: 5px 0;\n}\n\ntextarea.input-text {\n resize: vertical;\n}\n\n.labeled-input {\n display: flex;\n flex-direction: column;\n}\n\n.labeled-input .input-text {\n flex: 1;\n}\n\n.labeled-input:focus-within .input-label {\n color: var(--color-primary-darker);\n}\n\n.input-text:focus {\n border-color: var(--color-primary-darker);\n}\n\n.input-text:active {\n border-color: var(--color-primary-dark);\n}\n\n.btn {\n display: block;\n text-align: center;\n transition: all .2s;\n padding: 0 .4em;\n min-width: 3em;\n line-height: 1.5em;\n background: var(--color-primary);\n color: white;\n text-shadow: 0 0 4px var(--color-primary-verydark);\n box-shadow: 0 0 3px var(--color-shadow);\n cursor: pointer;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n position: relative;\n overflow: hidden;\n}\n\n.btn:hover {\n transition: all .05s;\n background: var(--color-primary-darker);\n}\n\n.btn.btn-down, .btn:active {\n transition: all .05s;\n background: var(--color-primary-dark);\n box-shadow: 0 0 1px var(--color-shadow);\n}\n\n.btn.disabled {\n background: var(--color-primary-light);\n}\n\n.dialog .btn {\n margin: 10px 0;\n}\n\n.btn-big {\n padding: 5px;\n}\n\n.btn-inline {\n display: inline;\n}\n\n.textbtn {\n display: inline-block;\n color: var(--color-text-gray);\n margin: 0 5px;\n}\n\n.textbtn.active {\n color: var(--color-text);\n}\n\n*[hidden] {\n display: none !important;\n}\n\n.context-menu {\n position: absolute;\n overflow-y: auto;\n background: var(--color-bg);\n border: solid 1px #777;\n box-shadow: 0 0px 12px var(--color-shadow);\n min-width: 100px;\n max-width: 450px;\n outline: none;\n z-index: 10001;\n animation: context-menu-in .2s ease-out forwards;\n will-change: transform;\n}\n\n.context-menu .item.dangerous {\n transition: color .3s, background .3s;\n color: red;\n}\n\n.context-menu .item.dangerous:hover {\n transition: color .1s, background .1s;\n background: red;\n color: white;\n}\n\n@keyframes context-menu-in {\n 0% {\n transform: scale(.9);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n*.menu-shown {\n background: var(--color-bg-dd);\n}\n\n.menu-info {\n white-space: pre-wrap;\n color: var(--color-text-gray);\n padding: 5px 10px;\n /* animation: showing .3s; */\n cursor: default;\n}\n\n.toasts-container {\n position: fixed;\n bottom: 0;\n right: 0;\n padding: 5px;\n width: 300px;\n z-index: 10001;\n overflow: hidden;\n}\n\n.toast {\n margin: 5px;\n padding: 10px;\n border-radius: 5px;\n box-shadow: 0 0 10px var(--color-shadow);\n background: var(--color-bg);\n white-space: pre-wrap;\n animation: showing-right .3s;\n}\n\n.fading-out {\n transition: opacity .3s;\n opacity: 0;\n pointer-events: none;\n}\n\n.anchor-bottom {\n transform: translate(-50%, -100%);\n}\n\n.tooltip {\n position: absolute;\n background: var(--color-bg);\n box-shadow: 0 0 5px var(--color-shadow);\n border-radius: 5px;\n padding: .2em .25em;\n}\n';function tt(){return Z}let et=!1;class nt extends p{constructor(){super(...arguments),this._text="",this.textFunc=null}get text(){var t,e;return null!==(e=null===(t=this.dom)||void 0===t?void 0:t.textContent)&&void 0!==e?e:this._text}set text(t){"function"==typeof t?(this._text=t(),this.textFunc=t):(this._text=t,this.textFunc=null),this.domCreated&&(this.dom.textContent=this._text)}postCreateDom(){super.postCreateDom(),this._text&&(this.dom.textContent=this._text)}updateDom(){super.updateDom(),this.textFunc&&(this.dom.textContent=this.textFunc())}}class it extends nt{constructor(t){super(),this.clickable=!0,this.active=!1,this.right=!1,m(this,t)}createDom(){return{tag:"span.textbtn.no-selection"}}updateDom(){super.updateDom(),this.dom.tabIndex=this.clickable?0:-1,this.toggleClass("clickable",this.clickable),this.toggleClass("active",this.active),this.dom.style.float=this.right?"right":"left"}}const ot=it;function st(t,e){let{x:n=0,y:i=0,anchor:o="bottom"}=e;t.style.left=n+"px",t.style.top=i+"px",t.classList.contains("anchor-"+o)||(t.classList.forEach((e=>{e.startsWith("anchor-")&&t.classList.remove(e)})),t.classList.add("anchor-"+o))}var rt=new class{constructor(){this._currentItem=null,this._currentArray=null,this.onDragStart=new v,this.onDragEnd=new v}get currentItem(){var t,e,n;return null!==(n=null!==(t=this._currentItem)&&void 0!==t?t:null===(e=this._currentArray)||void 0===e?void 0:e[0])&&void 0!==n?n:null}get currentArray(){return this._currentItem?[this._currentItem]:this._currentArray}start(t){this._currentItem=t,console.log("drag start",t),this.onDragStart.invoke()}startArray(t){this._currentArray=t,console.log("drag start array",t),this.onDragStart.invoke()}end(){this._currentItem=null,this._currentArray=null,console.log("drag end"),this.onDragEnd.invoke()}};t.FlagsInput=void 0,function(t){t.FlagsInput=class extends D{constructor(t){super(),null==t||t.forEach((t=>{var n=t instanceof e?t:new e({text:Object.prototype.toString.call(t)});this.addView(n)}))}createDom(){return{tag:"div.flags-input"}}};class e extends nt{get parentInput(){return this.parentView}constructor(t){super(),m(this,t)}createDom(){return{tag:"div.flags-input-item"}}}t.Flag=e}(t.FlagsInput||(t.FlagsInput={}));class at extends p{createDom(){return{tag:"div.overlay"}}setCenterChild(t){return this.setFlags({centerChild:t})}setNoBg(t){return this.setFlags({nobg:t})}setFixed(t){return this.setFlags({fixed:t})}setFlags(t){for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&this.toggleClass(e,t[e]);return this}}var lt=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{l(i.next(t))}catch(t){s(t)}}function a(t){try{l(i.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}l((i=i.apply(t,e||[])).next())}))};class dt extends p{get domheader(){return this.header.dom}static get defaultParent(){return dt._defaultParent||(dt._defaultParent=new ht),dt._defaultParent}static set defaultParent(t){dt._defaultParent=t}get width(){return this.dom.style.width}set width(t){this.dom.style.width=t}get contentFlex(){return this.content.dom.classList.contains("flex")}set contentFlex(t){this.content.toggleClass("flex",!!t)}get resizable(){return this.dom.classList.contains("resize")}set resizable(t){this.toggleClass("resize",!!t)}constructor(){super(),this.parent=dt.defaultParent,this.overlay=(new at).setFlags({centerChild:!0,nobg:!0}),this.header=new p({tag:"div.dialog-title.clearfix"}),this.content=new p({tag:"div.dialog-content"}),this.shown=!1,this.btnTitle=new it({active:!0,clickable:!1}),this.btnClose=new it({text:Q`Close`,right:!0}),this.title="Dialog",this.allowClose=!0,this.showCloseButton=!0,this.onShown=new v,this.onClose=new v,this.focusTrap=new p({tag:"div.focustrap",tabIndex:0}),this.btnClose.onActive.add((()=>this.allowClose&&this.close()))}createDom(){return{tag:"div.dialog",tabIndex:0,style:"width: 300px",child:[this.header,this.content,this.focusTrap]}}postCreateDom(){super.postCreateDom(),this.addBtn(this.btnTitle),this.addBtn(this.btnClose),this.overlay.appendView(this),this.overlay.dom.addEventListener("mousedown",(t=>{this.allowClose&&0===t.button&&t.target===this.overlay.dom&&(t.preventDefault(),this.close())})),this.overlay.dom.addEventListener("keydown",(t=>{if(this.allowClose&&27===t.keyCode)t.preventDefault(),this.close();else if(t.target===this.dom&&"Tab"===t.code&&t.shiftKey){t.preventDefault();let e=this.dom.querySelectorAll("a, [tabindex]");e.length>=2&&e[e.length-2].focus&&e[e.length-2].focus()}}));{let t;K(this.header.dom,(e=>{if("down"===e.action){if(e.ev.target!==this.header.dom&&e.ev.target!==this.btnTitle.dom)return;e.ev.preventDefault();const n=this.overlay.dom.getBoundingClientRect(),i=this.dom.getBoundingClientRect();return t={x:e.point.pageX-n.x-i.x,y:e.point.pageY-n.y-i.y},"track"}if("move"===e.action){e.ev.preventDefault();const n=this.overlay.dom.getBoundingClientRect(),i=r(e.point.pageX,n.left,n.right),o=r(e.point.pageY,n.top,n.bottom);this.setOffset(i-t.x,o-t.y)}}))}this.focusTrap.dom.addEventListener("focus",(t=>{this.dom.focus()}))}updateDom(){super.updateDom(),this.btnTitle.updateWith({text:this.title}),this.btnTitle.hidden=!this.title,this.btnClose.hidden=!(this.allowClose&&this.showCloseButton)}addBtn(t){this.ensureDom(),this.header.appendView(t)}addContent(t,e){this.ensureDom(),e&&this.content.removeAllView(),this.content.addChild(t)}addChild(t){this.addContent(t)}setOffset(t,e){this.dom.style.left=t?t+"px":"",this.dom.style.top=e?e+"px":"",this.overlay.setCenterChild(!1)}getOffset(){return{x:this.dom.style.left?parseFloat(this.dom.style.left):0,y:this.dom.style.top?parseFloat(this.dom.style.top):0}}center(){this.setOffset(0,0),this.overlay.setCenterChild(!0)}show(t){var e;this.shown||(this.shown=!0,null===(e=this._cancelFadeout)||void 0===e||e.call(this,!0),this.ensureDom(),this.parent.onDialogShowing(this),this.setTransformOrigin(t),this.dom.focus(),(this.autoFocus||this).dom.focus(),this.onShown.invoke())}setTransformOrigin(t){if(t){const e=this.dom.getBoundingClientRect();this.dom.style.transformOrigin=`${t.x-e.x}px ${t.y-e.y}px`}else this.dom.style.transformOrigin=""}close(){this.shown&&(this.shown=!1,this.setTransformOrigin(void 0),this.onClose.invoke(),this._cancelFadeout=j(this.overlay.dom).onFinished((()=>{var t;return null===(t=this.overlay.parentView)||void 0===t?void 0:t.removeView(this.overlay)})).cancel,dt.defaultParent.onDialogClosing(this))}waitClose(){return new Promise((t=>{var e=this.onClose.add((()=>{this.onClose.remove(e),t()}))}))}}dt._defaultParent=null;class ht{constructor(e=document.body){this.bgOverlay=new at,this.dialogCount=0,this.fixed=!1,this._cancelFadeout=null,this.view=p.getView(e),e===document.body&&(this.fixed=!0,this.view.mountStateChanged(t.MountState.Mounted))}onDialogShowing(t){var e;0==this.dialogCount++&&(null===(e=this._cancelFadeout)||void 0===e||e.call(this,!0),this.bgOverlay.setFlags({fixed:this.fixed,clickThrough:!0}),this.view.appendView(this.bgOverlay)),t.overlay.setFlags({fixed:this.fixed}),this.view.appendView(t.overlay)}onDialogClosing(t){0==--this.dialogCount&&(this._cancelFadeout=j(this.bgOverlay.dom).onFinished((()=>this.view.removeView(this.bgOverlay))).cancel)}}class ct extends p{get value(){return this.dom.value}set value(t){this.dom.value=t}constructor(t){super(),this.multiline=!1,this.type="text",this.placeholder="",m(this,t)}createDom(){return this.multiline?{tag:"textarea.input-text"}:{tag:"input.input-text"}}updateDom(){super.updateDom(),this.dom instanceof HTMLInputElement&&(this.dom.type=this.type,this.dom.placeholder=this.placeholder)}}class ut extends p{get dominput(){return this.input.dom}constructor(t){super(),this.label="",m(this,t)}createDom(){return{tag:"div.labeled-input",child:[{tag:"div.input-label",text:()=>this.label},this.input]}}updateDom(){super.updateDom(),this.input.domCreated&&this.input.updateDom()}}class mt extends p{constructor(){super(...arguments),this.dragging=void 0,this._selected=!1,this.onSelectedChanged=new v,this.enterctr=0,this.dragoverPlaceholder=null}get listview(){return this.parentView instanceof vt?this.parentView:null}get selectionHelper(){var t;return null===(t=this.listview)||void 0===t?void 0:t.selectionHelper}get dragData(){return this.dom.textContent}get selected(){return this._selected}set selected(t){this._selected=t,this.domCreated&&this.updateDom(),this.onSelectedChanged.invoke()}remove(){this.listview&&this.listview.remove(this)}postCreateDom(){super.postCreateDom(),this.dom.setAttribute("role","listitem"),this.dom.addEventListener("click",(t=>{var e,n,i;(null===(e=this.listview)||void 0===e?void 0:e.selectionHelper.handleItemClicked(this,t))||null===(i=null===(n=this.listview)||void 0===n?void 0:n.onItemClicked)||void 0===i||i.call(n,this)})),this.dom.addEventListener("keydown",(t=>{var e,n,i,o,s,r;if("Enter"===t.code){if(t.altKey){const t=this.dom.getBoundingClientRect(),o=new MouseEvent("contextmenu",{clientX:t.left,clientY:t.top,relatedTarget:this.dom});null===(i=null!==(e=this.onContextMenu)&&void 0!==e?e:null===(n=this.listview)||void 0===n?void 0:n.onContextMenu)||void 0===i||i(this,o)}else{if(null===(o=this.listview)||void 0===o?void 0:o.selectionHelper.handleItemClicked(this,t))return;null===(r=null===(s=this.listview)||void 0===s?void 0:s.onItemClicked)||void 0===r||r.call(s,this)}t.preventDefault()}else if(!this.listview||"ArrowUp"!==t.code&&"ArrowDown"!==t.code)if(!this.listview||"PageUp"!==t.code&&"PageDown"!==t.code)!this.listview||"Home"!==t.code&&"End"!==t.code?this.listview&&this.listview.selectionHelper.handleItemKeyDown(this,t):(this.listview.get("Home"==t.code?0:this.listview.length-1).dom.focus(),t.preventDefault());else{const e="PageUp"===t.code?-1:1,n=this.listview.scrollBox,i=e>0?this.dom.offsetTop+n.offsetHeight:this.dom.offsetTop+this.dom.offsetHeight-n.offsetHeight,o=this.listview.length;let s=this;for(;e>0?i>s.dom.offsetTop+s.dom.offsetHeight:i=o)break;s=this.listview.get(t)}s&&s!==this&&(s.dom.focus(),t.preventDefault())}else{const e="ArrowUp"===t.code?-1:1,n=this.listview.get(this.position+e);n&&(n.dom.focus(),t.preventDefault())}})),this.dom.addEventListener("contextmenu",(t=>{var e,n,i;null===(i=null!==(e=this.onContextMenu)&&void 0!==e?e:null===(n=this.listview)||void 0===n?void 0:n.onContextMenu)||void 0===i||i(this,t)})),this.dom.addEventListener("dragstart",(t=>{var e,n;if(null!==(e=this.dragging)&&void 0!==e?e:null===(n=this.listview)||void 0===n?void 0:n.dragging){var i=[];this.selected&&this.selectionHelper?(i=[...this.selectionHelper.selectedItems]).sort(((t,e)=>t.position-e.position)):i=[this],rt.startArray(i),t.dataTransfer.setData("text/plain",i.map((t=>t.dragData)).join("\r\n")),i.forEach((t=>t.dom.style.opacity=".5"))}else t.preventDefault()})),this.dom.addEventListener("dragend",(t=>{var e=rt.currentArray;rt.end(),t.preventDefault(),e.forEach((t=>t.dom.style.opacity=""))})),this.dom.addEventListener("dragover",(t=>{this.dragHandler(t,"dragover")})),this.dom.addEventListener("dragenter",(t=>{this.dragHandler(t,"dragenter")})),this.dom.addEventListener("dragleave",(t=>{this.dragHandler(t,"dragleave")})),this.dom.addEventListener("drop",(t=>{this.dragHandler(t,"drop")}))}dragHandler(t,e){var n,i,o,s,r,a,l,d;const h=rt.currentItem;let c=rt.currentArray;const u="drop"===e,m={source:h,target:this,sourceItems:c,event:t,drop:u,accept:!1};if(h instanceof mt&&(null===(n=this.listview)||void 0===n?void 0:n.moveByDragging)&&h.listview===this.listview){t.preventDefault();const e=c.indexOf(this)>=0,n=t.clientY-this.dom.getBoundingClientRect().top>this.dom.offsetHeight/2;if(e&&u||(m.accept=n?"move-after":"move"),u){if(-1===c.indexOf(this)){let t=this.position;n&&t++;for(const e of c)e!==this&&(t>e.position&&t--,this.listview.move(e,t),t++)}}else t.dataTransfer.dropEffect="move"}const v=null!==(i=this.onDragover)&&void 0!==i?i:null===(o=this.listview)||void 0===o?void 0:o.onDragover;!m.accept&&v&&(v(m),(u||m.accept)&&t.preventDefault());const g=null!==(s=this.onContextMenu)&&void 0!==s?s:null===(r=this.listview)||void 0===r?void 0:r.onContextMenu;if(!m.accept&&c&&c.indexOf(this)>=0&&g&&(u?g(this,t):t.preventDefault()),"dragenter"===e||"dragover"==e||"dragleave"===e||u){"dragenter"===e?this.enterctr++:"dragleave"===e?this.enterctr--:"drop"===e&&(this.enterctr=0);let t=this.enterctr>0;this.toggleClass("dragover",t);let n=t&&("move"===m.accept||"move-after"===m.accept)&&m.accept;if(n!=(null!==(l=null===(a=this.dragoverPlaceholder)||void 0===a?void 0:a[1])&&void 0!==l&&l)&&(null===(d=this.dragoverPlaceholder)||void 0===d||d[0].remove(),this.dragoverPlaceholder=null,n)){this.dragoverPlaceholder=[O({tag:"div.dragover-placeholder"}),n];var f=this.dom;"move-after"===m.accept&&(f=f.nextElementSibling),this.dom.parentElement.insertBefore(this.dragoverPlaceholder[0],f)}}}}class vt extends D{get scrollBox(){return this._scrollBox||this.dom}set scrollBox(t){this._scrollBox=t}constructor(t){super(t),this.onItemClicked=null,this.dragging=!1,this.moveByDragging=!1,this.selectionHelper=new gt,this._scrollBox=null,this.onItemMoved=null,this.onDragover=null,this.onContextMenu=null,this.selectionHelper.itemProvider=this}postCreateDom(){super.postCreateDom(),this.dom.setAttribute("role","list")}add(t,e){this.addView(t,e),this.dragging&&(t.dom.draggable=!0)}remove(t,e){t=this._ensureItem(t),!e&&t.selected&&this.selectionHelper.toggleItemSelection(t),this.removeView(t)}move(t,e){var n;t=this._ensureItem(t),this.remove(t,!0),this.add(t,e),null===(n=this.onItemMoved)||void 0===n||n.call(this,t,t.position)}removeAll(){for(;this.length;)this.remove(this.length-1)}clear(){this.removeAll(),H(this.dom)}ReplaceChild(t){this.clear(),this.dom.appendChild(t.getDOM())}}class gt{constructor(){this._enabled=!1,this.onEnabledChanged=new v,this.itemProvider=null,this.ctrlForceSelect=!1,this.selectedItems=[],this.onSelectedItemsChanged=new v,this.lastToggledItem=null}get enabled(){return this._enabled}set enabled(t){if(!!t!=!!this._enabled){for(this._enabled=t;this.selectedItems.length;)this.toggleItemSelection(this.selectedItems[0],!1);this.lastToggledItem=null,this.onEnabledChanged.invoke()}}get count(){return this.selectedItems.length}handleItemClicked(t,e){if(!this.enabled){if(!this.ctrlForceSelect||!e.ctrlKey)return!1;this.enabled=!0}if(e.shiftKey&&this.lastToggledItem&&this.itemProvider){var n=!!this.lastToggledItem.selected,i=t.position,o=this.lastToggledItem.position;i>o&&([i,o]=[o,i]);for(let t=i;t<=o;t++)this.toggleItemSelection(this.itemProvider.get(t),n);this.lastToggledItem=t}else this.toggleItemSelection(t);return e.preventDefault(),!0}handleItemKeyDown(t,e){if(!this.enabled)return!1;if(this.itemProvider&&e.ctrlKey&&"KeyA"===e.code){const t=this.itemProvider.length;for(let e=0;e{this.parentView instanceof wt&&(this.keepOpen||this.parentView.keepOpen||this.parentView.close())}))}updateDom(){super.updateDom(),this.dom.textContent=this.text,this.cls!==this._lastcls&&(this._lastcls&&this.dom.classList.remove(this._lastcls),this.cls&&this.dom.classList.add(this.cls))}}class wt extends vt{get visible(){return this._visible}constructor(t){super({tag:"div.context-menu",tabIndex:0}),this.keepOpen=!1,this.useOverlay=!0,this._visible=!1,this.overlay=null,this.onClose=new v,this._originalFocused=null,null==t||t.forEach((t=>this.add(t)))}postCreateDom(){super.postCreateDom(),this.dom.addEventListener("focusout",(t=>{!this.dom.contains(t.relatedTarget)&&this.close()})),this.dom.addEventListener("keydown",(t=>{"Escape"===t.code&&(t.preventDefault(),this.close())}))}show(t){this._visible?console.trace("[ContextMenu] show() called when it's already visible."):("ev"in t&&(t={x:t.ev.clientX,y:t.ev.clientY}),this._visible=!0,this.useOverlay?(this.overlay||(this.overlay=(new at).setFixed(!0),this.overlay.dom.style.background="rgba(0, 0, 0, .1)",this.overlay.dom.addEventListener("mousedown",(t=>{t.eventPhase===Event.AT_TARGET&&(t.preventDefault(),this.close())}))),this.overlay.appendView(this),C(document.body,this.overlay)):C(document.body,this),this._originalFocused=document.activeElement,this.setPosition(t),this.dom.focus())}setPosition(t){if(this._visible){this.dom.style.left="0",this.dom.style.top="0";var e=document.body.offsetWidth,n=document.body.offsetHeight;if(this.useOverlay){const t=this.overlay.dom;e=t.offsetWidth,n=t.offsetHeight}this.dom.style.maxHeight=n+"px";var i=this.dom.offsetWidth,o=this.dom.offsetHeight,s=t.x,r=t.y;s+i>e&&(s-=i),r+o>n&&(r-=o),s<0&&(s=t.x>e/2?0:e-i),r<0&&(r=t.y>n/2?0:n-o),this.dom.style.left=s+"px",this.dom.style.top=r+"px",this.dom.style.transformOrigin=`${t.x-s}px ${t.y-r}px`}else console.trace("[ContextMenu] setPosition() called when it's not visible.")}close(){var t,e;this._visible&&(this._visible=!1,this.onClose.invoke(),null===(e=null===(t=this._originalFocused)||void 0===t?void 0:t.focus)||void 0===e||e.call(t),this._originalFocused=null,this.overlay&&j(this.overlay.dom).onFinished((()=>k(document.body,this.overlay))),j(this.dom).onFinished((()=>!this.overlay&&k(document.body,this))))}}class bt extends nt{constructor(t){super(),m(this,t)}createDom(){return{tag:"div.section-action.clickable",tabIndex:0}}}class xt extends p{constructor(){super(...arguments),this.parentDom=null,this.toasts=[]}createDom(){return{tag:"div.toasts-container"}}addToast(t){0===this.toasts.length&&this.show(),this.toasts.push(t)}removeToast(t){this.toasts.remove(t),0===this.toasts.length&&this.remove()}show(){(this.parentDom||document.body).appendChild(this.dom)}remove(){this.dom.remove()}}xt.default=new xt;class yt extends p{constructor(t){super(),this.text="",this.shown=!1,this.timer=new R((()=>this.close())),m(this,t),this.container||(this.container=xt.default)}show(t){this.shown||(this.container.addToast(this),this.container.appendView(this),this.shown=!0),t?this.timer.timeout(t):this.timer.tryCancel()}close(){this.shown&&(this.shown=!1,j(this.dom).onFinished((()=>this.container.removeToast(this))))}createDom(){return{tag:"div.toast"}}updateDom(){super.updateDom(),this.dom.textContent=this.text}static show(t,e){var n=new yt({text:t});return n.show(e),n}}t.AutoResetEvent=class{constructor(){this._whenNotify=null,this._callback=null}wait(){return this._whenNotify||(this._whenNotify=new Promise((t=>{this._callback=()=>{this._callback=this._whenNotify=null,t()}}))),this._whenNotify}set(){this._callback&&this._callback()}},t.BuildDOMCtx=V,t.ButtonView=class extends nt{constructor(t){super(),this.disabled=!1,this.type="normal",m(this,t),this.updateDom()}createDom(){return{tag:"div.btn",tabIndex:0}}updateDom(){super.updateDom(),this.toggleClass("disabled",this.disabled),this.toggleClass("btn-big","big"===this.type),this.toggleClass("btn-inline","inline"===this.type)}},t.Callbacks=v,t.CancelToken=class{constructor(){this.cancelled=!1,this.onCancelled=new v}cancel(){this.cancelled||(this.cancelled=!0,this.onCancelled.invoke())}throwIfCancelled(){if(this.cancelled)throw new Error("operation cancelled.")}},t.ContainerView=D,t.ContextMenu=wt,t.DataUpdatingHelper=class{update(t){const e=this.items;var n={};for(const e of t)n[this.dataSelectId(e)]=e;var i={},o=[];for(const t of e){const e=this.selectId(t);void 0!==n[e]?i[e]=t:o.push(t)}for(let t=o.length-1;t>=0;t--)this.removeItem(o[t]);var s=0;for(const e of t){const t=i[this.dataSelectId(e)];void 0!==t?this.updateItem(t,e):this.addItem(e,s),s++}}updateOrRebuildAll(t){this.update(t),this.isSame(t)||this.rebuildAll(t)}isSame(t){var e=this.items[Symbol.iterator]();for(const i of t){var n=e.next();if(n.done)return!1;if(this.selectId(n.value)!==this.dataSelectId(i))return!1}return!!e.next().done}rebuildAll(t){var e=this.items;if(e instanceof Array)for(let t=e.length-1;t>=0;t--)this.removeItem(e[t]);else for(const t of e)this.removeItem(t);let n=0;for(const e of t)this.addItem(e,n++)}selectId(t){return t.id}dataSelectId(t){return t.id}addItem(t,e){}updateItem(t,e){}removeItem(t){}},t.Dialog=dt,t.DialogParent=ht,t.EditableHelper=class{constructor(t){this.editing=!1,this.beforeEdit=null,this.onComplete=null,this.element=t}startEdit(t){if(!this.editing){this.editing=!0;var e=this.element,n=this.beforeEdit=e.textContent;U(e,"editing",!0);for(var i=O({tag:"input",type:"text",value:n});e.firstChild;)e.removeChild(e.firstChild);e.appendChild(i),i.select(),i.focus();var o=()=>{var n;this.editing=!1,U(e,"editing",!1),s.forEach((t=>t.remove())),i.remove(),null===(n=this.onComplete)||void 0===n||n.call(this,i.value),null==t||t(i.value)},s=[W(i,"keydown",(t=>{"Enter"===t.code&&(o(),t.preventDefault())})),W(i,"focusout",(t=>{o()}))]}}startEditAsync(){return new Promise((t=>this.startEdit(t)))}},t.EventRegistrations=class{constructor(){this.list=[]}add(t,e){return this.list.push({event:t,func:e}),t.add(e),e}removeAll(){for(;this.list.length;){var t=this.list.pop();t.event.remove(t.func)}}},t.I=Q,t.I18n=Y,t.InputStateTracker=class{constructor(t){this.dom=t,this.state={mouseDown:!1,mouseIn:!1,focusIn:!1},this._removeEvents=null,this._removePointerEvents=null,this.onChanged=new v,this._removeEvents=$(t,["mouseenter","mouseleave","focusin","focusout"],(t=>{switch(t.type){case"mouseenter":this.stateChanged("mouseIn",!0);break;case"mouseleave":this.stateChanged("mouseIn",!1);break;case"focusin":this.stateChanged("focusIn",!0);break;case"focusout":this.stateChanged("focusIn",!1)}})).remove,this._removePointerEvents=K(t,(t=>{if("down"==t.action)return this.stateChanged("mouseDown",!0),"track";"up"==t.action&&this.stateChanged("mouseDown",!1)})).remove}stateChanged(t,e){this.state[t]=e,this.onChanged.invoke(t)}removeListeners(){var t,e;null===(t=this._removeEvents)||void 0===t||t.call(this),null===(e=this._removePointerEvents)||void 0===e||e.call(this),this._removePointerEvents=this._removeEvents=null}},t.InputView=ct,t.ItemActiveHelper=class{constructor(t){this.funcSetActive=(t,e)=>t.toggleClass("active",e),this.current=null,m(this,t)}set(t){this.current!==t&&(this.current&&this.funcSetActive(this.current,!1),this.current=t,this.current&&this.funcSetActive(this.current,!0))}},t.JsxNode=P,t.LabeledInput=class extends ut{get value(){return this.dominput.value}set value(t){this.dominput.value=t}constructor(t){super(),m(this,t),this.input||(this.input=new ct)}updateDom(){this.input.type=this.type,super.updateDom()}},t.LabeledInputBase=ut,t.Lazy=class{constructor(t){this._func=t,this._value=void 0}get computed(){return!this._func}get rawValue(){return this._value}get value(){return this._func&&(this._value=this._func(),this._func=void 0),this._value}},t.LazyListView=class extends vt{constructor(){super(...arguments),this._loaded=0,this._lazy=!1,this._slowLoading=null,this._autoLoad=null}get loaded(){return this.loaded}get slowLoading(){return this._slowLoading}get autoLoad(){return this._autoLoad}get lazy(){return this._lazy}set lazy(t){this._lazy=t,t||this.ensureLoaded(this.length-1)}ensureLoaded(t){for(t>=this.length&&(t=this.length-1);this._loaded<=t;)this.dom.appendChild(this.items[this._loaded].dom),this._loaded++}loadNext(t=50){return this._loaded=this.length?Promise.resolve(!0):this._slowLoading=new Promise((n=>{var i,o,s=()=>{this._slowLoading&&this.loadNext(e)?o():(this.lazy=!!this._autoLoad,i(),n(!!this._slowLoading),this._slowLoading=null)};if(-1==t&&window.requestIdleCallback){let t;i=()=>window.cancelIdleCallback(t),(o=()=>{t=window.requestIdleCallback(s)})()}else{-1==t&&(t=30);let e=setInterval(s,t);i=()=>clearInterval(e),o=()=>{}}}))}enableAutoLoad(t=30,e=50){this._autoLoad={interval:t,batchSize:e},this.slowlyLoad(t,e)}stopLoading(){this._slowLoading=null,this._autoLoad=null}unload(){this.stopLoading();for(let t=this._loaded-1;t>=0;t--)this.items[t].dom.remove();this.lazy=!0,this._loaded=0}_insertToDom(t,e){!this.lazy||ethis.toggleClass(e,t===e)))}get content(){return this._text}set content(t){this._text=t,this.ensureDom(),this._textdom.textContent=t}reset(){this.state="running",this.content=Q`Loading`,this.onclick=null}error(t,e){this.state="error",this.content=Q`Oh no! Something just goes wrong:`+"\r\n"+t,e&&(this.content+="\r\n"+Q`[Click here to retry]`),this.onclick=e}action(t){return ft(this,void 0,void 0,(function*(){try{yield t()}catch(e){this.error(e,(()=>this.action(t)))}}))}createDom(){return{tag:"div.loading-indicator",child:[{tag:"div.loading-indicator-inner",child:[{tag:"div.loading-indicator-text",_id:"text"}]}],onclick:t=>{var e;return null===(e=this.onclick)||void 0===e?void 0:e.call(this,t)}}}postCreateDom(){this._textdom=this.getDomById("text"),this.reset()}},t.MenuInfoItem=class extends pt{constructor(t){super(t),this.text="",this.keepOpen=!0,m(this,t)}createDom(){return{tag:"div.menu-info"}}updateDom(){super.updateDom(),this.dom.textContent=this.text}},t.MenuItem=pt,t.MenuLinkItem=class extends pt{constructor(t){super(t),this.link="",this.download="",m(this,t)}createDom(){var t=super.createDom();return t.tag="a.item.no-selection",t.target="_blank",t}updateDom(){super.updateDom(),this.dom.href=this.link,this.dom.download=this.download}},t.MessageBox=class extends dt{constructor(){super(...arguments),this.allowClose=!1,this.title="Message",this.result="none"}addResultBtns(t){for(const e of t)this.addBtnWithResult(new it({text:J.get("msgbox_"+e),right:!0}),e);return this}setTitle(t){return this.title=t,this.domCreated&&this.updateDom(),this}addText(t){return this.addContent(new nt({tag:"div.messagebox-text",text:t})),this}allowCloseWithResult(t,e){return this.result=t,this.allowClose=!0,this.showCloseButton=!!e,this.domCreated&&this.updateDom(),this}addBtnWithResult(t,e){return t.onActive.add((()=>{this.result=e,this.close()})),this.addBtn(t),this}showAndWaitResult(){return lt(this,void 0,void 0,(function*(){return this.show(),yield this.waitClose(),this.result}))}},t.Overlay=at,t.Ref=f,t.Section=class extends p{constructor(t){super(),this.titleView=new nt({tag:"span.section-title"}),this.headerView=new p({tag:"div.section-header",child:[this.titleView]}),this.ensureDom(),t&&(t.title&&this.setTitle(t.title),t.content&&this.setContent(t.content),t.actions&&t.actions.forEach((t=>this.addAction(t))))}createDom(){return{tag:"div.section",child:[this.headerView]}}setTitle(t){this.titleView.removeAllView(),this.titleView.addChild(t)}setContent(t){this.content&&this.removeView(this.content),this.content=p.getView(t),this.appendView(this.content)}addAction(t){var e=t instanceof p?t:new bt({text:t.text,onActive:t.onclick});this.headerView.appendView(e)}},t.SectionAction=bt,t.SelectionHelper=gt,t.Semaphore=class{constructor(t){this.queue=new Array,this.maxCount=1,this.runningCount=0,m(this,t)}enter(){if(this.runningCount===this.maxCount){var t,e=new Promise((e=>{t=e}));return this.queue.push(t),e}return this.runningCount++,Promise.resolve()}exit(){this.runningCount===this.maxCount&&this.queue.length?window.queueMicrotask?window.queueMicrotask(this.queue.shift()):setTimeout(this.queue.shift(),0):this.runningCount--}run(t){return e(this,void 0,void 0,(function*(){yield this.enter();try{yield t()}finally{this.exit()}}))}},t.TabBtn=ot,t.TextBtn=it,t.TextCompositionWatcher=class{get isCompositing(){return this._isCompositing}set isCompositing(t){this._isCompositing=t,this.onCompositingChanged.invoke()}constructor(t){this.onCompositingChanged=new v,this._isCompositing=!1,this.dom=b(t),this.dom.addEventListener("compositionstart",(t=>{this.isCompositing=!0})),this.dom.addEventListener("compositionend",(t=>{this.isCompositing=!1}))}},t.TextView=nt,t.Timer=R,t.Toast=yt,t.ToastsContainer=xt,t.ToolTip=class extends nt{constructor(){super(...arguments),this._shown=!1,this._timer=new R((()=>this.close())),this._cancelClose=null}createDom(){return{tag:"div.tooltip"}}get shown(){return this._shown}show(t){var e;if(this.shown)return;this._shown=!0,null===(e=this._cancelClose)||void 0===e||e.call(this);let{parent:n=document.body,timeout:i}=t;i&&this._timer.timeout(i);const o=this.dom;st(o,t),n.appendChild(o)}close(t){this.shown&&(this._timer.tryCancel(),this._shown=!1,this._cancelClose=j(this.dom,t).cancel)}},t.View=p,t.ViewToggle=class{constructor(t){this.shownKeys=[],this.toggleMode="remove",this.container=null,m(this,t),this.setShownKeys(this.shownKeys)}add(t,e){const n=this.items[t];n?n instanceof Array?this.items[t].push(e):this.items[t]=[n,e]:this.items[t]=e,this.toggleView(e,this.shownKeys.indexOf(t)>=0)}setShownKeys(t){this.shownKeys=t;const e=this.items;for(const n in e){const i=t.indexOf(n)>=0;if(Object.prototype.hasOwnProperty.call(e,n)){const t=e[n];if(t)if(t instanceof Array)for(const e of t)this.toggleView(e,i);else t&&this.toggleView(t,i)}}}toggleView(t,e,n){if(n||(n=this.toggleMode),"display"==n)t.dom.style.display=e?"":"none";else if("hidden"==n)t.dom.hidden=!e;else{if("remove"!=n)throw new Error("Unknown toggle mode");e!=!!t.parentView&&(e?this.container.appendView(t):this.container.removeView(t))}}},t.addChild=y,t.appendView=x,t.arrayFind=c,t.arrayForeach=d,t.arrayInsert=function(t,e,n){void 0===n?t.push(e):t.splice(n,0,e)},t.arrayMap=l,t.arrayRemove=a,t.arraySum=function(t,e){var n=0;return d(t,(t=>{var i=e(t);i&&(n+=i)})),n},t.base64EncodeUtf8=function(t){return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode("0x"+e)})))},t.buildDOM=O,t.buildView=F,t.clearChildren=H,t.createArrayBuilder=G,t.createName=function(t,e){for(let n=0;;n++){let i=t(n);if(!e(i))return i}},t.createStringBuilder=X,t.dragManager=rt,t.fadeout=j,t.foreachFlaten=h,t.formatDateTime=function(t){var e=new Date;return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()?t.toLocaleTimeString():t.toLocaleString()},t.formatDuration=function(t){if("number"!=typeof t||isNaN(t))return"--:--";t=Math.round(t);var e=Math.floor(t/60);return t%=60,o(e.toString(),2,"0")+":"+o(t.toString(),2,"0")},t.formatFileSize=function(t){if("number"!=typeof t||isNaN(t))return"NaN";for(var e=0;e=1024;)e++,t/=1024;return(e>0?t.toFixed(2):t)+" "+s[e]},t.getDOM=b,t.getWebfxCss=tt,t.i18n=J,t.injectCss=q,t.injectWebfxCss=function(t){et||(q(tt(),Object.assign(Object.assign({},t),{tag:"style.webfx-injected-style"})),et=!0)},t.jsx=N,t.jsxBuild=function(t,e){return B(t,64,e||new V)},t.jsxFactory=z,t.listenEvent=W,t.listenEvents=$,t.listenPointerEvents=K,t.mod=function(t,e){return t<0&&(t=e+t),t%e},t.mountView=C,t.numLimit=r,t.objectApply=u,t.objectInit=m,t.readBlobAsDataUrl=function(t){return new Promise(((e,n)=>{var i=new FileReader;i.onload=t=>{e(i.result)},i.onerror=t=>n(),i.readAsDataURL(t)}))},t.replaceChild=function(t,e){H(t),e&&t.appendChild(e)},t.setPosition=st,t.sleepAsync=function(t){return new Promise((e=>{setTimeout(e,t)}))},t.startBlockingDetect=function(t=20){var e=Date.now(),n=Date.now();setInterval((()=>{var i=Date.now();i-n>=t&&console.info(`[Blocking] ${(i-e)/1e3}s: blocked for ${i-n} ms`),n=i}),1)},t.strPadLeft=o,t.toggleClass=U,t.tryGetDOM=w,t.unmountView=k,t.version="1.10.4",Object.defineProperty(t,"__esModule",{value:!0})})); //# sourceMappingURL=webfx.min.js.map diff --git a/dist/webfx.min.js.map b/dist/webfx.min.js.map index d543802..9e2b53b 100644 --- a/dist/webfx.min.js.map +++ b/dist/webfx.min.js.map @@ -1 +1 @@ -{"version":3,"file":"webfx.min.js","sources":["https://github.com/lideming/webfx/raw/v1.10.3/packages/utils/src/utils.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/view.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/buildDOM.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/viewUtils.ts","https://github.com/lideming/webfx/raw/v1.10.3/packages/i18n/src/i18n.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/viewlib.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Basics.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/helpers.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Dev.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Overlay.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Dialog.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Inputs.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/ListView.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Menu.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Section.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/Toast.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/views/LoadingIndicator.ts","https://github.com/lideming/webfx/raw/v1.10.3/version"],"sourcesContent":["// file: utils.ts\n\nconst _object_assign = Object.assign;\nconst _object_hasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Time & formatting utils:\n\nexport function strPadLeft(str: string, len: number, ch: string = ' ') {\n while (str.length < len) {\n str = ch + str;\n }\n return str;\n}\n\nexport function formatDuration(sec: number | any) {\n if (typeof sec !== 'number' || isNaN(sec)) return '--:--';\n sec = Math.round(sec);\n var min = Math.floor(sec / 60);\n sec %= 60;\n return strPadLeft(min.toString(), 2, '0') + ':' + strPadLeft(sec.toString(), 2, '0');\n}\n\nconst fileSizeUnits = ['B', 'KB', 'MB', 'GB', 'TB'];\nexport function formatFileSize(size: number | any) {\n if (typeof size !== \"number\" || isNaN(size)) return 'NaN';\n var unit = 0;\n while (unit < fileSizeUnits.length - 1 && size >= 1024) {\n unit++;\n size /= 1024;\n }\n return (unit > 0 ? size.toFixed(2) : size) + ' ' + fileSizeUnits[unit];\n}\n\nexport function formatDateTime(date: Date) {\n var now = new Date();\n var sameday = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n return sameday ? date.toLocaleTimeString() : date.toLocaleString();\n}\n\nexport function numLimit(num: number, min: number, max: number) {\n return (num < min || typeof num != 'number' || isNaN(num)) ? min :\n (num > max) ? max : num;\n}\n\nexport function createName(nameFunc: (num: number) => string, existsFunc: (str: string) => boolean) {\n for (let num = 0; ; num++) {\n let str = nameFunc(num);\n if (!existsFunc(str)) return str;\n }\n}\n\n/** \n * btoa, but supports Unicode and uses UTF-8 encoding.\n * @see https://stackoverflow.com/questions/30106476\n */\nexport function base64EncodeUtf8(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\n function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1) as any);\n }));\n}\n\nexport function sleepAsync(time: number): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport function arrayRemove(array: T[], val: T) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === val) {\n array.splice(i, 1);\n i--;\n }\n }\n}\n\nexport function arrayInsert(array: T[], val: T, pos?: number) {\n if (pos === undefined) array.push(val);\n else array.splice(pos, 0, val);\n}\n\nexport function arrayMap(arr: Iterable, func: (item: T, idx: number) => TRet) {\n if (arr instanceof Array) return arr.map(func);\n var idx = 0;\n var ret = new Array((arr as any).length);\n for (var item of arr) {\n ret[idx] = (func(item, idx));\n idx++;\n }\n return ret;\n}\n\nexport function arrayForeach(arr: Iterable, func: (item: T, idx: number) => void) {\n var idx = 0;\n for (var item of arr) {\n func(item, idx++);\n }\n}\n\n\nexport function foreachFlaten(arr: T[], func: Action) {\n for (const it of arr) {\n if (it instanceof Array) {\n foreachFlaten(it as T[], func);\n } else {\n func(it);\n }\n }\n}\n\nexport function arrayFind(arr: Iterable, func: (item: T, idx: number) => any): T | null {\n if (arr instanceof Array) return arr.find(func);\n var idx = 0;\n for (var item of arr) {\n if (func(item, idx++)) return item;\n }\n return null;\n}\n\nexport function arraySum(arr: Iterable, func: (item: T) => number | null | undefined) {\n var sum = 0;\n arrayForeach(arr, (x) => {\n var val = func(x);\n if (val) sum += val;\n });\n return sum;\n}\n\nexport function objectApply(obj: Partial, kv?: Partial, keys?: Array) {\n if (kv) {\n if (!keys) return _object_assign(obj, kv);\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n obj[key] = val;\n }\n }\n }\n return obj;\n}\n\nexport function objectInit(obj: T, kv?: ObjectInit, keys?: Array) {\n if (kv) {\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n if (key.startsWith(\"on\") && obj[key] instanceof Callbacks) {\n (obj[key] as Callbacks).add(val);\n } else {\n obj[key] = val;\n }\n }\n }\n }\n return obj;\n}\n\nexport function mod(a: number, b: number): number {\n if (a < 0) a = b + a;\n return a % b;\n}\n\nexport function readBlobAsDataUrl(blob: Blob) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (ev) => {\n resolve(reader.result as string);\n };\n reader.onerror = (ev) => reject();\n reader.readAsDataURL(blob);\n });\n}\n\nArray.prototype.remove = function (item) {\n arrayRemove(this, item);\n};\n\ndeclare global {\n interface Array {\n /**\n * (Extension method) remove the specified item from array.\n * @param item The item to be removed from array\n */\n remove(item: T): void;\n }\n}\n\nexport type ObjectInit = Partial>;\n\nexport type ConvertObjectWithCallbacks = {\n [P in keyof T]: P extends `on${string}` ? CallbackInit : T[P];\n};\n\nexport type CallbackInit = T extends Callbacks ? T | U : T;\n\n// Some interesting function types:\nexport type AnyFunc = (...args: any) => any;\nexport type Action = (arg: T) => void;\nexport type Func = () => TRet;\nexport type AsyncFunc = Func>;\n\nexport type FuncOrVal = T | Func;\n\nclass CallbacksImpl {\n private _cbs: Set | undefined = undefined;\n private _cbs_invoking: Set | undefined = undefined;\n private _hook?: Callbacks<(adding: boolean, func: T) => void> = undefined;\n private _invoking = false;\n get onChanged() {\n this._hook ??= new Callbacks();\n return this._hook;\n }\n get length() { return this._cbs ? this._cbs.size : 0; }\n invoke(...args: Parameters) {\n if (!this._cbs) return;\n if (this._invoking) throw new Error(\"Cannot invoke callbacks during invocation\");\n this._invoking = true;\n this._cbs.forEach((x: (...args: any) => void) => {\n try {\n x.apply(this, args);\n } catch (error) {\n console.error(\"Error in callback\", error);\n }\n });\n if (this._cbs_invoking) {\n for (const x of this._cbs_invoking) {\n this._cbs.add(x);\n }\n }\n this._cbs_invoking?.clear();\n this._invoking = false;\n }\n add(callback: T) {\n if (this._cbs === undefined) {\n this._cbs = new Set();\n }\n if (this._invoking) {\n this._cbs_invoking ??= new Set();\n this._cbs_invoking.add(callback);\n } else {\n this._cbs.add(callback);\n }\n this._hook?.invoke(true, callback);\n return callback;\n }\n remove(callback: T) {\n if (this._cbs === undefined) return;\n if (this._invoking) {\n this._cbs_invoking?.delete(callback);\n }\n this._cbs.delete(callback);\n this._hook?.invoke(false, callback);\n }\n\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n waitOnce(callback?: T) {\n if (arguments.length === 0) {\n return new Promise>((resolve, reject) => {\n const cb = ((...args) => {\n this.remove(cb);\n resolve(args);\n }) as T;\n this.add(cb);\n });\n } else if (callback) {\n const cb = ((...args) => {\n this.remove(cb);\n return callback(...args);\n }) as T;\n this.add(cb);\n } else {\n throw new Error(\"Invalid callback\");\n }\n }\n}\n\nexport interface Callbacks {\n invoke(...args: Parameters): void;\n add(callback: T): T;\n remove(callback: T): void;\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n readonly length: number;\n readonly onChanged: Callbacks<(adding: boolean, func: T) => void>;\n}\nexport const Callbacks: { new (): Callbacks; } = CallbacksImpl;\n\nexport class Ref {\n private _value: T | undefined = undefined;\n private _onChanged: Callbacks>> | undefined = undefined;\n constructor(value?: T) {\n this._value = value;\n }\n get onChanged() {\n if (!this._onChanged) this._onChanged = new Callbacks();\n return this._onChanged;\n }\n get value() { return this._value; }\n set value(val) {\n this._value = val;\n if (this._onChanged) this.onChanged.invoke(this);\n }\n static from(value: T) {\n const ref = new Ref();\n ref._value = value;\n return ref as (Ref & { value: T });\n }\n}\n\nexport class Lazy {\n private _func?: Func;\n private _value?: T;\n get computed() { return !this._func; }\n get rawValue() { return this._value; }\n get value(): T {\n if (this._func) {\n this._value = this._func();\n this._func = undefined;\n }\n return this._value!;\n }\n constructor(func: Func) {\n this._func = func;\n this._value = undefined;\n }\n}\n\nexport class Semaphore {\n queue = new Array();\n maxCount = 1;\n runningCount = 0;\n constructor(init: ObjectInit) {\n objectInit(this, init);\n }\n enter(): Promise {\n if (this.runningCount === this.maxCount) {\n var resolve: Action;\n var prom = new Promise((res) => { resolve = res; });\n this.queue.push(resolve!);\n return prom;\n } else {\n this.runningCount++;\n return Promise.resolve();\n }\n }\n exit() {\n if (this.runningCount === this.maxCount && this.queue.length) {\n if (window.queueMicrotask) {\n window.queueMicrotask(this.queue.shift() as any);\n } else {\n setTimeout(this.queue.shift()!, 0);\n }\n } else {\n this.runningCount--;\n }\n }\n async run(func: () => Promise) {\n await this.enter();\n try {\n await func();\n } finally {\n this.exit();\n }\n }\n}\n\n/** Just like CancellationToken[Source] on .NET */\nexport class CancelToken {\n cancelled = false;\n onCancelled = new Callbacks();\n cancel() {\n if (this.cancelled) return;\n this.cancelled = true;\n this.onCancelled.invoke();\n }\n throwIfCancelled() {\n if (this.cancelled)\n throw new Error(\"operation cancelled.\");\n }\n}\n\nexport class AutoResetEvent {\n private _whenNotify: Promise | null = null;\n private _callback: Action | null = null;\n\n wait() {\n if (!this._whenNotify) {\n this._whenNotify = new Promise(r => {\n this._callback = () => {\n this._callback = this._whenNotify = null;\n r();\n };\n });\n }\n return this._whenNotify;\n }\n set() {\n this._callback && this._callback();\n }\n}\n\nexport class EventRegistrations {\n list: { event: Callbacks; func: AnyFunc; }[] = [];\n add(event: Callbacks, func: T) {\n this.list.push({ event, func });\n event.add(func);\n return func;\n }\n removeAll() {\n while (this.list.length) {\n var r = this.list.pop()!;\n r.event.remove(r.func);\n }\n }\n}\n","import { Action, Callbacks, objectApply, arrayFind, arrayForeach, arrayMap } from \"@yuuza/utils\";\nimport { buildDOM, BuildDOMCtx, BuildDomExpr, buildView, IDOM, IView, JsxNode, MountState } from \"./buildDOM\";\nimport { toggleClass } from \"./viewUtils\";\n\n\nexport class View implements IView {\n constructor(dom?: BuildDomExpr) {\n this._domctx.view = this;\n if (dom) this.domExprCreated(dom);\n }\n\n static getView(obj: BuildDomExpr) { return obj instanceof View ? obj : new View(obj); }\n\n static debugging = false;\n\n public parentView?: View = undefined;\n public _position?: number = undefined;\n get position() { return this._position; }\n\n private _domctx = new BuildDOMCtx();\n\n protected _dom: T | undefined = undefined;\n public get dom() {\n this.ensureDom();\n return this._dom!;\n }\n public get domCreated() { return !!this._dom; }\n\n private _baseView: View | undefined = undefined;\n public get baseView() { return this._baseView; }\n\n private _mountState: MountState = MountState.Unmounted;\n public get mountState() { return this._mountState; }\n\n public get hidden() { return this.dom.hidden; }\n public set hidden(val: boolean) { this.dom.hidden = val; }\n\n public ensureDom() {\n if (!this._dom) {\n var r = this.createDom();\n this.domExprCreated(r);\n }\n }\n\n private domExprCreated(r: BuildDomExpr) {\n var view = buildView(r, this._domctx);\n if (view instanceof View) {\n this._baseView = view;\n this._dom = view.dom as T;\n } else {\n this._dom = view as T;\n }\n this.postCreateDom();\n this.updateDom();\n }\n\n protected createDom(): BuildDomExpr {\n return document.createElement('div');\n }\n\n /** Will be called when the dom is created */\n protected postCreateDom() {\n if (View.debugging) {\n if (this.dom.dataset)\n this.dom.dataset['webfx'] = MountState[this._mountState];\n }\n }\n\n /** Will be called when the dom is created, after postCreateDom() */\n public updateDom() {\n this._domctx.update();\n }\n\n /** Will be called when the mounting state is changed */\n public mountStateChanged(state: MountState) {\n if (state == this._mountState) {\n console.trace(\"mountState unchanged\", state, this);\n return;\n }\n this._mountState = state;\n if (View.debugging) {\n if (!this._baseView && this.domCreated && this.dom.dataset) {\n if (this.dom.dataset['webfx'] == MountState[state]) {\n console.trace('mountState on the DOM is changed by other view', state, this);\n }\n this.dom.dataset['webfx'] = MountState[state];\n }\n }\n if (this._baseView) {\n // let the baseView do the rest\n this._baseView.mountStateChanged(state);\n return;\n }\n if (this._childViews) for (const child of this._childViews) {\n child.mountStateChanged(state);\n }\n }\n\n public getDomById(id: string): HTMLElement | null {\n this.ensureDom();\n return this._domctx.dict?.[id] ?? null;\n }\n\n /** Assign key-values and call `updateDom()` */\n updateWith(kv: Partial) {\n objectApply(this, kv);\n this.updateDom();\n }\n updateAllWith(kv: Partial) {\n objectApply(this, kv);\n this.updateAll();\n }\n toggleClass(clsName: string, force?: boolean) {\n toggleClass(this.dom, clsName, force);\n }\n\n // Implements `IDOMInstance`\n // appendView(view: View) { this.dom.appendChild(view.dom); }\n getDOM() { return this.dom; }\n addChild(child: BuildDomExpr) {\n const view = buildView(child, this._domctx);\n if (view instanceof View) {\n this.appendView(view);\n } else {\n this.dom.appendChild(view);\n }\n }\n\n private _onActive: Callbacks> | undefined = undefined;\n get onActive() {\n if (!this._onActive) {\n this._onActive = new Callbacks>();\n this.dom.addEventListener('click', (e: MouseEvent) => {\n this._onActive!.invoke(e);\n });\n this.dom.addEventListener('keydown', (e: KeyboardEvent) => {\n this.handleKeyDown(e);\n });\n }\n return this._onActive;\n }\n\n handleKeyDown(e: KeyboardEvent) {\n if (e.code === 'Enter') {\n const rect = this.dom.getBoundingClientRect();\n this._onActive?.invoke(new MouseEvent('click', {\n clientX: rect.x, clientY: rect.y,\n relatedTarget: this.dom\n }));\n e.preventDefault();\n }\n }\n\n private _childViews: View[] | undefined = undefined;\n get childViews(): View[] {\n // Return the childViews of the baseView if exists\n if (this._baseView) { return this._baseView.childViews; }\n\n // Lazy creating childViews array\n if (!this._childViews) this._childViews = [];\n return this._childViews;\n }\n appendView(view: View) {\n this.addView(view);\n }\n addView(view: View, pos?: number) {\n this._registerChild(view, pos, false);\n if (this._mountState == MountState.Mounted) view.mountStateChanged(MountState.Mounting);\n this._insertToDom(view, pos);\n if (this._mountState != MountState.Unmounted) view.mountStateChanged(this._mountState);\n }\n _registerChild(view: View, pos?: number, changeMountState = true) {\n const items = this.childViews;\n if (view.parentView) throw new Error('the view is already in a container view');\n view.parentView = this;\n if (pos === undefined) {\n view._position = items.length;\n items.push(view);\n } else {\n items.splice(pos, 0, view);\n for (let i = pos; i < items.length; i++) {\n items[i]._position = i;\n }\n }\n if (changeMountState && this._mountState != MountState.Unmounted) {\n view.mountStateChanged(this._mountState);\n }\n }\n removeView(view: View | number) {\n view = this._ensureItem(view);\n this._removeFromDom(view);\n var pos = view._position!;\n view.parentView = view._position = undefined;\n this.childViews.splice(pos, 1);\n for (let i = pos; i < this.childViews.length; i++) {\n this.childViews[i]._position = i;\n }\n if (this._mountState != MountState.Unmounted) {\n view.mountStateChanged(MountState.Unmounted);\n }\n }\n removeAllView() {\n while (this.childViews.length) this.removeView(this.childViews.length - 1);\n }\n removeFromParent() {\n if (this.parentView) this.parentView.removeView(this);\n }\n /** updateDom() then updateChildren() */\n updateAll() {\n this.updateDom();\n if (this.baseView) return this.baseView.updateAll();\n this.updateChildren();\n }\n /** Call updateDom() on the whole tree */\n updateChildren() {\n if (this._childViews) for (const child of this._childViews) {\n child.updateAll();\n }\n }\n protected _insertToDom(item: View, pos?: number) {\n if (pos == undefined) this.dom.appendChild(item.dom);\n else this.dom.insertBefore(item.dom, this.childViews[pos + 1]?.dom || null);\n }\n protected _removeFromDom(item: View) {\n if (item.domCreated) item.dom.remove();\n }\n protected _ensureItem(item: View | number) {\n if (typeof item === 'number') item = this.childViews[item];\n else if (!item) throw new Error('item is null or undefined.');\n else if (item.parentView !== this) throw new Error('the item is not in this listview.');\n return item;\n }\n\n}\n\nexport function tryGetDOM(idom: IDOM | null | undefined) {\n if (!idom) return idom;\n if (idom instanceof View) {\n return idom.getDOM();\n } else if (idom instanceof Node) {\n return idom;\n } else if (idom && \"getDOM\" in idom) {\n return idom.getDOM();\n }\n}\n\nexport function getDOM(idom: IDOM) {\n var dom = tryGetDOM(idom);\n if (!dom) {\n console.error(\"getDOM():\", idom);\n throw new Error(\"getDOM(): unsupported parameter: \" + idom);\n }\n return dom;\n}\n\nexport function appendView(parent: IDOM, childView: View) {\n warnMountingView(parent, childView);\n getDOM(parent).appendChild(childView.dom);\n}\n\nexport function addChild(parent: IDOM, child: BuildDomExpr) {\n // fast path\n if (parent instanceof View) parent.addChild(child);\n else if (parent instanceof Node) {\n warnMountingView(parent, child);\n parent.appendChild(buildDOM(child));\n }\n // slow path\n else if ('addChild' in parent) {\n parent.addChild(child);\n } else {\n console.error(\"addChild():\", { parent, child });\n throw new Error(\"addChild(): unsupported parent\");\n }\n}\n\nfunction warnMountingView(parent: IDOM, child: BuildDomExpr) {\n if (child instanceof View) {\n const data = { parent, child };\n if (parent instanceof Node)\n console.trace(\"Should use `mountView()` to mount a view to DOM.\", data);\n else\n console.trace(\"Should use `View.addChild()` or `View.appendView()` to add a view into another view.\", data);\n }\n}\n\nexport function mountView(parent: Node, view: View) {\n view.mountStateChanged(MountState.Mounting);\n parent.appendChild(view.dom);\n view.mountStateChanged(MountState.Mounted);\n}\n\nexport function unmountView(parent: Node, view: View) {\n view.dom.remove();\n view.mountStateChanged(MountState.Unmounted);\n}\n\ndeclare global {\n interface Node {\n /** @deprecated Use the exported function `getDOM()` instead. */\n getDOM(): this;\n /** @deprecated Use the exported function `appendView()` instead. */\n appendView(view: View);\n /** @deprecated Use the exported function `addChild()` instead. */\n addChild(child: BuildDomExpr): void;\n }\n}\n\n\nNode.prototype.getDOM = function () {\n console.trace(\"webfx: Node.getDOM() is deprecated. Please use the exported function `getDOM()` instead.\");\n return this;\n};\n\nNode.prototype.addChild = function (child) {\n console.trace(\"webfx: Node.addChild() is deprecated. Please use the exported function `addChild()` instead.\");\n addChild(this, child);\n};\n\nNode.prototype.appendView = function (this: Node, view: View) {\n console.trace(\"webfx: Node.appendView() is deprecated. Please use the exported function `appendView()` instead.\");\n appendView(this, view);\n};\n\nexport class ContainerView extends View {\n addView(view: T, pos?: number): void {\n return super.addView(view, pos);\n }\n removeView(view: T | number): void {\n super.removeView(view);\n }\n protected _insertToDom(item: T, pos: number): void {\n super._insertToDom(item, pos);\n }\n protected _removeFromDom(item: T): void {\n super._removeFromDom(item);\n }\n protected _ensureItem(item: T | number): T {\n return super._ensureItem(item) as T;\n }\n\n get items() { return this.childViews as T[]; }\n [Symbol.iterator]() { return (this.childViews as T[])[Symbol.iterator](); }\n get length() { return this.childViews.length; }\n get(idx: number) {\n return this.childViews[idx] as T;\n }\n map(func: (lvi: T) => TRet) { return arrayMap(this, func); }\n find(func: (lvi: T, idx: number) => any) { return arrayFind(this, func); }\n forEach(func: (lvi: T, idx: number) => void) { return arrayForeach(this, func); }\n}\n","import { Action, Callbacks, ConvertObjectWithCallbacks, foreachFlaten, Func, FuncOrVal, Ref } from \"@yuuza/utils\";\nimport { addChild, getDOM, View } from \"./view\";\n\n// BuildDOM types & implementation:\nexport type BuildDomExpr = string | BuildDomNode | HTMLElement | Node | IDOM;\n\nexport type IDOM = Node | View | IView;\n\nexport enum MountState {\n /** The view is unmounted. */\n Unmounted,\n /** The view will be mounted soon. */\n Mounting,\n /** The view is mounted (i.e. the DOM is in the document). */\n Mounted,\n}\n\nexport interface IView {\n getDOM(): HTMLElement;\n addChild(child: BuildDomExpr): void;\n mountStateChanged(state: MountState): void;\n}\n\nexport type BuildDomTag = string;\n\nexport type BuildDomReturn = HTMLElement | Text | Node;\n\nexport interface BuildDomNode {\n tag?: BuildDomTag;\n\n child?: BuildDomExpr[] | BuildDomExpr;\n\n text?: FuncOrVal;\n hidden?: FuncOrVal;\n init?: Action;\n update?: Action;\n\n ref?: Ref;\n\n _id?: string;\n /** @deprecated Use `_id` instead */\n _key?: string;\n\n [key: string]: any;\n}\n\nexport class BuildDOMCtx {\n dict: Record | undefined = undefined;\n actions: DOMUpdateAction[] | undefined = undefined;\n view: View | undefined = undefined;\n\n setDict(key: string, node: HTMLElement) {\n if (!this.dict) this.dict = {};\n this.dict[key] = node;\n }\n addUpdateAction(action: DOMUpdateAction) {\n if (!this.actions) this.actions = [];\n this.actions.push(action);\n }\n update() {\n if (!this.actions) return;\n for (const a of this.actions) {\n a.run();\n }\n }\n}\n\ninterface DOMUpdateAction {\n run(): void;\n}\n\nclass TextAction implements DOMUpdateAction {\n constructor(readonly node: Node, readonly func: Func) { }\n run() {\n this.node.textContent = this.func();\n }\n}\n\nclass HiddenAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Func) { }\n run() {\n this.node.hidden = this.func();\n }\n}\n\nclass UpdateAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Action) { }\n run() {\n this.func(this.node);\n }\n}\n\nvar createElementFromTag = function (tag: BuildDomTag): HTMLElement {\n var reg = /[#\\.^]?[\\w\\-]+/y;\n var match;\n var ele;\n while (match = reg.exec(tag)) {\n var val = match[0];\n var ch = val[0];\n if (ch === '.') {\n ele.classList.add(val.substr(1));\n } else if (ch === '#') {\n ele.id = val.substr(1);\n } else {\n if (ele) throw new Error('unexpected multiple tags');\n ele = document.createElement(val);\n }\n }\n return ele;\n};\n\nfunction tryHandleValues(obj: BuildDomExpr, ctx: BuildDOMCtx | null) {\n if (typeof (obj) === 'string') { return document.createTextNode(obj); }\n if (typeof obj === 'function') {\n const val = (obj as any)();\n if (!val || typeof val !== 'object') {\n const node = document.createTextNode(val);\n ctx?.addUpdateAction(new TextAction(node, obj));\n return node;\n } else {\n throw new Error('Unexpected function return value');\n }\n }\n if (Node && obj instanceof Node) return obj as Node;\n return null;\n}\n\nvar buildDomCore = function (obj: BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null): BuildDomReturn {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n var r = tryHandleValues(obj, ctx);\n if (r) return r;\n if (obj instanceof JsxNode) {\n obj = obj.buildView(ctx, ttl);\n if (!(obj instanceof View)) return obj as Node;\n }\n if (obj instanceof View) {\n ctx?.view?._registerChild(obj);\n return obj.getDOM();\n }\n // if ('getDOM' in (obj as any)) return (obj as any).getDOM();\n const tag = (obj as BuildDomNode).tag;\n if (!tag) throw new Error('no tag');\n var node = createElementFromTag(tag);\n for (var key in obj as any) {\n if (obj.hasOwnProperty(key)) {\n var val = obj[key];\n buildDOMHandleKey(key, val, node, ctx, ttl);\n }\n }\n const init = obj['init'];\n if (init) init(node);\n\n return node;\n};\n\nvar buildDOMHandleKey = function (key: string, val: any, node: HTMLElement, ctx: BuildDOMCtx | null, ttl: number) {\n if (key === 'child') {\n if (val instanceof Array) {\n foreachFlaten(val, function (val) {\n node.appendChild(buildDomCore(val, ttl, ctx));\n });\n } else {\n node.appendChild(buildDomCore(val, ttl, ctx));\n }\n } else if (key === '_id' || key === '_key') {\n ctx!.setDict(val, node);\n } else if (key === 'ref') {\n (val as Ref).value = node;\n } else if (key === 'text') {\n if (typeof val === 'function') {\n ctx!.addUpdateAction(new TextAction(node, val));\n } else {\n node.textContent = val;\n }\n } else if (key === 'class') {\n node.className = val;\n } else if (key === 'style' && typeof val === 'object') {\n for (const styleKey in val) {\n if (Object.prototype.hasOwnProperty.call(val, styleKey)) {\n const styleVal = val[styleKey];\n node.style[styleKey] = styleVal;\n }\n }\n } else if (key === 'hidden' && typeof val === 'function') {\n ctx!.addUpdateAction(new HiddenAction(node, val));\n } else if (key === 'update' && typeof val === 'function') {\n ctx!.addUpdateAction(new UpdateAction(node, val));\n } else if (key === 'init') {\n // no-op\n } else {\n node[key] = val;\n }\n};\n\n/** \n * Build a DOM tree from a JavaScript object.\n * @example\n * buildDOM({\n * tag: 'div.item#firstitem',\n * onclick: () => console.info('clicked'),\n * child: [\n * 'Name: ',\n * { tag: 'span.name', text: name },\n * ],\n * });\n */\nexport function buildDOM(obj: BuildDomExpr, ctx?: BuildDOMCtx): T {\n return buildDomCore(obj, 32, ctx || null) as T;\n};\n\n/** Get a View instance or a DOM Node. View is preferred. */\nexport function buildView(obj: BuildDomExpr, ctx?: BuildDOMCtx): View | Node {\n if (obj instanceof View) {\n return obj;\n } else if (obj instanceof JsxNode) {\n return obj.buildView(ctx as any, 64);\n } else {\n return buildDOM(obj, ctx);\n }\n}\n\nexport class JsxNode {\n tag: T | string;\n attrs: Record | undefined;\n child: any[] | undefined;\n constructor(tag: any, attrs: Record | undefined, childs: any[] | undefined) {\n this.tag = tag;\n this.attrs = attrs;\n this.child = childs;\n }\n getDOM(): HTMLElement {\n return this.buildDom(null, 64) as any;\n }\n buildDom(ctx: BuildDOMCtx | null, ttl: number) {\n return getDOM(this.buildView(ctx, ttl));\n }\n buildView(ctx: BuildDOMCtx | null, ttl: number)\n : T extends IDOM ? T : T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : HTMLElement {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n let view: Node | View;\n if (typeof this.tag === 'string') {\n // tag is an HTML tag\n const dom = document.createElement(this.tag);\n view = dom;\n if (this.attrs) {\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n buildDOMHandleKey(key, val, dom, ctx, ttl);\n }\n }\n const init = this.attrs['init'];\n if (init) init(dom);\n }\n } else {\n // tag is a View\n view = this.tag as View;\n if (this.attrs) {\n let init: Action | null = null;\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n if (key == \"init\") {\n init = val;\n } else if (key == \"ref\") {\n (val as Ref).value = view;\n } else if (key.startsWith(\"on\") && view[key] instanceof Callbacks) {\n (view[key] as Callbacks).add(val);\n } else {\n view[key] = val;\n }\n }\n }\n if (init) init(view);\n }\n }\n if (this.child) {\n if (view instanceof View) {\n foreachFlaten(this.child, it => {\n (view as View).addChild(jsxBuildCore(it, ttl, (view as View)['_domctx']) as any);\n });\n } else {\n foreachFlaten(this.child, it => {\n const c = jsxBuildCore(it, ttl, ctx);\n if (c instanceof View) {\n (view as Node).appendChild(c.dom);\n ctx?.view?._registerChild(c);\n } else {\n addChild(view, c);\n }\n });\n }\n }\n return view as any;\n }\n addChild(child: IDOM): void {\n if (this.child == null) this.child = [];\n this.child.push(child);\n }\n}\n\nfunction jsxBuildCore(node: JsxNode | BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null) {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n if (node instanceof View) return node;\n var r = tryHandleValues(node, ctx);\n if (r) return r;\n if (node instanceof JsxNode) {\n return node.buildView(ctx, ttl);\n } else {\n console.error(\"Unknown node type\", node);\n throw new Error(\"Unknown node type\");\n }\n}\n\nexport function jsxBuild(node: JsxNode, ctx?: BuildDOMCtx): T {\n return jsxBuildCore(node, 64, ctx || new BuildDOMCtx());\n}\n\nexport type JsxTag = JsxDOMTag | JsxCtorTag;\nexport type JsxCtorTag = new (...args) => IDOM;;\nexport type JsxDOMTag = keyof HTMLElementTagNameMap;\n\nexport type JsxTagInstance =\n T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] :\n T extends (new (...args) => infer U) ? U extends IDOM ? U :\n never : never;\n\nexport type JsxAttrs =\n T extends JsxCtorTag ? JsxCtorAttrs :\n T extends JsxDOMTag ? JsxDOMAttrs :\n never;\n\nexport type JsxCtorAttrs> = {\n args?: ConstructorParameters;\n init?: Action;\n} & Partial>;\n\nexport type JsxDOMAttrs = Omit & Partial>;\n\nexport function jsxFactory>(tag: T, attrs: JsxAttrs, ...childs: any)\n : JsxNode {\n if (typeof tag === 'string') {\n return new JsxNode(tag, attrs, childs) as any;\n } else {\n const view = attrs?.args ?\n new (tag as any)(...attrs.args) :\n new (tag as any)();\n return new JsxNode(view, attrs, childs) as any;\n }\n}\n\nexport const jsx = jsxFactory;\n","import { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { buildDOM, IDOM } from \"./buildDOM\";\r\nimport { getDOM } from \"./view\";\r\n\r\n\r\nexport function clearChildren(node: Node) {\r\n while (node.lastChild) node.removeChild(node.lastChild);\r\n}\r\n\r\n/** Remove all children from the node (if needed) and append one (if present) */\r\nexport function replaceChild(node: Node, newChild?: Node) {\r\n clearChildren(node);\r\n if (newChild) node.appendChild(newChild);\r\n}\r\n\r\n/** Add or remove a classname for the element\r\n * @param force - true -> add; false -> remove; undefined -> toggle.\r\n */\r\nexport function toggleClass(element: HTMLElement, clsName: string, force?: boolean) {\r\n var clsList = element.classList;\r\n if (clsList.toggle) return clsList.toggle(clsName, force);\r\n if (force === undefined) force = !clsList.contains(clsName);\r\n if (force) clsList.add(clsName);\r\n else clsList.remove(clsName);\r\n return force;\r\n}\r\n\r\nexport interface FadeOutOptions {\r\n className?: string;\r\n duration?: number;\r\n remove?: boolean;\r\n}\r\n\r\nexport interface FadeoutResult {\r\n readonly finished: boolean;\r\n onFinished(callback: Action): this;\r\n cancel(finish?: boolean): void;\r\n}\r\n\r\n/** Fade out the element and remove it */\r\nexport function fadeout(element: HTMLElement, options?: FadeOutOptions): FadeoutResult {\r\n const { className = 'fading-out', duration = 500, remove = true } = options || {};\r\n element.classList.add(className);\r\n var cb: Action | null = null;\r\n var end: Action | null = (finish = true) => {\r\n if (!end) return; // use a random variable as flag ;)\r\n end = null;\r\n element.removeEventListener('transitionend', onTransitionend);\r\n element.classList.remove(className);\r\n if (remove && finish) {\r\n element.remove();\r\n }\r\n finish && cb?.();\r\n };\r\n var onTransitionend = function (e: TransitionEvent) {\r\n if (e.eventPhase === Event.AT_TARGET) end?.();\r\n };\r\n element.addEventListener('transitionend', onTransitionend);\r\n setTimeout(end, duration); // failsafe\r\n return {\r\n get finished() { return !end; },\r\n onFinished(callback: Action) {\r\n if (!end) callback();\r\n else cb = callback;\r\n return this;\r\n },\r\n cancel(finish = false) {\r\n end?.(finish);\r\n }\r\n };\r\n}\r\n\r\nexport function startBlockingDetect(threshold = 20) {\r\n var begin = Date.now();\r\n var lastRun = Date.now();\r\n setInterval(() => {\r\n var now = Date.now();\r\n if (now - lastRun >= threshold) {\r\n console.info(`[Blocking] ${(now - begin) / 1000}s: blocked for ${now - lastRun} ms`);\r\n }\r\n lastRun = now;\r\n }, 1);\r\n}\r\n\r\nexport class Timer {\r\n callback: () => void;\r\n cancelFunc: (() => void) | undefined;\r\n constructor(callback: () => void) {\r\n this.callback = callback;\r\n this.cancelFunc = undefined;\r\n }\r\n timeout(time: number) {\r\n this.tryCancel();\r\n var handle = setTimeout(this.callback, time);\r\n this.cancelFunc = () => window.clearTimeout(handle);\r\n }\r\n interval(time: number) {\r\n this.tryCancel();\r\n var handle = setInterval(this.callback, time);\r\n this.cancelFunc = () => window.clearInterval(handle);\r\n }\r\n animationFrame() {\r\n this.tryCancel();\r\n var handle = requestAnimationFrame(this.callback);\r\n this.cancelFunc = () => cancelAnimationFrame(handle);\r\n }\r\n tryCancel() {\r\n if (this.cancelFunc) {\r\n this.cancelFunc();\r\n this.cancelFunc = undefined;\r\n }\r\n }\r\n}\r\n\r\nexport type PtrEvent = ({\r\n type: 'mouse';\r\n ev: MouseEvent;\r\n} | {\r\n type: 'touch';\r\n touch: 'start' | 'move' | 'end';\r\n ev: TouchEvent;\r\n}) & {\r\n action: 'down' | 'move' | 'up';\r\n point: MouseEvent | Touch;\r\n};\r\n\r\nexport function listenPointerEvents(element: HTMLElement, callback: (e: PtrEvent) => void | 'track', options?: AddEventListenerOptions) {\r\n var touchDown = false;\r\n var mouseDown = function (e: MouseEvent) {\r\n if (callback({ type: 'mouse', ev: e, point: e, action: 'down' }) === 'track') {\r\n var mousemove = function (e: MouseEvent) {\r\n callback({ type: 'mouse', ev: e, point: e, action: 'move' });\r\n };\r\n var mouseup = function (e: MouseEvent) {\r\n document.removeEventListener('mousemove', mousemove, true);\r\n document.removeEventListener('mouseup', mouseup, true);\r\n callback({ type: 'mouse', ev: e, point: e, action: 'up' });\r\n };\r\n document.addEventListener('mousemove', mousemove, true);\r\n document.addEventListener('mouseup', mouseup, true);\r\n }\r\n };\r\n var touchStart = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n var ret = callback({\r\n type: 'touch', touch: 'start', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'down'\r\n });\r\n if (!touchDown && ret === 'track') {\r\n touchDown = true;\r\n var touchmove = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n callback({ type: 'touch', touch: 'move', ev: e, point: ct, action: 'move' });\r\n };\r\n var touchend = function (e: TouchEvent) {\r\n if (e.touches.length === 0) {\r\n touchDown = false;\r\n element.removeEventListener('touchmove', touchmove);\r\n element.removeEventListener('touchend', touchend);\r\n element.removeEventListener('touchcancel', touchend);\r\n }\r\n var ct = e.changedTouches[0];\r\n callback({\r\n type: 'touch', touch: 'end', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'up'\r\n });\r\n };\r\n element.addEventListener('touchmove', touchmove, options);\r\n element.addEventListener('touchend', touchend, options);\r\n element.addEventListener('touchcancel', touchend, options);\r\n }\r\n };\r\n element.addEventListener('mousedown', mouseDown, options);\r\n element.addEventListener('touchstart', touchStart, options);\r\n return {\r\n remove: () => {\r\n element.removeEventListener('mousedown', mouseDown, options);\r\n element.removeEventListener('touchstart', touchStart, options);\r\n }\r\n };\r\n}\r\n\r\nexport function listenEvent(element: HTMLElement, event: K,\r\n handler: (ev: HTMLElementEventMap[K]) => any) {\r\n element.addEventListener(event, handler);\r\n return {\r\n remove: () => element.removeEventListener(event, handler)\r\n };\r\n}\r\n\r\nexport function listenEvents>(element: HTMLElement, events: K,\r\n handler: (ev: HTMLElementEventMap[K[number]]) => any) {\r\n events.forEach(event => element.addEventListener(event, handler));\r\n return {\r\n remove: () => events.forEach(event => element.removeEventListener(event, handler))\r\n };\r\n}\r\n\r\nexport function injectCss(css: string, options?: { parent?: Node, tag?: string; }) {\r\n const parent = options?.parent ?? document.head;\r\n parent.appendChild(buildDOM({ tag: options?.tag ?? 'style', text: css }));\r\n}\r\n\r\nexport class TextCompositionWatcher {\r\n dom: HTMLElement;\r\n onCompositingChanged = new Callbacks();\r\n private _isCompositing = false;\r\n get isCompositing() { return this._isCompositing; }\r\n set isCompositing(val) {\r\n this._isCompositing = val;\r\n this.onCompositingChanged.invoke();\r\n }\r\n constructor(dom: IDOM) {\r\n this.dom = getDOM(dom) as HTMLElement;\r\n this.dom.addEventListener('compositionstart', (ev) => {\r\n this.isCompositing = true;\r\n });\r\n this.dom.addEventListener('compositionend', (ev) => {\r\n this.isCompositing = false;\r\n });\r\n }\r\n}\r\n\r\nexport class InputStateTracker {\r\n state = {\r\n mouseDown: false,\r\n mouseIn: false,\r\n focusIn: false,\r\n };\r\n private _removeEvents: Action | null = null;\r\n private _removePointerEvents: Action | null = null;\r\n readonly onChanged = new Callbacks>();\r\n constructor(readonly dom: HTMLElement) {\r\n this._removeEvents = listenEvents(dom, ['mouseenter', 'mouseleave', 'focusin', 'focusout'], (e) => {\r\n switch (e.type) {\r\n case 'mouseenter':\r\n this.stateChanged('mouseIn', true);\r\n break;\r\n case 'mouseleave':\r\n this.stateChanged('mouseIn', false);\r\n break;\r\n case 'focusin':\r\n this.stateChanged('focusIn', true);\r\n break;\r\n case 'focusout':\r\n this.stateChanged('focusIn', false);\r\n break;\r\n }\r\n }).remove;\r\n\r\n this._removePointerEvents = listenPointerEvents(dom, (e) => {\r\n if (e.action == 'down') {\r\n this.stateChanged('mouseDown', true);\r\n return 'track';\r\n } else if (e.action == 'up') {\r\n this.stateChanged('mouseDown', false);\r\n }\r\n }).remove;\r\n }\r\n private stateChanged(state: T, val: InputStateTracker['state'][T]) {\r\n this.state[state] = val;\r\n this.onChanged.invoke(state);\r\n }\r\n removeListeners() {\r\n this._removeEvents?.();\r\n this._removePointerEvents?.();\r\n this._removePointerEvents = this._removeEvents = null;\r\n }\r\n}\r\n\r\n\r\nexport interface IId {\r\n id: keyof any;\r\n}\r\n\r\nexport class DataUpdatingHelper {\r\n items: Iterable;\r\n update(newData: Iterable) {\r\n const oldData = this.items;\r\n var dataDict: Record = {};\r\n for (const n of newData) {\r\n dataDict[this.dataSelectId(n)] = n;\r\n }\r\n var itemDict: Record = {};\r\n var removed: T[] = [];\r\n for (const d of oldData) {\r\n const id = this.selectId(d);\r\n if (dataDict[id] !== undefined) {\r\n itemDict[id] = d;\r\n } else {\r\n removed.push(d);\r\n }\r\n }\r\n for (let i = removed.length - 1; i >= 0; i--)\r\n this.removeItem(removed[i]);\r\n var pos = 0;\r\n for (const n of newData) {\r\n const d = itemDict[this.dataSelectId(n)];\r\n if (d !== undefined) {\r\n this.updateItem(d, n);\r\n } else {\r\n this.addItem(n, pos);\r\n }\r\n pos++;\r\n }\r\n }\r\n updateOrRebuildAll(newData: Iterable) {\r\n this.update(newData);\r\n if (!this.isSame(newData)) this.rebuildAll(newData);\r\n }\r\n isSame(newData: Iterable) {\r\n var t = this.items[Symbol.iterator]();\r\n for (const n of newData) {\r\n var d = t.next();\r\n if (d.done) return false;\r\n if (this.selectId(d.value) !== this.dataSelectId(n)) return false;\r\n }\r\n if (!t.next().done) return false;\r\n return true;\r\n }\r\n rebuildAll(newData: Iterable) {\r\n var oldData = this.items;\r\n if (oldData instanceof Array) {\r\n for (let i = oldData.length - 1; i >= 0; i--) {\r\n this.removeItem(oldData[i]);\r\n }\r\n } else {\r\n for (const o of oldData) {\r\n this.removeItem(o);\r\n }\r\n }\r\n let i = 0;\r\n for (const n of newData) {\r\n this.addItem(n, i++);\r\n }\r\n }\r\n protected selectId(obj: T): any { return obj.id; }\r\n protected dataSelectId(obj: TData): any { return obj.id; }\r\n addItem(obj: TData, pos: number) { }\r\n updateItem(old: T, data: TData) { }\r\n removeItem(obj: T) { }\r\n}","// file: I18n.ts\n\nexport interface I18nData {\n [lang: string]: LangObj;\n}\n\nexport type LangObj = Record;\n\n/** Internationalization (aka i18n) helper class */\nexport class I18n {\n data: I18nData = {};\n curLang = 'en';\n missing = new Map();\n /** Get i18n string for `key`, return `key` when not found. */\n get(key, arg?: any[]): string {\n return this.get2(key, arg) || key;\n }\n /** Get i18n string for `key`, return `null` when not found. */\n get2(key, arg?: any[], lang?: string): string | null {\n lang = lang || this.curLang;\n var langObj = this.data[lang];\n if (!langObj) {\n console.log('i18n missing lang: ' + lang);\n return null;\n }\n var r = langObj[key];\n if (!r) {\n if (!this.missing.has(key)) {\n this.missing.set(key, 1);\n console.log('i18n missing key: ' + key);\n }\n return null;\n }\n if (arg) {\n for (const key in arg) {\n if (arg.hasOwnProperty(key)) {\n const val = arg[key];\n r = r.replace('{' + key + '}', val);\n // Note that it only replaces the first occurrence.\n }\n }\n }\n return r;\n }\n /** Fills data with an 2darray */\n add2dArray(array: [...string[][]]) {\n const langObjs: LangObj[] = [];\n const langs = array[0];\n for (const lang of langs) {\n langObjs.push(this.data[lang] = this.data[lang] || {});\n }\n for (let i = 1; i < array.length; i++) {\n const line = array[i];\n const key = line[0];\n for (let j = 0; j < line.length; j++) {\n const val = line[j];\n langObjs[j][key] = val;\n }\n }\n }\n renderElements(elements) {\n console.log('i18n elements rendering');\n elements.forEach(x => {\n for (const node of x.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // console.log('node', node);\n var r = this.get2(node.beforeI18n || node.textContent);\n if (r) {\n node.beforeI18n = node.beforeI18n || node.textContent;\n node.textContent = r;\n }\n else {\n if (node.beforeI18n) {\n node.textContent = node.beforeI18n;\n }\n console.log('missing key for node', node);\n }\n }\n }\n });\n }\n /**\n * Detect the best available language using\n * the user language preferences provided by the browser.\n * @param langs Available languages\n */\n static detectLanguage(langs: string[]) {\n var cur: string | null = null;\n var curIdx = -1;\n var languages: string[] = [];\n // ['en-US'] -> ['en-US', 'en']\n (navigator.languages || [navigator.language]).forEach(lang => {\n languages.push(lang);\n if (lang.indexOf('-') > 0)\n languages.push(lang.substr(0, lang.indexOf('-')));\n });\n langs.forEach((l) => {\n var idx = languages.indexOf(l);\n if (!cur || (idx !== -1 && idx < curIdx)) {\n cur = l;\n curIdx = idx;\n }\n });\n return cur || langs[0];\n }\n}\n\nexport function createStringBuilder(i18n: I18n) {\n var arrBuilder = createArrayBuilder(i18n);\n\n return function (literals: TemplateStringsArray, ...placeholders: any[]) {\n if (placeholders.length === 0) {\n return i18n.get(literals[0]);\n }\n return arrBuilder(literals, ...placeholders).join('');\n }\n}\n\nexport function createArrayBuilder(i18n: I18n) {\n var formatCache = new WeakMap();\n var parseCache = new Map();\n\n return function (literals: TemplateStringsArray, ...placeholders: T): (string | T)[] {\n if (placeholders.length === 0) {\n return [i18n.get(literals[0])];\n }\n\n // Generate format string from template string if it's not cached:\n let format = formatCache.get(literals);\n if (format === undefined) {\n format = '';\n for (let i = 0; i < literals.length; i++) {\n const lit = literals[i];\n format += lit;\n if (i < placeholders.length) {\n format += '{' + i + '}';\n }\n }\n formatCache.set(literals, format);\n }\n\n const translatedFormat = i18n.get(format);\n\n // Also cache parsed template\n let parsed = parseCache.get(translatedFormat);\n if (parsed === undefined) {\n parsed = parseTemplate(translatedFormat);\n }\n\n return parsed.map(x => typeof x == 'number' ? placeholders[x] : x);\n }\n}\n\nfunction parseTemplate(template: string): (string | number)[] {\n const result: (string | number)[] = [];\n let state = 0; // 0: normal / 1: after '{' / 2: after '}' / 3: after '{' and numbers\n let buf = '';\n for (let i = 0; i < template.length; i++) {\n const ch = template[i];\n switch (ch) {\n case '{':\n if (state == 0) state = 1;\n else if (state == 1) { state = 0; buf += '{'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n case '}':\n if (state == 3) { state = 0; result.push(+buf); buf = ''; }\n else if (state == 0) { state = 2; }\n else if (state == 2) { state = 0; buf += '}'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n default:\n if (state == 2) throw new Error(`Expected '}', got '${ch}' at ${i}`);\n else if (state == 1) { state = 3; if (buf) result.push(buf); buf = ''; }\n buf += ch;\n }\n }\n if (state != 0) throw new Error(\"Unexpected end of template string\");\n if (buf) result.push(buf);\n return result;\n}\n\nexport var i18n = new I18n();\n\nexport const I = createStringBuilder(i18n);\n","// file: viewlib.ts\n\nimport { injectCss } from \"./viewUtils\";\nimport css from \"../../style.css\";\n\nexport function getWebfxCss() {\n return css;\n}\n\nlet cssInjected = false;\nexport function injectWebfxCss(options?: { parent?: Node }) {\n if (!cssInjected) {\n injectCss(getWebfxCss(), { ...options, tag: \"style.webfx-injected-style\" });\n cssInjected = true;\n }\n}\n\n// Views and helpers are moved to ../views/\n","import { BuildDomExpr } from \"../lib/buildDOM\";\r\nimport { Func, FuncOrVal, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\n\r\nexport class TextView extends View {\r\n private _text: string | null = \"\";\r\n get text() { return this.dom?.textContent ?? this._text; }\r\n set text(val: FuncOrVal | null) {\r\n if (typeof val == 'function') {\r\n this._text = val();\r\n this.textFunc = val;\r\n } else {\r\n this._text = val;\r\n this.textFunc = null;\r\n }\r\n if (this.domCreated) {\r\n this.dom.textContent = this._text;\r\n }\r\n }\r\n\r\n textFunc: Func | null = null;\r\n\r\n postCreateDom() {\r\n super.postCreateDom();\r\n if (this._text) this.dom.textContent = this._text;\r\n }\r\n\r\n updateDom() {\r\n super.updateDom();\r\n if (this.textFunc) {\r\n this.dom.textContent = this.textFunc();\r\n }\r\n }\r\n}\r\n\r\nexport class ButtonView extends TextView {\r\n disabled: boolean = false;\r\n type: 'normal' | 'big' | 'inline' = 'normal';\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n this.updateDom();\r\n }\r\n createDom(): BuildDomExpr {\r\n return { tag: 'div.btn', tabIndex: 0 };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.toggleClass('disabled', this.disabled);\r\n this.toggleClass('btn-big', this.type === 'big');\r\n this.toggleClass('btn-inline', this.type === 'inline');\r\n }\r\n}\r\n\r\nexport class TextBtn extends TextView {\r\n clickable = true;\r\n active = false;\r\n right = false;\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'span.textbtn.no-selection'\r\n };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.tabIndex = this.clickable ? 0 : -1;\r\n this.toggleClass('clickable', this.clickable);\r\n this.toggleClass('active', this.active);\r\n this.dom.style.float = this.right ? 'right' : 'left';\r\n }\r\n}\r\n\r\n/** @deprecated Use `TextBtn` instead. */\r\nexport const TabBtn = TextBtn;\r\n\r\n/** @deprecated Use `TextBtn` instead. */\r\nexport type TabBtn = TextBtn;\r\n","import { Callbacks, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { buildDOM } from \"../lib/buildDOM\";\r\nimport { listenEvent, toggleClass } from \"../lib/viewUtils\";\r\n\r\n\r\nexport interface PositionOptions {\r\n x?: number;\r\n y?: number;\r\n anchor?: 'bottom';\r\n}\r\n\r\nexport function setPosition(dom: HTMLElement, options: PositionOptions) {\r\n let { x = 0, y = 0, anchor = 'bottom' } = options;\r\n dom.style.left = x + 'px';\r\n dom.style.top = y + 'px';\r\n if (!dom.classList.contains('anchor-' + anchor)) {\r\n dom.classList.forEach(x => {\r\n if (x.startsWith('anchor-')) {\r\n dom.classList.remove(x);\r\n }\r\n });\r\n dom.classList.add('anchor-' + anchor);\r\n }\r\n}\r\n\r\n/** DragManager is used to help exchange information between views */\r\nexport var dragManager = new class DragManager {\r\n /** The item being dragged */\r\n _currentItem: any | null = null;\r\n _currentArray: any[] | null = null;\r\n get currentItem() { return this._currentItem ?? this._currentArray?.[0] ?? null; };\r\n get currentArray() {\r\n if (this._currentItem) return [this._currentItem];\r\n return this._currentArray;\r\n }\r\n onDragStart = new Callbacks();\r\n onDragEnd = new Callbacks();\r\n start(item: any) {\r\n this._currentItem = item;\r\n console.log('drag start', item);\r\n this.onDragStart.invoke();\r\n }\r\n startArray(arr: any[]) {\r\n this._currentArray = arr;\r\n console.log('drag start array', arr);\r\n this.onDragStart.invoke();\r\n }\r\n end() {\r\n this._currentItem = null;\r\n this._currentArray = null;\r\n console.log('drag end');\r\n this.onDragEnd.invoke();\r\n }\r\n};\r\n\r\nexport class EditableHelper {\r\n editing = false;\r\n beforeEdit: string | null = null;\r\n element: HTMLElement;\r\n onComplete: ((newName: string) => void) | null = null;\r\n constructor(element: HTMLElement) {\r\n this.element = element;\r\n }\r\n startEdit(onComplete?: this['onComplete']) {\r\n if (this.editing) return;\r\n this.editing = true;\r\n var ele = this.element;\r\n var beforeEdit = this.beforeEdit = ele.textContent!;\r\n toggleClass(ele, 'editing', true);\r\n var input = buildDOM({\r\n tag: 'input', type: 'text', value: beforeEdit\r\n }) as HTMLInputElement;\r\n while (ele.firstChild) ele.removeChild(ele.firstChild);\r\n ele.appendChild(input);\r\n input.select();\r\n input.focus();\r\n var stopEdit = () => {\r\n this.editing = false;\r\n toggleClass(ele, 'editing', false);\r\n events.forEach(x => x.remove());\r\n input.remove();\r\n this.onComplete?.(input.value);\r\n onComplete?.(input.value);\r\n };\r\n var events = [\r\n listenEvent(input, 'keydown', (evv) => {\r\n if (evv.code === 'Enter') {\r\n stopEdit();\r\n evv.preventDefault();\r\n }\r\n }),\r\n listenEvent(input, 'focusout', (evv) => { stopEdit(); }),\r\n ];\r\n }\r\n startEditAsync() {\r\n return new Promise((resolve) => this.startEdit(resolve));\r\n }\r\n}\r\n\r\nexport class ViewToggle {\r\n items: Record;\r\n shownKeys: T[] = [];\r\n toggleMode: 'display' | 'hidden' | 'remove' = 'remove';\r\n container: View | null = null;\r\n constructor(init?: ObjectInit>) {\r\n objectInit(this, init);\r\n this.setShownKeys(this.shownKeys);\r\n }\r\n add(key: T, view: View) {\r\n const oldVal = this.items[key];\r\n if (oldVal) {\r\n if (oldVal instanceof Array) {\r\n (this.items[key] as View[]).push(view);\r\n } else {\r\n this.items[key] = [oldVal as View, view];\r\n }\r\n } else {\r\n this.items[key] = view;\r\n }\r\n this.toggleView(view, this.shownKeys.indexOf(key) >= 0);\r\n }\r\n setShownKeys(keys: T[]) {\r\n this.shownKeys = keys;\r\n const items = this.items;\r\n for (const key in items) {\r\n const show = keys.indexOf(key) >= 0;\r\n if (Object.prototype.hasOwnProperty.call(items, key)) {\r\n const val = items[key];\r\n if (val) {\r\n if (val instanceof Array) {\r\n for (const v of val) {\r\n this.toggleView(v, show);\r\n }\r\n } else if (val) {\r\n this.toggleView(val as View, show);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n toggleView(view: View, show: boolean, mode?: ViewToggle['toggleMode']) {\r\n if (!mode) mode = this.toggleMode;\r\n if (mode == 'display') {\r\n view.dom.style.display = show ? '' : 'none';\r\n } else if (mode == 'hidden') {\r\n view.dom.hidden = !show;\r\n } else if (mode == 'remove') {\r\n if (show != !!view.parentView) {\r\n if (show) {\r\n this.container!.appendView(view);\r\n } else {\r\n this.container!.removeView(view);\r\n }\r\n }\r\n } else {\r\n throw new Error('Unknown toggle mode');\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\nexport class ItemActiveHelper {\r\n funcSetActive = (item: T, val: boolean) => item.toggleClass('active', val);\r\n current: T | null = null;\r\n constructor(init?: ObjectInit>) {\r\n objectInit(this, init);\r\n }\r\n set(item: T | null) {\r\n if (this.current === item) return;\r\n if (this.current) this.funcSetActive(this.current, false);\r\n this.current = item;\r\n if (this.current) this.funcSetActive(this.current, true);\r\n }\r\n}\r\n","import { Action, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { ContainerView } from \"../lib/view\";\r\nimport { fadeout, Timer } from \"../lib/viewUtils\";\r\nimport { TextView } from \"./Basics\";\r\nimport { setPosition, PositionOptions } from \"./helpers\";\r\n\r\n\r\nexport class ToolTip extends TextView {\r\n createDom() {\r\n return {\r\n tag: 'div.tooltip'\r\n };\r\n }\r\n private _shown = false;\r\n private _timer = new Timer(() => this.close());\r\n get shown() { return this._shown; }\r\n show(options: PositionOptions & {\r\n parent?: HTMLElement, timeout?: number;\r\n }) {\r\n if (this.shown) return;\r\n this._shown = true;\r\n this._cancelClose?.();\r\n let { parent = document.body, timeout } = options;\r\n if (timeout) this._timer.timeout(timeout);\r\n const dom = this.dom;\r\n setPosition(dom, options);\r\n parent.appendChild(dom);\r\n }\r\n private _cancelClose: Action | null = null;\r\n close(fadeOutOptions?: Parameters[1]) {\r\n if (!this.shown) return;\r\n this._timer.tryCancel();\r\n this._shown = false;\r\n this._cancelClose = fadeout(this.dom, fadeOutOptions).cancel;\r\n }\r\n}\r\n\r\nexport namespace FlagsInput {\r\n export class FlagsInput extends ContainerView {\r\n constructor(flags?: string[] | Flag[]) {\r\n super();\r\n flags?.forEach(f => {\r\n var flag = f instanceof Flag ? f : new Flag({ text: Object.prototype.toString.call(f) });\r\n this.addView(flag);\r\n });\r\n }\r\n createDom() {\r\n return { tag: 'div.flags-input' };\r\n }\r\n }\r\n\r\n export class Flag extends TextView {\r\n get parentInput() { return this.parentView as (FlagsInput | undefined); }\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom() {\r\n return { tag: 'div.flags-input-item' };\r\n }\r\n }\r\n}","import { View } from \"../lib/view\";\r\n\r\nexport class Overlay extends View {\r\n createDom() {\r\n return { tag: 'div.overlay' };\r\n }\r\n\r\n /** @deprecated Use `setFlags` instead. */\r\n setCenterChild(centerChild: boolean) {\r\n return this.setFlags({ centerChild });\r\n }\r\n\r\n /** @deprecated Use `setFlags` instead. */\r\n setNoBg(nobg: boolean) {\r\n return this.setFlags({ nobg });\r\n }\r\n\r\n /** @deprecated Use `setFlags` instead. */\r\n setFixed(fixed: boolean) {\r\n return this.setFlags({ fixed });\r\n }\r\n\r\n setFlags(flags: { centerChild?: boolean, nobg?: boolean, fixed?: boolean, clickThrough?: boolean }) {\r\n for (const key in flags) {\r\n if (Object.prototype.hasOwnProperty.call(flags, key)) {\r\n this.toggleClass(key, flags[key]);\r\n }\r\n }\r\n return this;\r\n }\r\n}","import { Action, Callbacks, numLimit } from \"@yuuza/utils\";\r\nimport { ContainerView, View } from \"../lib/view\";\r\nimport { I, i18n } from \"@yuuza/i18n\";\r\nimport { TextBtn, TextView } from \"./Basics\";\r\nimport { Overlay } from \"./Overlay\";\r\nimport { BuildDomExpr, IDOM, MountState } from \"../lib/buildDOM\";\r\nimport { fadeout, listenPointerEvents } from \"../lib/viewUtils\";\r\n\r\n\r\nexport class Dialog extends View {\r\n parent: DialogParent = Dialog.defaultParent;\r\n overlay = new Overlay().setFlags({ centerChild: true, nobg: true });\r\n\r\n get domheader() { return this.header.dom; }\r\n header = new View({ tag: 'div.dialog-title.clearfix' });\r\n content = new View({ tag: 'div.dialog-content' });\r\n shown = false;\r\n\r\n btnTitle = new TextBtn({ active: true, clickable: false });\r\n btnClose = new TextBtn({ text: I`Close`, right: true });\r\n\r\n title = 'Dialog';\r\n allowClose = true;\r\n showCloseButton = true;\r\n onShown = new Callbacks();\r\n onClose = new Callbacks();\r\n autoFocus: View;\r\n\r\n focusTrap = new View({ tag: 'div.focustrap', tabIndex: 0 });\r\n\r\n static _defaultParent: DialogParent | null = null;\r\n static get defaultParent(): DialogParent {\r\n if (!Dialog._defaultParent)\r\n Dialog._defaultParent = new DialogParent();\r\n return Dialog._defaultParent;\r\n }\r\n static set defaultParent(val) {\r\n Dialog._defaultParent = val;\r\n }\r\n\r\n get width() { return this.dom.style.width; }\r\n set width(val) { this.dom.style.width = val; }\r\n\r\n get contentFlex() { return this.content.dom.classList.contains('flex'); }\r\n set contentFlex(val) { this.content.toggleClass('flex', !!val); }\r\n\r\n get resizable() { return this.dom.classList.contains('resize'); }\r\n set resizable(val) { this.toggleClass('resize', !!val); }\r\n\r\n constructor() {\r\n super();\r\n this.btnClose.onActive.add(() => this.allowClose && this.close());\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.dialog',\r\n tabIndex: 0,\r\n style: 'width: 300px',\r\n child: [\r\n this.header,\r\n this.content,\r\n this.focusTrap\r\n ]\r\n };\r\n }\r\n postCreateDom() {\r\n super.postCreateDom();\r\n this.addBtn(this.btnTitle);\r\n this.addBtn(this.btnClose);\r\n this.overlay.appendView(this);\r\n this.overlay.dom.addEventListener('mousedown', (ev) => {\r\n if (this.allowClose && ev.button === 0 && ev.target === this.overlay.dom) {\r\n ev.preventDefault();\r\n this.close();\r\n }\r\n });\r\n this.overlay.dom.addEventListener('keydown', (ev) => {\r\n if (this.allowClose && ev.keyCode === 27) { // ESC\r\n ev.preventDefault();\r\n this.close();\r\n } else if (ev.target === this.dom && ev.code === 'Tab' && ev.shiftKey) {\r\n ev.preventDefault();\r\n let tabables = this.dom.querySelectorAll('a, [tabindex]');\r\n if (tabables.length >= 2 && tabables[tabables.length - 2]['focus']) {\r\n // the last tabable is `focusTrap`, so the index used here is `length - 2`\r\n tabables[tabables.length - 2]['focus']();\r\n }\r\n }\r\n });\r\n\r\n // title bar pointer event handler:\r\n {\r\n let offset: { x: number; y: number; };\r\n listenPointerEvents(this.header.dom, (e) => {\r\n if (e.action === 'down') {\r\n if (e.ev.target !== this.header.dom && e.ev.target !== this.btnTitle.dom)\r\n return;\r\n e.ev.preventDefault();\r\n const rectOverlay = this.overlay.dom.getBoundingClientRect();\r\n const rect = this.dom.getBoundingClientRect();\r\n offset = {\r\n x: e.point.pageX - rectOverlay.x - rect.x,\r\n y: e.point.pageY - rectOverlay.y - rect.y\r\n };\r\n return 'track';\r\n } else if (e.action === 'move') {\r\n e.ev.preventDefault();\r\n const rect = this.overlay.dom.getBoundingClientRect();\r\n const pageX = numLimit(e.point.pageX, rect.left, rect.right);\r\n const pageY = numLimit(e.point.pageY, rect.top, rect.bottom);\r\n this.setOffset(pageX - offset.x, pageY - offset.y);\r\n }\r\n });\r\n }\r\n\r\n this.focusTrap.dom.addEventListener('focus', (ev) => {\r\n this.dom.focus();\r\n });\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.btnTitle.updateWith({ text: this.title });\r\n this.btnTitle.hidden = !this.title;\r\n this.btnClose.hidden = !(this.allowClose && this.showCloseButton);\r\n }\r\n addBtn(btn: TextBtn) {\r\n this.ensureDom();\r\n this.header.appendView(btn);\r\n }\r\n addContent(view: BuildDomExpr, replace?: boolean) {\r\n this.ensureDom();\r\n if (replace)\r\n this.content.removeAllView();\r\n this.content.addChild(view);\r\n }\r\n addChild(view: BuildDomExpr) {\r\n this.addContent(view);\r\n }\r\n setOffset(x: number, y: number) {\r\n this.dom.style.left = x ? x + 'px' : '';\r\n this.dom.style.top = y ? y + 'px' : '';\r\n this.overlay.setCenterChild(false);\r\n }\r\n getOffset() {\r\n var x = this.dom.style.left ? parseFloat(this.dom.style.left) : 0;\r\n var y = this.dom.style.top ? parseFloat(this.dom.style.top) : 0;\r\n return { x, y };\r\n }\r\n center() {\r\n this.setOffset(0, 0);\r\n this.overlay.setCenterChild(true);\r\n }\r\n show(ev?: MouseEvent) {\r\n if (this.shown)\r\n return;\r\n this.shown = true;\r\n this._cancelFadeout?.(true);\r\n this.ensureDom();\r\n this.parent.onDialogShowing(this);\r\n this.setTransformOrigin(ev);\r\n this.dom.focus();\r\n (this.autoFocus || this).dom.focus();\r\n this.onShown.invoke();\r\n }\r\n setTransformOrigin(ev?: MouseEvent) {\r\n if (ev) {\r\n const rect = this.dom.getBoundingClientRect();\r\n this.dom.style.transformOrigin = `${ev.x - rect.x}px ${ev.y - rect.y}px`;\r\n } else {\r\n this.dom.style.transformOrigin = '';\r\n }\r\n }\r\n private _cancelFadeout: Action;\r\n close() {\r\n if (!this.shown)\r\n return;\r\n this.shown = false;\r\n this.setTransformOrigin(undefined);\r\n this.onClose.invoke();\r\n this._cancelFadeout = fadeout(this.overlay.dom)\r\n .onFinished(() => this.overlay.parentView?.removeView(this.overlay))\r\n .cancel;\r\n Dialog.defaultParent.onDialogClosing(this);\r\n }\r\n waitClose(): Promise {\r\n return new Promise((resolve) => {\r\n var cb = this.onClose.add(() => {\r\n this.onClose.remove(cb);\r\n resolve();\r\n });\r\n });\r\n }\r\n}\r\n\r\n\r\nexport class MessageBox extends Dialog {\r\n allowClose = false;\r\n title = 'Message';\r\n result: 'none' | 'no' | 'yes' | 'ok' | 'cancel' = 'none';\r\n addResultBtns(results: this['result'][]) {\r\n for (const r of results) {\r\n this.addBtnWithResult(new TextBtn({ text: i18n.get('msgbox_' + r), right: true }), r);\r\n }\r\n return this;\r\n }\r\n setTitle(title: string) {\r\n this.title = title;\r\n if (this.domCreated) this.updateDom();\r\n return this;\r\n }\r\n addText(text: string) {\r\n this.addContent(new TextView({ tag: 'div.messagebox-text', text }));\r\n return this;\r\n }\r\n allowCloseWithResult(result: this['result'], showCloseButton?: boolean) {\r\n this.result = result;\r\n this.allowClose = true;\r\n this.showCloseButton = !!showCloseButton;\r\n if (this.domCreated) this.updateDom();\r\n return this;\r\n }\r\n addBtnWithResult(btn: TextBtn, result: this['result']) {\r\n btn.onActive.add(() => { this.result = result; this.close(); });\r\n this.addBtn(btn);\r\n return this;\r\n }\r\n async showAndWaitResult() {\r\n this.show();\r\n await this.waitClose();\r\n return this.result;\r\n }\r\n}\r\n\r\nexport class DialogParent {\r\n bgOverlay = new Overlay();\r\n dialogCount = 0;\r\n fixed = false;\r\n view: View;\r\n private _cancelFadeout: Action | null = null;\r\n\r\n constructor(view: BuildDomExpr = document.body) {\r\n this.view = View.getView(view);\r\n if (view === document.body) {\r\n this.fixed = true;\r\n this.view.mountStateChanged(MountState.Mounted);\r\n }\r\n }\r\n onDialogShowing(dialog: Dialog) {\r\n if (this.dialogCount++ === 0) {\r\n this._cancelFadeout?.(true);\r\n this.bgOverlay.setFlags({ fixed: this.fixed, clickThrough: true });\r\n this.view.appendView(this.bgOverlay);\r\n }\r\n dialog.overlay.setFlags({ fixed: this.fixed });\r\n this.view.appendView(dialog.overlay);\r\n }\r\n onDialogClosing(dialog: Dialog) {\r\n if (--this.dialogCount === 0) {\r\n this._cancelFadeout = fadeout(this.bgOverlay.dom)\r\n .onFinished(() => this.view.removeView(this.bgOverlay))\r\n .cancel;\r\n }\r\n }\r\n}\r\n","import { BuildDomExpr } from \"../lib/buildDOM\";\r\nimport { ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\n\r\n\r\nexport class InputView extends View {\r\n multiline: boolean = false;\r\n type = 'text';\r\n placeholder = '';\r\n get value() { return (this.dom as HTMLInputElement).value; }\r\n set value(val) { (this.dom as HTMLInputElement).value = val; }\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return this.multiline ? { tag: 'textarea.input-text' } : { tag: 'input.input-text' };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n if (this.dom instanceof HTMLInputElement) {\r\n this.dom.type = this.type;\r\n this.dom.placeholder = this.placeholder;\r\n }\r\n }\r\n}\r\n\r\nexport class LabeledInputBase extends View {\r\n label: string = '';\r\n input: T;\r\n get dominput(): HTMLInputElement { return this.input.dom as any; }\r\n constructor(init?: ObjectInit>) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.labeled-input',\r\n child: [\r\n { tag: 'div.input-label', text: () => this.label },\r\n this.input\r\n ]\r\n };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.input.domCreated && this.input.updateDom();\r\n }\r\n}\r\n\r\nexport class LabeledInput extends LabeledInputBase {\r\n type: string;\r\n get value() { return this.dominput.value; }\r\n set value(val) { this.dominput.value = val; }\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n if (!this.input) this.input = new InputView();\r\n }\r\n updateDom() {\r\n this.input.type = this.type;\r\n super.updateDom();\r\n }\r\n}\r\n","import { buildDOM, BuildDomExpr, IDOM } from \"../lib/buildDOM\";\r\nimport { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { View, ContainerView } from \"../lib/view\";\r\nimport { dragManager } from \"./helpers\";\r\nimport { clearChildren } from \"../lib/viewUtils\";\r\n\r\nexport abstract class ListViewItem extends View implements ISelectable {\r\n get listview() { return this.parentView instanceof ListView ? this.parentView as ListView : null; }\r\n get selectionHelper() { return this.listview?.selectionHelper; }\r\n\r\n get dragData() { return this.dom.textContent; }\r\n\r\n onDragover: ListView['onDragover'];\r\n onContextMenu: ListView['onContextMenu'];\r\n\r\n dragging?: boolean = undefined;\r\n\r\n private _selected: boolean = false;\r\n public get selected(): boolean { return this._selected; }\r\n public set selected(v: boolean) {\r\n this._selected = v;\r\n this.domCreated && this.updateDom();\r\n this.onSelectedChanged.invoke();\r\n }\r\n onSelectedChanged = new Callbacks();\r\n\r\n\r\n remove() {\r\n if (!this.listview) return;\r\n this.listview.remove(this);\r\n }\r\n\r\n protected postCreateDom() {\r\n super.postCreateDom();\r\n this.dom.setAttribute('role', 'listitem');\r\n this.dom.addEventListener('click', (ev) => {\r\n if (this.listview?.selectionHelper.handleItemClicked(this, ev)) return;\r\n this.listview?.onItemClicked?.(this);\r\n });\r\n this.dom.addEventListener('keydown', (ev) => {\r\n if (ev.code === 'Enter') {\r\n if (ev.altKey) {\r\n const rect = this.dom.getBoundingClientRect();\r\n const mouseev = new MouseEvent('contextmenu', {\r\n clientX: rect.left, clientY: rect.top,\r\n relatedTarget: this.dom\r\n });\r\n (this.onContextMenu ?? this.listview?.onContextMenu)?.(this, mouseev);\r\n } else {\r\n if (this.listview?.selectionHelper.handleItemClicked(this, ev)) return;\r\n this.listview?.onItemClicked?.(this);\r\n }\r\n ev.preventDefault();\r\n } else if (this.listview && (ev.code === 'ArrowUp' || ev.code === 'ArrowDown')) {\r\n const direction = ev.code === 'ArrowUp' ? -1 : 1;\r\n const item = this.listview.get(this.position! + direction);\r\n if (item) {\r\n item.dom.focus();\r\n ev.preventDefault();\r\n }\r\n } else if (this.listview && (ev.code === 'PageUp' || ev.code === 'PageDown')) {\r\n const dir = ev.code === 'PageUp' ? -1 : 1;\r\n const scrollBox = this.listview.scrollBox;\r\n const targetY = dir > 0 ? (this.dom.offsetTop + scrollBox.offsetHeight)\r\n : (this.dom.offsetTop + this.dom.offsetHeight - scrollBox.offsetHeight);\r\n const len = this.listview.length;\r\n let item = this;\r\n while (dir > 0 ? (targetY > item.dom.offsetTop + item.dom.offsetHeight)\r\n : (targetY < item.dom.offsetTop)) {\r\n const nextIdx = item.position! + dir;\r\n if (nextIdx < 0 || nextIdx >= len) break;\r\n item = this.listview.get(nextIdx);\r\n }\r\n if (item && item !== this) {\r\n item.dom.focus();\r\n ev.preventDefault();\r\n }\r\n } else if (this.listview && (ev.code === 'Home' || ev.code === 'End')) {\r\n this.listview.get(ev.code == 'Home' ? 0 : (this.listview.length - 1)).dom.focus();\r\n ev.preventDefault();\r\n } else if (this.listview && this.listview.selectionHelper.handleItemKeyDown(this, ev)) {\r\n // noop\r\n }\r\n });\r\n this.dom.addEventListener('contextmenu', (ev) => {\r\n (this.onContextMenu ?? this.listview?.onContextMenu)?.(this, ev);\r\n });\r\n this.dom.addEventListener('dragstart', (ev) => {\r\n if (!(this.dragging ?? this.listview?.dragging)) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n var arr: ListViewItem[] = [];\r\n if (this.selected && this.selectionHelper) {\r\n arr = [...this.selectionHelper.selectedItems];\r\n arr.sort((a, b) => a.position! - b.position!); // remove this line to get a new feature!\r\n } else {\r\n arr = [this];\r\n }\r\n dragManager.startArray(arr);\r\n ev.dataTransfer!.setData('text/plain', arr.map(x => x.dragData).join('\\r\\n'));\r\n arr.forEach(x => x.dom.style.opacity = '.5');\r\n });\r\n this.dom.addEventListener('dragend', (ev) => {\r\n var arr = dragManager.currentArray as ListViewItem[];\r\n dragManager.end();\r\n ev.preventDefault();\r\n arr.forEach(x => x.dom.style.opacity = '');\r\n });\r\n this.dom.addEventListener('dragover', (ev) => {\r\n this.dragHandler(ev, 'dragover');\r\n });\r\n this.dom.addEventListener('dragenter', (ev) => {\r\n this.dragHandler(ev, 'dragenter');\r\n });\r\n this.dom.addEventListener('dragleave', (ev) => {\r\n this.dragHandler(ev, 'dragleave');\r\n });\r\n this.dom.addEventListener('drop', (ev) => {\r\n this.dragHandler(ev, 'drop');\r\n });\r\n }\r\n // https://stackoverflow.com/questions/7110353\r\n private enterctr = 0;\r\n private dragoverPlaceholder: [HTMLElement, 'move' | 'move-after'] | null = null;\r\n dragHandler(ev: DragEvent, type: string) {\r\n const item = dragManager.currentItem;\r\n let items = dragManager.currentArray! as ListViewItem[];\r\n const drop = type === 'drop';\r\n const arg: DragArg = {\r\n source: item, target: this,\r\n sourceItems: items,\r\n event: ev, drop: drop,\r\n accept: false\r\n };\r\n if (item instanceof ListViewItem) {\r\n if (this.listview?.moveByDragging && item.listview === this.listview) {\r\n ev.preventDefault();\r\n const selfInside = (items.indexOf(this) >= 0);\r\n const after = ev.clientY - this.dom.getBoundingClientRect().top > this.dom.offsetHeight / 2;\r\n if (!(selfInside && drop))\r\n arg.accept = after ? 'move-after' : 'move';\r\n if (!drop) {\r\n ev.dataTransfer!.dropEffect = 'move';\r\n } else {\r\n if (items.indexOf(this) === -1) {\r\n let newpos = this.position!;\r\n if (after) newpos++;\r\n for (const it of items) {\r\n if (it !== this) {\r\n if (newpos > it.position!) newpos--;\r\n this.listview.move(it as this, newpos);\r\n newpos++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n const onDragover = this.onDragover ?? this.listview?.onDragover;\r\n if (!arg.accept && onDragover) {\r\n onDragover(arg as DragArg);\r\n if (drop || arg.accept) ev.preventDefault();\r\n }\r\n const onContextMenu = this.onContextMenu ?? this.listview?.onContextMenu;\r\n if (!arg.accept && items && items.indexOf(this) >= 0 && onContextMenu) {\r\n if (drop) onContextMenu(this, ev);\r\n else ev.preventDefault();\r\n }\r\n if (type === 'dragenter' || type == 'dragover' || type === 'dragleave' || drop) {\r\n if (type === 'dragenter') {\r\n this.enterctr++;\r\n } else if (type === 'dragleave') {\r\n this.enterctr--;\r\n } else if (type === 'drop') {\r\n this.enterctr = 0;\r\n }\r\n let hover = this.enterctr > 0;\r\n this.toggleClass('dragover', hover);\r\n let placeholder = hover && (arg.accept === 'move' || arg.accept === 'move-after') && arg.accept;\r\n if (placeholder != (this.dragoverPlaceholder?.[1] ?? false)) {\r\n this.dragoverPlaceholder?.[0].remove();\r\n this.dragoverPlaceholder = null;\r\n if (placeholder) {\r\n this.dragoverPlaceholder = [\r\n buildDOM({ tag: 'div.dragover-placeholder' }) as HTMLElement,\r\n placeholder\r\n ];\r\n var before = this.dom as Element;\r\n if (arg.accept === 'move-after') before = before.nextElementSibling!;\r\n this.dom.parentElement!.insertBefore(this.dragoverPlaceholder[0], before);\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\ninterface DragArg {\r\n source: ListViewItem, target: T, drop: boolean,\r\n sourceItems: ListViewItem[],\r\n accept: boolean | 'move' | 'move-after', event: DragEvent;\r\n}\r\n\r\nexport class ListView extends ContainerView implements Iterable {\r\n // private items: Array = [];\r\n onItemClicked: null | ((item: T) => void) = null;\r\n /**\r\n * Allow user to drag an item.\r\n */\r\n dragging = false;\r\n /**\r\n * Allow user to drag an item and change its position.\r\n */\r\n moveByDragging = false;\r\n\r\n selectionHelper = new SelectionHelper();\r\n\r\n private _scrollBox: HTMLElement | null = null;\r\n\r\n get scrollBox() { return this._scrollBox || this.dom; }\r\n set scrollBox(val: HTMLElement) { this._scrollBox = val; }\r\n\r\n onItemMoved: null | ((item: T, from: number) => void) = null;\r\n /** \r\n * When dragover or drop\r\n */\r\n onDragover: null | ((arg: DragArg) => void) = null;\r\n onContextMenu: null | ((item: ListViewItem, ev: MouseEvent) => void) = null;\r\n constructor(container?: BuildDomExpr) {\r\n super(container);\r\n this.selectionHelper.itemProvider = this;\r\n }\r\n protected postCreateDom() {\r\n super.postCreateDom();\r\n this.dom.setAttribute('role', 'list');\r\n }\r\n add(item: T, pos?: number) {\r\n this.addView(item, pos);\r\n if (this.dragging) item.dom.draggable = true;\r\n }\r\n remove(item: T | number, keepSelected?: boolean) {\r\n item = this._ensureItem(item);\r\n if (!keepSelected && item.selected) this.selectionHelper.toggleItemSelection(item);\r\n this.removeView(item);\r\n }\r\n move(item: T | number, newpos: number) {\r\n item = this._ensureItem(item);\r\n this.remove(item, true);\r\n this.add(item, newpos);\r\n this.onItemMoved?.(item, item.position!);\r\n }\r\n /** Remove all items */\r\n removeAll() {\r\n while (this.length) this.remove(this.length - 1);\r\n }\r\n /** Remove all items and all DOM children */\r\n clear() {\r\n this.removeAll();\r\n clearChildren(this.dom);\r\n }\r\n ReplaceChild(dom: IDOM) {\r\n this.clear();\r\n this.dom.appendChild(dom.getDOM());\r\n }\r\n}\r\n\r\nexport interface ISelectable {\r\n selected: boolean;\r\n position?: number;\r\n}\r\n\r\nexport class SelectionHelper {\r\n _enabled: boolean = false;\r\n get enabled() { return this._enabled; }\r\n set enabled(val) {\r\n if (!!val === !!this._enabled) return;\r\n this._enabled = val;\r\n while (this.selectedItems.length)\r\n this.toggleItemSelection(this.selectedItems[0], false);\r\n this.lastToggledItem = null;\r\n this.onEnabledChanged.invoke();\r\n }\r\n onEnabledChanged = new Callbacks();\r\n\r\n itemProvider: null | {\r\n get: (pos: number) => TItem;\r\n length: number;\r\n } = null;\r\n\r\n ctrlForceSelect = false;\r\n\r\n selectedItems: TItem[] = [];\r\n onSelectedItemsChanged = new Callbacks<(action: 'add' | 'remove', item: TItem) => void>();\r\n get count() { return this.selectedItems.length; }\r\n\r\n /** For shift-click */\r\n lastToggledItem: TItem | null = null;\r\n\r\n /** Returns true if it's handled by the helper. */\r\n handleItemClicked(item: TItem, ev: MouseEvent | KeyboardEvent): boolean {\r\n if (!this.enabled) {\r\n if (!this.ctrlForceSelect || !ev.ctrlKey) return false;\r\n this.enabled = true;\r\n }\r\n if (ev.shiftKey && this.lastToggledItem && this.itemProvider) {\r\n var toSelect = !!this.lastToggledItem.selected;\r\n var start = item.position!, end = this.lastToggledItem.position!;\r\n if (start > end) [start, end] = [end, start];\r\n for (let i = start; i <= end; i++) {\r\n this.toggleItemSelection(this.itemProvider.get(i), toSelect);\r\n }\r\n this.lastToggledItem = item;\r\n } else {\r\n this.toggleItemSelection(item);\r\n }\r\n ev.preventDefault();\r\n return true;\r\n }\r\n\r\n /** Returns true if it's handled by the helper. */\r\n handleItemKeyDown(item: TItem, ev: KeyboardEvent): boolean {\r\n if (!this.enabled) return false;\r\n if (this.itemProvider && ev.ctrlKey && ev.code === 'KeyA') {\r\n const len = this.itemProvider.length;\r\n for (let i = 0; i < len; i++) {\r\n this.toggleItemSelection(this.itemProvider.get(i), true);\r\n }\r\n ev.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n toggleItemSelection(item: TItem, force?: boolean) {\r\n if (force !== undefined && force === !!item.selected) return;\r\n if (item.selected) {\r\n item.selected = false;\r\n this.selectedItems.remove(item);\r\n this.onSelectedItemsChanged.invoke('remove', item);\r\n } else {\r\n item.selected = true;\r\n this.selectedItems.push(item);\r\n this.onSelectedItemsChanged.invoke('add', item);\r\n }\r\n this.lastToggledItem = item;\r\n if (this.count === 0 && this.ctrlForceSelect) this.enabled = false;\r\n }\r\n}\r\n\r\n\r\nexport class LazyListView extends ListView {\r\n private _loaded = 0;\r\n private _lazy = false;\r\n private _slowLoading: Promise | null = null;\r\n private _autoLoad: { interval: number, batchSize: number; } | null = null;\r\n get loaded() { return this.loaded; }\r\n get slowLoading() { return this._slowLoading; }\r\n get autoLoad() { return this._autoLoad; }\r\n get lazy() { return this._lazy; }\r\n set lazy(val) {\r\n this._lazy = val;\r\n if (!val) this.ensureLoaded(this.length - 1);\r\n }\r\n ensureLoaded(pos: number) {\r\n if (pos >= this.length) pos = this.length - 1;\r\n while (this._loaded <= pos) {\r\n this.dom.appendChild(this.items[this._loaded].dom);\r\n this._loaded++;\r\n }\r\n }\r\n loadNext(batchSize = 50) {\r\n if (this._loaded < this.length) {\r\n this.ensureLoaded(Math.min(this.length - 1, this._loaded + batchSize - 1));\r\n return true;\r\n }\r\n return false;\r\n }\r\n slowlyLoad(interval = 30, batchSize = 50, autoLoad = false) {\r\n if (autoLoad) this.enableAutoLoad(interval, batchSize);\r\n if (this._slowLoading) return this._slowLoading;\r\n if (this._loaded >= this.length) return Promise.resolve(true);\r\n return this._slowLoading = new Promise((r) => {\r\n var cancel: Action;\r\n var cont: Action;\r\n var callback = () => {\r\n if (!this._slowLoading || !this.loadNext(batchSize)) {\r\n this.lazy = !!this._autoLoad;\r\n cancel();\r\n r(!!this._slowLoading);\r\n this._slowLoading = null;\r\n } else {\r\n cont();\r\n }\r\n };\r\n if (interval == -1 && window['requestIdleCallback']) {\r\n let handle: number;\r\n cancel = () => window['cancelIdleCallback'](handle);\r\n cont = () => {\r\n handle = window['requestIdleCallback'](callback);\r\n };\r\n cont();\r\n } else {\r\n if (interval == -1) interval = 30;\r\n let timer = setInterval(callback, interval);\r\n cancel = () => clearInterval(timer);\r\n cont = () => { };\r\n }\r\n });\r\n }\r\n enableAutoLoad(interval = 30, batchSize = 50) {\r\n this._autoLoad = { interval, batchSize };\r\n this.slowlyLoad(interval, batchSize);\r\n }\r\n stopLoading() {\r\n this._slowLoading = null;\r\n this._autoLoad = null;\r\n }\r\n unload() {\r\n this.stopLoading();\r\n for (let i = this._loaded - 1; i >= 0; i--) {\r\n this.items[i].dom.remove();\r\n }\r\n this.lazy = true;\r\n this._loaded = 0;\r\n }\r\n protected _insertToDom(item: T, pos: number) {\r\n if (!this.lazy || pos < this._loaded) {\r\n super._insertToDom(item, pos);\r\n this._loaded++;\r\n } else {\r\n if (this._autoLoad) {\r\n this.slowlyLoad(this._autoLoad.interval, this._autoLoad.batchSize);\r\n }\r\n }\r\n }\r\n protected _removeFromDom(item: T) {\r\n if (item.position! < this._loaded) {\r\n super._removeFromDom(item);\r\n this._loaded--;\r\n }\r\n }\r\n}\r\n","import { ObjectInit, objectInit, Callbacks, Action } from \"@yuuza/utils\";\r\nimport { BuildDomExpr, BuildDomNode } from \"../lib/buildDOM\";\r\nimport { ListViewItem, ListView } from \"./ListView\";\r\nimport { Overlay } from \"./Overlay\";\r\nimport { mountView, unmountView } from \"../lib/view\";\r\nimport { fadeout } from \"../lib/viewUtils\";\r\n\r\n\r\nexport class MenuItem extends ListViewItem {\r\n text: string = '';\r\n cls: 'normal' | 'dangerous' = 'normal';\r\n keepOpen = false;\r\n constructor(init: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.item.no-selection',\r\n tabIndex: 0\r\n };\r\n }\r\n postCreateDom() {\r\n super.postCreateDom();\r\n this.onActive.add((ev) => {\r\n if (this.parentView instanceof ContextMenu) {\r\n if (!this.keepOpen && !this.parentView.keepOpen) this.parentView.close();\r\n }\r\n });\r\n }\r\n private _lastcls;\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.textContent = this.text;\r\n if (this.cls !== this._lastcls) {\r\n if (this._lastcls) this.dom.classList.remove(this._lastcls);\r\n if (this.cls) this.dom.classList.add(this.cls);\r\n }\r\n }\r\n}\r\n\r\nexport class MenuLinkItem extends MenuItem {\r\n link: string = '';\r\n download: string = '';\r\n constructor(init: ObjectInit) {\r\n super(init);\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n var dom = super.createDom() as BuildDomNode;\r\n dom.tag = 'a.item.no-selection';\r\n dom.target = \"_blank\";\r\n return dom;\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n (this.dom as HTMLAnchorElement).href = this.link;\r\n (this.dom as HTMLAnchorElement).download = this.download;\r\n }\r\n}\r\n\r\nexport class MenuInfoItem extends MenuItem {\r\n text: string = '';\r\n constructor(init: ObjectInit) {\r\n super(init);\r\n this.keepOpen = true;\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.menu-info'\r\n };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.textContent = this.text;\r\n }\r\n}\r\n\r\n\r\nexport class ContextMenu extends ListView {\r\n keepOpen = false;\r\n useOverlay = true;\r\n private _visible = false;\r\n get visible() { return this._visible; };\r\n overlay: Overlay | null = null;\r\n onClose = new Callbacks();\r\n private _originalFocused: Element | null = null;\r\n constructor(items?: MenuItem[]) {\r\n super({ tag: 'div.context-menu', tabIndex: 0 });\r\n items?.forEach(x => this.add(x));\r\n }\r\n postCreateDom() {\r\n super.postCreateDom();\r\n this.dom.addEventListener('focusout', (e) => {\r\n !this.dom.contains(e.relatedTarget as HTMLElement) && this.close();\r\n });\r\n this.dom.addEventListener('keydown', (e) => {\r\n if (e.code === 'Escape') {\r\n e.preventDefault();\r\n this.close();\r\n }\r\n });\r\n }\r\n show(arg: { x: number, y: number; } | { ev: MouseEvent; }) {\r\n if (this._visible) {\r\n console.trace(\"[ContextMenu] show() called when it's already visible.\");\r\n return;\r\n }\r\n if ('ev' in arg) arg = {\r\n x: arg.ev.clientX,\r\n y: arg.ev.clientY\r\n };\r\n this._visible = true;\r\n if (this.useOverlay) {\r\n if (!this.overlay) {\r\n this.overlay = new Overlay().setFixed(true);\r\n this.overlay.dom.style.background = 'rgba(0, 0, 0, .1)';\r\n this.overlay.dom.addEventListener('mousedown', (ev) => {\r\n if (ev.eventPhase !== Event.AT_TARGET) return;\r\n ev.preventDefault();\r\n this.close();\r\n });\r\n }\r\n this.overlay.appendView(this);\r\n mountView(document.body, this.overlay);\r\n } else {\r\n mountView(document.body, this);\r\n }\r\n this._originalFocused = document.activeElement;\r\n this.setPosition(arg);\r\n this.dom.focus();\r\n }\r\n setPosition(arg: { x: number, y: number }) {\r\n if (!this._visible) {\r\n console.trace(\"[ContextMenu] setPosition() called when it's not visible.\");\r\n return;\r\n }\r\n this.dom.style.left = '0';\r\n this.dom.style.top = '0';\r\n var parentWidth = document.body.offsetWidth;\r\n var parentHeight = document.body.offsetHeight;\r\n if (this.useOverlay) {\r\n const overlayDom = this.overlay!.dom;\r\n parentWidth = overlayDom.offsetWidth;\r\n parentHeight = overlayDom.offsetHeight;\r\n }\r\n this.dom.style.maxHeight = parentHeight + 'px';\r\n var width = this.dom.offsetWidth, height = this.dom.offsetHeight;\r\n var x = arg.x, y = arg.y;\r\n if (x + width > parentWidth) x -= width;\r\n if (y + height > parentHeight) y -= height;\r\n if (x < 0) {\r\n if (arg.x > parentWidth / 2) x = 0;\r\n else x = parentWidth - width;\r\n }\r\n if (y < 0) {\r\n if (arg.y > parentHeight / 2) y = 0;\r\n else y = parentHeight - height;\r\n }\r\n this.dom.style.left = x + 'px';\r\n this.dom.style.top = y + 'px';\r\n this.dom.style.transformOrigin = `${arg.x - x}px ${arg.y - y}px`;\r\n }\r\n close() {\r\n if (this._visible) {\r\n this._visible = false;\r\n this.onClose.invoke();\r\n this._originalFocused?.['focus']?.();\r\n this._originalFocused = null;\r\n if (this.overlay) fadeout(this.overlay.dom).onFinished(() => unmountView(document.body, this.overlay!));\r\n fadeout(this.dom).onFinished(() => !this.overlay && unmountView(document.body, this));\r\n }\r\n }\r\n}\r\n","import { Action, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { IDOM, BuildDomExpr } from \"../lib/buildDOM\";\r\nimport { TextView } from \"./Basics\";\r\n\r\n\r\ntype SectionActionOptions = { text: string, onclick: Action; };\r\n\r\nexport class Section extends View {\r\n titleView = new TextView({ tag: 'span.section-title' });\r\n headerView = new View({\r\n tag: 'div.section-header',\r\n child: [\r\n this.titleView\r\n ]\r\n });\r\n content: View;\r\n constructor(arg?: { title?: BuildDomExpr, content?: BuildDomExpr, actions?: SectionActionOptions[]; }) {\r\n super();\r\n this.ensureDom();\r\n if (arg) {\r\n if (arg.title) this.setTitle(arg.title);\r\n if (arg.content) this.setContent(arg.content);\r\n if (arg.actions) arg.actions.forEach(x => this.addAction(x));\r\n }\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.section',\r\n child: [\r\n this.headerView\r\n ]\r\n };\r\n }\r\n setTitle(text: BuildDomExpr) {\r\n this.titleView.removeAllView();\r\n this.titleView.addChild(text);\r\n }\r\n setContent(view: BuildDomExpr) {\r\n if (this.content) this.removeView(this.content);\r\n this.content = View.getView(view);\r\n this.appendView(this.content);\r\n }\r\n addAction(arg: SectionAction | SectionActionOptions) {\r\n var view = arg instanceof View ?\r\n arg :\r\n new SectionAction({ text: arg.text, onActive: arg.onclick });\r\n this.headerView.appendView(view);\r\n }\r\n}\r\n\r\nexport class SectionAction extends TextView {\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom() {\r\n return {\r\n tag: 'div.section-action.clickable',\r\n tabIndex: 0\r\n }\r\n }\r\n}\r\n","import { ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { fadeout, Timer } from \"../lib/viewUtils\";\r\n\r\n\r\nexport class ToastsContainer extends View {\r\n static default: ToastsContainer = new ToastsContainer();\r\n parentDom: HTMLElement | null = null;\r\n toasts: Toast[] = [];\r\n createDom() {\r\n return { tag: 'div.toasts-container' };\r\n }\r\n addToast(toast: Toast) {\r\n if (this.toasts.length === 0)\r\n this.show();\r\n this.toasts.push(toast);\r\n }\r\n removeToast(toast: Toast) {\r\n this.toasts.remove(toast);\r\n if (this.toasts.length === 0)\r\n this.remove();\r\n }\r\n show() {\r\n var parent = this.parentDom || document.body;\r\n parent.appendChild(this.dom);\r\n }\r\n remove() {\r\n this.dom.remove();\r\n }\r\n}\r\n\r\nexport class Toast extends View {\r\n text: string = '';\r\n container: ToastsContainer;\r\n shown = false;\r\n timer = new Timer(() => this.close());\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n if (!this.container) this.container = ToastsContainer.default;\r\n }\r\n show(timeout?: number) {\r\n if (!this.shown) {\r\n this.container.addToast(this);\r\n this.container.appendView(this);\r\n this.shown = true;\r\n }\r\n if (timeout) this.timer.timeout(timeout);\r\n else this.timer.tryCancel();\r\n }\r\n close() {\r\n if (!this.shown) return;\r\n this.shown = false;\r\n fadeout(this.dom)\r\n .onFinished(() => this.container.removeToast(this));\r\n }\r\n createDom() {\r\n return { tag: 'div.toast' };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.textContent = this.text;\r\n }\r\n static show(text: string, timeout?: number) {\r\n var toast = new Toast({ text });\r\n toast.show(timeout);\r\n return toast;\r\n }\r\n}","import { Action, objectInit, ObjectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { I } from \"@yuuza/i18n\";\r\nimport { BuildDomExpr } from \"../lib/buildDOM\";\r\n\r\ntype LoadingIndicatorState = 'normal' | 'running' | 'error';\r\n\r\nexport class LoadingIndicator extends View {\r\n constructor(init?: ObjectInit) {\r\n super();\r\n if (init) objectInit(this, init);\r\n }\r\n private _status: LoadingIndicatorState = 'running';\r\n get state() { return this._status; }\r\n set state(val: LoadingIndicatorState) {\r\n this._status = val;\r\n ['running', 'error', 'normal'].forEach(x => this.toggleClass(x, val === x));\r\n }\r\n private _text: string;\r\n private _textdom: HTMLElement;\r\n get content() { return this._text; }\r\n set content(val: string) { this._text = val; this.ensureDom(); this._textdom.textContent = val; }\r\n onclick: ((e: MouseEvent) => void) | null = null;\r\n reset() {\r\n this.state = 'running';\r\n this.content = I`Loading`;\r\n this.onclick = null;\r\n }\r\n error(err, retry?: Action) {\r\n this.state = 'error';\r\n this.content = I`Oh no! Something just goes wrong:` + '\\r\\n' + err;\r\n if (retry) {\r\n this.content += '\\r\\n' + I`[Click here to retry]`;\r\n }\r\n this.onclick = retry as any;\r\n }\r\n async action(func: () => Promise) {\r\n try {\r\n await func();\r\n } catch (error) {\r\n this.error(error, () => this.action(func));\r\n }\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.loading-indicator',\r\n child: [{\r\n tag: 'div.loading-indicator-inner',\r\n child: [{ tag: 'div.loading-indicator-text', _id: 'text' }]\r\n }],\r\n onclick: (e) => this.onclick?.(e)\r\n };\r\n }\r\n postCreateDom() {\r\n this._textdom = this.getDomById('text')!;\r\n this.reset();\r\n }\r\n}\r\n","export const version = \"1.10.3\""],"names":["_object_assign","Object","assign","_object_hasOwnProperty","prototype","hasOwnProperty","strPadLeft","str","len","ch","length","fileSizeUnits","numLimit","num","min","max","isNaN","arrayRemove","array","val","i","splice","arrayMap","arr","func","Array","map","idx","ret","item","arrayForeach","foreachFlaten","it","arrayFind","find","objectApply","obj","kv","keys","key","call","indexOf","objectInit","startsWith","Callbacks","add","remove","this","constructor","_cbs","undefined","_cbs_invoking","_hook","_invoking","onChanged","_a","size","invoke","args","Error","forEach","x","apply","error","console","clear","callback","Set","_b","delete","waitOnce","arguments","Promise","resolve","reject","cb","Ref","value","_value","_onChanged","from","ref","View","dom","parentView","_position","_domctx","BuildDOMCtx","_dom","_baseView","_mountState","MountState","Unmounted","_onActive","_childViews","view","domExprCreated","getView","position","ensureDom","domCreated","baseView","mountState","hidden","r","createDom","buildView","postCreateDom","updateDom","document","createElement","debugging","dataset","update","mountStateChanged","state","trace","child","getDomById","id","dict","updateWith","updateAllWith","updateAll","toggleClass","clsName","force","getDOM","addChild","appendView","appendChild","onActive","addEventListener","e","handleKeyDown","code","rect","getBoundingClientRect","MouseEvent","clientX","clientY","y","relatedTarget","preventDefault","childViews","addView","pos","_registerChild","Mounted","Mounting","_insertToDom","changeMountState","items","push","removeView","_ensureItem","_removeFromDom","removeAllView","removeFromParent","updateChildren","insertBefore","tryGetDOM","idom","Node","parent","childView","warnMountingView","buildDOM","data","mountView","unmountView","ContainerView","super","Symbol","iterator","get","exports","actions","setDict","node","addUpdateAction","action","a","run","TextAction","textContent","HiddenAction","UpdateAction","tryHandleValues","ctx","createTextNode","buildDomCore","ttl","JsxNode","tag","match","ele","reg","exec","classList","substr","createElementFromTag","buildDOMHandleKey","init","className","styleKey","styleVal","style","attrs","childs","buildDom","jsxBuildCore","c","jsxFactory","jsx","clearChildren","lastChild","removeChild","element","clsList","toggle","contains","fadeout","options","duration","end","finish","removeEventListener","onTransitionend","eventPhase","Event","AT_TARGET","setTimeout","finished","onFinished","cancel","Timer","cancelFunc","timeout","time","tryCancel","handle","window","clearTimeout","interval","setInterval","clearInterval","animationFrame","requestAnimationFrame","cancelAnimationFrame","listenPointerEvents","touchDown","mouseDown","type","ev","point","mousemove","mouseup","touchStart","ct","changedTouches","touch","touchmove","touchend","touches","listenEvent","event","handler","listenEvents","events","injectCss","css","head","text","I18n","curLang","missing","Map","arg","get2","lang","langObj","log","has","set","replace","add2dArray","langObjs","langs","line","j","renderElements","elements","childNodes","nodeType","TEXT_NODE","beforeI18n","detectLanguage","cur","curIdx","languages","navigator","language","l","createStringBuilder","i18n","arrBuilder","createArrayBuilder","literals","placeholders","join","formatCache","WeakMap","parseCache","format","translatedFormat","parsed","template","result","buf","parseTemplate","I","getWebfxCss","cssInjected","TextView","_text","textFunc","TextBtn","clickable","active","right","tabIndex","float","TabBtn","setPosition","anchor","left","top","dragManager","_currentItem","_currentArray","onDragStart","onDragEnd","currentItem","_c","currentArray","start","startArray","FlagsInput","FlagsInput_1","flags","f","flag","Flag","toString","parentInput","Overlay","setCenterChild","centerChild","setFlags","setNoBg","nobg","setFixed","fixed","Dialog","domheader","header","defaultParent","_defaultParent","DialogParent","width","contentFlex","content","resizable","overlay","shown","btnTitle","btnClose","title","allowClose","showCloseButton","onShown","onClose","focusTrap","close","addBtn","button","target","keyCode","shiftKey","tabables","querySelectorAll","offset","rectOverlay","pageX","pageY","bottom","setOffset","focus","btn","addContent","getOffset","parseFloat","center","show","_cancelFadeout","onDialogShowing","setTransformOrigin","autoFocus","transformOrigin","onDialogClosing","waitClose","body","bgOverlay","dialogCount","dialog","clickThrough","InputView","multiline","placeholder","HTMLInputElement","LabeledInputBase","dominput","input","label","ListViewItem","dragging","_selected","onSelectedChanged","enterctr","dragoverPlaceholder","listview","ListView","selectionHelper","dragData","selected","v","setAttribute","handleItemClicked","onItemClicked","altKey","mouseev","onContextMenu","_d","_f","_e","handleItemKeyDown","dir","scrollBox","targetY","offsetTop","offsetHeight","nextIdx","direction","selectedItems","sort","b","dataTransfer","setData","opacity","dragHandler","drop","source","sourceItems","accept","moveByDragging","selfInside","after","newpos","move","dropEffect","onDragover","hover","_g","_h","before","nextElementSibling","parentElement","_scrollBox","container","SelectionHelper","onItemMoved","itemProvider","draggable","keepSelected","toggleItemSelection","removeAll","ReplaceChild","_enabled","onEnabledChanged","ctrlForceSelect","onSelectedItemsChanged","lastToggledItem","enabled","count","ctrlKey","toSelect","MenuItem","cls","keepOpen","ContextMenu","_lastcls","visible","_visible","useOverlay","_originalFocused","background","activeElement","parentWidth","offsetWidth","parentHeight","overlayDom","maxHeight","height","SectionAction","ToastsContainer","parentDom","toasts","addToast","toast","removeToast","default","Toast","timer","_whenNotify","_callback","wait","disabled","cancelled","onCancelled","throwIfCancelled","newData","oldData","dataDict","n","dataSelectId","itemDict","removed","d","selectId","removeItem","updateItem","addItem","updateOrRebuildAll","isSame","rebuildAll","t","next","done","o","old","editing","beforeEdit","onComplete","startEdit","firstChild","select","stopEdit","evv","startEditAsync","list","pop","mouseIn","focusIn","_removeEvents","_removePointerEvents","stateChanged","removeListeners","funcSetActive","current","_func","computed","rawValue","_loaded","_lazy","_slowLoading","_autoLoad","loaded","slowLoading","autoLoad","lazy","ensureLoaded","loadNext","batchSize","Math","slowlyLoad","enableAutoLoad","cont","stopLoading","unload","_status","onclick","_textdom","reset","err","retry","_id","link","download","href","addResultBtns","results","addBtnWithResult","setTitle","addText","allowCloseWithResult","showAndWaitResult","titleView","headerView","setContent","addAction","queue","maxCount","runningCount","enter","prom","res","exit","queueMicrotask","shift","isCompositing","_isCompositing","onCompositingChanged","_shown","_timer","_cancelClose","fadeOutOptions","shownKeys","toggleMode","setShownKeys","oldVal","toggleView","mode","display","sum","btoa","encodeURIComponent","p1","String","fromCharCode","nameFunc","existsFunc","date","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","toLocaleString","sec","round","floor","unit","toFixed","blob","reader","FileReader","onload","onerror","readAsDataURL","newChild","threshold","begin","lastRun","info"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"webfx.min.js","sources":["https://github.com/lideming/webfx/raw/v1.10.4/packages/utils/src/utils.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/view.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/buildDOM.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/viewUtils.ts","https://github.com/lideming/webfx/raw/v1.10.4/packages/i18n/src/i18n.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/viewlib.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Basics.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/helpers.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Dev.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Overlay.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Dialog.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Inputs.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/ListView.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Menu.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Section.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/Toast.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/views/LoadingIndicator.ts","https://github.com/lideming/webfx/raw/v1.10.4/version"],"sourcesContent":["// file: utils.ts\n\nconst _object_assign = Object.assign;\nconst _object_hasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Time & formatting utils:\n\nexport function strPadLeft(str: string, len: number, ch: string = ' ') {\n while (str.length < len) {\n str = ch + str;\n }\n return str;\n}\n\nexport function formatDuration(sec: number | any) {\n if (typeof sec !== 'number' || isNaN(sec)) return '--:--';\n sec = Math.round(sec);\n var min = Math.floor(sec / 60);\n sec %= 60;\n return strPadLeft(min.toString(), 2, '0') + ':' + strPadLeft(sec.toString(), 2, '0');\n}\n\nconst fileSizeUnits = ['B', 'KB', 'MB', 'GB', 'TB'];\nexport function formatFileSize(size: number | any) {\n if (typeof size !== \"number\" || isNaN(size)) return 'NaN';\n var unit = 0;\n while (unit < fileSizeUnits.length - 1 && size >= 1024) {\n unit++;\n size /= 1024;\n }\n return (unit > 0 ? size.toFixed(2) : size) + ' ' + fileSizeUnits[unit];\n}\n\nexport function formatDateTime(date: Date) {\n var now = new Date();\n var sameday = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n return sameday ? date.toLocaleTimeString() : date.toLocaleString();\n}\n\nexport function numLimit(num: number, min: number, max: number) {\n return (num < min || typeof num != 'number' || isNaN(num)) ? min :\n (num > max) ? max : num;\n}\n\nexport function createName(nameFunc: (num: number) => string, existsFunc: (str: string) => boolean) {\n for (let num = 0; ; num++) {\n let str = nameFunc(num);\n if (!existsFunc(str)) return str;\n }\n}\n\n/** \n * btoa, but supports Unicode and uses UTF-8 encoding.\n * @see https://stackoverflow.com/questions/30106476\n */\nexport function base64EncodeUtf8(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\n function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1) as any);\n }));\n}\n\nexport function sleepAsync(time: number): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport function arrayRemove(array: T[], val: T) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === val) {\n array.splice(i, 1);\n i--;\n }\n }\n}\n\nexport function arrayInsert(array: T[], val: T, pos?: number) {\n if (pos === undefined) array.push(val);\n else array.splice(pos, 0, val);\n}\n\nexport function arrayMap(arr: Iterable, func: (item: T, idx: number) => TRet) {\n if (arr instanceof Array) return arr.map(func);\n var idx = 0;\n var ret = new Array((arr as any).length);\n for (var item of arr) {\n ret[idx] = (func(item, idx));\n idx++;\n }\n return ret;\n}\n\nexport function arrayForeach(arr: Iterable, func: (item: T, idx: number) => void) {\n var idx = 0;\n for (var item of arr) {\n func(item, idx++);\n }\n}\n\n\nexport function foreachFlaten(arr: T[], func: Action) {\n for (const it of arr) {\n if (it instanceof Array) {\n foreachFlaten(it as T[], func);\n } else {\n func(it);\n }\n }\n}\n\nexport function arrayFind(arr: Iterable, func: (item: T, idx: number) => any): T | null {\n if (arr instanceof Array) return arr.find(func);\n var idx = 0;\n for (var item of arr) {\n if (func(item, idx++)) return item;\n }\n return null;\n}\n\nexport function arraySum(arr: Iterable, func: (item: T) => number | null | undefined) {\n var sum = 0;\n arrayForeach(arr, (x) => {\n var val = func(x);\n if (val) sum += val;\n });\n return sum;\n}\n\nexport function objectApply(obj: Partial, kv?: Partial, keys?: Array) {\n if (kv) {\n if (!keys) return _object_assign(obj, kv);\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n obj[key] = val;\n }\n }\n }\n return obj;\n}\n\nexport function objectInit(obj: T, kv?: ObjectInit, keys?: Array) {\n if (kv) {\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n if (key.startsWith(\"on\") && obj[key] instanceof Callbacks) {\n (obj[key] as Callbacks).add(val);\n } else {\n obj[key] = val;\n }\n }\n }\n }\n return obj;\n}\n\nexport function mod(a: number, b: number): number {\n if (a < 0) a = b + a;\n return a % b;\n}\n\nexport function readBlobAsDataUrl(blob: Blob) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (ev) => {\n resolve(reader.result as string);\n };\n reader.onerror = (ev) => reject();\n reader.readAsDataURL(blob);\n });\n}\n\nArray.prototype.remove = function (item) {\n arrayRemove(this, item);\n};\n\ndeclare global {\n interface Array {\n /**\n * (Extension method) remove the specified item from array.\n * @param item The item to be removed from array\n */\n remove(item: T): void;\n }\n}\n\nexport type ObjectInit = Partial>;\n\nexport type ConvertObjectWithCallbacks = {\n [P in keyof T]: P extends `on${string}` ? CallbackInit : T[P];\n};\n\nexport type CallbackInit = T extends Callbacks ? T | U : T;\n\n// Some interesting function types:\nexport type AnyFunc = (...args: any) => any;\nexport type Action = (arg: T) => void;\nexport type Func = () => TRet;\nexport type AsyncFunc = Func>;\n\nexport type FuncOrVal = T | Func;\n\nclass CallbacksImpl {\n private _cbs: Set | undefined = undefined;\n private _cbs_invoking: Set | undefined = undefined;\n private _hook?: Callbacks<(adding: boolean, func: T) => void> = undefined;\n private _invoking = false;\n get onChanged() {\n this._hook ??= new Callbacks();\n return this._hook;\n }\n get length() { return this._cbs ? this._cbs.size : 0; }\n invoke(...args: Parameters) {\n if (!this._cbs) return;\n if (this._invoking) throw new Error(\"Cannot invoke callbacks during invocation\");\n this._invoking = true;\n this._cbs.forEach((x: (...args: any) => void) => {\n try {\n x.apply(this, args);\n } catch (error) {\n console.error(\"Error in callback\", error);\n }\n });\n if (this._cbs_invoking) {\n for (const x of this._cbs_invoking) {\n this._cbs.add(x);\n }\n }\n this._cbs_invoking?.clear();\n this._invoking = false;\n }\n add(callback: T) {\n if (this._cbs === undefined) {\n this._cbs = new Set();\n }\n if (this._invoking) {\n this._cbs_invoking ??= new Set();\n this._cbs_invoking.add(callback);\n } else {\n this._cbs.add(callback);\n }\n this._hook?.invoke(true, callback);\n return callback;\n }\n remove(callback: T) {\n if (this._cbs === undefined) return;\n if (this._invoking) {\n this._cbs_invoking?.delete(callback);\n }\n this._cbs.delete(callback);\n this._hook?.invoke(false, callback);\n }\n\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n waitOnce(callback?: T) {\n if (arguments.length === 0) {\n return new Promise>((resolve, reject) => {\n const cb = ((...args) => {\n this.remove(cb);\n resolve(args);\n }) as T;\n this.add(cb);\n });\n } else if (callback) {\n const cb = ((...args) => {\n this.remove(cb);\n return callback(...args);\n }) as T;\n this.add(cb);\n } else {\n throw new Error(\"Invalid callback\");\n }\n }\n}\n\nexport interface Callbacks {\n invoke(...args: Parameters): void;\n add(callback: T): T;\n remove(callback: T): void;\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n readonly length: number;\n readonly onChanged: Callbacks<(adding: boolean, func: T) => void>;\n}\nexport const Callbacks: { new (): Callbacks; } = CallbacksImpl;\n\nlet accessedRefs: Set> | null = null;\n\nfunction beginRefCollect() {\n accessedRefs = new Set>()\n}\n\nfunction endRefCollect() {\n const result = accessedRefs;\n accessedRefs = null;\n return result!;\n}\n\nexport class Ref {\n private _value: T | undefined = undefined;\n private _onChanged: Callbacks>> | undefined = undefined;\n constructor(value?: T) {\n this._value = value;\n }\n get onChanged() {\n if (!this._onChanged) this._onChanged = new Callbacks();\n return this._onChanged;\n }\n get value() {\n if (accessedRefs) accessedRefs.add(this);\n return this._value;\n }\n set value(val) {\n this._value = val;\n if (this._onChanged) this.onChanged.invoke(this);\n }\n static from(value: T) {\n const ref = new Ref();\n ref._value = value;\n return ref as (Ref & { value: T });\n }\n static computed(func: Func) {\n const ref = new Ref();\n let deps: Set> | null = null;\n const updateValue = () => {\n if (deps) {\n for (const dep of deps) {\n dep.onChanged.remove(updateValue);\n }\n }\n beginRefCollect();\n const value = func();\n deps = endRefCollect();\n for (const dep of deps) {\n dep.onChanged.add(updateValue);\n }\n ref.value = value;\n };\n updateValue();\n return ref;\n }\n}\n\nexport class Lazy {\n private _func?: Func;\n private _value?: T;\n get computed() { return !this._func; }\n get rawValue() { return this._value; }\n get value(): T {\n if (this._func) {\n this._value = this._func();\n this._func = undefined;\n }\n return this._value!;\n }\n constructor(func: Func) {\n this._func = func;\n this._value = undefined;\n }\n}\n\nexport class Semaphore {\n queue = new Array();\n maxCount = 1;\n runningCount = 0;\n constructor(init: ObjectInit) {\n objectInit(this, init);\n }\n enter(): Promise {\n if (this.runningCount === this.maxCount) {\n var resolve: Action;\n var prom = new Promise((res) => { resolve = res; });\n this.queue.push(resolve!);\n return prom;\n } else {\n this.runningCount++;\n return Promise.resolve();\n }\n }\n exit() {\n if (this.runningCount === this.maxCount && this.queue.length) {\n if (window.queueMicrotask) {\n window.queueMicrotask(this.queue.shift() as any);\n } else {\n setTimeout(this.queue.shift()!, 0);\n }\n } else {\n this.runningCount--;\n }\n }\n async run(func: () => Promise) {\n await this.enter();\n try {\n await func();\n } finally {\n this.exit();\n }\n }\n}\n\n/** Just like CancellationToken[Source] on .NET */\nexport class CancelToken {\n cancelled = false;\n onCancelled = new Callbacks();\n cancel() {\n if (this.cancelled) return;\n this.cancelled = true;\n this.onCancelled.invoke();\n }\n throwIfCancelled() {\n if (this.cancelled)\n throw new Error(\"operation cancelled.\");\n }\n}\n\nexport class AutoResetEvent {\n private _whenNotify: Promise | null = null;\n private _callback: Action | null = null;\n\n wait() {\n if (!this._whenNotify) {\n this._whenNotify = new Promise(r => {\n this._callback = () => {\n this._callback = this._whenNotify = null;\n r();\n };\n });\n }\n return this._whenNotify;\n }\n set() {\n this._callback && this._callback();\n }\n}\n\nexport class EventRegistrations {\n list: { event: Callbacks; func: AnyFunc; }[] = [];\n add(event: Callbacks, func: T) {\n this.list.push({ event, func });\n event.add(func);\n return func;\n }\n removeAll() {\n while (this.list.length) {\n var r = this.list.pop()!;\n r.event.remove(r.func);\n }\n }\n}\n","import { Action, Callbacks, objectApply, arrayFind, arrayForeach, arrayMap } from \"@yuuza/utils\";\nimport { buildDOM, BuildDOMCtx, BuildDomExpr, buildView, IDOM, IView, JsxNode, MountState } from \"./buildDOM\";\nimport { toggleClass } from \"./viewUtils\";\n\n\nexport class View implements IView {\n constructor(dom?: BuildDomExpr) {\n this._domctx.view = this;\n if (dom) this.domExprCreated(dom);\n }\n\n static getView(obj: BuildDomExpr) { return obj instanceof View ? obj : new View(obj); }\n\n static debugging = false;\n\n public parentView?: View = undefined;\n public _position?: number = undefined;\n get position() { return this._position; }\n\n private _domctx = new BuildDOMCtx();\n\n protected _dom: T | undefined = undefined;\n public get dom() {\n this.ensureDom();\n return this._dom!;\n }\n public get domCreated() { return !!this._dom; }\n\n private _baseView: View | undefined = undefined;\n public get baseView() { return this._baseView; }\n\n private _mountState: MountState = MountState.Unmounted;\n public get mountState() { return this._mountState; }\n\n public get hidden() { return this.dom.hidden; }\n public set hidden(val: boolean) { this.dom.hidden = val; }\n\n public ensureDom() {\n if (!this._dom) {\n var r = this.createDom();\n this.domExprCreated(r);\n }\n }\n\n private domExprCreated(r: BuildDomExpr) {\n var view = buildView(r, this._domctx);\n if (view instanceof View) {\n this._baseView = view;\n this._dom = view.dom as T;\n } else {\n this._dom = view as T;\n }\n this.postCreateDom();\n this.updateDom();\n }\n\n protected createDom(): BuildDomExpr {\n return document.createElement('div');\n }\n\n /** Will be called when the dom is created */\n protected postCreateDom() {\n if (View.debugging) {\n if (this.dom.dataset)\n this.dom.dataset['webfx'] = MountState[this._mountState];\n }\n }\n\n /** Will be called when the dom is created, after postCreateDom() */\n public updateDom() {\n this._domctx.update();\n }\n\n /** Will be called when the mounting state is changed */\n public mountStateChanged(state: MountState) {\n if (state == this._mountState) {\n console.trace(\"mountState unchanged\", state, this);\n return;\n }\n this._mountState = state;\n if (View.debugging) {\n if (!this._baseView && this.domCreated && this.dom.dataset) {\n if (this.dom.dataset['webfx'] == MountState[state]) {\n console.trace('mountState on the DOM is changed by other view', state, this);\n }\n this.dom.dataset['webfx'] = MountState[state];\n }\n }\n if (this._baseView) {\n // let the baseView do the rest\n this._baseView.mountStateChanged(state);\n return;\n }\n if (this._childViews) for (const child of this._childViews) {\n child.mountStateChanged(state);\n }\n }\n\n public getDomById(id: string): HTMLElement | null {\n this.ensureDom();\n return this._domctx.dict?.[id] ?? null;\n }\n\n /** Assign key-values and call `updateDom()` */\n updateWith(kv: Partial) {\n objectApply(this, kv);\n this.updateDom();\n }\n updateAllWith(kv: Partial) {\n objectApply(this, kv);\n this.updateAll();\n }\n toggleClass(clsName: string, force?: boolean) {\n toggleClass(this.dom, clsName, force);\n }\n\n // Implements `IDOMInstance`\n // appendView(view: View) { this.dom.appendChild(view.dom); }\n getDOM() { return this.dom; }\n addChild(child: BuildDomExpr) {\n const view = buildView(child, this._domctx);\n if (view instanceof View) {\n this.appendView(view);\n } else {\n this.dom.appendChild(view);\n }\n }\n\n private _onActive: Callbacks> | undefined = undefined;\n get onActive() {\n if (!this._onActive) {\n this._onActive = new Callbacks>();\n this.dom.addEventListener('click', (e: MouseEvent) => {\n this._onActive!.invoke(e);\n });\n this.dom.addEventListener('keydown', (e: KeyboardEvent) => {\n this.handleKeyDown(e);\n });\n }\n return this._onActive;\n }\n\n handleKeyDown(e: KeyboardEvent) {\n if (e.code === 'Enter') {\n const rect = this.dom.getBoundingClientRect();\n this._onActive?.invoke(new MouseEvent('click', {\n clientX: rect.x, clientY: rect.y,\n relatedTarget: this.dom\n }));\n e.preventDefault();\n }\n }\n\n private _childViews: View[] | undefined = undefined;\n get childViews(): View[] {\n // Return the childViews of the baseView if exists\n if (this._baseView) { return this._baseView.childViews; }\n\n // Lazy creating childViews array\n if (!this._childViews) this._childViews = [];\n return this._childViews;\n }\n appendView(view: View) {\n this.addView(view);\n }\n addView(view: View, pos?: number) {\n this._registerChild(view, pos, false);\n if (this._mountState == MountState.Mounted) view.mountStateChanged(MountState.Mounting);\n this._insertToDom(view, pos);\n if (this._mountState != MountState.Unmounted) view.mountStateChanged(this._mountState);\n }\n _registerChild(view: View, pos?: number, changeMountState = true) {\n const items = this.childViews;\n if (view.parentView) throw new Error('the view is already in a container view');\n view.parentView = this;\n if (pos === undefined) {\n view._position = items.length;\n items.push(view);\n } else {\n items.splice(pos, 0, view);\n for (let i = pos; i < items.length; i++) {\n items[i]._position = i;\n }\n }\n if (changeMountState && this._mountState != MountState.Unmounted) {\n view.mountStateChanged(this._mountState);\n }\n }\n removeView(view: View | number) {\n view = this._ensureItem(view);\n this._removeFromDom(view);\n var pos = view._position!;\n view.parentView = view._position = undefined;\n this.childViews.splice(pos, 1);\n for (let i = pos; i < this.childViews.length; i++) {\n this.childViews[i]._position = i;\n }\n if (this._mountState != MountState.Unmounted) {\n view.mountStateChanged(MountState.Unmounted);\n }\n }\n removeAllView() {\n while (this.childViews.length) this.removeView(this.childViews.length - 1);\n }\n removeFromParent() {\n if (this.parentView) this.parentView.removeView(this);\n }\n /** updateDom() then updateChildren() */\n updateAll() {\n this.updateDom();\n if (this.baseView) return this.baseView.updateAll();\n this.updateChildren();\n }\n /** Call updateDom() on the whole tree */\n updateChildren() {\n if (this._childViews) for (const child of this._childViews) {\n child.updateAll();\n }\n }\n protected _insertToDom(item: View, pos?: number) {\n if (pos == undefined) this.dom.appendChild(item.dom);\n else this.dom.insertBefore(item.dom, this.childViews[pos + 1]?.dom || null);\n }\n protected _removeFromDom(item: View) {\n if (item.domCreated) item.dom.remove();\n }\n protected _ensureItem(item: View | number) {\n if (typeof item === 'number') item = this.childViews[item];\n else if (!item) throw new Error('item is null or undefined.');\n else if (item.parentView !== this) throw new Error('the item is not in this listview.');\n return item;\n }\n\n}\n\nexport function tryGetDOM(idom: IDOM | null | undefined) {\n if (!idom) return idom;\n if (idom instanceof View) {\n return idom.getDOM();\n } else if (idom instanceof Node) {\n return idom;\n } else if (idom && \"getDOM\" in idom) {\n return idom.getDOM();\n }\n}\n\nexport function getDOM(idom: IDOM) {\n var dom = tryGetDOM(idom);\n if (!dom) {\n console.error(\"getDOM():\", idom);\n throw new Error(\"getDOM(): unsupported parameter: \" + idom);\n }\n return dom;\n}\n\nexport function appendView(parent: IDOM, childView: View) {\n warnMountingView(parent, childView);\n getDOM(parent).appendChild(childView.dom);\n}\n\nexport function addChild(parent: IDOM, child: BuildDomExpr) {\n // fast path\n if (parent instanceof View) parent.addChild(child);\n else if (parent instanceof Node) {\n warnMountingView(parent, child);\n parent.appendChild(buildDOM(child));\n }\n // slow path\n else if ('addChild' in parent) {\n parent.addChild(child);\n } else {\n console.error(\"addChild():\", { parent, child });\n throw new Error(\"addChild(): unsupported parent\");\n }\n}\n\nfunction warnMountingView(parent: IDOM, child: BuildDomExpr) {\n if (child instanceof View) {\n const data = { parent, child };\n if (parent instanceof Node)\n console.trace(\"Should use `mountView()` to mount a view to DOM.\", data);\n else\n console.trace(\"Should use `View.addChild()` or `View.appendView()` to add a view into another view.\", data);\n }\n}\n\nexport function mountView(parent: Node, view: View) {\n view.mountStateChanged(MountState.Mounting);\n parent.appendChild(view.dom);\n view.mountStateChanged(MountState.Mounted);\n}\n\nexport function unmountView(parent: Node, view: View) {\n view.dom.remove();\n view.mountStateChanged(MountState.Unmounted);\n}\n\ndeclare global {\n interface Node {\n /** @deprecated Use the exported function `getDOM()` instead. */\n getDOM(): this;\n /** @deprecated Use the exported function `appendView()` instead. */\n appendView(view: View);\n /** @deprecated Use the exported function `addChild()` instead. */\n addChild(child: BuildDomExpr): void;\n }\n}\n\n\nNode.prototype.getDOM = function () {\n console.trace(\"webfx: Node.getDOM() is deprecated. Please use the exported function `getDOM()` instead.\");\n return this;\n};\n\nNode.prototype.addChild = function (child) {\n console.trace(\"webfx: Node.addChild() is deprecated. Please use the exported function `addChild()` instead.\");\n addChild(this, child);\n};\n\nNode.prototype.appendView = function (this: Node, view: View) {\n console.trace(\"webfx: Node.appendView() is deprecated. Please use the exported function `appendView()` instead.\");\n appendView(this, view);\n};\n\nexport class ContainerView extends View {\n addView(view: T, pos?: number): void {\n return super.addView(view, pos);\n }\n removeView(view: T | number): void {\n super.removeView(view);\n }\n protected _insertToDom(item: T, pos: number): void {\n super._insertToDom(item, pos);\n }\n protected _removeFromDom(item: T): void {\n super._removeFromDom(item);\n }\n protected _ensureItem(item: T | number): T {\n return super._ensureItem(item) as T;\n }\n\n get items() { return this.childViews as T[]; }\n [Symbol.iterator]() { return (this.childViews as T[])[Symbol.iterator](); }\n get length() { return this.childViews.length; }\n get(idx: number) {\n return this.childViews[idx] as T;\n }\n map(func: (lvi: T) => TRet) { return arrayMap(this, func); }\n find(func: (lvi: T, idx: number) => any) { return arrayFind(this, func); }\n forEach(func: (lvi: T, idx: number) => void) { return arrayForeach(this, func); }\n}\n","import { Action, Callbacks, ConvertObjectWithCallbacks, foreachFlaten, Func, FuncOrVal, Ref } from \"@yuuza/utils\";\nimport { addChild, getDOM, View } from \"./view\";\n\n// BuildDOM types & implementation:\nexport type BuildDomExpr = string | BuildDomNode | HTMLElement | Node | IDOM;\n\nexport type IDOM = Node | View | IView;\n\nexport enum MountState {\n /** The view is unmounted. */\n Unmounted,\n /** The view will be mounted soon. */\n Mounting,\n /** The view is mounted (i.e. the DOM is in the document). */\n Mounted,\n}\n\nexport interface IView {\n getDOM(): HTMLElement;\n addChild(child: BuildDomExpr): void;\n mountStateChanged(state: MountState): void;\n}\n\nexport type BuildDomTag = string;\n\nexport type BuildDomReturn = HTMLElement | Text | Node;\n\nexport interface BuildDomNode {\n tag?: BuildDomTag;\n\n child?: BuildDomExpr[] | BuildDomExpr;\n\n text?: FuncOrVal;\n hidden?: FuncOrVal;\n init?: Action;\n update?: Action;\n\n ref?: Ref;\n\n _id?: string;\n /** @deprecated Use `_id` instead */\n _key?: string;\n\n [key: string]: any;\n}\n\nexport class BuildDOMCtx {\n dict: Record | undefined = undefined;\n actions: DOMUpdateAction[] | undefined = undefined;\n view: View | undefined = undefined;\n\n setDict(key: string, node: HTMLElement) {\n if (!this.dict) this.dict = {};\n this.dict[key] = node;\n }\n addUpdateAction(action: DOMUpdateAction) {\n if (!this.actions) this.actions = [];\n this.actions.push(action);\n }\n update() {\n if (!this.actions) return;\n for (const a of this.actions) {\n a.run();\n }\n }\n}\n\ninterface DOMUpdateAction {\n run(): void;\n}\n\nclass TextAction implements DOMUpdateAction {\n constructor(readonly node: Node, readonly func: Func) { }\n run() {\n this.node.textContent = this.func();\n }\n}\n\nclass HiddenAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Func) { }\n run() {\n this.node.hidden = this.func();\n }\n}\n\nclass UpdateAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Action) { }\n run() {\n this.func(this.node);\n }\n}\n\nvar createElementFromTag = function (tag: BuildDomTag): HTMLElement {\n var reg = /[#\\.^]?[\\w\\-]+/y;\n var match;\n var ele;\n while (match = reg.exec(tag)) {\n var val = match[0];\n var ch = val[0];\n if (ch === '.') {\n ele.classList.add(val.substr(1));\n } else if (ch === '#') {\n ele.id = val.substr(1);\n } else {\n if (ele) throw new Error('unexpected multiple tags');\n ele = document.createElement(val);\n }\n }\n return ele;\n};\n\nfunction tryHandleValues(obj: BuildDomExpr, ctx: BuildDOMCtx | null) {\n if (typeof (obj) === 'string') { return document.createTextNode(obj); }\n if (typeof obj === 'function') {\n const val = (obj as any)();\n if (!val || typeof val !== 'object') {\n const node = document.createTextNode(val);\n ctx?.addUpdateAction(new TextAction(node, obj));\n return node;\n } else {\n throw new Error('Unexpected function return value');\n }\n }\n if (Node && obj instanceof Node) return obj as Node;\n return null;\n}\n\nvar buildDomCore = function (obj: BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null): BuildDomReturn {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n var r = tryHandleValues(obj, ctx);\n if (r) return r;\n if (obj instanceof JsxNode) {\n obj = obj.buildView(ctx, ttl);\n if (!(obj instanceof View)) return obj as Node;\n }\n if (obj instanceof View) {\n ctx?.view?._registerChild(obj);\n return obj.getDOM();\n }\n // if ('getDOM' in (obj as any)) return (obj as any).getDOM();\n const tag = (obj as BuildDomNode).tag;\n if (!tag) throw new Error('no tag');\n var node = createElementFromTag(tag);\n for (var key in obj as any) {\n if (obj.hasOwnProperty(key)) {\n var val = obj[key];\n buildDOMHandleKey(key, val, node, ctx, ttl);\n }\n }\n const init = obj['init'];\n if (init) init(node);\n\n return node;\n};\n\nvar buildDOMHandleKey = function (key: string, val: any, node: HTMLElement, ctx: BuildDOMCtx | null, ttl: number) {\n if (key === 'child') {\n if (val instanceof Array) {\n foreachFlaten(val, function (val) {\n node.appendChild(buildDomCore(val, ttl, ctx));\n });\n } else {\n node.appendChild(buildDomCore(val, ttl, ctx));\n }\n } else if (key === '_id' || key === '_key') {\n ctx!.setDict(val, node);\n } else if (key === 'ref') {\n (val as Ref).value = node;\n } else if (key === 'text') {\n if (typeof val === 'function') {\n ctx!.addUpdateAction(new TextAction(node, val));\n } else {\n node.textContent = val;\n }\n } else if (key === 'class') {\n node.className = val;\n } else if (key === 'style' && typeof val === 'object') {\n for (const styleKey in val) {\n if (Object.prototype.hasOwnProperty.call(val, styleKey)) {\n const styleVal = val[styleKey];\n node.style[styleKey] = styleVal;\n }\n }\n } else if (key === 'hidden' && typeof val === 'function') {\n ctx!.addUpdateAction(new HiddenAction(node, val));\n } else if (key === 'update' && typeof val === 'function') {\n ctx!.addUpdateAction(new UpdateAction(node, val));\n } else if (key === 'init') {\n // no-op\n } else {\n node[key] = val;\n }\n};\n\n/** \n * Build a DOM tree from a JavaScript object.\n * @example\n * buildDOM({\n * tag: 'div.item#firstitem',\n * onclick: () => console.info('clicked'),\n * child: [\n * 'Name: ',\n * { tag: 'span.name', text: name },\n * ],\n * });\n */\nexport function buildDOM(obj: BuildDomExpr, ctx?: BuildDOMCtx): T {\n return buildDomCore(obj, 32, ctx || null) as T;\n};\n\n/** Get a View instance or a DOM Node. View is preferred. */\nexport function buildView(obj: BuildDomExpr, ctx?: BuildDOMCtx): View | Node {\n if (obj instanceof View) {\n return obj;\n } else if (obj instanceof JsxNode) {\n return obj.buildView(ctx as any, 64);\n } else {\n return buildDOM(obj, ctx);\n }\n}\n\nexport class JsxNode {\n tag: T | string;\n attrs: Record | undefined;\n child: any[] | undefined;\n constructor(tag: any, attrs: Record | undefined, childs: any[] | undefined) {\n this.tag = tag;\n this.attrs = attrs;\n this.child = childs;\n }\n getDOM(): HTMLElement {\n return this.buildDom(null, 64) as any;\n }\n buildDom(ctx: BuildDOMCtx | null, ttl: number) {\n return getDOM(this.buildView(ctx, ttl));\n }\n buildView(ctx: BuildDOMCtx | null, ttl: number)\n : T extends IDOM ? T : T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : HTMLElement {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n let view: Node | View;\n if (typeof this.tag === 'string') {\n // tag is an HTML tag\n const dom = document.createElement(this.tag);\n view = dom;\n if (this.attrs) {\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n buildDOMHandleKey(key, val, dom, ctx, ttl);\n }\n }\n const init = this.attrs['init'];\n if (init) init(dom);\n }\n } else {\n // tag is a View\n view = this.tag as View;\n if (this.attrs) {\n let init: Action | null = null;\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n if (key == \"init\") {\n init = val;\n } else if (key == \"ref\") {\n (val as Ref).value = view;\n } else if (key.startsWith(\"on\") && view[key] instanceof Callbacks) {\n (view[key] as Callbacks).add(val);\n } else {\n view[key] = val;\n }\n }\n }\n if (init) init(view);\n }\n }\n if (this.child) {\n if (view instanceof View) {\n foreachFlaten(this.child, it => {\n (view as View).addChild(jsxBuildCore(it, ttl, (view as View)['_domctx']) as any);\n });\n } else {\n foreachFlaten(this.child, it => {\n const c = jsxBuildCore(it, ttl, ctx);\n if (c instanceof View) {\n (view as Node).appendChild(c.dom);\n ctx?.view?._registerChild(c);\n } else {\n addChild(view, c);\n }\n });\n }\n }\n return view as any;\n }\n addChild(child: IDOM): void {\n if (this.child == null) this.child = [];\n this.child.push(child);\n }\n}\n\nfunction jsxBuildCore(node: JsxNode | BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null) {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n if (node instanceof View) return node;\n var r = tryHandleValues(node, ctx);\n if (r) return r;\n if (node instanceof JsxNode) {\n return node.buildView(ctx, ttl);\n } else {\n console.error(\"Unknown node type\", node);\n throw new Error(\"Unknown node type\");\n }\n}\n\nexport function jsxBuild(node: JsxNode, ctx?: BuildDOMCtx): T {\n return jsxBuildCore(node, 64, ctx || new BuildDOMCtx());\n}\n\nexport type JsxTag = JsxDOMTag | JsxCtorTag;\nexport type JsxCtorTag = new (...args) => IDOM;;\nexport type JsxDOMTag = keyof HTMLElementTagNameMap;\n\nexport type JsxTagInstance =\n T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] :\n T extends (new (...args) => infer U) ? U extends IDOM ? U :\n never : never;\n\nexport type JsxAttrs =\n T extends JsxCtorTag ? JsxCtorAttrs :\n T extends JsxDOMTag ? JsxDOMAttrs :\n never;\n\nexport type JsxCtorAttrs> = {\n args?: ConstructorParameters;\n init?: Action;\n} & Partial>;\n\nexport type JsxDOMAttrs = Omit & Partial>;\n\nexport function jsxFactory>(tag: T, attrs: JsxAttrs, ...childs: any)\n : JsxNode {\n if (typeof tag === 'string') {\n return new JsxNode(tag, attrs, childs) as any;\n } else {\n const view = attrs?.args ?\n new (tag as any)(...attrs.args) :\n new (tag as any)();\n return new JsxNode(view, attrs, childs) as any;\n }\n}\n\nexport const jsx = jsxFactory;\n","import { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { buildDOM, IDOM } from \"./buildDOM\";\r\nimport { getDOM } from \"./view\";\r\n\r\n\r\nexport function clearChildren(node: Node) {\r\n while (node.lastChild) node.removeChild(node.lastChild);\r\n}\r\n\r\n/** Remove all children from the node (if needed) and append one (if present) */\r\nexport function replaceChild(node: Node, newChild?: Node) {\r\n clearChildren(node);\r\n if (newChild) node.appendChild(newChild);\r\n}\r\n\r\n/** Add or remove a classname for the element\r\n * @param force - true -> add; false -> remove; undefined -> toggle.\r\n */\r\nexport function toggleClass(element: HTMLElement, clsName: string, force?: boolean) {\r\n var clsList = element.classList;\r\n if (clsList.toggle) return clsList.toggle(clsName, force);\r\n if (force === undefined) force = !clsList.contains(clsName);\r\n if (force) clsList.add(clsName);\r\n else clsList.remove(clsName);\r\n return force;\r\n}\r\n\r\nexport interface FadeOutOptions {\r\n className?: string;\r\n duration?: number;\r\n remove?: boolean;\r\n}\r\n\r\nexport interface FadeoutResult {\r\n readonly finished: boolean;\r\n onFinished(callback: Action): this;\r\n cancel(finish?: boolean): void;\r\n}\r\n\r\n/** Fade out the element and remove it */\r\nexport function fadeout(element: HTMLElement, options?: FadeOutOptions): FadeoutResult {\r\n const { className = 'fading-out', duration = 500, remove = true } = options || {};\r\n element.classList.add(className);\r\n var cb: Action | null = null;\r\n var end: Action | null = (finish = true) => {\r\n if (!end) return; // use a random variable as flag ;)\r\n end = null;\r\n element.removeEventListener('transitionend', onTransitionend);\r\n element.classList.remove(className);\r\n if (remove && finish) {\r\n element.remove();\r\n }\r\n finish && cb?.();\r\n };\r\n var onTransitionend = function (e: TransitionEvent) {\r\n if (e.eventPhase === Event.AT_TARGET) end?.();\r\n };\r\n element.addEventListener('transitionend', onTransitionend);\r\n setTimeout(end, duration); // failsafe\r\n return {\r\n get finished() { return !end; },\r\n onFinished(callback: Action) {\r\n if (!end) callback();\r\n else cb = callback;\r\n return this;\r\n },\r\n cancel(finish = false) {\r\n end?.(finish);\r\n }\r\n };\r\n}\r\n\r\nexport function startBlockingDetect(threshold = 20) {\r\n var begin = Date.now();\r\n var lastRun = Date.now();\r\n setInterval(() => {\r\n var now = Date.now();\r\n if (now - lastRun >= threshold) {\r\n console.info(`[Blocking] ${(now - begin) / 1000}s: blocked for ${now - lastRun} ms`);\r\n }\r\n lastRun = now;\r\n }, 1);\r\n}\r\n\r\nexport class Timer {\r\n callback: () => void;\r\n cancelFunc: (() => void) | undefined;\r\n constructor(callback: () => void) {\r\n this.callback = callback;\r\n this.cancelFunc = undefined;\r\n }\r\n timeout(time: number) {\r\n this.tryCancel();\r\n var handle = setTimeout(this.callback, time);\r\n this.cancelFunc = () => window.clearTimeout(handle);\r\n }\r\n interval(time: number) {\r\n this.tryCancel();\r\n var handle = setInterval(this.callback, time);\r\n this.cancelFunc = () => window.clearInterval(handle);\r\n }\r\n animationFrame() {\r\n this.tryCancel();\r\n var handle = requestAnimationFrame(this.callback);\r\n this.cancelFunc = () => cancelAnimationFrame(handle);\r\n }\r\n tryCancel() {\r\n if (this.cancelFunc) {\r\n this.cancelFunc();\r\n this.cancelFunc = undefined;\r\n }\r\n }\r\n}\r\n\r\nexport type PtrEvent = ({\r\n type: 'mouse';\r\n ev: MouseEvent;\r\n} | {\r\n type: 'touch';\r\n touch: 'start' | 'move' | 'end';\r\n ev: TouchEvent;\r\n}) & {\r\n action: 'down' | 'move' | 'up';\r\n point: MouseEvent | Touch;\r\n};\r\n\r\nexport function listenPointerEvents(element: HTMLElement, callback: (e: PtrEvent) => void | 'track', options?: AddEventListenerOptions) {\r\n var touchDown = false;\r\n var mouseDown = function (e: MouseEvent) {\r\n if (callback({ type: 'mouse', ev: e, point: e, action: 'down' }) === 'track') {\r\n var mousemove = function (e: MouseEvent) {\r\n callback({ type: 'mouse', ev: e, point: e, action: 'move' });\r\n };\r\n var mouseup = function (e: MouseEvent) {\r\n document.removeEventListener('mousemove', mousemove, true);\r\n document.removeEventListener('mouseup', mouseup, true);\r\n callback({ type: 'mouse', ev: e, point: e, action: 'up' });\r\n };\r\n document.addEventListener('mousemove', mousemove, true);\r\n document.addEventListener('mouseup', mouseup, true);\r\n }\r\n };\r\n var touchStart = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n var ret = callback({\r\n type: 'touch', touch: 'start', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'down'\r\n });\r\n if (!touchDown && ret === 'track') {\r\n touchDown = true;\r\n var touchmove = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n callback({ type: 'touch', touch: 'move', ev: e, point: ct, action: 'move' });\r\n };\r\n var touchend = function (e: TouchEvent) {\r\n if (e.touches.length === 0) {\r\n touchDown = false;\r\n element.removeEventListener('touchmove', touchmove);\r\n element.removeEventListener('touchend', touchend);\r\n element.removeEventListener('touchcancel', touchend);\r\n }\r\n var ct = e.changedTouches[0];\r\n callback({\r\n type: 'touch', touch: 'end', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'up'\r\n });\r\n };\r\n element.addEventListener('touchmove', touchmove, options);\r\n element.addEventListener('touchend', touchend, options);\r\n element.addEventListener('touchcancel', touchend, options);\r\n }\r\n };\r\n element.addEventListener('mousedown', mouseDown, options);\r\n element.addEventListener('touchstart', touchStart, options);\r\n return {\r\n remove: () => {\r\n element.removeEventListener('mousedown', mouseDown, options);\r\n element.removeEventListener('touchstart', touchStart, options);\r\n }\r\n };\r\n}\r\n\r\nexport function listenEvent(element: HTMLElement, event: K,\r\n handler: (ev: HTMLElementEventMap[K]) => any) {\r\n element.addEventListener(event, handler);\r\n return {\r\n remove: () => element.removeEventListener(event, handler)\r\n };\r\n}\r\n\r\nexport function listenEvents>(element: HTMLElement, events: K,\r\n handler: (ev: HTMLElementEventMap[K[number]]) => any) {\r\n events.forEach(event => element.addEventListener(event, handler));\r\n return {\r\n remove: () => events.forEach(event => element.removeEventListener(event, handler))\r\n };\r\n}\r\n\r\nexport function injectCss(css: string, options?: { parent?: Node, tag?: string; }) {\r\n const parent = options?.parent ?? document.head;\r\n parent.appendChild(buildDOM({ tag: options?.tag ?? 'style', text: css }));\r\n}\r\n\r\nexport class TextCompositionWatcher {\r\n dom: HTMLElement;\r\n onCompositingChanged = new Callbacks();\r\n private _isCompositing = false;\r\n get isCompositing() { return this._isCompositing; }\r\n set isCompositing(val) {\r\n this._isCompositing = val;\r\n this.onCompositingChanged.invoke();\r\n }\r\n constructor(dom: IDOM) {\r\n this.dom = getDOM(dom) as HTMLElement;\r\n this.dom.addEventListener('compositionstart', (ev) => {\r\n this.isCompositing = true;\r\n });\r\n this.dom.addEventListener('compositionend', (ev) => {\r\n this.isCompositing = false;\r\n });\r\n }\r\n}\r\n\r\nexport class InputStateTracker {\r\n state = {\r\n mouseDown: false,\r\n mouseIn: false,\r\n focusIn: false,\r\n };\r\n private _removeEvents: Action | null = null;\r\n private _removePointerEvents: Action | null = null;\r\n readonly onChanged = new Callbacks>();\r\n constructor(readonly dom: HTMLElement) {\r\n this._removeEvents = listenEvents(dom, ['mouseenter', 'mouseleave', 'focusin', 'focusout'], (e) => {\r\n switch (e.type) {\r\n case 'mouseenter':\r\n this.stateChanged('mouseIn', true);\r\n break;\r\n case 'mouseleave':\r\n this.stateChanged('mouseIn', false);\r\n break;\r\n case 'focusin':\r\n this.stateChanged('focusIn', true);\r\n break;\r\n case 'focusout':\r\n this.stateChanged('focusIn', false);\r\n break;\r\n }\r\n }).remove;\r\n\r\n this._removePointerEvents = listenPointerEvents(dom, (e) => {\r\n if (e.action == 'down') {\r\n this.stateChanged('mouseDown', true);\r\n return 'track';\r\n } else if (e.action == 'up') {\r\n this.stateChanged('mouseDown', false);\r\n }\r\n }).remove;\r\n }\r\n private stateChanged(state: T, val: InputStateTracker['state'][T]) {\r\n this.state[state] = val;\r\n this.onChanged.invoke(state);\r\n }\r\n removeListeners() {\r\n this._removeEvents?.();\r\n this._removePointerEvents?.();\r\n this._removePointerEvents = this._removeEvents = null;\r\n }\r\n}\r\n\r\n\r\nexport interface IId {\r\n id: keyof any;\r\n}\r\n\r\nexport class DataUpdatingHelper {\r\n items: Iterable;\r\n update(newData: Iterable) {\r\n const oldData = this.items;\r\n var dataDict: Record = {};\r\n for (const n of newData) {\r\n dataDict[this.dataSelectId(n)] = n;\r\n }\r\n var itemDict: Record = {};\r\n var removed: T[] = [];\r\n for (const d of oldData) {\r\n const id = this.selectId(d);\r\n if (dataDict[id] !== undefined) {\r\n itemDict[id] = d;\r\n } else {\r\n removed.push(d);\r\n }\r\n }\r\n for (let i = removed.length - 1; i >= 0; i--)\r\n this.removeItem(removed[i]);\r\n var pos = 0;\r\n for (const n of newData) {\r\n const d = itemDict[this.dataSelectId(n)];\r\n if (d !== undefined) {\r\n this.updateItem(d, n);\r\n } else {\r\n this.addItem(n, pos);\r\n }\r\n pos++;\r\n }\r\n }\r\n updateOrRebuildAll(newData: Iterable) {\r\n this.update(newData);\r\n if (!this.isSame(newData)) this.rebuildAll(newData);\r\n }\r\n isSame(newData: Iterable) {\r\n var t = this.items[Symbol.iterator]();\r\n for (const n of newData) {\r\n var d = t.next();\r\n if (d.done) return false;\r\n if (this.selectId(d.value) !== this.dataSelectId(n)) return false;\r\n }\r\n if (!t.next().done) return false;\r\n return true;\r\n }\r\n rebuildAll(newData: Iterable) {\r\n var oldData = this.items;\r\n if (oldData instanceof Array) {\r\n for (let i = oldData.length - 1; i >= 0; i--) {\r\n this.removeItem(oldData[i]);\r\n }\r\n } else {\r\n for (const o of oldData) {\r\n this.removeItem(o);\r\n }\r\n }\r\n let i = 0;\r\n for (const n of newData) {\r\n this.addItem(n, i++);\r\n }\r\n }\r\n protected selectId(obj: T): any { return obj.id; }\r\n protected dataSelectId(obj: TData): any { return obj.id; }\r\n addItem(obj: TData, pos: number) { }\r\n updateItem(old: T, data: TData) { }\r\n removeItem(obj: T) { }\r\n}","// file: I18n.ts\n\nexport interface I18nData {\n [lang: string]: LangObj;\n}\n\nexport type LangObj = Record;\n\n/** Internationalization (aka i18n) helper class */\nexport class I18n {\n data: I18nData = {};\n curLang = 'en';\n missing = new Map();\n /** Get i18n string for `key`, return `key` when not found. */\n get(key, arg?: any[]): string {\n return this.get2(key, arg) || key;\n }\n /** Get i18n string for `key`, return `null` when not found. */\n get2(key, arg?: any[], lang?: string): string | null {\n lang = lang || this.curLang;\n var langObj = this.data[lang];\n if (!langObj) {\n console.log('i18n missing lang: ' + lang);\n return null;\n }\n var r = langObj[key];\n if (!r) {\n if (!this.missing.has(key)) {\n this.missing.set(key, 1);\n console.log('i18n missing key: ' + key);\n }\n return null;\n }\n if (arg) {\n for (const key in arg) {\n if (arg.hasOwnProperty(key)) {\n const val = arg[key];\n r = r.replace('{' + key + '}', val);\n // Note that it only replaces the first occurrence.\n }\n }\n }\n return r;\n }\n /** Fills data with an 2darray */\n add2dArray(array: [...string[][]]) {\n const langObjs: LangObj[] = [];\n const langs = array[0];\n for (const lang of langs) {\n langObjs.push(this.data[lang] = this.data[lang] || {});\n }\n for (let i = 1; i < array.length; i++) {\n const line = array[i];\n const key = line[0];\n for (let j = 0; j < line.length; j++) {\n const val = line[j];\n langObjs[j][key] = val;\n }\n }\n }\n renderElements(elements) {\n console.log('i18n elements rendering');\n elements.forEach(x => {\n for (const node of x.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // console.log('node', node);\n var r = this.get2(node.beforeI18n || node.textContent);\n if (r) {\n node.beforeI18n = node.beforeI18n || node.textContent;\n node.textContent = r;\n }\n else {\n if (node.beforeI18n) {\n node.textContent = node.beforeI18n;\n }\n console.log('missing key for node', node);\n }\n }\n }\n });\n }\n /**\n * Detect the best available language using\n * the user language preferences provided by the browser.\n * @param langs Available languages\n */\n static detectLanguage(langs: string[]) {\n var cur: string | null = null;\n var curIdx = -1;\n var languages: string[] = [];\n // ['en-US'] -> ['en-US', 'en']\n (navigator.languages || [navigator.language]).forEach(lang => {\n languages.push(lang);\n if (lang.indexOf('-') > 0)\n languages.push(lang.substr(0, lang.indexOf('-')));\n });\n langs.forEach((l) => {\n var idx = languages.indexOf(l);\n if (!cur || (idx !== -1 && idx < curIdx)) {\n cur = l;\n curIdx = idx;\n }\n });\n return cur || langs[0];\n }\n}\n\nexport function createStringBuilder(i18n: I18n) {\n var arrBuilder = createArrayBuilder(i18n);\n\n return function (literals: TemplateStringsArray, ...placeholders: any[]) {\n if (placeholders.length === 0) {\n return i18n.get(literals[0]);\n }\n return arrBuilder(literals, ...placeholders).join('');\n }\n}\n\nexport function createArrayBuilder(i18n: I18n) {\n var formatCache = new WeakMap();\n var parseCache = new Map();\n\n return function (literals: TemplateStringsArray, ...placeholders: T): (string | T)[] {\n if (placeholders.length === 0) {\n return [i18n.get(literals[0])];\n }\n\n // Generate format string from template string if it's not cached:\n let format = formatCache.get(literals);\n if (format === undefined) {\n format = '';\n for (let i = 0; i < literals.length; i++) {\n const lit = literals[i];\n format += lit;\n if (i < placeholders.length) {\n format += '{' + i + '}';\n }\n }\n formatCache.set(literals, format);\n }\n\n const translatedFormat = i18n.get(format);\n\n // Also cache parsed template\n let parsed = parseCache.get(translatedFormat);\n if (parsed === undefined) {\n parsed = parseTemplate(translatedFormat);\n }\n\n return parsed.map(x => typeof x == 'number' ? placeholders[x] : x);\n }\n}\n\nfunction parseTemplate(template: string): (string | number)[] {\n const result: (string | number)[] = [];\n let state = 0; // 0: normal / 1: after '{' / 2: after '}' / 3: after '{' and numbers\n let buf = '';\n for (let i = 0; i < template.length; i++) {\n const ch = template[i];\n switch (ch) {\n case '{':\n if (state == 0) state = 1;\n else if (state == 1) { state = 0; buf += '{'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n case '}':\n if (state == 3) { state = 0; result.push(+buf); buf = ''; }\n else if (state == 0) { state = 2; }\n else if (state == 2) { state = 0; buf += '}'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n default:\n if (state == 2) throw new Error(`Expected '}', got '${ch}' at ${i}`);\n else if (state == 1) { state = 3; if (buf) result.push(buf); buf = ''; }\n buf += ch;\n }\n }\n if (state != 0) throw new Error(\"Unexpected end of template string\");\n if (buf) result.push(buf);\n return result;\n}\n\nexport var i18n = new I18n();\n\nexport const I = createStringBuilder(i18n);\n","// file: viewlib.ts\n\nimport { injectCss } from \"./viewUtils\";\nimport css from \"../../style.css\";\n\nexport function getWebfxCss() {\n return css;\n}\n\nlet cssInjected = false;\nexport function injectWebfxCss(options?: { parent?: Node }) {\n if (!cssInjected) {\n injectCss(getWebfxCss(), { ...options, tag: \"style.webfx-injected-style\" });\n cssInjected = true;\n }\n}\n\n// Views and helpers are moved to ../views/\n","import { BuildDomExpr } from \"../lib/buildDOM\";\r\nimport { Func, FuncOrVal, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\n\r\nexport class TextView extends View {\r\n private _text: string | null = \"\";\r\n get text() { return this.dom?.textContent ?? this._text; }\r\n set text(val: FuncOrVal | null) {\r\n if (typeof val == 'function') {\r\n this._text = val();\r\n this.textFunc = val;\r\n } else {\r\n this._text = val;\r\n this.textFunc = null;\r\n }\r\n if (this.domCreated) {\r\n this.dom.textContent = this._text;\r\n }\r\n }\r\n\r\n textFunc: Func | null = null;\r\n\r\n postCreateDom() {\r\n super.postCreateDom();\r\n if (this._text) this.dom.textContent = this._text;\r\n }\r\n\r\n updateDom() {\r\n super.updateDom();\r\n if (this.textFunc) {\r\n this.dom.textContent = this.textFunc();\r\n }\r\n }\r\n}\r\n\r\nexport class ButtonView extends TextView {\r\n disabled: boolean = false;\r\n type: 'normal' | 'big' | 'inline' = 'normal';\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n this.updateDom();\r\n }\r\n createDom(): BuildDomExpr {\r\n return { tag: 'div.btn', tabIndex: 0 };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.toggleClass('disabled', this.disabled);\r\n this.toggleClass('btn-big', this.type === 'big');\r\n this.toggleClass('btn-inline', this.type === 'inline');\r\n }\r\n}\r\n\r\nexport class TextBtn extends TextView {\r\n clickable = true;\r\n active = false;\r\n right = false;\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'span.textbtn.no-selection'\r\n };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.tabIndex = this.clickable ? 0 : -1;\r\n this.toggleClass('clickable', this.clickable);\r\n this.toggleClass('active', this.active);\r\n this.dom.style.float = this.right ? 'right' : 'left';\r\n }\r\n}\r\n\r\n/** @deprecated Use `TextBtn` instead. */\r\nexport const TabBtn = TextBtn;\r\n\r\n/** @deprecated Use `TextBtn` instead. */\r\nexport type TabBtn = TextBtn;\r\n","import { Callbacks, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { buildDOM } from \"../lib/buildDOM\";\r\nimport { listenEvent, toggleClass } from \"../lib/viewUtils\";\r\n\r\n\r\nexport interface PositionOptions {\r\n x?: number;\r\n y?: number;\r\n anchor?: 'bottom';\r\n}\r\n\r\nexport function setPosition(dom: HTMLElement, options: PositionOptions) {\r\n let { x = 0, y = 0, anchor = 'bottom' } = options;\r\n dom.style.left = x + 'px';\r\n dom.style.top = y + 'px';\r\n if (!dom.classList.contains('anchor-' + anchor)) {\r\n dom.classList.forEach(x => {\r\n if (x.startsWith('anchor-')) {\r\n dom.classList.remove(x);\r\n }\r\n });\r\n dom.classList.add('anchor-' + anchor);\r\n }\r\n}\r\n\r\n/** DragManager is used to help exchange information between views */\r\nexport var dragManager = new class DragManager {\r\n /** The item being dragged */\r\n _currentItem: any | null = null;\r\n _currentArray: any[] | null = null;\r\n get currentItem() { return this._currentItem ?? this._currentArray?.[0] ?? null; };\r\n get currentArray() {\r\n if (this._currentItem) return [this._currentItem];\r\n return this._currentArray;\r\n }\r\n onDragStart = new Callbacks();\r\n onDragEnd = new Callbacks();\r\n start(item: any) {\r\n this._currentItem = item;\r\n console.log('drag start', item);\r\n this.onDragStart.invoke();\r\n }\r\n startArray(arr: any[]) {\r\n this._currentArray = arr;\r\n console.log('drag start array', arr);\r\n this.onDragStart.invoke();\r\n }\r\n end() {\r\n this._currentItem = null;\r\n this._currentArray = null;\r\n console.log('drag end');\r\n this.onDragEnd.invoke();\r\n }\r\n};\r\n\r\nexport class EditableHelper {\r\n editing = false;\r\n beforeEdit: string | null = null;\r\n element: HTMLElement;\r\n onComplete: ((newName: string) => void) | null = null;\r\n constructor(element: HTMLElement) {\r\n this.element = element;\r\n }\r\n startEdit(onComplete?: this['onComplete']) {\r\n if (this.editing) return;\r\n this.editing = true;\r\n var ele = this.element;\r\n var beforeEdit = this.beforeEdit = ele.textContent!;\r\n toggleClass(ele, 'editing', true);\r\n var input = buildDOM({\r\n tag: 'input', type: 'text', value: beforeEdit\r\n }) as HTMLInputElement;\r\n while (ele.firstChild) ele.removeChild(ele.firstChild);\r\n ele.appendChild(input);\r\n input.select();\r\n input.focus();\r\n var stopEdit = () => {\r\n this.editing = false;\r\n toggleClass(ele, 'editing', false);\r\n events.forEach(x => x.remove());\r\n input.remove();\r\n this.onComplete?.(input.value);\r\n onComplete?.(input.value);\r\n };\r\n var events = [\r\n listenEvent(input, 'keydown', (evv) => {\r\n if (evv.code === 'Enter') {\r\n stopEdit();\r\n evv.preventDefault();\r\n }\r\n }),\r\n listenEvent(input, 'focusout', (evv) => { stopEdit(); }),\r\n ];\r\n }\r\n startEditAsync() {\r\n return new Promise((resolve) => this.startEdit(resolve));\r\n }\r\n}\r\n\r\nexport class ViewToggle {\r\n items: Record;\r\n shownKeys: T[] = [];\r\n toggleMode: 'display' | 'hidden' | 'remove' = 'remove';\r\n container: View | null = null;\r\n constructor(init?: ObjectInit>) {\r\n objectInit(this, init);\r\n this.setShownKeys(this.shownKeys);\r\n }\r\n add(key: T, view: View) {\r\n const oldVal = this.items[key];\r\n if (oldVal) {\r\n if (oldVal instanceof Array) {\r\n (this.items[key] as View[]).push(view);\r\n } else {\r\n this.items[key] = [oldVal as View, view];\r\n }\r\n } else {\r\n this.items[key] = view;\r\n }\r\n this.toggleView(view, this.shownKeys.indexOf(key) >= 0);\r\n }\r\n setShownKeys(keys: T[]) {\r\n this.shownKeys = keys;\r\n const items = this.items;\r\n for (const key in items) {\r\n const show = keys.indexOf(key) >= 0;\r\n if (Object.prototype.hasOwnProperty.call(items, key)) {\r\n const val = items[key];\r\n if (val) {\r\n if (val instanceof Array) {\r\n for (const v of val) {\r\n this.toggleView(v, show);\r\n }\r\n } else if (val) {\r\n this.toggleView(val as View, show);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n toggleView(view: View, show: boolean, mode?: ViewToggle['toggleMode']) {\r\n if (!mode) mode = this.toggleMode;\r\n if (mode == 'display') {\r\n view.dom.style.display = show ? '' : 'none';\r\n } else if (mode == 'hidden') {\r\n view.dom.hidden = !show;\r\n } else if (mode == 'remove') {\r\n if (show != !!view.parentView) {\r\n if (show) {\r\n this.container!.appendView(view);\r\n } else {\r\n this.container!.removeView(view);\r\n }\r\n }\r\n } else {\r\n throw new Error('Unknown toggle mode');\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\nexport class ItemActiveHelper {\r\n funcSetActive = (item: T, val: boolean) => item.toggleClass('active', val);\r\n current: T | null = null;\r\n constructor(init?: ObjectInit>) {\r\n objectInit(this, init);\r\n }\r\n set(item: T | null) {\r\n if (this.current === item) return;\r\n if (this.current) this.funcSetActive(this.current, false);\r\n this.current = item;\r\n if (this.current) this.funcSetActive(this.current, true);\r\n }\r\n}\r\n","import { Action, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { ContainerView } from \"../lib/view\";\r\nimport { fadeout, Timer } from \"../lib/viewUtils\";\r\nimport { TextView } from \"./Basics\";\r\nimport { setPosition, PositionOptions } from \"./helpers\";\r\n\r\n\r\nexport class ToolTip extends TextView {\r\n createDom() {\r\n return {\r\n tag: 'div.tooltip'\r\n };\r\n }\r\n private _shown = false;\r\n private _timer = new Timer(() => this.close());\r\n get shown() { return this._shown; }\r\n show(options: PositionOptions & {\r\n parent?: HTMLElement, timeout?: number;\r\n }) {\r\n if (this.shown) return;\r\n this._shown = true;\r\n this._cancelClose?.();\r\n let { parent = document.body, timeout } = options;\r\n if (timeout) this._timer.timeout(timeout);\r\n const dom = this.dom;\r\n setPosition(dom, options);\r\n parent.appendChild(dom);\r\n }\r\n private _cancelClose: Action | null = null;\r\n close(fadeOutOptions?: Parameters[1]) {\r\n if (!this.shown) return;\r\n this._timer.tryCancel();\r\n this._shown = false;\r\n this._cancelClose = fadeout(this.dom, fadeOutOptions).cancel;\r\n }\r\n}\r\n\r\nexport namespace FlagsInput {\r\n export class FlagsInput extends ContainerView {\r\n constructor(flags?: string[] | Flag[]) {\r\n super();\r\n flags?.forEach(f => {\r\n var flag = f instanceof Flag ? f : new Flag({ text: Object.prototype.toString.call(f) });\r\n this.addView(flag);\r\n });\r\n }\r\n createDom() {\r\n return { tag: 'div.flags-input' };\r\n }\r\n }\r\n\r\n export class Flag extends TextView {\r\n get parentInput() { return this.parentView as (FlagsInput | undefined); }\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom() {\r\n return { tag: 'div.flags-input-item' };\r\n }\r\n }\r\n}","import { View } from \"../lib/view\";\r\n\r\nexport class Overlay extends View {\r\n createDom() {\r\n return { tag: 'div.overlay' };\r\n }\r\n\r\n /** @deprecated Use `setFlags` instead. */\r\n setCenterChild(centerChild: boolean) {\r\n return this.setFlags({ centerChild });\r\n }\r\n\r\n /** @deprecated Use `setFlags` instead. */\r\n setNoBg(nobg: boolean) {\r\n return this.setFlags({ nobg });\r\n }\r\n\r\n /** @deprecated Use `setFlags` instead. */\r\n setFixed(fixed: boolean) {\r\n return this.setFlags({ fixed });\r\n }\r\n\r\n setFlags(flags: { centerChild?: boolean, nobg?: boolean, fixed?: boolean, clickThrough?: boolean }) {\r\n for (const key in flags) {\r\n if (Object.prototype.hasOwnProperty.call(flags, key)) {\r\n this.toggleClass(key, flags[key]);\r\n }\r\n }\r\n return this;\r\n }\r\n}","import { Action, Callbacks, numLimit } from \"@yuuza/utils\";\r\nimport { ContainerView, View } from \"../lib/view\";\r\nimport { I, i18n } from \"@yuuza/i18n\";\r\nimport { TextBtn, TextView } from \"./Basics\";\r\nimport { Overlay } from \"./Overlay\";\r\nimport { BuildDomExpr, IDOM, MountState } from \"../lib/buildDOM\";\r\nimport { fadeout, listenPointerEvents } from \"../lib/viewUtils\";\r\n\r\n\r\nexport class Dialog extends View {\r\n parent: DialogParent = Dialog.defaultParent;\r\n overlay = new Overlay().setFlags({ centerChild: true, nobg: true });\r\n\r\n get domheader() { return this.header.dom; }\r\n header = new View({ tag: 'div.dialog-title.clearfix' });\r\n content = new View({ tag: 'div.dialog-content' });\r\n shown = false;\r\n\r\n btnTitle = new TextBtn({ active: true, clickable: false });\r\n btnClose = new TextBtn({ text: I`Close`, right: true });\r\n\r\n title = 'Dialog';\r\n allowClose = true;\r\n showCloseButton = true;\r\n onShown = new Callbacks();\r\n onClose = new Callbacks();\r\n autoFocus: View;\r\n\r\n focusTrap = new View({ tag: 'div.focustrap', tabIndex: 0 });\r\n\r\n static _defaultParent: DialogParent | null = null;\r\n static get defaultParent(): DialogParent {\r\n if (!Dialog._defaultParent)\r\n Dialog._defaultParent = new DialogParent();\r\n return Dialog._defaultParent;\r\n }\r\n static set defaultParent(val) {\r\n Dialog._defaultParent = val;\r\n }\r\n\r\n get width() { return this.dom.style.width; }\r\n set width(val) { this.dom.style.width = val; }\r\n\r\n get contentFlex() { return this.content.dom.classList.contains('flex'); }\r\n set contentFlex(val) { this.content.toggleClass('flex', !!val); }\r\n\r\n get resizable() { return this.dom.classList.contains('resize'); }\r\n set resizable(val) { this.toggleClass('resize', !!val); }\r\n\r\n constructor() {\r\n super();\r\n this.btnClose.onActive.add(() => this.allowClose && this.close());\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.dialog',\r\n tabIndex: 0,\r\n style: 'width: 300px',\r\n child: [\r\n this.header,\r\n this.content,\r\n this.focusTrap\r\n ]\r\n };\r\n }\r\n postCreateDom() {\r\n super.postCreateDom();\r\n this.addBtn(this.btnTitle);\r\n this.addBtn(this.btnClose);\r\n this.overlay.appendView(this);\r\n this.overlay.dom.addEventListener('mousedown', (ev) => {\r\n if (this.allowClose && ev.button === 0 && ev.target === this.overlay.dom) {\r\n ev.preventDefault();\r\n this.close();\r\n }\r\n });\r\n this.overlay.dom.addEventListener('keydown', (ev) => {\r\n if (this.allowClose && ev.keyCode === 27) { // ESC\r\n ev.preventDefault();\r\n this.close();\r\n } else if (ev.target === this.dom && ev.code === 'Tab' && ev.shiftKey) {\r\n ev.preventDefault();\r\n let tabables = this.dom.querySelectorAll('a, [tabindex]');\r\n if (tabables.length >= 2 && tabables[tabables.length - 2]['focus']) {\r\n // the last tabable is `focusTrap`, so the index used here is `length - 2`\r\n tabables[tabables.length - 2]['focus']();\r\n }\r\n }\r\n });\r\n\r\n // title bar pointer event handler:\r\n {\r\n let offset: { x: number; y: number; };\r\n listenPointerEvents(this.header.dom, (e) => {\r\n if (e.action === 'down') {\r\n if (e.ev.target !== this.header.dom && e.ev.target !== this.btnTitle.dom)\r\n return;\r\n e.ev.preventDefault();\r\n const rectOverlay = this.overlay.dom.getBoundingClientRect();\r\n const rect = this.dom.getBoundingClientRect();\r\n offset = {\r\n x: e.point.pageX - rectOverlay.x - rect.x,\r\n y: e.point.pageY - rectOverlay.y - rect.y\r\n };\r\n return 'track';\r\n } else if (e.action === 'move') {\r\n e.ev.preventDefault();\r\n const rect = this.overlay.dom.getBoundingClientRect();\r\n const pageX = numLimit(e.point.pageX, rect.left, rect.right);\r\n const pageY = numLimit(e.point.pageY, rect.top, rect.bottom);\r\n this.setOffset(pageX - offset.x, pageY - offset.y);\r\n }\r\n });\r\n }\r\n\r\n this.focusTrap.dom.addEventListener('focus', (ev) => {\r\n this.dom.focus();\r\n });\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.btnTitle.updateWith({ text: this.title });\r\n this.btnTitle.hidden = !this.title;\r\n this.btnClose.hidden = !(this.allowClose && this.showCloseButton);\r\n }\r\n addBtn(btn: TextBtn) {\r\n this.ensureDom();\r\n this.header.appendView(btn);\r\n }\r\n addContent(view: BuildDomExpr, replace?: boolean) {\r\n this.ensureDom();\r\n if (replace)\r\n this.content.removeAllView();\r\n this.content.addChild(view);\r\n }\r\n addChild(view: BuildDomExpr) {\r\n this.addContent(view);\r\n }\r\n setOffset(x: number, y: number) {\r\n this.dom.style.left = x ? x + 'px' : '';\r\n this.dom.style.top = y ? y + 'px' : '';\r\n this.overlay.setCenterChild(false);\r\n }\r\n getOffset() {\r\n var x = this.dom.style.left ? parseFloat(this.dom.style.left) : 0;\r\n var y = this.dom.style.top ? parseFloat(this.dom.style.top) : 0;\r\n return { x, y };\r\n }\r\n center() {\r\n this.setOffset(0, 0);\r\n this.overlay.setCenterChild(true);\r\n }\r\n show(ev?: MouseEvent) {\r\n if (this.shown)\r\n return;\r\n this.shown = true;\r\n this._cancelFadeout?.(true);\r\n this.ensureDom();\r\n this.parent.onDialogShowing(this);\r\n this.setTransformOrigin(ev);\r\n this.dom.focus();\r\n (this.autoFocus || this).dom.focus();\r\n this.onShown.invoke();\r\n }\r\n setTransformOrigin(ev?: MouseEvent) {\r\n if (ev) {\r\n const rect = this.dom.getBoundingClientRect();\r\n this.dom.style.transformOrigin = `${ev.x - rect.x}px ${ev.y - rect.y}px`;\r\n } else {\r\n this.dom.style.transformOrigin = '';\r\n }\r\n }\r\n private _cancelFadeout: Action;\r\n close() {\r\n if (!this.shown)\r\n return;\r\n this.shown = false;\r\n this.setTransformOrigin(undefined);\r\n this.onClose.invoke();\r\n this._cancelFadeout = fadeout(this.overlay.dom)\r\n .onFinished(() => this.overlay.parentView?.removeView(this.overlay))\r\n .cancel;\r\n Dialog.defaultParent.onDialogClosing(this);\r\n }\r\n waitClose(): Promise {\r\n return new Promise((resolve) => {\r\n var cb = this.onClose.add(() => {\r\n this.onClose.remove(cb);\r\n resolve();\r\n });\r\n });\r\n }\r\n}\r\n\r\n\r\nexport class MessageBox extends Dialog {\r\n allowClose = false;\r\n title = 'Message';\r\n result: 'none' | 'no' | 'yes' | 'ok' | 'cancel' = 'none';\r\n addResultBtns(results: this['result'][]) {\r\n for (const r of results) {\r\n this.addBtnWithResult(new TextBtn({ text: i18n.get('msgbox_' + r), right: true }), r);\r\n }\r\n return this;\r\n }\r\n setTitle(title: string) {\r\n this.title = title;\r\n if (this.domCreated) this.updateDom();\r\n return this;\r\n }\r\n addText(text: string) {\r\n this.addContent(new TextView({ tag: 'div.messagebox-text', text }));\r\n return this;\r\n }\r\n allowCloseWithResult(result: this['result'], showCloseButton?: boolean) {\r\n this.result = result;\r\n this.allowClose = true;\r\n this.showCloseButton = !!showCloseButton;\r\n if (this.domCreated) this.updateDom();\r\n return this;\r\n }\r\n addBtnWithResult(btn: TextBtn, result: this['result']) {\r\n btn.onActive.add(() => { this.result = result; this.close(); });\r\n this.addBtn(btn);\r\n return this;\r\n }\r\n async showAndWaitResult() {\r\n this.show();\r\n await this.waitClose();\r\n return this.result;\r\n }\r\n}\r\n\r\nexport class DialogParent {\r\n bgOverlay = new Overlay();\r\n dialogCount = 0;\r\n fixed = false;\r\n view: View;\r\n private _cancelFadeout: Action | null = null;\r\n\r\n constructor(view: BuildDomExpr = document.body) {\r\n this.view = View.getView(view);\r\n if (view === document.body) {\r\n this.fixed = true;\r\n this.view.mountStateChanged(MountState.Mounted);\r\n }\r\n }\r\n onDialogShowing(dialog: Dialog) {\r\n if (this.dialogCount++ === 0) {\r\n this._cancelFadeout?.(true);\r\n this.bgOverlay.setFlags({ fixed: this.fixed, clickThrough: true });\r\n this.view.appendView(this.bgOverlay);\r\n }\r\n dialog.overlay.setFlags({ fixed: this.fixed });\r\n this.view.appendView(dialog.overlay);\r\n }\r\n onDialogClosing(dialog: Dialog) {\r\n if (--this.dialogCount === 0) {\r\n this._cancelFadeout = fadeout(this.bgOverlay.dom)\r\n .onFinished(() => this.view.removeView(this.bgOverlay))\r\n .cancel;\r\n }\r\n }\r\n}\r\n","import { BuildDomExpr } from \"../lib/buildDOM\";\r\nimport { ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\n\r\n\r\nexport class InputView extends View {\r\n multiline: boolean = false;\r\n type = 'text';\r\n placeholder = '';\r\n get value() { return (this.dom as HTMLInputElement).value; }\r\n set value(val) { (this.dom as HTMLInputElement).value = val; }\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return this.multiline ? { tag: 'textarea.input-text' } : { tag: 'input.input-text' };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n if (this.dom instanceof HTMLInputElement) {\r\n this.dom.type = this.type;\r\n this.dom.placeholder = this.placeholder;\r\n }\r\n }\r\n}\r\n\r\nexport class LabeledInputBase extends View {\r\n label: string = '';\r\n input: T;\r\n get dominput(): HTMLInputElement { return this.input.dom as any; }\r\n constructor(init?: ObjectInit>) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.labeled-input',\r\n child: [\r\n { tag: 'div.input-label', text: () => this.label },\r\n this.input\r\n ]\r\n };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.input.domCreated && this.input.updateDom();\r\n }\r\n}\r\n\r\nexport class LabeledInput extends LabeledInputBase {\r\n type: string;\r\n get value() { return this.dominput.value; }\r\n set value(val) { this.dominput.value = val; }\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n if (!this.input) this.input = new InputView();\r\n }\r\n updateDom() {\r\n this.input.type = this.type;\r\n super.updateDom();\r\n }\r\n}\r\n","import { buildDOM, BuildDomExpr, IDOM } from \"../lib/buildDOM\";\r\nimport { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { View, ContainerView } from \"../lib/view\";\r\nimport { dragManager } from \"./helpers\";\r\nimport { clearChildren } from \"../lib/viewUtils\";\r\n\r\nexport abstract class ListViewItem extends View implements ISelectable {\r\n get listview() { return this.parentView instanceof ListView ? this.parentView as ListView : null; }\r\n get selectionHelper() { return this.listview?.selectionHelper; }\r\n\r\n get dragData() { return this.dom.textContent; }\r\n\r\n onDragover: ListView['onDragover'];\r\n onContextMenu: ListView['onContextMenu'];\r\n\r\n dragging?: boolean = undefined;\r\n\r\n private _selected: boolean = false;\r\n public get selected(): boolean { return this._selected; }\r\n public set selected(v: boolean) {\r\n this._selected = v;\r\n this.domCreated && this.updateDom();\r\n this.onSelectedChanged.invoke();\r\n }\r\n onSelectedChanged = new Callbacks();\r\n\r\n\r\n remove() {\r\n if (!this.listview) return;\r\n this.listview.remove(this);\r\n }\r\n\r\n protected postCreateDom() {\r\n super.postCreateDom();\r\n this.dom.setAttribute('role', 'listitem');\r\n this.dom.addEventListener('click', (ev) => {\r\n if (this.listview?.selectionHelper.handleItemClicked(this, ev)) return;\r\n this.listview?.onItemClicked?.(this);\r\n });\r\n this.dom.addEventListener('keydown', (ev) => {\r\n if (ev.code === 'Enter') {\r\n if (ev.altKey) {\r\n const rect = this.dom.getBoundingClientRect();\r\n const mouseev = new MouseEvent('contextmenu', {\r\n clientX: rect.left, clientY: rect.top,\r\n relatedTarget: this.dom\r\n });\r\n (this.onContextMenu ?? this.listview?.onContextMenu)?.(this, mouseev);\r\n } else {\r\n if (this.listview?.selectionHelper.handleItemClicked(this, ev)) return;\r\n this.listview?.onItemClicked?.(this);\r\n }\r\n ev.preventDefault();\r\n } else if (this.listview && (ev.code === 'ArrowUp' || ev.code === 'ArrowDown')) {\r\n const direction = ev.code === 'ArrowUp' ? -1 : 1;\r\n const item = this.listview.get(this.position! + direction);\r\n if (item) {\r\n item.dom.focus();\r\n ev.preventDefault();\r\n }\r\n } else if (this.listview && (ev.code === 'PageUp' || ev.code === 'PageDown')) {\r\n const dir = ev.code === 'PageUp' ? -1 : 1;\r\n const scrollBox = this.listview.scrollBox;\r\n const targetY = dir > 0 ? (this.dom.offsetTop + scrollBox.offsetHeight)\r\n : (this.dom.offsetTop + this.dom.offsetHeight - scrollBox.offsetHeight);\r\n const len = this.listview.length;\r\n let item = this;\r\n while (dir > 0 ? (targetY > item.dom.offsetTop + item.dom.offsetHeight)\r\n : (targetY < item.dom.offsetTop)) {\r\n const nextIdx = item.position! + dir;\r\n if (nextIdx < 0 || nextIdx >= len) break;\r\n item = this.listview.get(nextIdx);\r\n }\r\n if (item && item !== this) {\r\n item.dom.focus();\r\n ev.preventDefault();\r\n }\r\n } else if (this.listview && (ev.code === 'Home' || ev.code === 'End')) {\r\n this.listview.get(ev.code == 'Home' ? 0 : (this.listview.length - 1)).dom.focus();\r\n ev.preventDefault();\r\n } else if (this.listview && this.listview.selectionHelper.handleItemKeyDown(this, ev)) {\r\n // noop\r\n }\r\n });\r\n this.dom.addEventListener('contextmenu', (ev) => {\r\n (this.onContextMenu ?? this.listview?.onContextMenu)?.(this, ev);\r\n });\r\n this.dom.addEventListener('dragstart', (ev) => {\r\n if (!(this.dragging ?? this.listview?.dragging)) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n var arr: ListViewItem[] = [];\r\n if (this.selected && this.selectionHelper) {\r\n arr = [...this.selectionHelper.selectedItems];\r\n arr.sort((a, b) => a.position! - b.position!); // remove this line to get a new feature!\r\n } else {\r\n arr = [this];\r\n }\r\n dragManager.startArray(arr);\r\n ev.dataTransfer!.setData('text/plain', arr.map(x => x.dragData).join('\\r\\n'));\r\n arr.forEach(x => x.dom.style.opacity = '.5');\r\n });\r\n this.dom.addEventListener('dragend', (ev) => {\r\n var arr = dragManager.currentArray as ListViewItem[];\r\n dragManager.end();\r\n ev.preventDefault();\r\n arr.forEach(x => x.dom.style.opacity = '');\r\n });\r\n this.dom.addEventListener('dragover', (ev) => {\r\n this.dragHandler(ev, 'dragover');\r\n });\r\n this.dom.addEventListener('dragenter', (ev) => {\r\n this.dragHandler(ev, 'dragenter');\r\n });\r\n this.dom.addEventListener('dragleave', (ev) => {\r\n this.dragHandler(ev, 'dragleave');\r\n });\r\n this.dom.addEventListener('drop', (ev) => {\r\n this.dragHandler(ev, 'drop');\r\n });\r\n }\r\n // https://stackoverflow.com/questions/7110353\r\n private enterctr = 0;\r\n private dragoverPlaceholder: [HTMLElement, 'move' | 'move-after'] | null = null;\r\n dragHandler(ev: DragEvent, type: string) {\r\n const item = dragManager.currentItem;\r\n let items = dragManager.currentArray! as ListViewItem[];\r\n const drop = type === 'drop';\r\n const arg: DragArg = {\r\n source: item, target: this,\r\n sourceItems: items,\r\n event: ev, drop: drop,\r\n accept: false\r\n };\r\n if (item instanceof ListViewItem) {\r\n if (this.listview?.moveByDragging && item.listview === this.listview) {\r\n ev.preventDefault();\r\n const selfInside = (items.indexOf(this) >= 0);\r\n const after = ev.clientY - this.dom.getBoundingClientRect().top > this.dom.offsetHeight / 2;\r\n if (!(selfInside && drop))\r\n arg.accept = after ? 'move-after' : 'move';\r\n if (!drop) {\r\n ev.dataTransfer!.dropEffect = 'move';\r\n } else {\r\n if (items.indexOf(this) === -1) {\r\n let newpos = this.position!;\r\n if (after) newpos++;\r\n for (const it of items) {\r\n if (it !== this) {\r\n if (newpos > it.position!) newpos--;\r\n this.listview.move(it as this, newpos);\r\n newpos++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n const onDragover = this.onDragover ?? this.listview?.onDragover;\r\n if (!arg.accept && onDragover) {\r\n onDragover(arg as DragArg);\r\n if (drop || arg.accept) ev.preventDefault();\r\n }\r\n const onContextMenu = this.onContextMenu ?? this.listview?.onContextMenu;\r\n if (!arg.accept && items && items.indexOf(this) >= 0 && onContextMenu) {\r\n if (drop) onContextMenu(this, ev);\r\n else ev.preventDefault();\r\n }\r\n if (type === 'dragenter' || type == 'dragover' || type === 'dragleave' || drop) {\r\n if (type === 'dragenter') {\r\n this.enterctr++;\r\n } else if (type === 'dragleave') {\r\n this.enterctr--;\r\n } else if (type === 'drop') {\r\n this.enterctr = 0;\r\n }\r\n let hover = this.enterctr > 0;\r\n this.toggleClass('dragover', hover);\r\n let placeholder = hover && (arg.accept === 'move' || arg.accept === 'move-after') && arg.accept;\r\n if (placeholder != (this.dragoverPlaceholder?.[1] ?? false)) {\r\n this.dragoverPlaceholder?.[0].remove();\r\n this.dragoverPlaceholder = null;\r\n if (placeholder) {\r\n this.dragoverPlaceholder = [\r\n buildDOM({ tag: 'div.dragover-placeholder' }) as HTMLElement,\r\n placeholder\r\n ];\r\n var before = this.dom as Element;\r\n if (arg.accept === 'move-after') before = before.nextElementSibling!;\r\n this.dom.parentElement!.insertBefore(this.dragoverPlaceholder[0], before);\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\ninterface DragArg {\r\n source: ListViewItem, target: T, drop: boolean,\r\n sourceItems: ListViewItem[],\r\n accept: boolean | 'move' | 'move-after', event: DragEvent;\r\n}\r\n\r\nexport class ListView extends ContainerView implements Iterable {\r\n // private items: Array = [];\r\n onItemClicked: null | ((item: T) => void) = null;\r\n /**\r\n * Allow user to drag an item.\r\n */\r\n dragging = false;\r\n /**\r\n * Allow user to drag an item and change its position.\r\n */\r\n moveByDragging = false;\r\n\r\n selectionHelper = new SelectionHelper();\r\n\r\n private _scrollBox: HTMLElement | null = null;\r\n\r\n get scrollBox() { return this._scrollBox || this.dom; }\r\n set scrollBox(val: HTMLElement) { this._scrollBox = val; }\r\n\r\n onItemMoved: null | ((item: T, from: number) => void) = null;\r\n /** \r\n * When dragover or drop\r\n */\r\n onDragover: null | ((arg: DragArg) => void) = null;\r\n onContextMenu: null | ((item: ListViewItem, ev: MouseEvent) => void) = null;\r\n constructor(container?: BuildDomExpr) {\r\n super(container);\r\n this.selectionHelper.itemProvider = this;\r\n }\r\n protected postCreateDom() {\r\n super.postCreateDom();\r\n this.dom.setAttribute('role', 'list');\r\n }\r\n add(item: T, pos?: number) {\r\n this.addView(item, pos);\r\n if (this.dragging) item.dom.draggable = true;\r\n }\r\n remove(item: T | number, keepSelected?: boolean) {\r\n item = this._ensureItem(item);\r\n if (!keepSelected && item.selected) this.selectionHelper.toggleItemSelection(item);\r\n this.removeView(item);\r\n }\r\n move(item: T | number, newpos: number) {\r\n item = this._ensureItem(item);\r\n this.remove(item, true);\r\n this.add(item, newpos);\r\n this.onItemMoved?.(item, item.position!);\r\n }\r\n /** Remove all items */\r\n removeAll() {\r\n while (this.length) this.remove(this.length - 1);\r\n }\r\n /** Remove all items and all DOM children */\r\n clear() {\r\n this.removeAll();\r\n clearChildren(this.dom);\r\n }\r\n ReplaceChild(dom: IDOM) {\r\n this.clear();\r\n this.dom.appendChild(dom.getDOM());\r\n }\r\n}\r\n\r\nexport interface ISelectable {\r\n selected: boolean;\r\n position?: number;\r\n}\r\n\r\nexport class SelectionHelper {\r\n _enabled: boolean = false;\r\n get enabled() { return this._enabled; }\r\n set enabled(val) {\r\n if (!!val === !!this._enabled) return;\r\n this._enabled = val;\r\n while (this.selectedItems.length)\r\n this.toggleItemSelection(this.selectedItems[0], false);\r\n this.lastToggledItem = null;\r\n this.onEnabledChanged.invoke();\r\n }\r\n onEnabledChanged = new Callbacks();\r\n\r\n itemProvider: null | {\r\n get: (pos: number) => TItem;\r\n length: number;\r\n } = null;\r\n\r\n ctrlForceSelect = false;\r\n\r\n selectedItems: TItem[] = [];\r\n onSelectedItemsChanged = new Callbacks<(action: 'add' | 'remove', item: TItem) => void>();\r\n get count() { return this.selectedItems.length; }\r\n\r\n /** For shift-click */\r\n lastToggledItem: TItem | null = null;\r\n\r\n /** Returns true if it's handled by the helper. */\r\n handleItemClicked(item: TItem, ev: MouseEvent | KeyboardEvent): boolean {\r\n if (!this.enabled) {\r\n if (!this.ctrlForceSelect || !ev.ctrlKey) return false;\r\n this.enabled = true;\r\n }\r\n if (ev.shiftKey && this.lastToggledItem && this.itemProvider) {\r\n var toSelect = !!this.lastToggledItem.selected;\r\n var start = item.position!, end = this.lastToggledItem.position!;\r\n if (start > end) [start, end] = [end, start];\r\n for (let i = start; i <= end; i++) {\r\n this.toggleItemSelection(this.itemProvider.get(i), toSelect);\r\n }\r\n this.lastToggledItem = item;\r\n } else {\r\n this.toggleItemSelection(item);\r\n }\r\n ev.preventDefault();\r\n return true;\r\n }\r\n\r\n /** Returns true if it's handled by the helper. */\r\n handleItemKeyDown(item: TItem, ev: KeyboardEvent): boolean {\r\n if (!this.enabled) return false;\r\n if (this.itemProvider && ev.ctrlKey && ev.code === 'KeyA') {\r\n const len = this.itemProvider.length;\r\n for (let i = 0; i < len; i++) {\r\n this.toggleItemSelection(this.itemProvider.get(i), true);\r\n }\r\n ev.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n toggleItemSelection(item: TItem, force?: boolean) {\r\n if (force !== undefined && force === !!item.selected) return;\r\n if (item.selected) {\r\n item.selected = false;\r\n this.selectedItems.remove(item);\r\n this.onSelectedItemsChanged.invoke('remove', item);\r\n } else {\r\n item.selected = true;\r\n this.selectedItems.push(item);\r\n this.onSelectedItemsChanged.invoke('add', item);\r\n }\r\n this.lastToggledItem = item;\r\n if (this.count === 0 && this.ctrlForceSelect) this.enabled = false;\r\n }\r\n}\r\n\r\n\r\nexport class LazyListView extends ListView {\r\n private _loaded = 0;\r\n private _lazy = false;\r\n private _slowLoading: Promise | null = null;\r\n private _autoLoad: { interval: number, batchSize: number; } | null = null;\r\n get loaded() { return this.loaded; }\r\n get slowLoading() { return this._slowLoading; }\r\n get autoLoad() { return this._autoLoad; }\r\n get lazy() { return this._lazy; }\r\n set lazy(val) {\r\n this._lazy = val;\r\n if (!val) this.ensureLoaded(this.length - 1);\r\n }\r\n ensureLoaded(pos: number) {\r\n if (pos >= this.length) pos = this.length - 1;\r\n while (this._loaded <= pos) {\r\n this.dom.appendChild(this.items[this._loaded].dom);\r\n this._loaded++;\r\n }\r\n }\r\n loadNext(batchSize = 50) {\r\n if (this._loaded < this.length) {\r\n this.ensureLoaded(Math.min(this.length - 1, this._loaded + batchSize - 1));\r\n return true;\r\n }\r\n return false;\r\n }\r\n slowlyLoad(interval = 30, batchSize = 50, autoLoad = false) {\r\n if (autoLoad) this.enableAutoLoad(interval, batchSize);\r\n if (this._slowLoading) return this._slowLoading;\r\n if (this._loaded >= this.length) return Promise.resolve(true);\r\n return this._slowLoading = new Promise((r) => {\r\n var cancel: Action;\r\n var cont: Action;\r\n var callback = () => {\r\n if (!this._slowLoading || !this.loadNext(batchSize)) {\r\n this.lazy = !!this._autoLoad;\r\n cancel();\r\n r(!!this._slowLoading);\r\n this._slowLoading = null;\r\n } else {\r\n cont();\r\n }\r\n };\r\n if (interval == -1 && window['requestIdleCallback']) {\r\n let handle: number;\r\n cancel = () => window['cancelIdleCallback'](handle);\r\n cont = () => {\r\n handle = window['requestIdleCallback'](callback);\r\n };\r\n cont();\r\n } else {\r\n if (interval == -1) interval = 30;\r\n let timer = setInterval(callback, interval);\r\n cancel = () => clearInterval(timer);\r\n cont = () => { };\r\n }\r\n });\r\n }\r\n enableAutoLoad(interval = 30, batchSize = 50) {\r\n this._autoLoad = { interval, batchSize };\r\n this.slowlyLoad(interval, batchSize);\r\n }\r\n stopLoading() {\r\n this._slowLoading = null;\r\n this._autoLoad = null;\r\n }\r\n unload() {\r\n this.stopLoading();\r\n for (let i = this._loaded - 1; i >= 0; i--) {\r\n this.items[i].dom.remove();\r\n }\r\n this.lazy = true;\r\n this._loaded = 0;\r\n }\r\n protected _insertToDom(item: T, pos: number) {\r\n if (!this.lazy || pos < this._loaded) {\r\n super._insertToDom(item, pos);\r\n this._loaded++;\r\n } else {\r\n if (this._autoLoad) {\r\n this.slowlyLoad(this._autoLoad.interval, this._autoLoad.batchSize);\r\n }\r\n }\r\n }\r\n protected _removeFromDom(item: T) {\r\n if (item.position! < this._loaded) {\r\n super._removeFromDom(item);\r\n this._loaded--;\r\n }\r\n }\r\n}\r\n","import { ObjectInit, objectInit, Callbacks, Action } from \"@yuuza/utils\";\r\nimport { BuildDomExpr, BuildDomNode } from \"../lib/buildDOM\";\r\nimport { ListViewItem, ListView } from \"./ListView\";\r\nimport { Overlay } from \"./Overlay\";\r\nimport { mountView, unmountView } from \"../lib/view\";\r\nimport { fadeout } from \"../lib/viewUtils\";\r\n\r\n\r\nexport class MenuItem extends ListViewItem {\r\n text: string = '';\r\n cls: 'normal' | 'dangerous' = 'normal';\r\n keepOpen = false;\r\n constructor(init: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.item.no-selection',\r\n tabIndex: 0\r\n };\r\n }\r\n postCreateDom() {\r\n super.postCreateDom();\r\n this.onActive.add((ev) => {\r\n if (this.parentView instanceof ContextMenu) {\r\n if (!this.keepOpen && !this.parentView.keepOpen) this.parentView.close();\r\n }\r\n });\r\n }\r\n private _lastcls;\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.textContent = this.text;\r\n if (this.cls !== this._lastcls) {\r\n if (this._lastcls) this.dom.classList.remove(this._lastcls);\r\n if (this.cls) this.dom.classList.add(this.cls);\r\n }\r\n }\r\n}\r\n\r\nexport class MenuLinkItem extends MenuItem {\r\n link: string = '';\r\n download: string = '';\r\n constructor(init: ObjectInit) {\r\n super(init);\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n var dom = super.createDom() as BuildDomNode;\r\n dom.tag = 'a.item.no-selection';\r\n dom.target = \"_blank\";\r\n return dom;\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n (this.dom as HTMLAnchorElement).href = this.link;\r\n (this.dom as HTMLAnchorElement).download = this.download;\r\n }\r\n}\r\n\r\nexport class MenuInfoItem extends MenuItem {\r\n text: string = '';\r\n constructor(init: ObjectInit) {\r\n super(init);\r\n this.keepOpen = true;\r\n objectInit(this, init);\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.menu-info'\r\n };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.textContent = this.text;\r\n }\r\n}\r\n\r\n\r\nexport class ContextMenu extends ListView {\r\n keepOpen = false;\r\n useOverlay = true;\r\n private _visible = false;\r\n get visible() { return this._visible; };\r\n overlay: Overlay | null = null;\r\n onClose = new Callbacks();\r\n private _originalFocused: Element | null = null;\r\n constructor(items?: MenuItem[]) {\r\n super({ tag: 'div.context-menu', tabIndex: 0 });\r\n items?.forEach(x => this.add(x));\r\n }\r\n postCreateDom() {\r\n super.postCreateDom();\r\n this.dom.addEventListener('focusout', (e) => {\r\n !this.dom.contains(e.relatedTarget as HTMLElement) && this.close();\r\n });\r\n this.dom.addEventListener('keydown', (e) => {\r\n if (e.code === 'Escape') {\r\n e.preventDefault();\r\n this.close();\r\n }\r\n });\r\n }\r\n show(arg: { x: number, y: number; } | { ev: MouseEvent; }) {\r\n if (this._visible) {\r\n console.trace(\"[ContextMenu] show() called when it's already visible.\");\r\n return;\r\n }\r\n if ('ev' in arg) arg = {\r\n x: arg.ev.clientX,\r\n y: arg.ev.clientY\r\n };\r\n this._visible = true;\r\n if (this.useOverlay) {\r\n if (!this.overlay) {\r\n this.overlay = new Overlay().setFixed(true);\r\n this.overlay.dom.style.background = 'rgba(0, 0, 0, .1)';\r\n this.overlay.dom.addEventListener('mousedown', (ev) => {\r\n if (ev.eventPhase !== Event.AT_TARGET) return;\r\n ev.preventDefault();\r\n this.close();\r\n });\r\n }\r\n this.overlay.appendView(this);\r\n mountView(document.body, this.overlay);\r\n } else {\r\n mountView(document.body, this);\r\n }\r\n this._originalFocused = document.activeElement;\r\n this.setPosition(arg);\r\n this.dom.focus();\r\n }\r\n setPosition(arg: { x: number, y: number }) {\r\n if (!this._visible) {\r\n console.trace(\"[ContextMenu] setPosition() called when it's not visible.\");\r\n return;\r\n }\r\n this.dom.style.left = '0';\r\n this.dom.style.top = '0';\r\n var parentWidth = document.body.offsetWidth;\r\n var parentHeight = document.body.offsetHeight;\r\n if (this.useOverlay) {\r\n const overlayDom = this.overlay!.dom;\r\n parentWidth = overlayDom.offsetWidth;\r\n parentHeight = overlayDom.offsetHeight;\r\n }\r\n this.dom.style.maxHeight = parentHeight + 'px';\r\n var width = this.dom.offsetWidth, height = this.dom.offsetHeight;\r\n var x = arg.x, y = arg.y;\r\n if (x + width > parentWidth) x -= width;\r\n if (y + height > parentHeight) y -= height;\r\n if (x < 0) {\r\n if (arg.x > parentWidth / 2) x = 0;\r\n else x = parentWidth - width;\r\n }\r\n if (y < 0) {\r\n if (arg.y > parentHeight / 2) y = 0;\r\n else y = parentHeight - height;\r\n }\r\n this.dom.style.left = x + 'px';\r\n this.dom.style.top = y + 'px';\r\n this.dom.style.transformOrigin = `${arg.x - x}px ${arg.y - y}px`;\r\n }\r\n close() {\r\n if (this._visible) {\r\n this._visible = false;\r\n this.onClose.invoke();\r\n this._originalFocused?.['focus']?.();\r\n this._originalFocused = null;\r\n if (this.overlay) fadeout(this.overlay.dom).onFinished(() => unmountView(document.body, this.overlay!));\r\n fadeout(this.dom).onFinished(() => !this.overlay && unmountView(document.body, this));\r\n }\r\n }\r\n}\r\n","import { Action, ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { IDOM, BuildDomExpr } from \"../lib/buildDOM\";\r\nimport { TextView } from \"./Basics\";\r\n\r\n\r\ntype SectionActionOptions = { text: string, onclick: Action; };\r\n\r\nexport class Section extends View {\r\n titleView = new TextView({ tag: 'span.section-title' });\r\n headerView = new View({\r\n tag: 'div.section-header',\r\n child: [\r\n this.titleView\r\n ]\r\n });\r\n content: View;\r\n constructor(arg?: { title?: BuildDomExpr, content?: BuildDomExpr, actions?: SectionActionOptions[]; }) {\r\n super();\r\n this.ensureDom();\r\n if (arg) {\r\n if (arg.title) this.setTitle(arg.title);\r\n if (arg.content) this.setContent(arg.content);\r\n if (arg.actions) arg.actions.forEach(x => this.addAction(x));\r\n }\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.section',\r\n child: [\r\n this.headerView\r\n ]\r\n };\r\n }\r\n setTitle(text: BuildDomExpr) {\r\n this.titleView.removeAllView();\r\n this.titleView.addChild(text);\r\n }\r\n setContent(view: BuildDomExpr) {\r\n if (this.content) this.removeView(this.content);\r\n this.content = View.getView(view);\r\n this.appendView(this.content);\r\n }\r\n addAction(arg: SectionAction | SectionActionOptions) {\r\n var view = arg instanceof View ?\r\n arg :\r\n new SectionAction({ text: arg.text, onActive: arg.onclick });\r\n this.headerView.appendView(view);\r\n }\r\n}\r\n\r\nexport class SectionAction extends TextView {\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n }\r\n createDom() {\r\n return {\r\n tag: 'div.section-action.clickable',\r\n tabIndex: 0\r\n }\r\n }\r\n}\r\n","import { ObjectInit, objectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { fadeout, Timer } from \"../lib/viewUtils\";\r\n\r\n\r\nexport class ToastsContainer extends View {\r\n static default: ToastsContainer = new ToastsContainer();\r\n parentDom: HTMLElement | null = null;\r\n toasts: Toast[] = [];\r\n createDom() {\r\n return { tag: 'div.toasts-container' };\r\n }\r\n addToast(toast: Toast) {\r\n if (this.toasts.length === 0)\r\n this.show();\r\n this.toasts.push(toast);\r\n }\r\n removeToast(toast: Toast) {\r\n this.toasts.remove(toast);\r\n if (this.toasts.length === 0)\r\n this.remove();\r\n }\r\n show() {\r\n var parent = this.parentDom || document.body;\r\n parent.appendChild(this.dom);\r\n }\r\n remove() {\r\n this.dom.remove();\r\n }\r\n}\r\n\r\nexport class Toast extends View {\r\n text: string = '';\r\n container: ToastsContainer;\r\n shown = false;\r\n timer = new Timer(() => this.close());\r\n constructor(init?: ObjectInit) {\r\n super();\r\n objectInit(this, init);\r\n if (!this.container) this.container = ToastsContainer.default;\r\n }\r\n show(timeout?: number) {\r\n if (!this.shown) {\r\n this.container.addToast(this);\r\n this.container.appendView(this);\r\n this.shown = true;\r\n }\r\n if (timeout) this.timer.timeout(timeout);\r\n else this.timer.tryCancel();\r\n }\r\n close() {\r\n if (!this.shown) return;\r\n this.shown = false;\r\n fadeout(this.dom)\r\n .onFinished(() => this.container.removeToast(this));\r\n }\r\n createDom() {\r\n return { tag: 'div.toast' };\r\n }\r\n updateDom() {\r\n super.updateDom();\r\n this.dom.textContent = this.text;\r\n }\r\n static show(text: string, timeout?: number) {\r\n var toast = new Toast({ text });\r\n toast.show(timeout);\r\n return toast;\r\n }\r\n}","import { Action, objectInit, ObjectInit } from \"@yuuza/utils\";\r\nimport { View } from \"../lib/view\";\r\nimport { I } from \"@yuuza/i18n\";\r\nimport { BuildDomExpr } from \"../lib/buildDOM\";\r\n\r\ntype LoadingIndicatorState = 'normal' | 'running' | 'error';\r\n\r\nexport class LoadingIndicator extends View {\r\n constructor(init?: ObjectInit) {\r\n super();\r\n if (init) objectInit(this, init);\r\n }\r\n private _status: LoadingIndicatorState = 'running';\r\n get state() { return this._status; }\r\n set state(val: LoadingIndicatorState) {\r\n this._status = val;\r\n ['running', 'error', 'normal'].forEach(x => this.toggleClass(x, val === x));\r\n }\r\n private _text: string;\r\n private _textdom: HTMLElement;\r\n get content() { return this._text; }\r\n set content(val: string) { this._text = val; this.ensureDom(); this._textdom.textContent = val; }\r\n onclick: ((e: MouseEvent) => void) | null = null;\r\n reset() {\r\n this.state = 'running';\r\n this.content = I`Loading`;\r\n this.onclick = null;\r\n }\r\n error(err, retry?: Action) {\r\n this.state = 'error';\r\n this.content = I`Oh no! Something just goes wrong:` + '\\r\\n' + err;\r\n if (retry) {\r\n this.content += '\\r\\n' + I`[Click here to retry]`;\r\n }\r\n this.onclick = retry as any;\r\n }\r\n async action(func: () => Promise) {\r\n try {\r\n await func();\r\n } catch (error) {\r\n this.error(error, () => this.action(func));\r\n }\r\n }\r\n createDom(): BuildDomExpr {\r\n return {\r\n tag: 'div.loading-indicator',\r\n child: [{\r\n tag: 'div.loading-indicator-inner',\r\n child: [{ tag: 'div.loading-indicator-text', _id: 'text' }]\r\n }],\r\n onclick: (e) => this.onclick?.(e)\r\n };\r\n }\r\n postCreateDom() {\r\n this._textdom = this.getDomById('text')!;\r\n this.reset();\r\n }\r\n}\r\n","export const version = \"1.10.4\""],"names":["_object_assign","Object","assign","_object_hasOwnProperty","prototype","hasOwnProperty","strPadLeft","str","len","ch","length","fileSizeUnits","numLimit","num","min","max","isNaN","arrayRemove","array","val","i","splice","arrayMap","arr","func","Array","map","idx","ret","item","arrayForeach","foreachFlaten","it","arrayFind","find","objectApply","obj","kv","keys","key","call","indexOf","objectInit","startsWith","Callbacks","add","remove","this","constructor","_cbs","undefined","_cbs_invoking","_hook","_invoking","onChanged","_a","size","invoke","args","Error","forEach","x","apply","error","console","clear","callback","Set","_b","delete","waitOnce","arguments","Promise","resolve","reject","cb","accessedRefs","Ref","value","_value","_onChanged","from","ref","computed","deps","updateValue","dep","result","endRefCollect","View","dom","parentView","_position","_domctx","BuildDOMCtx","_dom","_baseView","_mountState","MountState","Unmounted","_onActive","_childViews","view","domExprCreated","getView","position","ensureDom","domCreated","baseView","mountState","hidden","r","createDom","buildView","postCreateDom","updateDom","document","createElement","debugging","dataset","update","mountStateChanged","state","trace","child","getDomById","id","dict","updateWith","updateAllWith","updateAll","toggleClass","clsName","force","getDOM","addChild","appendView","appendChild","onActive","addEventListener","e","handleKeyDown","code","rect","getBoundingClientRect","MouseEvent","clientX","clientY","y","relatedTarget","preventDefault","childViews","addView","pos","_registerChild","Mounted","Mounting","_insertToDom","changeMountState","items","push","removeView","_ensureItem","_removeFromDom","removeAllView","removeFromParent","updateChildren","insertBefore","tryGetDOM","idom","Node","parent","childView","warnMountingView","buildDOM","data","mountView","unmountView","ContainerView","super","Symbol","iterator","get","exports","actions","setDict","node","addUpdateAction","action","a","run","TextAction","textContent","HiddenAction","UpdateAction","tryHandleValues","ctx","createTextNode","buildDomCore","ttl","JsxNode","tag","match","ele","reg","exec","classList","substr","createElementFromTag","buildDOMHandleKey","init","className","styleKey","styleVal","style","attrs","childs","buildDom","jsxBuildCore","c","jsxFactory","jsx","clearChildren","lastChild","removeChild","element","clsList","toggle","contains","fadeout","options","duration","end","finish","removeEventListener","onTransitionend","eventPhase","Event","AT_TARGET","setTimeout","finished","onFinished","cancel","Timer","cancelFunc","timeout","time","tryCancel","handle","window","clearTimeout","interval","setInterval","clearInterval","animationFrame","requestAnimationFrame","cancelAnimationFrame","listenPointerEvents","touchDown","mouseDown","type","ev","point","mousemove","mouseup","touchStart","ct","changedTouches","touch","touchmove","touchend","touches","listenEvent","event","handler","listenEvents","events","injectCss","css","head","text","I18n","curLang","missing","Map","arg","get2","lang","langObj","log","has","set","replace","add2dArray","langObjs","langs","line","j","renderElements","elements","childNodes","nodeType","TEXT_NODE","beforeI18n","detectLanguage","cur","curIdx","languages","navigator","language","l","createStringBuilder","i18n","arrBuilder","createArrayBuilder","literals","placeholders","join","formatCache","WeakMap","parseCache","format","translatedFormat","parsed","template","buf","parseTemplate","I","getWebfxCss","cssInjected","TextView","_text","textFunc","TextBtn","clickable","active","right","tabIndex","float","TabBtn","setPosition","anchor","left","top","dragManager","_currentItem","_currentArray","onDragStart","onDragEnd","currentItem","_c","currentArray","start","startArray","FlagsInput","FlagsInput_1","flags","f","flag","Flag","toString","parentInput","Overlay","setCenterChild","centerChild","setFlags","setNoBg","nobg","setFixed","fixed","Dialog","domheader","header","defaultParent","_defaultParent","DialogParent","width","contentFlex","content","resizable","overlay","shown","btnTitle","btnClose","title","allowClose","showCloseButton","onShown","onClose","focusTrap","close","addBtn","button","target","keyCode","shiftKey","tabables","querySelectorAll","offset","rectOverlay","pageX","pageY","bottom","setOffset","focus","btn","addContent","getOffset","parseFloat","center","show","_cancelFadeout","onDialogShowing","setTransformOrigin","autoFocus","transformOrigin","onDialogClosing","waitClose","body","bgOverlay","dialogCount","dialog","clickThrough","InputView","multiline","placeholder","HTMLInputElement","LabeledInputBase","dominput","input","label","ListViewItem","dragging","_selected","onSelectedChanged","enterctr","dragoverPlaceholder","listview","ListView","selectionHelper","dragData","selected","v","setAttribute","handleItemClicked","onItemClicked","altKey","mouseev","onContextMenu","_d","_f","_e","handleItemKeyDown","dir","scrollBox","targetY","offsetTop","offsetHeight","nextIdx","direction","selectedItems","sort","b","dataTransfer","setData","opacity","dragHandler","drop","source","sourceItems","accept","moveByDragging","selfInside","after","newpos","move","dropEffect","onDragover","hover","_g","_h","before","nextElementSibling","parentElement","_scrollBox","container","SelectionHelper","onItemMoved","itemProvider","draggable","keepSelected","toggleItemSelection","removeAll","ReplaceChild","_enabled","onEnabledChanged","ctrlForceSelect","onSelectedItemsChanged","lastToggledItem","enabled","count","ctrlKey","toSelect","MenuItem","cls","keepOpen","ContextMenu","_lastcls","visible","_visible","useOverlay","_originalFocused","background","activeElement","parentWidth","offsetWidth","parentHeight","overlayDom","maxHeight","height","SectionAction","ToastsContainer","parentDom","toasts","addToast","toast","removeToast","default","Toast","timer","_whenNotify","_callback","wait","disabled","cancelled","onCancelled","throwIfCancelled","newData","oldData","dataDict","n","dataSelectId","itemDict","removed","d","selectId","removeItem","updateItem","addItem","updateOrRebuildAll","isSame","rebuildAll","t","next","done","o","old","editing","beforeEdit","onComplete","startEdit","firstChild","select","stopEdit","evv","startEditAsync","list","pop","mouseIn","focusIn","_removeEvents","_removePointerEvents","stateChanged","removeListeners","funcSetActive","current","_func","rawValue","_loaded","_lazy","_slowLoading","_autoLoad","loaded","slowLoading","autoLoad","lazy","ensureLoaded","loadNext","batchSize","Math","slowlyLoad","enableAutoLoad","cont","stopLoading","unload","_status","onclick","_textdom","reset","err","retry","_id","link","download","href","addResultBtns","results","addBtnWithResult","setTitle","addText","allowCloseWithResult","showAndWaitResult","titleView","headerView","setContent","addAction","queue","maxCount","runningCount","enter","prom","res","exit","queueMicrotask","shift","isCompositing","_isCompositing","onCompositingChanged","_shown","_timer","_cancelClose","fadeOutOptions","shownKeys","toggleMode","setShownKeys","oldVal","toggleView","mode","display","sum","btoa","encodeURIComponent","p1","String","fromCharCode","nameFunc","existsFunc","date","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","toLocaleString","sec","round","floor","unit","toFixed","blob","reader","FileReader","onload","onerror","readAsDataURL","newChild","threshold","begin","lastRun","info"],"mappings":"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"} \ No newline at end of file diff --git a/dist/webfxcore.min.esm.js b/dist/webfxcore.min.esm.js index 55053d6..902a870 100644 --- a/dist/webfxcore.min.esm.js +++ b/dist/webfxcore.min.esm.js @@ -1,2 +1,2 @@ -var t=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{h(i.next(t))}catch(t){s(t)}}function a(t){try{h(i.throw(t))}catch(t){s(t)}}function h(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}h((i=i.apply(t,e||[])).next())}))};const e=Object.assign,n=Object.prototype.hasOwnProperty;function i(t,e,n=" "){for(;t.length=1024;)e++,t/=1024;return(e>0?t.toFixed(2):t)+" "+s[e]}function a(t){var e=new Date;return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()?t.toLocaleTimeString():t.toLocaleString()}function h(t,e,n){return tn?n:t}function c(t,e){for(let n=0;;n++){let i=t(n);if(!e(i))return i}}function d(t){return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode("0x"+e)})))}function u(t){return new Promise((e=>{setTimeout(e,t)}))}function l(t,e){for(let n=0;n{var i=e(t);i&&(n+=i)})),n}function _(t,i,o){if(i){if(!o)return e(t,i);for(const e in i)if(n.call(i,e)&&(!o||o.indexOf(e)>=0)){const n=i[e];t[e]=n}}return t}function C(t,e,i){if(e)for(const o in e)if(n.call(e,o)&&(!i||i.indexOf(o)>=0)){const n=e[o];o.startsWith("on")&&t[o]instanceof E?t[o].add(n):t[o]=n}return t}function b(t,e){return t<0&&(t=e+t),t%e}function y(t){return new Promise(((e,n)=>{var i=new FileReader;i.onload=t=>{e(i.result)},i.onerror=t=>n(),i.readAsDataURL(t)}))}Array.prototype.remove=function(t){l(this,t)};const E=class{constructor(){this._cbs=void 0,this._cbs_invoking=void 0,this._hook=void 0,this._invoking=!1}get onChanged(){var t;return null!==(t=this._hook)&&void 0!==t||(this._hook=new E),this._hook}get length(){return this._cbs?this._cbs.size:0}invoke(...t){var e;if(this._cbs){if(this._invoking)throw new Error("Cannot invoke callbacks during invocation");if(this._invoking=!0,this._cbs.forEach((e=>{try{e.apply(this,t)}catch(t){console.error("Error in callback",t)}})),this._cbs_invoking)for(const t of this._cbs_invoking)this._cbs.add(t);null===(e=this._cbs_invoking)||void 0===e||e.clear(),this._invoking=!1}}add(t){var e,n;return void 0===this._cbs&&(this._cbs=new Set),this._invoking?(null!==(e=this._cbs_invoking)&&void 0!==e||(this._cbs_invoking=new Set),this._cbs_invoking.add(t)):this._cbs.add(t),null===(n=this._hook)||void 0===n||n.invoke(!0,t),t}remove(t){var e,n;void 0!==this._cbs&&(this._invoking&&(null===(e=this._cbs_invoking)||void 0===e||e.delete(t)),this._cbs.delete(t),null===(n=this._hook)||void 0===n||n.invoke(!1,t))}waitOnce(t){if(0===arguments.length)return new Promise(((t,e)=>{const n=(...e)=>{this.remove(n),t(e)};this.add(n)}));if(!t)throw new Error("Invalid callback");{const e=(...n)=>(this.remove(e),t(...n));this.add(e)}}};class V{constructor(t){this._value=void 0,this._onChanged=void 0,this._value=t}get onChanged(){return this._onChanged||(this._onChanged=new E),this._onChanged}get value(){return this._value}set value(t){this._value=t,this._onChanged&&this.onChanged.invoke(this)}static from(t){const e=new V;return e._value=t,e}}class k{constructor(t){this._func=t,this._value=void 0}get computed(){return!this._func}get rawValue(){return this._value}get value(){return this._func&&(this._value=this._func(),this._func=void 0),this._value}}class x{constructor(t){this.queue=new Array,this.maxCount=1,this.runningCount=0,C(this,t)}enter(){if(this.runningCount===this.maxCount){var t,e=new Promise((e=>{t=e}));return this.queue.push(t),e}return this.runningCount++,Promise.resolve()}exit(){this.runningCount===this.maxCount&&this.queue.length?window.queueMicrotask?window.queueMicrotask(this.queue.shift()):setTimeout(this.queue.shift(),0):this.runningCount--}run(e){return t(this,void 0,void 0,(function*(){yield this.enter();try{yield e()}finally{this.exit()}}))}}class D{constructor(){this.cancelled=!1,this.onCancelled=new E}cancel(){this.cancelled||(this.cancelled=!0,this.onCancelled.invoke())}throwIfCancelled(){if(this.cancelled)throw new Error("operation cancelled.")}}class S{constructor(){this._whenNotify=null,this._callback=null}wait(){return this._whenNotify||(this._whenNotify=new Promise((t=>{this._callback=()=>{this._callback=this._whenNotify=null,t()}}))),this._whenNotify}set(){this._callback&&this._callback()}}class I{constructor(){this.list=[]}add(t,e){return this.list.push({event:t,func:e}),t.add(e),e}removeAll(){for(;this.list.length;){var t=this.list.pop();t.event.remove(t.func)}}}class L{constructor(t){this.parentView=void 0,this._position=void 0,this._domctx=new j,this._dom=void 0,this._baseView=void 0,this._mountState=B.Unmounted,this._onActive=void 0,this._childViews=void 0,this._domctx.view=this,t&&this.domExprCreated(t)}static getView(t){return t instanceof L?t:new L(t)}get position(){return this._position}get dom(){return this.ensureDom(),this._dom}get domCreated(){return!!this._dom}get baseView(){return this._baseView}get mountState(){return this._mountState}get hidden(){return this.dom.hidden}set hidden(t){this.dom.hidden=t}ensureDom(){if(!this._dom){var t=this.createDom();this.domExprCreated(t)}}domExprCreated(t){var e=X(t,this._domctx);e instanceof L?(this._baseView=e,this._dom=e.dom):this._dom=e,this.postCreateDom(),this.updateDom()}createDom(){return document.createElement("div")}postCreateDom(){L.debugging&&this.dom.dataset&&(this.dom.dataset.webfx=B[this._mountState])}updateDom(){this._domctx.update()}mountStateChanged(t){if(t!=this._mountState){if(this._mountState=t,L.debugging&&!this._baseView&&this.domCreated&&this.dom.dataset&&(this.dom.dataset.webfx==B[t]&&console.trace("mountState on the DOM is changed by other view",t,this),this.dom.dataset.webfx=B[t]),this._baseView)this._baseView.mountStateChanged(t);else if(this._childViews)for(const e of this._childViews)e.mountStateChanged(t)}else console.trace("mountState unchanged",t,this)}getDomById(t){var e,n;return this.ensureDom(),null!==(n=null===(e=this._domctx.dict)||void 0===e?void 0:e[t])&&void 0!==n?n:null}updateWith(t){_(this,t),this.updateDom()}updateAllWith(t){_(this,t),this.updateAll()}toggleClass(t,e){nt(this.dom,t,e)}getDOM(){return this.dom}addChild(t){const e=X(t,this._domctx);e instanceof L?this.appendView(e):this.dom.appendChild(e)}get onActive(){return this._onActive||(this._onActive=new E,this.dom.addEventListener("click",(t=>{this._onActive.invoke(t)})),this.dom.addEventListener("keydown",(t=>{this.handleKeyDown(t)}))),this._onActive}handleKeyDown(t){var e;if("Enter"===t.code){const n=this.dom.getBoundingClientRect();null===(e=this._onActive)||void 0===e||e.invoke(new MouseEvent("click",{clientX:n.x,clientY:n.y,relatedTarget:this.dom})),t.preventDefault()}}get childViews(){return this._baseView?this._baseView.childViews:(this._childViews||(this._childViews=[]),this._childViews)}appendView(t){this.addView(t)}addView(t,e){this._registerChild(t,e,!1),this._mountState==B.Mounted&&t.mountStateChanged(B.Mounting),this._insertToDom(t,e),this._mountState!=B.Unmounted&&t.mountStateChanged(this._mountState)}_registerChild(t,e,n=!0){const i=this.childViews;if(t.parentView)throw new Error("the view is already in a container view");if(t.parentView=this,void 0===e)t._position=i.length,i.push(t);else{i.splice(e,0,t);for(let t=e;t{n.addChild(H(t,e,n._domctx))}:i=>{var o;const s=H(i,e,t);s instanceof L?(n.appendChild(s.dom),null===(o=null==t?void 0:t.view)||void 0===o||o._registerChild(s)):N(n,s)}),n}addChild(t){null==this.child&&(this.child=[]),this.child.push(t)}}function H(t,e,n){if(e--<0)throw new Error("ran out of TTL");if(t instanceof L)return t;var i=W(t,n);if(i)return i;if(t instanceof z)return t.buildView(n,e);throw console.error("Unknown node type",t),new Error("Unknown node type")}function J(t,e){return H(t,64,e||new j)}function Q(t,e,...n){if("string"==typeof t)return new z(t,e,n);{const i=(null==e?void 0:e.args)?new t(...e.args):new t;return new z(i,e,n)}}const Z=Q;function tt(t){for(;t.lastChild;)t.removeChild(t.lastChild)}function et(t,e){tt(t),e&&t.appendChild(e)}function nt(t,e,n){var i=t.classList;return i.toggle?i.toggle(e,n):(void 0===n&&(n=!i.contains(e)),n?i.add(e):i.remove(e),n)}function it(t,e){const{className:n="fading-out",duration:i=500,remove:o=!0}=e||{};t.classList.add(n);var s=null,r=(e=!0)=>{r&&(r=null,t.removeEventListener("transitionend",a),t.classList.remove(n),o&&e&&t.remove(),e&&(null==s||s()))},a=function(t){t.eventPhase===Event.AT_TARGET&&(null==r||r())};return t.addEventListener("transitionend",a),setTimeout(r,i),{get finished(){return!r},onFinished(t){return r?s=t:t(),this},cancel(t=!1){null==r||r(t)}}}function ot(t=20){var e=Date.now(),n=Date.now();setInterval((()=>{var i=Date.now();i-n>=t&&console.info(`[Blocking] ${(i-e)/1e3}s: blocked for ${i-n} ms`),n=i}),1)}class st{constructor(t){this.callback=t,this.cancelFunc=void 0}timeout(t){this.tryCancel();var e=setTimeout(this.callback,t);this.cancelFunc=()=>window.clearTimeout(e)}interval(t){this.tryCancel();var e=setInterval(this.callback,t);this.cancelFunc=()=>window.clearInterval(e)}animationFrame(){this.tryCancel();var t=requestAnimationFrame(this.callback);this.cancelFunc=()=>cancelAnimationFrame(t)}tryCancel(){this.cancelFunc&&(this.cancelFunc(),this.cancelFunc=void 0)}}function rt(t,e,n){var i=!1,o=function(t){if("track"===e({type:"mouse",ev:t,point:t,action:"down"})){var n=function(t){e({type:"mouse",ev:t,point:t,action:"move"})},i=function(t){document.removeEventListener("mousemove",n,!0),document.removeEventListener("mouseup",i,!0),e({type:"mouse",ev:t,point:t,action:"up"})};document.addEventListener("mousemove",n,!0),document.addEventListener("mouseup",i,!0)}},s=function(o){var s=o.changedTouches[0],r=e({type:"touch",touch:"start",ev:o,point:s,action:i?"move":"down"});if(!i&&"track"===r){i=!0;var a=function(t){var n=t.changedTouches[0];e({type:"touch",touch:"move",ev:t,point:n,action:"move"})},h=function(n){0===n.touches.length&&(i=!1,t.removeEventListener("touchmove",a),t.removeEventListener("touchend",h),t.removeEventListener("touchcancel",h));var o=n.changedTouches[0];e({type:"touch",touch:"end",ev:n,point:o,action:i?"move":"up"})};t.addEventListener("touchmove",a,n),t.addEventListener("touchend",h,n),t.addEventListener("touchcancel",h,n)}};return t.addEventListener("mousedown",o,n),t.addEventListener("touchstart",s,n),{remove:()=>{t.removeEventListener("mousedown",o,n),t.removeEventListener("touchstart",s,n)}}}function at(t,e,n){return t.addEventListener(e,n),{remove:()=>t.removeEventListener(e,n)}}function ht(t,e,n){return e.forEach((e=>t.addEventListener(e,n))),{remove:()=>e.forEach((e=>t.removeEventListener(e,n)))}}function ct(t,e){var n,i;(null!==(n=null==e?void 0:e.parent)&&void 0!==n?n:document.head).appendChild(G({tag:null!==(i=null==e?void 0:e.tag)&&void 0!==i?i:"style",text:t}))}class dt{get isCompositing(){return this._isCompositing}set isCompositing(t){this._isCompositing=t,this.onCompositingChanged.invoke()}constructor(t){this.onCompositingChanged=new E,this._isCompositing=!1,this.dom=M(t),this.dom.addEventListener("compositionstart",(t=>{this.isCompositing=!0})),this.dom.addEventListener("compositionend",(t=>{this.isCompositing=!1}))}}class ut{constructor(t){this.dom=t,this.state={mouseDown:!1,mouseIn:!1,focusIn:!1},this._removeEvents=null,this._removePointerEvents=null,this.onChanged=new E,this._removeEvents=ht(t,["mouseenter","mouseleave","focusin","focusout"],(t=>{switch(t.type){case"mouseenter":this.stateChanged("mouseIn",!0);break;case"mouseleave":this.stateChanged("mouseIn",!1);break;case"focusin":this.stateChanged("focusIn",!0);break;case"focusout":this.stateChanged("focusIn",!1)}})).remove,this._removePointerEvents=rt(t,(t=>{if("down"==t.action)return this.stateChanged("mouseDown",!0),"track";"up"==t.action&&this.stateChanged("mouseDown",!1)})).remove}stateChanged(t,e){this.state[t]=e,this.onChanged.invoke(t)}removeListeners(){var t,e;null===(t=this._removeEvents)||void 0===t||t.call(this),null===(e=this._removePointerEvents)||void 0===e||e.call(this),this._removePointerEvents=this._removeEvents=null}}class lt{update(t){const e=this.items;var n={};for(const e of t)n[this.dataSelectId(e)]=e;var i={},o=[];for(const t of e){const e=this.selectId(t);void 0!==n[e]?i[e]=t:o.push(t)}for(let t=o.length-1;t>=0;t--)this.removeItem(o[t]);var s=0;for(const e of t){const t=i[this.dataSelectId(e)];void 0!==t?this.updateItem(t,e):this.addItem(e,s),s++}}updateOrRebuildAll(t){this.update(t),this.isSame(t)||this.rebuildAll(t)}isSame(t){var e=this.items[Symbol.iterator]();for(const i of t){var n=e.next();if(n.done)return!1;if(this.selectId(n.value)!==this.dataSelectId(i))return!1}return!!e.next().done}rebuildAll(t){var e=this.items;if(e instanceof Array)for(let t=e.length-1;t>=0;t--)this.removeItem(e[t]);else for(const t of e)this.removeItem(t);let n=0;for(const e of t)this.addItem(e,n++)}selectId(t){return t.id}dataSelectId(t){return t.id}addItem(t,e){}updateItem(t,e){}removeItem(t){}}class ft{constructor(){this.data={},this.curLang="en",this.missing=new Map}get(t,e){return this.get2(t,e)||t}get2(t,e,n){n=n||this.curLang;var i=this.data[n];if(!i)return console.log("i18n missing lang: "+n),null;var o=i[t];if(!o)return this.missing.has(t)||(this.missing.set(t,1),console.log("i18n missing key: "+t)),null;if(e)for(const t in e)if(e.hasOwnProperty(t)){const n=e[t];o=o.replace("{"+t+"}",n)}return o}add2dArray(t){const e=[],n=t[0];for(const t of n)e.push(this.data[t]=this.data[t]||{});for(let n=1;n{for(const n of t.childNodes)if(n.nodeType===Node.TEXT_NODE){var e=this.get2(n.beforeI18n||n.textContent);e?(n.beforeI18n=n.beforeI18n||n.textContent,n.textContent=e):(n.beforeI18n&&(n.textContent=n.beforeI18n),console.log("missing key for node",n))}}))}static detectLanguage(t){var e=null,n=-1,i=[];return(navigator.languages||[navigator.language]).forEach((t=>{i.push(t),t.indexOf("-")>0&&i.push(t.substr(0,t.indexOf("-")))})),t.forEach((t=>{var o=i.indexOf(t);(!e||-1!==o&&o"number"==typeof t?o[t]:t))}}var gt=new ft;const pt=vt(gt),wt="1.10.3";export{S as AutoResetEvent,j as BuildDOMCtx,E as Callbacks,D as CancelToken,U as ContainerView,lt as DataUpdatingHelper,I as EventRegistrations,pt as I,ft as I18n,ut as InputStateTracker,z as JsxNode,k as Lazy,B as MountState,V as Ref,x as Semaphore,dt as TextCompositionWatcher,st as Timer,L as View,N as addChild,O as appendView,p as arrayFind,m as arrayForeach,f as arrayInsert,v as arrayMap,l as arrayRemove,w as arraySum,d as base64EncodeUtf8,G as buildDOM,X as buildView,tt as clearChildren,mt as createArrayBuilder,c as createName,vt as createStringBuilder,it as fadeout,g as foreachFlaten,a as formatDateTime,o as formatDuration,r as formatFileSize,M as getDOM,gt as i18n,ct as injectCss,Z as jsx,J as jsxBuild,Q as jsxFactory,at as listenEvent,ht as listenEvents,rt as listenPointerEvents,b as mod,P as mountView,h as numLimit,_ as objectApply,C as objectInit,y as readBlobAsDataUrl,et as replaceChild,u as sleepAsync,ot as startBlockingDetect,i as strPadLeft,nt as toggleClass,A as tryGetDOM,F as unmountView,wt as version}; +var t=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{h(i.next(t))}catch(t){s(t)}}function a(t){try{h(i.throw(t))}catch(t){s(t)}}function h(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}h((i=i.apply(t,e||[])).next())}))};const e=Object.assign,n=Object.prototype.hasOwnProperty;function i(t,e,n=" "){for(;t.length=1024;)e++,t/=1024;return(e>0?t.toFixed(2):t)+" "+s[e]}function a(t){var e=new Date;return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()?t.toLocaleTimeString():t.toLocaleString()}function h(t,e,n){return tn?n:t}function c(t,e){for(let n=0;;n++){let i=t(n);if(!e(i))return i}}function d(t){return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode("0x"+e)})))}function u(t){return new Promise((e=>{setTimeout(e,t)}))}function l(t,e){for(let n=0;n{var i=e(t);i&&(n+=i)})),n}function _(t,i,o){if(i){if(!o)return e(t,i);for(const e in i)if(n.call(i,e)&&(!o||o.indexOf(e)>=0)){const n=i[e];t[e]=n}}return t}function C(t,e,i){if(e)for(const o in e)if(n.call(e,o)&&(!i||i.indexOf(o)>=0)){const n=e[o];o.startsWith("on")&&t[o]instanceof E?t[o].add(n):t[o]=n}return t}function b(t,e){return t<0&&(t=e+t),t%e}function y(t){return new Promise(((e,n)=>{var i=new FileReader;i.onload=t=>{e(i.result)},i.onerror=t=>n(),i.readAsDataURL(t)}))}Array.prototype.remove=function(t){l(this,t)};const E=class{constructor(){this._cbs=void 0,this._cbs_invoking=void 0,this._hook=void 0,this._invoking=!1}get onChanged(){var t;return null!==(t=this._hook)&&void 0!==t||(this._hook=new E),this._hook}get length(){return this._cbs?this._cbs.size:0}invoke(...t){var e;if(this._cbs){if(this._invoking)throw new Error("Cannot invoke callbacks during invocation");if(this._invoking=!0,this._cbs.forEach((e=>{try{e.apply(this,t)}catch(t){console.error("Error in callback",t)}})),this._cbs_invoking)for(const t of this._cbs_invoking)this._cbs.add(t);null===(e=this._cbs_invoking)||void 0===e||e.clear(),this._invoking=!1}}add(t){var e,n;return void 0===this._cbs&&(this._cbs=new Set),this._invoking?(null!==(e=this._cbs_invoking)&&void 0!==e||(this._cbs_invoking=new Set),this._cbs_invoking.add(t)):this._cbs.add(t),null===(n=this._hook)||void 0===n||n.invoke(!0,t),t}remove(t){var e,n;void 0!==this._cbs&&(this._invoking&&(null===(e=this._cbs_invoking)||void 0===e||e.delete(t)),this._cbs.delete(t),null===(n=this._hook)||void 0===n||n.invoke(!1,t))}waitOnce(t){if(0===arguments.length)return new Promise(((t,e)=>{const n=(...e)=>{this.remove(n),t(e)};this.add(n)}));if(!t)throw new Error("Invalid callback");{const e=(...n)=>(this.remove(e),t(...n));this.add(e)}}};let V=null;class k{constructor(t){this._value=void 0,this._onChanged=void 0,this._value=t}get onChanged(){return this._onChanged||(this._onChanged=new E),this._onChanged}get value(){return V&&V.add(this),this._value}set value(t){this._value=t,this._onChanged&&this.onChanged.invoke(this)}static from(t){const e=new k;return e._value=t,e}static computed(t){const e=new k;let n=null;const i=()=>{if(n)for(const t of n)t.onChanged.remove(i);V=new Set;const o=t();n=function(){const t=V;return V=null,t}();for(const t of n)t.onChanged.add(i);e.value=o};return i(),e}}class x{constructor(t){this._func=t,this._value=void 0}get computed(){return!this._func}get rawValue(){return this._value}get value(){return this._func&&(this._value=this._func(),this._func=void 0),this._value}}class D{constructor(t){this.queue=new Array,this.maxCount=1,this.runningCount=0,C(this,t)}enter(){if(this.runningCount===this.maxCount){var t,e=new Promise((e=>{t=e}));return this.queue.push(t),e}return this.runningCount++,Promise.resolve()}exit(){this.runningCount===this.maxCount&&this.queue.length?window.queueMicrotask?window.queueMicrotask(this.queue.shift()):setTimeout(this.queue.shift(),0):this.runningCount--}run(e){return t(this,void 0,void 0,(function*(){yield this.enter();try{yield e()}finally{this.exit()}}))}}class S{constructor(){this.cancelled=!1,this.onCancelled=new E}cancel(){this.cancelled||(this.cancelled=!0,this.onCancelled.invoke())}throwIfCancelled(){if(this.cancelled)throw new Error("operation cancelled.")}}class I{constructor(){this._whenNotify=null,this._callback=null}wait(){return this._whenNotify||(this._whenNotify=new Promise((t=>{this._callback=()=>{this._callback=this._whenNotify=null,t()}}))),this._whenNotify}set(){this._callback&&this._callback()}}class L{constructor(){this.list=[]}add(t,e){return this.list.push({event:t,func:e}),t.add(e),e}removeAll(){for(;this.list.length;){var t=this.list.pop();t.event.remove(t.func)}}}class A{constructor(t){this.parentView=void 0,this._position=void 0,this._domctx=new q,this._dom=void 0,this._baseView=void 0,this._mountState=j.Unmounted,this._onActive=void 0,this._childViews=void 0,this._domctx.view=this,t&&this.domExprCreated(t)}static getView(t){return t instanceof A?t:new A(t)}get position(){return this._position}get dom(){return this.ensureDom(),this._dom}get domCreated(){return!!this._dom}get baseView(){return this._baseView}get mountState(){return this._mountState}get hidden(){return this.dom.hidden}set hidden(t){this.dom.hidden=t}ensureDom(){if(!this._dom){var t=this.createDom();this.domExprCreated(t)}}domExprCreated(t){var e=z(t,this._domctx);e instanceof A?(this._baseView=e,this._dom=e.dom):this._dom=e,this.postCreateDom(),this.updateDom()}createDom(){return document.createElement("div")}postCreateDom(){A.debugging&&this.dom.dataset&&(this.dom.dataset.webfx=j[this._mountState])}updateDom(){this._domctx.update()}mountStateChanged(t){if(t!=this._mountState){if(this._mountState=t,A.debugging&&!this._baseView&&this.domCreated&&this.dom.dataset&&(this.dom.dataset.webfx==j[t]&&console.trace("mountState on the DOM is changed by other view",t,this),this.dom.dataset.webfx=j[t]),this._baseView)this._baseView.mountStateChanged(t);else if(this._childViews)for(const e of this._childViews)e.mountStateChanged(t)}else console.trace("mountState unchanged",t,this)}getDomById(t){var e,n;return this.ensureDom(),null!==(n=null===(e=this._domctx.dict)||void 0===e?void 0:e[t])&&void 0!==n?n:null}updateWith(t){_(this,t),this.updateDom()}updateAllWith(t){_(this,t),this.updateAll()}toggleClass(t,e){it(this.dom,t,e)}getDOM(){return this.dom}addChild(t){const e=z(t,this._domctx);e instanceof A?this.appendView(e):this.dom.appendChild(e)}get onActive(){return this._onActive||(this._onActive=new E,this.dom.addEventListener("click",(t=>{this._onActive.invoke(t)})),this.dom.addEventListener("keydown",(t=>{this.handleKeyDown(t)}))),this._onActive}handleKeyDown(t){var e;if("Enter"===t.code){const n=this.dom.getBoundingClientRect();null===(e=this._onActive)||void 0===e||e.invoke(new MouseEvent("click",{clientX:n.x,clientY:n.y,relatedTarget:this.dom})),t.preventDefault()}}get childViews(){return this._baseView?this._baseView.childViews:(this._childViews||(this._childViews=[]),this._childViews)}appendView(t){this.addView(t)}addView(t,e){this._registerChild(t,e,!1),this._mountState==j.Mounted&&t.mountStateChanged(j.Mounting),this._insertToDom(t,e),this._mountState!=j.Unmounted&&t.mountStateChanged(this._mountState)}_registerChild(t,e,n=!0){const i=this.childViews;if(t.parentView)throw new Error("the view is already in a container view");if(t.parentView=this,void 0===e)t._position=i.length,i.push(t);else{i.splice(e,0,t);for(let t=e;t{n.addChild(J(t,e,n._domctx))}:i=>{var o;const s=J(i,e,t);s instanceof A?(n.appendChild(s.dom),null===(o=null==t?void 0:t.view)||void 0===o||o._registerChild(s)):T(n,s)}),n}addChild(t){null==this.child&&(this.child=[]),this.child.push(t)}}function J(t,e,n){if(e--<0)throw new Error("ran out of TTL");if(t instanceof A)return t;var i=K(t,n);if(i)return i;if(t instanceof H)return t.buildView(n,e);throw console.error("Unknown node type",t),new Error("Unknown node type")}function Q(t,e){return J(t,64,e||new q)}function Z(t,e,...n){if("string"==typeof t)return new H(t,e,n);{const i=(null==e?void 0:e.args)?new t(...e.args):new t;return new H(i,e,n)}}const tt=Z;function et(t){for(;t.lastChild;)t.removeChild(t.lastChild)}function nt(t,e){et(t),e&&t.appendChild(e)}function it(t,e,n){var i=t.classList;return i.toggle?i.toggle(e,n):(void 0===n&&(n=!i.contains(e)),n?i.add(e):i.remove(e),n)}function ot(t,e){const{className:n="fading-out",duration:i=500,remove:o=!0}=e||{};t.classList.add(n);var s=null,r=(e=!0)=>{r&&(r=null,t.removeEventListener("transitionend",a),t.classList.remove(n),o&&e&&t.remove(),e&&(null==s||s()))},a=function(t){t.eventPhase===Event.AT_TARGET&&(null==r||r())};return t.addEventListener("transitionend",a),setTimeout(r,i),{get finished(){return!r},onFinished(t){return r?s=t:t(),this},cancel(t=!1){null==r||r(t)}}}function st(t=20){var e=Date.now(),n=Date.now();setInterval((()=>{var i=Date.now();i-n>=t&&console.info(`[Blocking] ${(i-e)/1e3}s: blocked for ${i-n} ms`),n=i}),1)}class rt{constructor(t){this.callback=t,this.cancelFunc=void 0}timeout(t){this.tryCancel();var e=setTimeout(this.callback,t);this.cancelFunc=()=>window.clearTimeout(e)}interval(t){this.tryCancel();var e=setInterval(this.callback,t);this.cancelFunc=()=>window.clearInterval(e)}animationFrame(){this.tryCancel();var t=requestAnimationFrame(this.callback);this.cancelFunc=()=>cancelAnimationFrame(t)}tryCancel(){this.cancelFunc&&(this.cancelFunc(),this.cancelFunc=void 0)}}function at(t,e,n){var i=!1,o=function(t){if("track"===e({type:"mouse",ev:t,point:t,action:"down"})){var n=function(t){e({type:"mouse",ev:t,point:t,action:"move"})},i=function(t){document.removeEventListener("mousemove",n,!0),document.removeEventListener("mouseup",i,!0),e({type:"mouse",ev:t,point:t,action:"up"})};document.addEventListener("mousemove",n,!0),document.addEventListener("mouseup",i,!0)}},s=function(o){var s=o.changedTouches[0],r=e({type:"touch",touch:"start",ev:o,point:s,action:i?"move":"down"});if(!i&&"track"===r){i=!0;var a=function(t){var n=t.changedTouches[0];e({type:"touch",touch:"move",ev:t,point:n,action:"move"})},h=function(n){0===n.touches.length&&(i=!1,t.removeEventListener("touchmove",a),t.removeEventListener("touchend",h),t.removeEventListener("touchcancel",h));var o=n.changedTouches[0];e({type:"touch",touch:"end",ev:n,point:o,action:i?"move":"up"})};t.addEventListener("touchmove",a,n),t.addEventListener("touchend",h,n),t.addEventListener("touchcancel",h,n)}};return t.addEventListener("mousedown",o,n),t.addEventListener("touchstart",s,n),{remove:()=>{t.removeEventListener("mousedown",o,n),t.removeEventListener("touchstart",s,n)}}}function ht(t,e,n){return t.addEventListener(e,n),{remove:()=>t.removeEventListener(e,n)}}function ct(t,e,n){return e.forEach((e=>t.addEventListener(e,n))),{remove:()=>e.forEach((e=>t.removeEventListener(e,n)))}}function dt(t,e){var n,i;(null!==(n=null==e?void 0:e.parent)&&void 0!==n?n:document.head).appendChild(X({tag:null!==(i=null==e?void 0:e.tag)&&void 0!==i?i:"style",text:t}))}class ut{get isCompositing(){return this._isCompositing}set isCompositing(t){this._isCompositing=t,this.onCompositingChanged.invoke()}constructor(t){this.onCompositingChanged=new E,this._isCompositing=!1,this.dom=O(t),this.dom.addEventListener("compositionstart",(t=>{this.isCompositing=!0})),this.dom.addEventListener("compositionend",(t=>{this.isCompositing=!1}))}}class lt{constructor(t){this.dom=t,this.state={mouseDown:!1,mouseIn:!1,focusIn:!1},this._removeEvents=null,this._removePointerEvents=null,this.onChanged=new E,this._removeEvents=ct(t,["mouseenter","mouseleave","focusin","focusout"],(t=>{switch(t.type){case"mouseenter":this.stateChanged("mouseIn",!0);break;case"mouseleave":this.stateChanged("mouseIn",!1);break;case"focusin":this.stateChanged("focusIn",!0);break;case"focusout":this.stateChanged("focusIn",!1)}})).remove,this._removePointerEvents=at(t,(t=>{if("down"==t.action)return this.stateChanged("mouseDown",!0),"track";"up"==t.action&&this.stateChanged("mouseDown",!1)})).remove}stateChanged(t,e){this.state[t]=e,this.onChanged.invoke(t)}removeListeners(){var t,e;null===(t=this._removeEvents)||void 0===t||t.call(this),null===(e=this._removePointerEvents)||void 0===e||e.call(this),this._removePointerEvents=this._removeEvents=null}}class ft{update(t){const e=this.items;var n={};for(const e of t)n[this.dataSelectId(e)]=e;var i={},o=[];for(const t of e){const e=this.selectId(t);void 0!==n[e]?i[e]=t:o.push(t)}for(let t=o.length-1;t>=0;t--)this.removeItem(o[t]);var s=0;for(const e of t){const t=i[this.dataSelectId(e)];void 0!==t?this.updateItem(t,e):this.addItem(e,s),s++}}updateOrRebuildAll(t){this.update(t),this.isSame(t)||this.rebuildAll(t)}isSame(t){var e=this.items[Symbol.iterator]();for(const i of t){var n=e.next();if(n.done)return!1;if(this.selectId(n.value)!==this.dataSelectId(i))return!1}return!!e.next().done}rebuildAll(t){var e=this.items;if(e instanceof Array)for(let t=e.length-1;t>=0;t--)this.removeItem(e[t]);else for(const t of e)this.removeItem(t);let n=0;for(const e of t)this.addItem(e,n++)}selectId(t){return t.id}dataSelectId(t){return t.id}addItem(t,e){}updateItem(t,e){}removeItem(t){}}class vt{constructor(){this.data={},this.curLang="en",this.missing=new Map}get(t,e){return this.get2(t,e)||t}get2(t,e,n){n=n||this.curLang;var i=this.data[n];if(!i)return console.log("i18n missing lang: "+n),null;var o=i[t];if(!o)return this.missing.has(t)||(this.missing.set(t,1),console.log("i18n missing key: "+t)),null;if(e)for(const t in e)if(e.hasOwnProperty(t)){const n=e[t];o=o.replace("{"+t+"}",n)}return o}add2dArray(t){const e=[],n=t[0];for(const t of n)e.push(this.data[t]=this.data[t]||{});for(let n=1;n{for(const n of t.childNodes)if(n.nodeType===Node.TEXT_NODE){var e=this.get2(n.beforeI18n||n.textContent);e?(n.beforeI18n=n.beforeI18n||n.textContent,n.textContent=e):(n.beforeI18n&&(n.textContent=n.beforeI18n),console.log("missing key for node",n))}}))}static detectLanguage(t){var e=null,n=-1,i=[];return(navigator.languages||[navigator.language]).forEach((t=>{i.push(t),t.indexOf("-")>0&&i.push(t.substr(0,t.indexOf("-")))})),t.forEach((t=>{var o=i.indexOf(t);(!e||-1!==o&&o"number"==typeof t?o[t]:t))}}var pt=new vt;const wt=mt(pt),_t="1.10.4";export{I as AutoResetEvent,q as BuildDOMCtx,E as Callbacks,S as CancelToken,B as ContainerView,ft as DataUpdatingHelper,L as EventRegistrations,wt as I,vt as I18n,lt as InputStateTracker,H as JsxNode,x as Lazy,j as MountState,k as Ref,D as Semaphore,ut as TextCompositionWatcher,rt as Timer,A as View,T as addChild,N as appendView,p as arrayFind,m as arrayForeach,f as arrayInsert,v as arrayMap,l as arrayRemove,w as arraySum,d as base64EncodeUtf8,X as buildDOM,z as buildView,et as clearChildren,gt as createArrayBuilder,c as createName,mt as createStringBuilder,ot as fadeout,g as foreachFlaten,a as formatDateTime,o as formatDuration,r as formatFileSize,O as getDOM,pt as i18n,dt as injectCss,tt as jsx,Q as jsxBuild,Z as jsxFactory,ht as listenEvent,ct as listenEvents,at as listenPointerEvents,b as mod,F as mountView,h as numLimit,_ as objectApply,C as objectInit,y as readBlobAsDataUrl,nt as replaceChild,u as sleepAsync,st as startBlockingDetect,i as strPadLeft,it as toggleClass,M as tryGetDOM,U as unmountView,_t as version}; //# sourceMappingURL=webfxcore.min.esm.js.map diff --git a/dist/webfxcore.min.esm.js.map b/dist/webfxcore.min.esm.js.map index dc7eb70..9dcb774 100644 --- a/dist/webfxcore.min.esm.js.map +++ b/dist/webfxcore.min.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"webfxcore.min.esm.js","sources":["https://github.com/lideming/webfx/raw/v1.10.3/packages/utils/src/utils.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/view.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/buildDOM.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/viewUtils.ts","https://github.com/lideming/webfx/raw/v1.10.3/packages/i18n/src/i18n.ts","https://github.com/lideming/webfx/raw/v1.10.3/version"],"sourcesContent":["// file: utils.ts\n\nconst _object_assign = Object.assign;\nconst _object_hasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Time & formatting utils:\n\nexport function strPadLeft(str: string, len: number, ch: string = ' ') {\n while (str.length < len) {\n str = ch + str;\n }\n return str;\n}\n\nexport function formatDuration(sec: number | any) {\n if (typeof sec !== 'number' || isNaN(sec)) return '--:--';\n sec = Math.round(sec);\n var min = Math.floor(sec / 60);\n sec %= 60;\n return strPadLeft(min.toString(), 2, '0') + ':' + strPadLeft(sec.toString(), 2, '0');\n}\n\nconst fileSizeUnits = ['B', 'KB', 'MB', 'GB', 'TB'];\nexport function formatFileSize(size: number | any) {\n if (typeof size !== \"number\" || isNaN(size)) return 'NaN';\n var unit = 0;\n while (unit < fileSizeUnits.length - 1 && size >= 1024) {\n unit++;\n size /= 1024;\n }\n return (unit > 0 ? size.toFixed(2) : size) + ' ' + fileSizeUnits[unit];\n}\n\nexport function formatDateTime(date: Date) {\n var now = new Date();\n var sameday = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n return sameday ? date.toLocaleTimeString() : date.toLocaleString();\n}\n\nexport function numLimit(num: number, min: number, max: number) {\n return (num < min || typeof num != 'number' || isNaN(num)) ? min :\n (num > max) ? max : num;\n}\n\nexport function createName(nameFunc: (num: number) => string, existsFunc: (str: string) => boolean) {\n for (let num = 0; ; num++) {\n let str = nameFunc(num);\n if (!existsFunc(str)) return str;\n }\n}\n\n/** \n * btoa, but supports Unicode and uses UTF-8 encoding.\n * @see https://stackoverflow.com/questions/30106476\n */\nexport function base64EncodeUtf8(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\n function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1) as any);\n }));\n}\n\nexport function sleepAsync(time: number): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport function arrayRemove(array: T[], val: T) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === val) {\n array.splice(i, 1);\n i--;\n }\n }\n}\n\nexport function arrayInsert(array: T[], val: T, pos?: number) {\n if (pos === undefined) array.push(val);\n else array.splice(pos, 0, val);\n}\n\nexport function arrayMap(arr: Iterable, func: (item: T, idx: number) => TRet) {\n if (arr instanceof Array) return arr.map(func);\n var idx = 0;\n var ret = new Array((arr as any).length);\n for (var item of arr) {\n ret[idx] = (func(item, idx));\n idx++;\n }\n return ret;\n}\n\nexport function arrayForeach(arr: Iterable, func: (item: T, idx: number) => void) {\n var idx = 0;\n for (var item of arr) {\n func(item, idx++);\n }\n}\n\n\nexport function foreachFlaten(arr: T[], func: Action) {\n for (const it of arr) {\n if (it instanceof Array) {\n foreachFlaten(it as T[], func);\n } else {\n func(it);\n }\n }\n}\n\nexport function arrayFind(arr: Iterable, func: (item: T, idx: number) => any): T | null {\n if (arr instanceof Array) return arr.find(func);\n var idx = 0;\n for (var item of arr) {\n if (func(item, idx++)) return item;\n }\n return null;\n}\n\nexport function arraySum(arr: Iterable, func: (item: T) => number | null | undefined) {\n var sum = 0;\n arrayForeach(arr, (x) => {\n var val = func(x);\n if (val) sum += val;\n });\n return sum;\n}\n\nexport function objectApply(obj: Partial, kv?: Partial, keys?: Array) {\n if (kv) {\n if (!keys) return _object_assign(obj, kv);\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n obj[key] = val;\n }\n }\n }\n return obj;\n}\n\nexport function objectInit(obj: T, kv?: ObjectInit, keys?: Array) {\n if (kv) {\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n if (key.startsWith(\"on\") && obj[key] instanceof Callbacks) {\n (obj[key] as Callbacks).add(val);\n } else {\n obj[key] = val;\n }\n }\n }\n }\n return obj;\n}\n\nexport function mod(a: number, b: number): number {\n if (a < 0) a = b + a;\n return a % b;\n}\n\nexport function readBlobAsDataUrl(blob: Blob) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (ev) => {\n resolve(reader.result as string);\n };\n reader.onerror = (ev) => reject();\n reader.readAsDataURL(blob);\n });\n}\n\nArray.prototype.remove = function (item) {\n arrayRemove(this, item);\n};\n\ndeclare global {\n interface Array {\n /**\n * (Extension method) remove the specified item from array.\n * @param item The item to be removed from array\n */\n remove(item: T): void;\n }\n}\n\nexport type ObjectInit = Partial>;\n\nexport type ConvertObjectWithCallbacks = {\n [P in keyof T]: P extends `on${string}` ? CallbackInit : T[P];\n};\n\nexport type CallbackInit = T extends Callbacks ? T | U : T;\n\n// Some interesting function types:\nexport type AnyFunc = (...args: any) => any;\nexport type Action = (arg: T) => void;\nexport type Func = () => TRet;\nexport type AsyncFunc = Func>;\n\nexport type FuncOrVal = T | Func;\n\nclass CallbacksImpl {\n private _cbs: Set | undefined = undefined;\n private _cbs_invoking: Set | undefined = undefined;\n private _hook?: Callbacks<(adding: boolean, func: T) => void> = undefined;\n private _invoking = false;\n get onChanged() {\n this._hook ??= new Callbacks();\n return this._hook;\n }\n get length() { return this._cbs ? this._cbs.size : 0; }\n invoke(...args: Parameters) {\n if (!this._cbs) return;\n if (this._invoking) throw new Error(\"Cannot invoke callbacks during invocation\");\n this._invoking = true;\n this._cbs.forEach((x: (...args: any) => void) => {\n try {\n x.apply(this, args);\n } catch (error) {\n console.error(\"Error in callback\", error);\n }\n });\n if (this._cbs_invoking) {\n for (const x of this._cbs_invoking) {\n this._cbs.add(x);\n }\n }\n this._cbs_invoking?.clear();\n this._invoking = false;\n }\n add(callback: T) {\n if (this._cbs === undefined) {\n this._cbs = new Set();\n }\n if (this._invoking) {\n this._cbs_invoking ??= new Set();\n this._cbs_invoking.add(callback);\n } else {\n this._cbs.add(callback);\n }\n this._hook?.invoke(true, callback);\n return callback;\n }\n remove(callback: T) {\n if (this._cbs === undefined) return;\n if (this._invoking) {\n this._cbs_invoking?.delete(callback);\n }\n this._cbs.delete(callback);\n this._hook?.invoke(false, callback);\n }\n\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n waitOnce(callback?: T) {\n if (arguments.length === 0) {\n return new Promise>((resolve, reject) => {\n const cb = ((...args) => {\n this.remove(cb);\n resolve(args);\n }) as T;\n this.add(cb);\n });\n } else if (callback) {\n const cb = ((...args) => {\n this.remove(cb);\n return callback(...args);\n }) as T;\n this.add(cb);\n } else {\n throw new Error(\"Invalid callback\");\n }\n }\n}\n\nexport interface Callbacks {\n invoke(...args: Parameters): void;\n add(callback: T): T;\n remove(callback: T): void;\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n readonly length: number;\n readonly onChanged: Callbacks<(adding: boolean, func: T) => void>;\n}\nexport const Callbacks: { new (): Callbacks; } = CallbacksImpl;\n\nexport class Ref {\n private _value: T | undefined = undefined;\n private _onChanged: Callbacks>> | undefined = undefined;\n constructor(value?: T) {\n this._value = value;\n }\n get onChanged() {\n if (!this._onChanged) this._onChanged = new Callbacks();\n return this._onChanged;\n }\n get value() { return this._value; }\n set value(val) {\n this._value = val;\n if (this._onChanged) this.onChanged.invoke(this);\n }\n static from(value: T) {\n const ref = new Ref();\n ref._value = value;\n return ref as (Ref & { value: T });\n }\n}\n\nexport class Lazy {\n private _func?: Func;\n private _value?: T;\n get computed() { return !this._func; }\n get rawValue() { return this._value; }\n get value(): T {\n if (this._func) {\n this._value = this._func();\n this._func = undefined;\n }\n return this._value!;\n }\n constructor(func: Func) {\n this._func = func;\n this._value = undefined;\n }\n}\n\nexport class Semaphore {\n queue = new Array();\n maxCount = 1;\n runningCount = 0;\n constructor(init: ObjectInit) {\n objectInit(this, init);\n }\n enter(): Promise {\n if (this.runningCount === this.maxCount) {\n var resolve: Action;\n var prom = new Promise((res) => { resolve = res; });\n this.queue.push(resolve!);\n return prom;\n } else {\n this.runningCount++;\n return Promise.resolve();\n }\n }\n exit() {\n if (this.runningCount === this.maxCount && this.queue.length) {\n if (window.queueMicrotask) {\n window.queueMicrotask(this.queue.shift() as any);\n } else {\n setTimeout(this.queue.shift()!, 0);\n }\n } else {\n this.runningCount--;\n }\n }\n async run(func: () => Promise) {\n await this.enter();\n try {\n await func();\n } finally {\n this.exit();\n }\n }\n}\n\n/** Just like CancellationToken[Source] on .NET */\nexport class CancelToken {\n cancelled = false;\n onCancelled = new Callbacks();\n cancel() {\n if (this.cancelled) return;\n this.cancelled = true;\n this.onCancelled.invoke();\n }\n throwIfCancelled() {\n if (this.cancelled)\n throw new Error(\"operation cancelled.\");\n }\n}\n\nexport class AutoResetEvent {\n private _whenNotify: Promise | null = null;\n private _callback: Action | null = null;\n\n wait() {\n if (!this._whenNotify) {\n this._whenNotify = new Promise(r => {\n this._callback = () => {\n this._callback = this._whenNotify = null;\n r();\n };\n });\n }\n return this._whenNotify;\n }\n set() {\n this._callback && this._callback();\n }\n}\n\nexport class EventRegistrations {\n list: { event: Callbacks; func: AnyFunc; }[] = [];\n add(event: Callbacks, func: T) {\n this.list.push({ event, func });\n event.add(func);\n return func;\n }\n removeAll() {\n while (this.list.length) {\n var r = this.list.pop()!;\n r.event.remove(r.func);\n }\n }\n}\n","import { Action, Callbacks, objectApply, arrayFind, arrayForeach, arrayMap } from \"@yuuza/utils\";\nimport { buildDOM, BuildDOMCtx, BuildDomExpr, buildView, IDOM, IView, JsxNode, MountState } from \"./buildDOM\";\nimport { toggleClass } from \"./viewUtils\";\n\n\nexport class View implements IView {\n constructor(dom?: BuildDomExpr) {\n this._domctx.view = this;\n if (dom) this.domExprCreated(dom);\n }\n\n static getView(obj: BuildDomExpr) { return obj instanceof View ? obj : new View(obj); }\n\n static debugging = false;\n\n public parentView?: View = undefined;\n public _position?: number = undefined;\n get position() { return this._position; }\n\n private _domctx = new BuildDOMCtx();\n\n protected _dom: T | undefined = undefined;\n public get dom() {\n this.ensureDom();\n return this._dom!;\n }\n public get domCreated() { return !!this._dom; }\n\n private _baseView: View | undefined = undefined;\n public get baseView() { return this._baseView; }\n\n private _mountState: MountState = MountState.Unmounted;\n public get mountState() { return this._mountState; }\n\n public get hidden() { return this.dom.hidden; }\n public set hidden(val: boolean) { this.dom.hidden = val; }\n\n public ensureDom() {\n if (!this._dom) {\n var r = this.createDom();\n this.domExprCreated(r);\n }\n }\n\n private domExprCreated(r: BuildDomExpr) {\n var view = buildView(r, this._domctx);\n if (view instanceof View) {\n this._baseView = view;\n this._dom = view.dom as T;\n } else {\n this._dom = view as T;\n }\n this.postCreateDom();\n this.updateDom();\n }\n\n protected createDom(): BuildDomExpr {\n return document.createElement('div');\n }\n\n /** Will be called when the dom is created */\n protected postCreateDom() {\n if (View.debugging) {\n if (this.dom.dataset)\n this.dom.dataset['webfx'] = MountState[this._mountState];\n }\n }\n\n /** Will be called when the dom is created, after postCreateDom() */\n public updateDom() {\n this._domctx.update();\n }\n\n /** Will be called when the mounting state is changed */\n public mountStateChanged(state: MountState) {\n if (state == this._mountState) {\n console.trace(\"mountState unchanged\", state, this);\n return;\n }\n this._mountState = state;\n if (View.debugging) {\n if (!this._baseView && this.domCreated && this.dom.dataset) {\n if (this.dom.dataset['webfx'] == MountState[state]) {\n console.trace('mountState on the DOM is changed by other view', state, this);\n }\n this.dom.dataset['webfx'] = MountState[state];\n }\n }\n if (this._baseView) {\n // let the baseView do the rest\n this._baseView.mountStateChanged(state);\n return;\n }\n if (this._childViews) for (const child of this._childViews) {\n child.mountStateChanged(state);\n }\n }\n\n public getDomById(id: string): HTMLElement | null {\n this.ensureDom();\n return this._domctx.dict?.[id] ?? null;\n }\n\n /** Assign key-values and call `updateDom()` */\n updateWith(kv: Partial) {\n objectApply(this, kv);\n this.updateDom();\n }\n updateAllWith(kv: Partial) {\n objectApply(this, kv);\n this.updateAll();\n }\n toggleClass(clsName: string, force?: boolean) {\n toggleClass(this.dom, clsName, force);\n }\n\n // Implements `IDOMInstance`\n // appendView(view: View) { this.dom.appendChild(view.dom); }\n getDOM() { return this.dom; }\n addChild(child: BuildDomExpr) {\n const view = buildView(child, this._domctx);\n if (view instanceof View) {\n this.appendView(view);\n } else {\n this.dom.appendChild(view);\n }\n }\n\n private _onActive: Callbacks> | undefined = undefined;\n get onActive() {\n if (!this._onActive) {\n this._onActive = new Callbacks>();\n this.dom.addEventListener('click', (e: MouseEvent) => {\n this._onActive!.invoke(e);\n });\n this.dom.addEventListener('keydown', (e: KeyboardEvent) => {\n this.handleKeyDown(e);\n });\n }\n return this._onActive;\n }\n\n handleKeyDown(e: KeyboardEvent) {\n if (e.code === 'Enter') {\n const rect = this.dom.getBoundingClientRect();\n this._onActive?.invoke(new MouseEvent('click', {\n clientX: rect.x, clientY: rect.y,\n relatedTarget: this.dom\n }));\n e.preventDefault();\n }\n }\n\n private _childViews: View[] | undefined = undefined;\n get childViews(): View[] {\n // Return the childViews of the baseView if exists\n if (this._baseView) { return this._baseView.childViews; }\n\n // Lazy creating childViews array\n if (!this._childViews) this._childViews = [];\n return this._childViews;\n }\n appendView(view: View) {\n this.addView(view);\n }\n addView(view: View, pos?: number) {\n this._registerChild(view, pos, false);\n if (this._mountState == MountState.Mounted) view.mountStateChanged(MountState.Mounting);\n this._insertToDom(view, pos);\n if (this._mountState != MountState.Unmounted) view.mountStateChanged(this._mountState);\n }\n _registerChild(view: View, pos?: number, changeMountState = true) {\n const items = this.childViews;\n if (view.parentView) throw new Error('the view is already in a container view');\n view.parentView = this;\n if (pos === undefined) {\n view._position = items.length;\n items.push(view);\n } else {\n items.splice(pos, 0, view);\n for (let i = pos; i < items.length; i++) {\n items[i]._position = i;\n }\n }\n if (changeMountState && this._mountState != MountState.Unmounted) {\n view.mountStateChanged(this._mountState);\n }\n }\n removeView(view: View | number) {\n view = this._ensureItem(view);\n this._removeFromDom(view);\n var pos = view._position!;\n view.parentView = view._position = undefined;\n this.childViews.splice(pos, 1);\n for (let i = pos; i < this.childViews.length; i++) {\n this.childViews[i]._position = i;\n }\n if (this._mountState != MountState.Unmounted) {\n view.mountStateChanged(MountState.Unmounted);\n }\n }\n removeAllView() {\n while (this.childViews.length) this.removeView(this.childViews.length - 1);\n }\n removeFromParent() {\n if (this.parentView) this.parentView.removeView(this);\n }\n /** updateDom() then updateChildren() */\n updateAll() {\n this.updateDom();\n if (this.baseView) return this.baseView.updateAll();\n this.updateChildren();\n }\n /** Call updateDom() on the whole tree */\n updateChildren() {\n if (this._childViews) for (const child of this._childViews) {\n child.updateAll();\n }\n }\n protected _insertToDom(item: View, pos?: number) {\n if (pos == undefined) this.dom.appendChild(item.dom);\n else this.dom.insertBefore(item.dom, this.childViews[pos + 1]?.dom || null);\n }\n protected _removeFromDom(item: View) {\n if (item.domCreated) item.dom.remove();\n }\n protected _ensureItem(item: View | number) {\n if (typeof item === 'number') item = this.childViews[item];\n else if (!item) throw new Error('item is null or undefined.');\n else if (item.parentView !== this) throw new Error('the item is not in this listview.');\n return item;\n }\n\n}\n\nexport function tryGetDOM(idom: IDOM | null | undefined) {\n if (!idom) return idom;\n if (idom instanceof View) {\n return idom.getDOM();\n } else if (idom instanceof Node) {\n return idom;\n } else if (idom && \"getDOM\" in idom) {\n return idom.getDOM();\n }\n}\n\nexport function getDOM(idom: IDOM) {\n var dom = tryGetDOM(idom);\n if (!dom) {\n console.error(\"getDOM():\", idom);\n throw new Error(\"getDOM(): unsupported parameter: \" + idom);\n }\n return dom;\n}\n\nexport function appendView(parent: IDOM, childView: View) {\n warnMountingView(parent, childView);\n getDOM(parent).appendChild(childView.dom);\n}\n\nexport function addChild(parent: IDOM, child: BuildDomExpr) {\n // fast path\n if (parent instanceof View) parent.addChild(child);\n else if (parent instanceof Node) {\n warnMountingView(parent, child);\n parent.appendChild(buildDOM(child));\n }\n // slow path\n else if ('addChild' in parent) {\n parent.addChild(child);\n } else {\n console.error(\"addChild():\", { parent, child });\n throw new Error(\"addChild(): unsupported parent\");\n }\n}\n\nfunction warnMountingView(parent: IDOM, child: BuildDomExpr) {\n if (child instanceof View) {\n const data = { parent, child };\n if (parent instanceof Node)\n console.trace(\"Should use `mountView()` to mount a view to DOM.\", data);\n else\n console.trace(\"Should use `View.addChild()` or `View.appendView()` to add a view into another view.\", data);\n }\n}\n\nexport function mountView(parent: Node, view: View) {\n view.mountStateChanged(MountState.Mounting);\n parent.appendChild(view.dom);\n view.mountStateChanged(MountState.Mounted);\n}\n\nexport function unmountView(parent: Node, view: View) {\n view.dom.remove();\n view.mountStateChanged(MountState.Unmounted);\n}\n\ndeclare global {\n interface Node {\n /** @deprecated Use the exported function `getDOM()` instead. */\n getDOM(): this;\n /** @deprecated Use the exported function `appendView()` instead. */\n appendView(view: View);\n /** @deprecated Use the exported function `addChild()` instead. */\n addChild(child: BuildDomExpr): void;\n }\n}\n\n\nNode.prototype.getDOM = function () {\n console.trace(\"webfx: Node.getDOM() is deprecated. Please use the exported function `getDOM()` instead.\");\n return this;\n};\n\nNode.prototype.addChild = function (child) {\n console.trace(\"webfx: Node.addChild() is deprecated. Please use the exported function `addChild()` instead.\");\n addChild(this, child);\n};\n\nNode.prototype.appendView = function (this: Node, view: View) {\n console.trace(\"webfx: Node.appendView() is deprecated. Please use the exported function `appendView()` instead.\");\n appendView(this, view);\n};\n\nexport class ContainerView extends View {\n addView(view: T, pos?: number): void {\n return super.addView(view, pos);\n }\n removeView(view: T | number): void {\n super.removeView(view);\n }\n protected _insertToDom(item: T, pos: number): void {\n super._insertToDom(item, pos);\n }\n protected _removeFromDom(item: T): void {\n super._removeFromDom(item);\n }\n protected _ensureItem(item: T | number): T {\n return super._ensureItem(item) as T;\n }\n\n get items() { return this.childViews as T[]; }\n [Symbol.iterator]() { return (this.childViews as T[])[Symbol.iterator](); }\n get length() { return this.childViews.length; }\n get(idx: number) {\n return this.childViews[idx] as T;\n }\n map(func: (lvi: T) => TRet) { return arrayMap(this, func); }\n find(func: (lvi: T, idx: number) => any) { return arrayFind(this, func); }\n forEach(func: (lvi: T, idx: number) => void) { return arrayForeach(this, func); }\n}\n","import { Action, Callbacks, ConvertObjectWithCallbacks, foreachFlaten, Func, FuncOrVal, Ref } from \"@yuuza/utils\";\nimport { addChild, getDOM, View } from \"./view\";\n\n// BuildDOM types & implementation:\nexport type BuildDomExpr = string | BuildDomNode | HTMLElement | Node | IDOM;\n\nexport type IDOM = Node | View | IView;\n\nexport enum MountState {\n /** The view is unmounted. */\n Unmounted,\n /** The view will be mounted soon. */\n Mounting,\n /** The view is mounted (i.e. the DOM is in the document). */\n Mounted,\n}\n\nexport interface IView {\n getDOM(): HTMLElement;\n addChild(child: BuildDomExpr): void;\n mountStateChanged(state: MountState): void;\n}\n\nexport type BuildDomTag = string;\n\nexport type BuildDomReturn = HTMLElement | Text | Node;\n\nexport interface BuildDomNode {\n tag?: BuildDomTag;\n\n child?: BuildDomExpr[] | BuildDomExpr;\n\n text?: FuncOrVal;\n hidden?: FuncOrVal;\n init?: Action;\n update?: Action;\n\n ref?: Ref;\n\n _id?: string;\n /** @deprecated Use `_id` instead */\n _key?: string;\n\n [key: string]: any;\n}\n\nexport class BuildDOMCtx {\n dict: Record | undefined = undefined;\n actions: DOMUpdateAction[] | undefined = undefined;\n view: View | undefined = undefined;\n\n setDict(key: string, node: HTMLElement) {\n if (!this.dict) this.dict = {};\n this.dict[key] = node;\n }\n addUpdateAction(action: DOMUpdateAction) {\n if (!this.actions) this.actions = [];\n this.actions.push(action);\n }\n update() {\n if (!this.actions) return;\n for (const a of this.actions) {\n a.run();\n }\n }\n}\n\ninterface DOMUpdateAction {\n run(): void;\n}\n\nclass TextAction implements DOMUpdateAction {\n constructor(readonly node: Node, readonly func: Func) { }\n run() {\n this.node.textContent = this.func();\n }\n}\n\nclass HiddenAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Func) { }\n run() {\n this.node.hidden = this.func();\n }\n}\n\nclass UpdateAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Action) { }\n run() {\n this.func(this.node);\n }\n}\n\nvar createElementFromTag = function (tag: BuildDomTag): HTMLElement {\n var reg = /[#\\.^]?[\\w\\-]+/y;\n var match;\n var ele;\n while (match = reg.exec(tag)) {\n var val = match[0];\n var ch = val[0];\n if (ch === '.') {\n ele.classList.add(val.substr(1));\n } else if (ch === '#') {\n ele.id = val.substr(1);\n } else {\n if (ele) throw new Error('unexpected multiple tags');\n ele = document.createElement(val);\n }\n }\n return ele;\n};\n\nfunction tryHandleValues(obj: BuildDomExpr, ctx: BuildDOMCtx | null) {\n if (typeof (obj) === 'string') { return document.createTextNode(obj); }\n if (typeof obj === 'function') {\n const val = (obj as any)();\n if (!val || typeof val !== 'object') {\n const node = document.createTextNode(val);\n ctx?.addUpdateAction(new TextAction(node, obj));\n return node;\n } else {\n throw new Error('Unexpected function return value');\n }\n }\n if (Node && obj instanceof Node) return obj as Node;\n return null;\n}\n\nvar buildDomCore = function (obj: BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null): BuildDomReturn {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n var r = tryHandleValues(obj, ctx);\n if (r) return r;\n if (obj instanceof JsxNode) {\n obj = obj.buildView(ctx, ttl);\n if (!(obj instanceof View)) return obj as Node;\n }\n if (obj instanceof View) {\n ctx?.view?._registerChild(obj);\n return obj.getDOM();\n }\n // if ('getDOM' in (obj as any)) return (obj as any).getDOM();\n const tag = (obj as BuildDomNode).tag;\n if (!tag) throw new Error('no tag');\n var node = createElementFromTag(tag);\n for (var key in obj as any) {\n if (obj.hasOwnProperty(key)) {\n var val = obj[key];\n buildDOMHandleKey(key, val, node, ctx, ttl);\n }\n }\n const init = obj['init'];\n if (init) init(node);\n\n return node;\n};\n\nvar buildDOMHandleKey = function (key: string, val: any, node: HTMLElement, ctx: BuildDOMCtx | null, ttl: number) {\n if (key === 'child') {\n if (val instanceof Array) {\n foreachFlaten(val, function (val) {\n node.appendChild(buildDomCore(val, ttl, ctx));\n });\n } else {\n node.appendChild(buildDomCore(val, ttl, ctx));\n }\n } else if (key === '_id' || key === '_key') {\n ctx!.setDict(val, node);\n } else if (key === 'ref') {\n (val as Ref).value = node;\n } else if (key === 'text') {\n if (typeof val === 'function') {\n ctx!.addUpdateAction(new TextAction(node, val));\n } else {\n node.textContent = val;\n }\n } else if (key === 'class') {\n node.className = val;\n } else if (key === 'style' && typeof val === 'object') {\n for (const styleKey in val) {\n if (Object.prototype.hasOwnProperty.call(val, styleKey)) {\n const styleVal = val[styleKey];\n node.style[styleKey] = styleVal;\n }\n }\n } else if (key === 'hidden' && typeof val === 'function') {\n ctx!.addUpdateAction(new HiddenAction(node, val));\n } else if (key === 'update' && typeof val === 'function') {\n ctx!.addUpdateAction(new UpdateAction(node, val));\n } else if (key === 'init') {\n // no-op\n } else {\n node[key] = val;\n }\n};\n\n/** \n * Build a DOM tree from a JavaScript object.\n * @example\n * buildDOM({\n * tag: 'div.item#firstitem',\n * onclick: () => console.info('clicked'),\n * child: [\n * 'Name: ',\n * { tag: 'span.name', text: name },\n * ],\n * });\n */\nexport function buildDOM(obj: BuildDomExpr, ctx?: BuildDOMCtx): T {\n return buildDomCore(obj, 32, ctx || null) as T;\n};\n\n/** Get a View instance or a DOM Node. View is preferred. */\nexport function buildView(obj: BuildDomExpr, ctx?: BuildDOMCtx): View | Node {\n if (obj instanceof View) {\n return obj;\n } else if (obj instanceof JsxNode) {\n return obj.buildView(ctx as any, 64);\n } else {\n return buildDOM(obj, ctx);\n }\n}\n\nexport class JsxNode {\n tag: T | string;\n attrs: Record | undefined;\n child: any[] | undefined;\n constructor(tag: any, attrs: Record | undefined, childs: any[] | undefined) {\n this.tag = tag;\n this.attrs = attrs;\n this.child = childs;\n }\n getDOM(): HTMLElement {\n return this.buildDom(null, 64) as any;\n }\n buildDom(ctx: BuildDOMCtx | null, ttl: number) {\n return getDOM(this.buildView(ctx, ttl));\n }\n buildView(ctx: BuildDOMCtx | null, ttl: number)\n : T extends IDOM ? T : T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : HTMLElement {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n let view: Node | View;\n if (typeof this.tag === 'string') {\n // tag is an HTML tag\n const dom = document.createElement(this.tag);\n view = dom;\n if (this.attrs) {\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n buildDOMHandleKey(key, val, dom, ctx, ttl);\n }\n }\n const init = this.attrs['init'];\n if (init) init(dom);\n }\n } else {\n // tag is a View\n view = this.tag as View;\n if (this.attrs) {\n let init: Action | null = null;\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n if (key == \"init\") {\n init = val;\n } else if (key == \"ref\") {\n (val as Ref).value = view;\n } else if (key.startsWith(\"on\") && view[key] instanceof Callbacks) {\n (view[key] as Callbacks).add(val);\n } else {\n view[key] = val;\n }\n }\n }\n if (init) init(view);\n }\n }\n if (this.child) {\n if (view instanceof View) {\n foreachFlaten(this.child, it => {\n (view as View).addChild(jsxBuildCore(it, ttl, (view as View)['_domctx']) as any);\n });\n } else {\n foreachFlaten(this.child, it => {\n const c = jsxBuildCore(it, ttl, ctx);\n if (c instanceof View) {\n (view as Node).appendChild(c.dom);\n ctx?.view?._registerChild(c);\n } else {\n addChild(view, c);\n }\n });\n }\n }\n return view as any;\n }\n addChild(child: IDOM): void {\n if (this.child == null) this.child = [];\n this.child.push(child);\n }\n}\n\nfunction jsxBuildCore(node: JsxNode | BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null) {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n if (node instanceof View) return node;\n var r = tryHandleValues(node, ctx);\n if (r) return r;\n if (node instanceof JsxNode) {\n return node.buildView(ctx, ttl);\n } else {\n console.error(\"Unknown node type\", node);\n throw new Error(\"Unknown node type\");\n }\n}\n\nexport function jsxBuild(node: JsxNode, ctx?: BuildDOMCtx): T {\n return jsxBuildCore(node, 64, ctx || new BuildDOMCtx());\n}\n\nexport type JsxTag = JsxDOMTag | JsxCtorTag;\nexport type JsxCtorTag = new (...args) => IDOM;;\nexport type JsxDOMTag = keyof HTMLElementTagNameMap;\n\nexport type JsxTagInstance =\n T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] :\n T extends (new (...args) => infer U) ? U extends IDOM ? U :\n never : never;\n\nexport type JsxAttrs =\n T extends JsxCtorTag ? JsxCtorAttrs :\n T extends JsxDOMTag ? JsxDOMAttrs :\n never;\n\nexport type JsxCtorAttrs> = {\n args?: ConstructorParameters;\n init?: Action;\n} & Partial>;\n\nexport type JsxDOMAttrs = Omit & Partial>;\n\nexport function jsxFactory>(tag: T, attrs: JsxAttrs, ...childs: any)\n : JsxNode {\n if (typeof tag === 'string') {\n return new JsxNode(tag, attrs, childs) as any;\n } else {\n const view = attrs?.args ?\n new (tag as any)(...attrs.args) :\n new (tag as any)();\n return new JsxNode(view, attrs, childs) as any;\n }\n}\n\nexport const jsx = jsxFactory;\n","import { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { buildDOM, IDOM } from \"./buildDOM\";\r\nimport { getDOM } from \"./view\";\r\n\r\n\r\nexport function clearChildren(node: Node) {\r\n while (node.lastChild) node.removeChild(node.lastChild);\r\n}\r\n\r\n/** Remove all children from the node (if needed) and append one (if present) */\r\nexport function replaceChild(node: Node, newChild?: Node) {\r\n clearChildren(node);\r\n if (newChild) node.appendChild(newChild);\r\n}\r\n\r\n/** Add or remove a classname for the element\r\n * @param force - true -> add; false -> remove; undefined -> toggle.\r\n */\r\nexport function toggleClass(element: HTMLElement, clsName: string, force?: boolean) {\r\n var clsList = element.classList;\r\n if (clsList.toggle) return clsList.toggle(clsName, force);\r\n if (force === undefined) force = !clsList.contains(clsName);\r\n if (force) clsList.add(clsName);\r\n else clsList.remove(clsName);\r\n return force;\r\n}\r\n\r\nexport interface FadeOutOptions {\r\n className?: string;\r\n duration?: number;\r\n remove?: boolean;\r\n}\r\n\r\nexport interface FadeoutResult {\r\n readonly finished: boolean;\r\n onFinished(callback: Action): this;\r\n cancel(finish?: boolean): void;\r\n}\r\n\r\n/** Fade out the element and remove it */\r\nexport function fadeout(element: HTMLElement, options?: FadeOutOptions): FadeoutResult {\r\n const { className = 'fading-out', duration = 500, remove = true } = options || {};\r\n element.classList.add(className);\r\n var cb: Action | null = null;\r\n var end: Action | null = (finish = true) => {\r\n if (!end) return; // use a random variable as flag ;)\r\n end = null;\r\n element.removeEventListener('transitionend', onTransitionend);\r\n element.classList.remove(className);\r\n if (remove && finish) {\r\n element.remove();\r\n }\r\n finish && cb?.();\r\n };\r\n var onTransitionend = function (e: TransitionEvent) {\r\n if (e.eventPhase === Event.AT_TARGET) end?.();\r\n };\r\n element.addEventListener('transitionend', onTransitionend);\r\n setTimeout(end, duration); // failsafe\r\n return {\r\n get finished() { return !end; },\r\n onFinished(callback: Action) {\r\n if (!end) callback();\r\n else cb = callback;\r\n return this;\r\n },\r\n cancel(finish = false) {\r\n end?.(finish);\r\n }\r\n };\r\n}\r\n\r\nexport function startBlockingDetect(threshold = 20) {\r\n var begin = Date.now();\r\n var lastRun = Date.now();\r\n setInterval(() => {\r\n var now = Date.now();\r\n if (now - lastRun >= threshold) {\r\n console.info(`[Blocking] ${(now - begin) / 1000}s: blocked for ${now - lastRun} ms`);\r\n }\r\n lastRun = now;\r\n }, 1);\r\n}\r\n\r\nexport class Timer {\r\n callback: () => void;\r\n cancelFunc: (() => void) | undefined;\r\n constructor(callback: () => void) {\r\n this.callback = callback;\r\n this.cancelFunc = undefined;\r\n }\r\n timeout(time: number) {\r\n this.tryCancel();\r\n var handle = setTimeout(this.callback, time);\r\n this.cancelFunc = () => window.clearTimeout(handle);\r\n }\r\n interval(time: number) {\r\n this.tryCancel();\r\n var handle = setInterval(this.callback, time);\r\n this.cancelFunc = () => window.clearInterval(handle);\r\n }\r\n animationFrame() {\r\n this.tryCancel();\r\n var handle = requestAnimationFrame(this.callback);\r\n this.cancelFunc = () => cancelAnimationFrame(handle);\r\n }\r\n tryCancel() {\r\n if (this.cancelFunc) {\r\n this.cancelFunc();\r\n this.cancelFunc = undefined;\r\n }\r\n }\r\n}\r\n\r\nexport type PtrEvent = ({\r\n type: 'mouse';\r\n ev: MouseEvent;\r\n} | {\r\n type: 'touch';\r\n touch: 'start' | 'move' | 'end';\r\n ev: TouchEvent;\r\n}) & {\r\n action: 'down' | 'move' | 'up';\r\n point: MouseEvent | Touch;\r\n};\r\n\r\nexport function listenPointerEvents(element: HTMLElement, callback: (e: PtrEvent) => void | 'track', options?: AddEventListenerOptions) {\r\n var touchDown = false;\r\n var mouseDown = function (e: MouseEvent) {\r\n if (callback({ type: 'mouse', ev: e, point: e, action: 'down' }) === 'track') {\r\n var mousemove = function (e: MouseEvent) {\r\n callback({ type: 'mouse', ev: e, point: e, action: 'move' });\r\n };\r\n var mouseup = function (e: MouseEvent) {\r\n document.removeEventListener('mousemove', mousemove, true);\r\n document.removeEventListener('mouseup', mouseup, true);\r\n callback({ type: 'mouse', ev: e, point: e, action: 'up' });\r\n };\r\n document.addEventListener('mousemove', mousemove, true);\r\n document.addEventListener('mouseup', mouseup, true);\r\n }\r\n };\r\n var touchStart = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n var ret = callback({\r\n type: 'touch', touch: 'start', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'down'\r\n });\r\n if (!touchDown && ret === 'track') {\r\n touchDown = true;\r\n var touchmove = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n callback({ type: 'touch', touch: 'move', ev: e, point: ct, action: 'move' });\r\n };\r\n var touchend = function (e: TouchEvent) {\r\n if (e.touches.length === 0) {\r\n touchDown = false;\r\n element.removeEventListener('touchmove', touchmove);\r\n element.removeEventListener('touchend', touchend);\r\n element.removeEventListener('touchcancel', touchend);\r\n }\r\n var ct = e.changedTouches[0];\r\n callback({\r\n type: 'touch', touch: 'end', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'up'\r\n });\r\n };\r\n element.addEventListener('touchmove', touchmove, options);\r\n element.addEventListener('touchend', touchend, options);\r\n element.addEventListener('touchcancel', touchend, options);\r\n }\r\n };\r\n element.addEventListener('mousedown', mouseDown, options);\r\n element.addEventListener('touchstart', touchStart, options);\r\n return {\r\n remove: () => {\r\n element.removeEventListener('mousedown', mouseDown, options);\r\n element.removeEventListener('touchstart', touchStart, options);\r\n }\r\n };\r\n}\r\n\r\nexport function listenEvent(element: HTMLElement, event: K,\r\n handler: (ev: HTMLElementEventMap[K]) => any) {\r\n element.addEventListener(event, handler);\r\n return {\r\n remove: () => element.removeEventListener(event, handler)\r\n };\r\n}\r\n\r\nexport function listenEvents>(element: HTMLElement, events: K,\r\n handler: (ev: HTMLElementEventMap[K[number]]) => any) {\r\n events.forEach(event => element.addEventListener(event, handler));\r\n return {\r\n remove: () => events.forEach(event => element.removeEventListener(event, handler))\r\n };\r\n}\r\n\r\nexport function injectCss(css: string, options?: { parent?: Node, tag?: string; }) {\r\n const parent = options?.parent ?? document.head;\r\n parent.appendChild(buildDOM({ tag: options?.tag ?? 'style', text: css }));\r\n}\r\n\r\nexport class TextCompositionWatcher {\r\n dom: HTMLElement;\r\n onCompositingChanged = new Callbacks();\r\n private _isCompositing = false;\r\n get isCompositing() { return this._isCompositing; }\r\n set isCompositing(val) {\r\n this._isCompositing = val;\r\n this.onCompositingChanged.invoke();\r\n }\r\n constructor(dom: IDOM) {\r\n this.dom = getDOM(dom) as HTMLElement;\r\n this.dom.addEventListener('compositionstart', (ev) => {\r\n this.isCompositing = true;\r\n });\r\n this.dom.addEventListener('compositionend', (ev) => {\r\n this.isCompositing = false;\r\n });\r\n }\r\n}\r\n\r\nexport class InputStateTracker {\r\n state = {\r\n mouseDown: false,\r\n mouseIn: false,\r\n focusIn: false,\r\n };\r\n private _removeEvents: Action | null = null;\r\n private _removePointerEvents: Action | null = null;\r\n readonly onChanged = new Callbacks>();\r\n constructor(readonly dom: HTMLElement) {\r\n this._removeEvents = listenEvents(dom, ['mouseenter', 'mouseleave', 'focusin', 'focusout'], (e) => {\r\n switch (e.type) {\r\n case 'mouseenter':\r\n this.stateChanged('mouseIn', true);\r\n break;\r\n case 'mouseleave':\r\n this.stateChanged('mouseIn', false);\r\n break;\r\n case 'focusin':\r\n this.stateChanged('focusIn', true);\r\n break;\r\n case 'focusout':\r\n this.stateChanged('focusIn', false);\r\n break;\r\n }\r\n }).remove;\r\n\r\n this._removePointerEvents = listenPointerEvents(dom, (e) => {\r\n if (e.action == 'down') {\r\n this.stateChanged('mouseDown', true);\r\n return 'track';\r\n } else if (e.action == 'up') {\r\n this.stateChanged('mouseDown', false);\r\n }\r\n }).remove;\r\n }\r\n private stateChanged(state: T, val: InputStateTracker['state'][T]) {\r\n this.state[state] = val;\r\n this.onChanged.invoke(state);\r\n }\r\n removeListeners() {\r\n this._removeEvents?.();\r\n this._removePointerEvents?.();\r\n this._removePointerEvents = this._removeEvents = null;\r\n }\r\n}\r\n\r\n\r\nexport interface IId {\r\n id: keyof any;\r\n}\r\n\r\nexport class DataUpdatingHelper {\r\n items: Iterable;\r\n update(newData: Iterable) {\r\n const oldData = this.items;\r\n var dataDict: Record = {};\r\n for (const n of newData) {\r\n dataDict[this.dataSelectId(n)] = n;\r\n }\r\n var itemDict: Record = {};\r\n var removed: T[] = [];\r\n for (const d of oldData) {\r\n const id = this.selectId(d);\r\n if (dataDict[id] !== undefined) {\r\n itemDict[id] = d;\r\n } else {\r\n removed.push(d);\r\n }\r\n }\r\n for (let i = removed.length - 1; i >= 0; i--)\r\n this.removeItem(removed[i]);\r\n var pos = 0;\r\n for (const n of newData) {\r\n const d = itemDict[this.dataSelectId(n)];\r\n if (d !== undefined) {\r\n this.updateItem(d, n);\r\n } else {\r\n this.addItem(n, pos);\r\n }\r\n pos++;\r\n }\r\n }\r\n updateOrRebuildAll(newData: Iterable) {\r\n this.update(newData);\r\n if (!this.isSame(newData)) this.rebuildAll(newData);\r\n }\r\n isSame(newData: Iterable) {\r\n var t = this.items[Symbol.iterator]();\r\n for (const n of newData) {\r\n var d = t.next();\r\n if (d.done) return false;\r\n if (this.selectId(d.value) !== this.dataSelectId(n)) return false;\r\n }\r\n if (!t.next().done) return false;\r\n return true;\r\n }\r\n rebuildAll(newData: Iterable) {\r\n var oldData = this.items;\r\n if (oldData instanceof Array) {\r\n for (let i = oldData.length - 1; i >= 0; i--) {\r\n this.removeItem(oldData[i]);\r\n }\r\n } else {\r\n for (const o of oldData) {\r\n this.removeItem(o);\r\n }\r\n }\r\n let i = 0;\r\n for (const n of newData) {\r\n this.addItem(n, i++);\r\n }\r\n }\r\n protected selectId(obj: T): any { return obj.id; }\r\n protected dataSelectId(obj: TData): any { return obj.id; }\r\n addItem(obj: TData, pos: number) { }\r\n updateItem(old: T, data: TData) { }\r\n removeItem(obj: T) { }\r\n}","// file: I18n.ts\n\nexport interface I18nData {\n [lang: string]: LangObj;\n}\n\nexport type LangObj = Record;\n\n/** Internationalization (aka i18n) helper class */\nexport class I18n {\n data: I18nData = {};\n curLang = 'en';\n missing = new Map();\n /** Get i18n string for `key`, return `key` when not found. */\n get(key, arg?: any[]): string {\n return this.get2(key, arg) || key;\n }\n /** Get i18n string for `key`, return `null` when not found. */\n get2(key, arg?: any[], lang?: string): string | null {\n lang = lang || this.curLang;\n var langObj = this.data[lang];\n if (!langObj) {\n console.log('i18n missing lang: ' + lang);\n return null;\n }\n var r = langObj[key];\n if (!r) {\n if (!this.missing.has(key)) {\n this.missing.set(key, 1);\n console.log('i18n missing key: ' + key);\n }\n return null;\n }\n if (arg) {\n for (const key in arg) {\n if (arg.hasOwnProperty(key)) {\n const val = arg[key];\n r = r.replace('{' + key + '}', val);\n // Note that it only replaces the first occurrence.\n }\n }\n }\n return r;\n }\n /** Fills data with an 2darray */\n add2dArray(array: [...string[][]]) {\n const langObjs: LangObj[] = [];\n const langs = array[0];\n for (const lang of langs) {\n langObjs.push(this.data[lang] = this.data[lang] || {});\n }\n for (let i = 1; i < array.length; i++) {\n const line = array[i];\n const key = line[0];\n for (let j = 0; j < line.length; j++) {\n const val = line[j];\n langObjs[j][key] = val;\n }\n }\n }\n renderElements(elements) {\n console.log('i18n elements rendering');\n elements.forEach(x => {\n for (const node of x.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // console.log('node', node);\n var r = this.get2(node.beforeI18n || node.textContent);\n if (r) {\n node.beforeI18n = node.beforeI18n || node.textContent;\n node.textContent = r;\n }\n else {\n if (node.beforeI18n) {\n node.textContent = node.beforeI18n;\n }\n console.log('missing key for node', node);\n }\n }\n }\n });\n }\n /**\n * Detect the best available language using\n * the user language preferences provided by the browser.\n * @param langs Available languages\n */\n static detectLanguage(langs: string[]) {\n var cur: string | null = null;\n var curIdx = -1;\n var languages: string[] = [];\n // ['en-US'] -> ['en-US', 'en']\n (navigator.languages || [navigator.language]).forEach(lang => {\n languages.push(lang);\n if (lang.indexOf('-') > 0)\n languages.push(lang.substr(0, lang.indexOf('-')));\n });\n langs.forEach((l) => {\n var idx = languages.indexOf(l);\n if (!cur || (idx !== -1 && idx < curIdx)) {\n cur = l;\n curIdx = idx;\n }\n });\n return cur || langs[0];\n }\n}\n\nexport function createStringBuilder(i18n: I18n) {\n var arrBuilder = createArrayBuilder(i18n);\n\n return function (literals: TemplateStringsArray, ...placeholders: any[]) {\n if (placeholders.length === 0) {\n return i18n.get(literals[0]);\n }\n return arrBuilder(literals, ...placeholders).join('');\n }\n}\n\nexport function createArrayBuilder(i18n: I18n) {\n var formatCache = new WeakMap();\n var parseCache = new Map();\n\n return function (literals: TemplateStringsArray, ...placeholders: T): (string | T)[] {\n if (placeholders.length === 0) {\n return [i18n.get(literals[0])];\n }\n\n // Generate format string from template string if it's not cached:\n let format = formatCache.get(literals);\n if (format === undefined) {\n format = '';\n for (let i = 0; i < literals.length; i++) {\n const lit = literals[i];\n format += lit;\n if (i < placeholders.length) {\n format += '{' + i + '}';\n }\n }\n formatCache.set(literals, format);\n }\n\n const translatedFormat = i18n.get(format);\n\n // Also cache parsed template\n let parsed = parseCache.get(translatedFormat);\n if (parsed === undefined) {\n parsed = parseTemplate(translatedFormat);\n }\n\n return parsed.map(x => typeof x == 'number' ? placeholders[x] : x);\n }\n}\n\nfunction parseTemplate(template: string): (string | number)[] {\n const result: (string | number)[] = [];\n let state = 0; // 0: normal / 1: after '{' / 2: after '}' / 3: after '{' and numbers\n let buf = '';\n for (let i = 0; i < template.length; i++) {\n const ch = template[i];\n switch (ch) {\n case '{':\n if (state == 0) state = 1;\n else if (state == 1) { state = 0; buf += '{'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n case '}':\n if (state == 3) { state = 0; result.push(+buf); buf = ''; }\n else if (state == 0) { state = 2; }\n else if (state == 2) { state = 0; buf += '}'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n default:\n if (state == 2) throw new Error(`Expected '}', got '${ch}' at ${i}`);\n else if (state == 1) { state = 3; if (buf) result.push(buf); buf = ''; }\n buf += ch;\n }\n }\n if (state != 0) throw new Error(\"Unexpected end of template string\");\n if (buf) result.push(buf);\n return result;\n}\n\nexport var i18n = new I18n();\n\nexport const I = createStringBuilder(i18n);\n","export const version = \"1.10.3\""],"names":["_object_assign","Object","assign","_object_hasOwnProperty","prototype","hasOwnProperty","strPadLeft","str","len","ch","length","formatDuration","sec","isNaN","Math","round","min","floor","toString","fileSizeUnits","formatFileSize","size","unit","toFixed","formatDateTime","date","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","toLocaleString","numLimit","num","max","createName","nameFunc","existsFunc","base64EncodeUtf8","btoa","encodeURIComponent","replace","match","p1","String","fromCharCode","sleepAsync","time","Promise","resolve","setTimeout","arrayRemove","array","val","i","splice","arrayInsert","pos","undefined","push","arrayMap","arr","func","Array","map","idx","ret","item","arrayForeach","foreachFlaten","it","arrayFind","find","arraySum","sum","x","objectApply","obj","kv","keys","key","call","indexOf","objectInit","startsWith","Callbacks","add","mod","a","b","readBlobAsDataUrl","blob","reject","reader","FileReader","onload","ev","result","onerror","readAsDataURL","remove","this","constructor","_cbs","_cbs_invoking","_hook","_invoking","onChanged","_a","invoke","args","Error","forEach","apply","error","console","clear","callback","Set","_b","delete","waitOnce","arguments","cb","Ref","value","_value","_onChanged","from","ref","Lazy","_func","computed","rawValue","Semaphore","init","queue","maxCount","runningCount","enter","prom","res","exit","window","queueMicrotask","shift","run","CancelToken","cancelled","onCancelled","cancel","throwIfCancelled","AutoResetEvent","_whenNotify","_callback","wait","r","set","EventRegistrations","list","event","removeAll","pop","View","dom","parentView","_position","_domctx","BuildDOMCtx","_dom","_baseView","_mountState","MountState","Unmounted","_onActive","_childViews","view","domExprCreated","getView","position","ensureDom","domCreated","baseView","mountState","hidden","createDom","buildView","postCreateDom","updateDom","document","createElement","debugging","dataset","update","mountStateChanged","state","trace","child","getDomById","id","dict","updateWith","updateAllWith","updateAll","toggleClass","clsName","force","getDOM","addChild","appendView","appendChild","onActive","addEventListener","e","handleKeyDown","code","rect","getBoundingClientRect","MouseEvent","clientX","clientY","y","relatedTarget","preventDefault","childViews","addView","_registerChild","Mounted","Mounting","_insertToDom","changeMountState","items","removeView","_ensureItem","_removeFromDom","removeAllView","removeFromParent","updateChildren","insertBefore","tryGetDOM","idom","Node","parent","childView","warnMountingView","buildDOM","data","mountView","unmountView","ContainerView","super","Symbol","iterator","get","actions","setDict","node","addUpdateAction","action","TextAction","textContent","HiddenAction","UpdateAction","tryHandleValues","ctx","createTextNode","buildDomCore","ttl","JsxNode","tag","ele","reg","exec","classList","substr","createElementFromTag","buildDOMHandleKey","className","styleKey","styleVal","style","attrs","childs","buildDom","jsxBuildCore","c","jsxBuild","jsxFactory","jsx","clearChildren","lastChild","removeChild","replaceChild","newChild","element","clsList","toggle","contains","fadeout","options","duration","end","finish","removeEventListener","onTransitionend","eventPhase","Event","AT_TARGET","finished","onFinished","startBlockingDetect","threshold","begin","lastRun","setInterval","info","Timer","cancelFunc","timeout","tryCancel","handle","clearTimeout","interval","clearInterval","animationFrame","requestAnimationFrame","cancelAnimationFrame","listenPointerEvents","touchDown","mouseDown","type","point","mousemove","mouseup","touchStart","ct","changedTouches","touch","touchmove","touchend","touches","listenEvent","handler","listenEvents","events","injectCss","css","head","text","TextCompositionWatcher","isCompositing","_isCompositing","onCompositingChanged","InputStateTracker","mouseIn","focusIn","_removeEvents","_removePointerEvents","stateChanged","removeListeners","DataUpdatingHelper","newData","oldData","dataDict","n","dataSelectId","itemDict","removed","d","selectId","removeItem","updateItem","addItem","updateOrRebuildAll","isSame","rebuildAll","t","next","done","o","old","I18n","curLang","missing","Map","arg","get2","lang","langObj","log","has","add2dArray","langObjs","langs","line","j","renderElements","elements","childNodes","nodeType","TEXT_NODE","beforeI18n","detectLanguage","cur","curIdx","languages","navigator","language","l","createStringBuilder","i18n","arrBuilder","createArrayBuilder","literals","placeholders","join","formatCache","WeakMap","parseCache","format","translatedFormat","parsed","template","buf","parseTemplate","I","version"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"webfxcore.min.esm.js","sources":["https://github.com/lideming/webfx/raw/v1.10.4/packages/utils/src/utils.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/view.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/buildDOM.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/viewUtils.ts","https://github.com/lideming/webfx/raw/v1.10.4/packages/i18n/src/i18n.ts","https://github.com/lideming/webfx/raw/v1.10.4/version"],"sourcesContent":["// file: utils.ts\n\nconst _object_assign = Object.assign;\nconst _object_hasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Time & formatting utils:\n\nexport function strPadLeft(str: string, len: number, ch: string = ' ') {\n while (str.length < len) {\n str = ch + str;\n }\n return str;\n}\n\nexport function formatDuration(sec: number | any) {\n if (typeof sec !== 'number' || isNaN(sec)) return '--:--';\n sec = Math.round(sec);\n var min = Math.floor(sec / 60);\n sec %= 60;\n return strPadLeft(min.toString(), 2, '0') + ':' + strPadLeft(sec.toString(), 2, '0');\n}\n\nconst fileSizeUnits = ['B', 'KB', 'MB', 'GB', 'TB'];\nexport function formatFileSize(size: number | any) {\n if (typeof size !== \"number\" || isNaN(size)) return 'NaN';\n var unit = 0;\n while (unit < fileSizeUnits.length - 1 && size >= 1024) {\n unit++;\n size /= 1024;\n }\n return (unit > 0 ? size.toFixed(2) : size) + ' ' + fileSizeUnits[unit];\n}\n\nexport function formatDateTime(date: Date) {\n var now = new Date();\n var sameday = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n return sameday ? date.toLocaleTimeString() : date.toLocaleString();\n}\n\nexport function numLimit(num: number, min: number, max: number) {\n return (num < min || typeof num != 'number' || isNaN(num)) ? min :\n (num > max) ? max : num;\n}\n\nexport function createName(nameFunc: (num: number) => string, existsFunc: (str: string) => boolean) {\n for (let num = 0; ; num++) {\n let str = nameFunc(num);\n if (!existsFunc(str)) return str;\n }\n}\n\n/** \n * btoa, but supports Unicode and uses UTF-8 encoding.\n * @see https://stackoverflow.com/questions/30106476\n */\nexport function base64EncodeUtf8(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\n function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1) as any);\n }));\n}\n\nexport function sleepAsync(time: number): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport function arrayRemove(array: T[], val: T) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === val) {\n array.splice(i, 1);\n i--;\n }\n }\n}\n\nexport function arrayInsert(array: T[], val: T, pos?: number) {\n if (pos === undefined) array.push(val);\n else array.splice(pos, 0, val);\n}\n\nexport function arrayMap(arr: Iterable, func: (item: T, idx: number) => TRet) {\n if (arr instanceof Array) return arr.map(func);\n var idx = 0;\n var ret = new Array((arr as any).length);\n for (var item of arr) {\n ret[idx] = (func(item, idx));\n idx++;\n }\n return ret;\n}\n\nexport function arrayForeach(arr: Iterable, func: (item: T, idx: number) => void) {\n var idx = 0;\n for (var item of arr) {\n func(item, idx++);\n }\n}\n\n\nexport function foreachFlaten(arr: T[], func: Action) {\n for (const it of arr) {\n if (it instanceof Array) {\n foreachFlaten(it as T[], func);\n } else {\n func(it);\n }\n }\n}\n\nexport function arrayFind(arr: Iterable, func: (item: T, idx: number) => any): T | null {\n if (arr instanceof Array) return arr.find(func);\n var idx = 0;\n for (var item of arr) {\n if (func(item, idx++)) return item;\n }\n return null;\n}\n\nexport function arraySum(arr: Iterable, func: (item: T) => number | null | undefined) {\n var sum = 0;\n arrayForeach(arr, (x) => {\n var val = func(x);\n if (val) sum += val;\n });\n return sum;\n}\n\nexport function objectApply(obj: Partial, kv?: Partial, keys?: Array) {\n if (kv) {\n if (!keys) return _object_assign(obj, kv);\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n obj[key] = val;\n }\n }\n }\n return obj;\n}\n\nexport function objectInit(obj: T, kv?: ObjectInit, keys?: Array) {\n if (kv) {\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n if (key.startsWith(\"on\") && obj[key] instanceof Callbacks) {\n (obj[key] as Callbacks).add(val);\n } else {\n obj[key] = val;\n }\n }\n }\n }\n return obj;\n}\n\nexport function mod(a: number, b: number): number {\n if (a < 0) a = b + a;\n return a % b;\n}\n\nexport function readBlobAsDataUrl(blob: Blob) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (ev) => {\n resolve(reader.result as string);\n };\n reader.onerror = (ev) => reject();\n reader.readAsDataURL(blob);\n });\n}\n\nArray.prototype.remove = function (item) {\n arrayRemove(this, item);\n};\n\ndeclare global {\n interface Array {\n /**\n * (Extension method) remove the specified item from array.\n * @param item The item to be removed from array\n */\n remove(item: T): void;\n }\n}\n\nexport type ObjectInit = Partial>;\n\nexport type ConvertObjectWithCallbacks = {\n [P in keyof T]: P extends `on${string}` ? CallbackInit : T[P];\n};\n\nexport type CallbackInit = T extends Callbacks ? T | U : T;\n\n// Some interesting function types:\nexport type AnyFunc = (...args: any) => any;\nexport type Action = (arg: T) => void;\nexport type Func = () => TRet;\nexport type AsyncFunc = Func>;\n\nexport type FuncOrVal = T | Func;\n\nclass CallbacksImpl {\n private _cbs: Set | undefined = undefined;\n private _cbs_invoking: Set | undefined = undefined;\n private _hook?: Callbacks<(adding: boolean, func: T) => void> = undefined;\n private _invoking = false;\n get onChanged() {\n this._hook ??= new Callbacks();\n return this._hook;\n }\n get length() { return this._cbs ? this._cbs.size : 0; }\n invoke(...args: Parameters) {\n if (!this._cbs) return;\n if (this._invoking) throw new Error(\"Cannot invoke callbacks during invocation\");\n this._invoking = true;\n this._cbs.forEach((x: (...args: any) => void) => {\n try {\n x.apply(this, args);\n } catch (error) {\n console.error(\"Error in callback\", error);\n }\n });\n if (this._cbs_invoking) {\n for (const x of this._cbs_invoking) {\n this._cbs.add(x);\n }\n }\n this._cbs_invoking?.clear();\n this._invoking = false;\n }\n add(callback: T) {\n if (this._cbs === undefined) {\n this._cbs = new Set();\n }\n if (this._invoking) {\n this._cbs_invoking ??= new Set();\n this._cbs_invoking.add(callback);\n } else {\n this._cbs.add(callback);\n }\n this._hook?.invoke(true, callback);\n return callback;\n }\n remove(callback: T) {\n if (this._cbs === undefined) return;\n if (this._invoking) {\n this._cbs_invoking?.delete(callback);\n }\n this._cbs.delete(callback);\n this._hook?.invoke(false, callback);\n }\n\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n waitOnce(callback?: T) {\n if (arguments.length === 0) {\n return new Promise>((resolve, reject) => {\n const cb = ((...args) => {\n this.remove(cb);\n resolve(args);\n }) as T;\n this.add(cb);\n });\n } else if (callback) {\n const cb = ((...args) => {\n this.remove(cb);\n return callback(...args);\n }) as T;\n this.add(cb);\n } else {\n throw new Error(\"Invalid callback\");\n }\n }\n}\n\nexport interface Callbacks {\n invoke(...args: Parameters): void;\n add(callback: T): T;\n remove(callback: T): void;\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n readonly length: number;\n readonly onChanged: Callbacks<(adding: boolean, func: T) => void>;\n}\nexport const Callbacks: { new (): Callbacks; } = CallbacksImpl;\n\nlet accessedRefs: Set> | null = null;\n\nfunction beginRefCollect() {\n accessedRefs = new Set>()\n}\n\nfunction endRefCollect() {\n const result = accessedRefs;\n accessedRefs = null;\n return result!;\n}\n\nexport class Ref {\n private _value: T | undefined = undefined;\n private _onChanged: Callbacks>> | undefined = undefined;\n constructor(value?: T) {\n this._value = value;\n }\n get onChanged() {\n if (!this._onChanged) this._onChanged = new Callbacks();\n return this._onChanged;\n }\n get value() {\n if (accessedRefs) accessedRefs.add(this);\n return this._value;\n }\n set value(val) {\n this._value = val;\n if (this._onChanged) this.onChanged.invoke(this);\n }\n static from(value: T) {\n const ref = new Ref();\n ref._value = value;\n return ref as (Ref & { value: T });\n }\n static computed(func: Func) {\n const ref = new Ref();\n let deps: Set> | null = null;\n const updateValue = () => {\n if (deps) {\n for (const dep of deps) {\n dep.onChanged.remove(updateValue);\n }\n }\n beginRefCollect();\n const value = func();\n deps = endRefCollect();\n for (const dep of deps) {\n dep.onChanged.add(updateValue);\n }\n ref.value = value;\n };\n updateValue();\n return ref;\n }\n}\n\nexport class Lazy {\n private _func?: Func;\n private _value?: T;\n get computed() { return !this._func; }\n get rawValue() { return this._value; }\n get value(): T {\n if (this._func) {\n this._value = this._func();\n this._func = undefined;\n }\n return this._value!;\n }\n constructor(func: Func) {\n this._func = func;\n this._value = undefined;\n }\n}\n\nexport class Semaphore {\n queue = new Array();\n maxCount = 1;\n runningCount = 0;\n constructor(init: ObjectInit) {\n objectInit(this, init);\n }\n enter(): Promise {\n if (this.runningCount === this.maxCount) {\n var resolve: Action;\n var prom = new Promise((res) => { resolve = res; });\n this.queue.push(resolve!);\n return prom;\n } else {\n this.runningCount++;\n return Promise.resolve();\n }\n }\n exit() {\n if (this.runningCount === this.maxCount && this.queue.length) {\n if (window.queueMicrotask) {\n window.queueMicrotask(this.queue.shift() as any);\n } else {\n setTimeout(this.queue.shift()!, 0);\n }\n } else {\n this.runningCount--;\n }\n }\n async run(func: () => Promise) {\n await this.enter();\n try {\n await func();\n } finally {\n this.exit();\n }\n }\n}\n\n/** Just like CancellationToken[Source] on .NET */\nexport class CancelToken {\n cancelled = false;\n onCancelled = new Callbacks();\n cancel() {\n if (this.cancelled) return;\n this.cancelled = true;\n this.onCancelled.invoke();\n }\n throwIfCancelled() {\n if (this.cancelled)\n throw new Error(\"operation cancelled.\");\n }\n}\n\nexport class AutoResetEvent {\n private _whenNotify: Promise | null = null;\n private _callback: Action | null = null;\n\n wait() {\n if (!this._whenNotify) {\n this._whenNotify = new Promise(r => {\n this._callback = () => {\n this._callback = this._whenNotify = null;\n r();\n };\n });\n }\n return this._whenNotify;\n }\n set() {\n this._callback && this._callback();\n }\n}\n\nexport class EventRegistrations {\n list: { event: Callbacks; func: AnyFunc; }[] = [];\n add(event: Callbacks, func: T) {\n this.list.push({ event, func });\n event.add(func);\n return func;\n }\n removeAll() {\n while (this.list.length) {\n var r = this.list.pop()!;\n r.event.remove(r.func);\n }\n }\n}\n","import { Action, Callbacks, objectApply, arrayFind, arrayForeach, arrayMap } from \"@yuuza/utils\";\nimport { buildDOM, BuildDOMCtx, BuildDomExpr, buildView, IDOM, IView, JsxNode, MountState } from \"./buildDOM\";\nimport { toggleClass } from \"./viewUtils\";\n\n\nexport class View implements IView {\n constructor(dom?: BuildDomExpr) {\n this._domctx.view = this;\n if (dom) this.domExprCreated(dom);\n }\n\n static getView(obj: BuildDomExpr) { return obj instanceof View ? obj : new View(obj); }\n\n static debugging = false;\n\n public parentView?: View = undefined;\n public _position?: number = undefined;\n get position() { return this._position; }\n\n private _domctx = new BuildDOMCtx();\n\n protected _dom: T | undefined = undefined;\n public get dom() {\n this.ensureDom();\n return this._dom!;\n }\n public get domCreated() { return !!this._dom; }\n\n private _baseView: View | undefined = undefined;\n public get baseView() { return this._baseView; }\n\n private _mountState: MountState = MountState.Unmounted;\n public get mountState() { return this._mountState; }\n\n public get hidden() { return this.dom.hidden; }\n public set hidden(val: boolean) { this.dom.hidden = val; }\n\n public ensureDom() {\n if (!this._dom) {\n var r = this.createDom();\n this.domExprCreated(r);\n }\n }\n\n private domExprCreated(r: BuildDomExpr) {\n var view = buildView(r, this._domctx);\n if (view instanceof View) {\n this._baseView = view;\n this._dom = view.dom as T;\n } else {\n this._dom = view as T;\n }\n this.postCreateDom();\n this.updateDom();\n }\n\n protected createDom(): BuildDomExpr {\n return document.createElement('div');\n }\n\n /** Will be called when the dom is created */\n protected postCreateDom() {\n if (View.debugging) {\n if (this.dom.dataset)\n this.dom.dataset['webfx'] = MountState[this._mountState];\n }\n }\n\n /** Will be called when the dom is created, after postCreateDom() */\n public updateDom() {\n this._domctx.update();\n }\n\n /** Will be called when the mounting state is changed */\n public mountStateChanged(state: MountState) {\n if (state == this._mountState) {\n console.trace(\"mountState unchanged\", state, this);\n return;\n }\n this._mountState = state;\n if (View.debugging) {\n if (!this._baseView && this.domCreated && this.dom.dataset) {\n if (this.dom.dataset['webfx'] == MountState[state]) {\n console.trace('mountState on the DOM is changed by other view', state, this);\n }\n this.dom.dataset['webfx'] = MountState[state];\n }\n }\n if (this._baseView) {\n // let the baseView do the rest\n this._baseView.mountStateChanged(state);\n return;\n }\n if (this._childViews) for (const child of this._childViews) {\n child.mountStateChanged(state);\n }\n }\n\n public getDomById(id: string): HTMLElement | null {\n this.ensureDom();\n return this._domctx.dict?.[id] ?? null;\n }\n\n /** Assign key-values and call `updateDom()` */\n updateWith(kv: Partial) {\n objectApply(this, kv);\n this.updateDom();\n }\n updateAllWith(kv: Partial) {\n objectApply(this, kv);\n this.updateAll();\n }\n toggleClass(clsName: string, force?: boolean) {\n toggleClass(this.dom, clsName, force);\n }\n\n // Implements `IDOMInstance`\n // appendView(view: View) { this.dom.appendChild(view.dom); }\n getDOM() { return this.dom; }\n addChild(child: BuildDomExpr) {\n const view = buildView(child, this._domctx);\n if (view instanceof View) {\n this.appendView(view);\n } else {\n this.dom.appendChild(view);\n }\n }\n\n private _onActive: Callbacks> | undefined = undefined;\n get onActive() {\n if (!this._onActive) {\n this._onActive = new Callbacks>();\n this.dom.addEventListener('click', (e: MouseEvent) => {\n this._onActive!.invoke(e);\n });\n this.dom.addEventListener('keydown', (e: KeyboardEvent) => {\n this.handleKeyDown(e);\n });\n }\n return this._onActive;\n }\n\n handleKeyDown(e: KeyboardEvent) {\n if (e.code === 'Enter') {\n const rect = this.dom.getBoundingClientRect();\n this._onActive?.invoke(new MouseEvent('click', {\n clientX: rect.x, clientY: rect.y,\n relatedTarget: this.dom\n }));\n e.preventDefault();\n }\n }\n\n private _childViews: View[] | undefined = undefined;\n get childViews(): View[] {\n // Return the childViews of the baseView if exists\n if (this._baseView) { return this._baseView.childViews; }\n\n // Lazy creating childViews array\n if (!this._childViews) this._childViews = [];\n return this._childViews;\n }\n appendView(view: View) {\n this.addView(view);\n }\n addView(view: View, pos?: number) {\n this._registerChild(view, pos, false);\n if (this._mountState == MountState.Mounted) view.mountStateChanged(MountState.Mounting);\n this._insertToDom(view, pos);\n if (this._mountState != MountState.Unmounted) view.mountStateChanged(this._mountState);\n }\n _registerChild(view: View, pos?: number, changeMountState = true) {\n const items = this.childViews;\n if (view.parentView) throw new Error('the view is already in a container view');\n view.parentView = this;\n if (pos === undefined) {\n view._position = items.length;\n items.push(view);\n } else {\n items.splice(pos, 0, view);\n for (let i = pos; i < items.length; i++) {\n items[i]._position = i;\n }\n }\n if (changeMountState && this._mountState != MountState.Unmounted) {\n view.mountStateChanged(this._mountState);\n }\n }\n removeView(view: View | number) {\n view = this._ensureItem(view);\n this._removeFromDom(view);\n var pos = view._position!;\n view.parentView = view._position = undefined;\n this.childViews.splice(pos, 1);\n for (let i = pos; i < this.childViews.length; i++) {\n this.childViews[i]._position = i;\n }\n if (this._mountState != MountState.Unmounted) {\n view.mountStateChanged(MountState.Unmounted);\n }\n }\n removeAllView() {\n while (this.childViews.length) this.removeView(this.childViews.length - 1);\n }\n removeFromParent() {\n if (this.parentView) this.parentView.removeView(this);\n }\n /** updateDom() then updateChildren() */\n updateAll() {\n this.updateDom();\n if (this.baseView) return this.baseView.updateAll();\n this.updateChildren();\n }\n /** Call updateDom() on the whole tree */\n updateChildren() {\n if (this._childViews) for (const child of this._childViews) {\n child.updateAll();\n }\n }\n protected _insertToDom(item: View, pos?: number) {\n if (pos == undefined) this.dom.appendChild(item.dom);\n else this.dom.insertBefore(item.dom, this.childViews[pos + 1]?.dom || null);\n }\n protected _removeFromDom(item: View) {\n if (item.domCreated) item.dom.remove();\n }\n protected _ensureItem(item: View | number) {\n if (typeof item === 'number') item = this.childViews[item];\n else if (!item) throw new Error('item is null or undefined.');\n else if (item.parentView !== this) throw new Error('the item is not in this listview.');\n return item;\n }\n\n}\n\nexport function tryGetDOM(idom: IDOM | null | undefined) {\n if (!idom) return idom;\n if (idom instanceof View) {\n return idom.getDOM();\n } else if (idom instanceof Node) {\n return idom;\n } else if (idom && \"getDOM\" in idom) {\n return idom.getDOM();\n }\n}\n\nexport function getDOM(idom: IDOM) {\n var dom = tryGetDOM(idom);\n if (!dom) {\n console.error(\"getDOM():\", idom);\n throw new Error(\"getDOM(): unsupported parameter: \" + idom);\n }\n return dom;\n}\n\nexport function appendView(parent: IDOM, childView: View) {\n warnMountingView(parent, childView);\n getDOM(parent).appendChild(childView.dom);\n}\n\nexport function addChild(parent: IDOM, child: BuildDomExpr) {\n // fast path\n if (parent instanceof View) parent.addChild(child);\n else if (parent instanceof Node) {\n warnMountingView(parent, child);\n parent.appendChild(buildDOM(child));\n }\n // slow path\n else if ('addChild' in parent) {\n parent.addChild(child);\n } else {\n console.error(\"addChild():\", { parent, child });\n throw new Error(\"addChild(): unsupported parent\");\n }\n}\n\nfunction warnMountingView(parent: IDOM, child: BuildDomExpr) {\n if (child instanceof View) {\n const data = { parent, child };\n if (parent instanceof Node)\n console.trace(\"Should use `mountView()` to mount a view to DOM.\", data);\n else\n console.trace(\"Should use `View.addChild()` or `View.appendView()` to add a view into another view.\", data);\n }\n}\n\nexport function mountView(parent: Node, view: View) {\n view.mountStateChanged(MountState.Mounting);\n parent.appendChild(view.dom);\n view.mountStateChanged(MountState.Mounted);\n}\n\nexport function unmountView(parent: Node, view: View) {\n view.dom.remove();\n view.mountStateChanged(MountState.Unmounted);\n}\n\ndeclare global {\n interface Node {\n /** @deprecated Use the exported function `getDOM()` instead. */\n getDOM(): this;\n /** @deprecated Use the exported function `appendView()` instead. */\n appendView(view: View);\n /** @deprecated Use the exported function `addChild()` instead. */\n addChild(child: BuildDomExpr): void;\n }\n}\n\n\nNode.prototype.getDOM = function () {\n console.trace(\"webfx: Node.getDOM() is deprecated. Please use the exported function `getDOM()` instead.\");\n return this;\n};\n\nNode.prototype.addChild = function (child) {\n console.trace(\"webfx: Node.addChild() is deprecated. Please use the exported function `addChild()` instead.\");\n addChild(this, child);\n};\n\nNode.prototype.appendView = function (this: Node, view: View) {\n console.trace(\"webfx: Node.appendView() is deprecated. Please use the exported function `appendView()` instead.\");\n appendView(this, view);\n};\n\nexport class ContainerView extends View {\n addView(view: T, pos?: number): void {\n return super.addView(view, pos);\n }\n removeView(view: T | number): void {\n super.removeView(view);\n }\n protected _insertToDom(item: T, pos: number): void {\n super._insertToDom(item, pos);\n }\n protected _removeFromDom(item: T): void {\n super._removeFromDom(item);\n }\n protected _ensureItem(item: T | number): T {\n return super._ensureItem(item) as T;\n }\n\n get items() { return this.childViews as T[]; }\n [Symbol.iterator]() { return (this.childViews as T[])[Symbol.iterator](); }\n get length() { return this.childViews.length; }\n get(idx: number) {\n return this.childViews[idx] as T;\n }\n map(func: (lvi: T) => TRet) { return arrayMap(this, func); }\n find(func: (lvi: T, idx: number) => any) { return arrayFind(this, func); }\n forEach(func: (lvi: T, idx: number) => void) { return arrayForeach(this, func); }\n}\n","import { Action, Callbacks, ConvertObjectWithCallbacks, foreachFlaten, Func, FuncOrVal, Ref } from \"@yuuza/utils\";\nimport { addChild, getDOM, View } from \"./view\";\n\n// BuildDOM types & implementation:\nexport type BuildDomExpr = string | BuildDomNode | HTMLElement | Node | IDOM;\n\nexport type IDOM = Node | View | IView;\n\nexport enum MountState {\n /** The view is unmounted. */\n Unmounted,\n /** The view will be mounted soon. */\n Mounting,\n /** The view is mounted (i.e. the DOM is in the document). */\n Mounted,\n}\n\nexport interface IView {\n getDOM(): HTMLElement;\n addChild(child: BuildDomExpr): void;\n mountStateChanged(state: MountState): void;\n}\n\nexport type BuildDomTag = string;\n\nexport type BuildDomReturn = HTMLElement | Text | Node;\n\nexport interface BuildDomNode {\n tag?: BuildDomTag;\n\n child?: BuildDomExpr[] | BuildDomExpr;\n\n text?: FuncOrVal;\n hidden?: FuncOrVal;\n init?: Action;\n update?: Action;\n\n ref?: Ref;\n\n _id?: string;\n /** @deprecated Use `_id` instead */\n _key?: string;\n\n [key: string]: any;\n}\n\nexport class BuildDOMCtx {\n dict: Record | undefined = undefined;\n actions: DOMUpdateAction[] | undefined = undefined;\n view: View | undefined = undefined;\n\n setDict(key: string, node: HTMLElement) {\n if (!this.dict) this.dict = {};\n this.dict[key] = node;\n }\n addUpdateAction(action: DOMUpdateAction) {\n if (!this.actions) this.actions = [];\n this.actions.push(action);\n }\n update() {\n if (!this.actions) return;\n for (const a of this.actions) {\n a.run();\n }\n }\n}\n\ninterface DOMUpdateAction {\n run(): void;\n}\n\nclass TextAction implements DOMUpdateAction {\n constructor(readonly node: Node, readonly func: Func) { }\n run() {\n this.node.textContent = this.func();\n }\n}\n\nclass HiddenAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Func) { }\n run() {\n this.node.hidden = this.func();\n }\n}\n\nclass UpdateAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Action) { }\n run() {\n this.func(this.node);\n }\n}\n\nvar createElementFromTag = function (tag: BuildDomTag): HTMLElement {\n var reg = /[#\\.^]?[\\w\\-]+/y;\n var match;\n var ele;\n while (match = reg.exec(tag)) {\n var val = match[0];\n var ch = val[0];\n if (ch === '.') {\n ele.classList.add(val.substr(1));\n } else if (ch === '#') {\n ele.id = val.substr(1);\n } else {\n if (ele) throw new Error('unexpected multiple tags');\n ele = document.createElement(val);\n }\n }\n return ele;\n};\n\nfunction tryHandleValues(obj: BuildDomExpr, ctx: BuildDOMCtx | null) {\n if (typeof (obj) === 'string') { return document.createTextNode(obj); }\n if (typeof obj === 'function') {\n const val = (obj as any)();\n if (!val || typeof val !== 'object') {\n const node = document.createTextNode(val);\n ctx?.addUpdateAction(new TextAction(node, obj));\n return node;\n } else {\n throw new Error('Unexpected function return value');\n }\n }\n if (Node && obj instanceof Node) return obj as Node;\n return null;\n}\n\nvar buildDomCore = function (obj: BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null): BuildDomReturn {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n var r = tryHandleValues(obj, ctx);\n if (r) return r;\n if (obj instanceof JsxNode) {\n obj = obj.buildView(ctx, ttl);\n if (!(obj instanceof View)) return obj as Node;\n }\n if (obj instanceof View) {\n ctx?.view?._registerChild(obj);\n return obj.getDOM();\n }\n // if ('getDOM' in (obj as any)) return (obj as any).getDOM();\n const tag = (obj as BuildDomNode).tag;\n if (!tag) throw new Error('no tag');\n var node = createElementFromTag(tag);\n for (var key in obj as any) {\n if (obj.hasOwnProperty(key)) {\n var val = obj[key];\n buildDOMHandleKey(key, val, node, ctx, ttl);\n }\n }\n const init = obj['init'];\n if (init) init(node);\n\n return node;\n};\n\nvar buildDOMHandleKey = function (key: string, val: any, node: HTMLElement, ctx: BuildDOMCtx | null, ttl: number) {\n if (key === 'child') {\n if (val instanceof Array) {\n foreachFlaten(val, function (val) {\n node.appendChild(buildDomCore(val, ttl, ctx));\n });\n } else {\n node.appendChild(buildDomCore(val, ttl, ctx));\n }\n } else if (key === '_id' || key === '_key') {\n ctx!.setDict(val, node);\n } else if (key === 'ref') {\n (val as Ref).value = node;\n } else if (key === 'text') {\n if (typeof val === 'function') {\n ctx!.addUpdateAction(new TextAction(node, val));\n } else {\n node.textContent = val;\n }\n } else if (key === 'class') {\n node.className = val;\n } else if (key === 'style' && typeof val === 'object') {\n for (const styleKey in val) {\n if (Object.prototype.hasOwnProperty.call(val, styleKey)) {\n const styleVal = val[styleKey];\n node.style[styleKey] = styleVal;\n }\n }\n } else if (key === 'hidden' && typeof val === 'function') {\n ctx!.addUpdateAction(new HiddenAction(node, val));\n } else if (key === 'update' && typeof val === 'function') {\n ctx!.addUpdateAction(new UpdateAction(node, val));\n } else if (key === 'init') {\n // no-op\n } else {\n node[key] = val;\n }\n};\n\n/** \n * Build a DOM tree from a JavaScript object.\n * @example\n * buildDOM({\n * tag: 'div.item#firstitem',\n * onclick: () => console.info('clicked'),\n * child: [\n * 'Name: ',\n * { tag: 'span.name', text: name },\n * ],\n * });\n */\nexport function buildDOM(obj: BuildDomExpr, ctx?: BuildDOMCtx): T {\n return buildDomCore(obj, 32, ctx || null) as T;\n};\n\n/** Get a View instance or a DOM Node. View is preferred. */\nexport function buildView(obj: BuildDomExpr, ctx?: BuildDOMCtx): View | Node {\n if (obj instanceof View) {\n return obj;\n } else if (obj instanceof JsxNode) {\n return obj.buildView(ctx as any, 64);\n } else {\n return buildDOM(obj, ctx);\n }\n}\n\nexport class JsxNode {\n tag: T | string;\n attrs: Record | undefined;\n child: any[] | undefined;\n constructor(tag: any, attrs: Record | undefined, childs: any[] | undefined) {\n this.tag = tag;\n this.attrs = attrs;\n this.child = childs;\n }\n getDOM(): HTMLElement {\n return this.buildDom(null, 64) as any;\n }\n buildDom(ctx: BuildDOMCtx | null, ttl: number) {\n return getDOM(this.buildView(ctx, ttl));\n }\n buildView(ctx: BuildDOMCtx | null, ttl: number)\n : T extends IDOM ? T : T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : HTMLElement {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n let view: Node | View;\n if (typeof this.tag === 'string') {\n // tag is an HTML tag\n const dom = document.createElement(this.tag);\n view = dom;\n if (this.attrs) {\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n buildDOMHandleKey(key, val, dom, ctx, ttl);\n }\n }\n const init = this.attrs['init'];\n if (init) init(dom);\n }\n } else {\n // tag is a View\n view = this.tag as View;\n if (this.attrs) {\n let init: Action | null = null;\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n if (key == \"init\") {\n init = val;\n } else if (key == \"ref\") {\n (val as Ref).value = view;\n } else if (key.startsWith(\"on\") && view[key] instanceof Callbacks) {\n (view[key] as Callbacks).add(val);\n } else {\n view[key] = val;\n }\n }\n }\n if (init) init(view);\n }\n }\n if (this.child) {\n if (view instanceof View) {\n foreachFlaten(this.child, it => {\n (view as View).addChild(jsxBuildCore(it, ttl, (view as View)['_domctx']) as any);\n });\n } else {\n foreachFlaten(this.child, it => {\n const c = jsxBuildCore(it, ttl, ctx);\n if (c instanceof View) {\n (view as Node).appendChild(c.dom);\n ctx?.view?._registerChild(c);\n } else {\n addChild(view, c);\n }\n });\n }\n }\n return view as any;\n }\n addChild(child: IDOM): void {\n if (this.child == null) this.child = [];\n this.child.push(child);\n }\n}\n\nfunction jsxBuildCore(node: JsxNode | BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null) {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n if (node instanceof View) return node;\n var r = tryHandleValues(node, ctx);\n if (r) return r;\n if (node instanceof JsxNode) {\n return node.buildView(ctx, ttl);\n } else {\n console.error(\"Unknown node type\", node);\n throw new Error(\"Unknown node type\");\n }\n}\n\nexport function jsxBuild(node: JsxNode, ctx?: BuildDOMCtx): T {\n return jsxBuildCore(node, 64, ctx || new BuildDOMCtx());\n}\n\nexport type JsxTag = JsxDOMTag | JsxCtorTag;\nexport type JsxCtorTag = new (...args) => IDOM;;\nexport type JsxDOMTag = keyof HTMLElementTagNameMap;\n\nexport type JsxTagInstance =\n T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] :\n T extends (new (...args) => infer U) ? U extends IDOM ? U :\n never : never;\n\nexport type JsxAttrs =\n T extends JsxCtorTag ? JsxCtorAttrs :\n T extends JsxDOMTag ? JsxDOMAttrs :\n never;\n\nexport type JsxCtorAttrs> = {\n args?: ConstructorParameters;\n init?: Action;\n} & Partial>;\n\nexport type JsxDOMAttrs = Omit & Partial>;\n\nexport function jsxFactory>(tag: T, attrs: JsxAttrs, ...childs: any)\n : JsxNode {\n if (typeof tag === 'string') {\n return new JsxNode(tag, attrs, childs) as any;\n } else {\n const view = attrs?.args ?\n new (tag as any)(...attrs.args) :\n new (tag as any)();\n return new JsxNode(view, attrs, childs) as any;\n }\n}\n\nexport const jsx = jsxFactory;\n","import { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { buildDOM, IDOM } from \"./buildDOM\";\r\nimport { getDOM } from \"./view\";\r\n\r\n\r\nexport function clearChildren(node: Node) {\r\n while (node.lastChild) node.removeChild(node.lastChild);\r\n}\r\n\r\n/** Remove all children from the node (if needed) and append one (if present) */\r\nexport function replaceChild(node: Node, newChild?: Node) {\r\n clearChildren(node);\r\n if (newChild) node.appendChild(newChild);\r\n}\r\n\r\n/** Add or remove a classname for the element\r\n * @param force - true -> add; false -> remove; undefined -> toggle.\r\n */\r\nexport function toggleClass(element: HTMLElement, clsName: string, force?: boolean) {\r\n var clsList = element.classList;\r\n if (clsList.toggle) return clsList.toggle(clsName, force);\r\n if (force === undefined) force = !clsList.contains(clsName);\r\n if (force) clsList.add(clsName);\r\n else clsList.remove(clsName);\r\n return force;\r\n}\r\n\r\nexport interface FadeOutOptions {\r\n className?: string;\r\n duration?: number;\r\n remove?: boolean;\r\n}\r\n\r\nexport interface FadeoutResult {\r\n readonly finished: boolean;\r\n onFinished(callback: Action): this;\r\n cancel(finish?: boolean): void;\r\n}\r\n\r\n/** Fade out the element and remove it */\r\nexport function fadeout(element: HTMLElement, options?: FadeOutOptions): FadeoutResult {\r\n const { className = 'fading-out', duration = 500, remove = true } = options || {};\r\n element.classList.add(className);\r\n var cb: Action | null = null;\r\n var end: Action | null = (finish = true) => {\r\n if (!end) return; // use a random variable as flag ;)\r\n end = null;\r\n element.removeEventListener('transitionend', onTransitionend);\r\n element.classList.remove(className);\r\n if (remove && finish) {\r\n element.remove();\r\n }\r\n finish && cb?.();\r\n };\r\n var onTransitionend = function (e: TransitionEvent) {\r\n if (e.eventPhase === Event.AT_TARGET) end?.();\r\n };\r\n element.addEventListener('transitionend', onTransitionend);\r\n setTimeout(end, duration); // failsafe\r\n return {\r\n get finished() { return !end; },\r\n onFinished(callback: Action) {\r\n if (!end) callback();\r\n else cb = callback;\r\n return this;\r\n },\r\n cancel(finish = false) {\r\n end?.(finish);\r\n }\r\n };\r\n}\r\n\r\nexport function startBlockingDetect(threshold = 20) {\r\n var begin = Date.now();\r\n var lastRun = Date.now();\r\n setInterval(() => {\r\n var now = Date.now();\r\n if (now - lastRun >= threshold) {\r\n console.info(`[Blocking] ${(now - begin) / 1000}s: blocked for ${now - lastRun} ms`);\r\n }\r\n lastRun = now;\r\n }, 1);\r\n}\r\n\r\nexport class Timer {\r\n callback: () => void;\r\n cancelFunc: (() => void) | undefined;\r\n constructor(callback: () => void) {\r\n this.callback = callback;\r\n this.cancelFunc = undefined;\r\n }\r\n timeout(time: number) {\r\n this.tryCancel();\r\n var handle = setTimeout(this.callback, time);\r\n this.cancelFunc = () => window.clearTimeout(handle);\r\n }\r\n interval(time: number) {\r\n this.tryCancel();\r\n var handle = setInterval(this.callback, time);\r\n this.cancelFunc = () => window.clearInterval(handle);\r\n }\r\n animationFrame() {\r\n this.tryCancel();\r\n var handle = requestAnimationFrame(this.callback);\r\n this.cancelFunc = () => cancelAnimationFrame(handle);\r\n }\r\n tryCancel() {\r\n if (this.cancelFunc) {\r\n this.cancelFunc();\r\n this.cancelFunc = undefined;\r\n }\r\n }\r\n}\r\n\r\nexport type PtrEvent = ({\r\n type: 'mouse';\r\n ev: MouseEvent;\r\n} | {\r\n type: 'touch';\r\n touch: 'start' | 'move' | 'end';\r\n ev: TouchEvent;\r\n}) & {\r\n action: 'down' | 'move' | 'up';\r\n point: MouseEvent | Touch;\r\n};\r\n\r\nexport function listenPointerEvents(element: HTMLElement, callback: (e: PtrEvent) => void | 'track', options?: AddEventListenerOptions) {\r\n var touchDown = false;\r\n var mouseDown = function (e: MouseEvent) {\r\n if (callback({ type: 'mouse', ev: e, point: e, action: 'down' }) === 'track') {\r\n var mousemove = function (e: MouseEvent) {\r\n callback({ type: 'mouse', ev: e, point: e, action: 'move' });\r\n };\r\n var mouseup = function (e: MouseEvent) {\r\n document.removeEventListener('mousemove', mousemove, true);\r\n document.removeEventListener('mouseup', mouseup, true);\r\n callback({ type: 'mouse', ev: e, point: e, action: 'up' });\r\n };\r\n document.addEventListener('mousemove', mousemove, true);\r\n document.addEventListener('mouseup', mouseup, true);\r\n }\r\n };\r\n var touchStart = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n var ret = callback({\r\n type: 'touch', touch: 'start', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'down'\r\n });\r\n if (!touchDown && ret === 'track') {\r\n touchDown = true;\r\n var touchmove = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n callback({ type: 'touch', touch: 'move', ev: e, point: ct, action: 'move' });\r\n };\r\n var touchend = function (e: TouchEvent) {\r\n if (e.touches.length === 0) {\r\n touchDown = false;\r\n element.removeEventListener('touchmove', touchmove);\r\n element.removeEventListener('touchend', touchend);\r\n element.removeEventListener('touchcancel', touchend);\r\n }\r\n var ct = e.changedTouches[0];\r\n callback({\r\n type: 'touch', touch: 'end', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'up'\r\n });\r\n };\r\n element.addEventListener('touchmove', touchmove, options);\r\n element.addEventListener('touchend', touchend, options);\r\n element.addEventListener('touchcancel', touchend, options);\r\n }\r\n };\r\n element.addEventListener('mousedown', mouseDown, options);\r\n element.addEventListener('touchstart', touchStart, options);\r\n return {\r\n remove: () => {\r\n element.removeEventListener('mousedown', mouseDown, options);\r\n element.removeEventListener('touchstart', touchStart, options);\r\n }\r\n };\r\n}\r\n\r\nexport function listenEvent(element: HTMLElement, event: K,\r\n handler: (ev: HTMLElementEventMap[K]) => any) {\r\n element.addEventListener(event, handler);\r\n return {\r\n remove: () => element.removeEventListener(event, handler)\r\n };\r\n}\r\n\r\nexport function listenEvents>(element: HTMLElement, events: K,\r\n handler: (ev: HTMLElementEventMap[K[number]]) => any) {\r\n events.forEach(event => element.addEventListener(event, handler));\r\n return {\r\n remove: () => events.forEach(event => element.removeEventListener(event, handler))\r\n };\r\n}\r\n\r\nexport function injectCss(css: string, options?: { parent?: Node, tag?: string; }) {\r\n const parent = options?.parent ?? document.head;\r\n parent.appendChild(buildDOM({ tag: options?.tag ?? 'style', text: css }));\r\n}\r\n\r\nexport class TextCompositionWatcher {\r\n dom: HTMLElement;\r\n onCompositingChanged = new Callbacks();\r\n private _isCompositing = false;\r\n get isCompositing() { return this._isCompositing; }\r\n set isCompositing(val) {\r\n this._isCompositing = val;\r\n this.onCompositingChanged.invoke();\r\n }\r\n constructor(dom: IDOM) {\r\n this.dom = getDOM(dom) as HTMLElement;\r\n this.dom.addEventListener('compositionstart', (ev) => {\r\n this.isCompositing = true;\r\n });\r\n this.dom.addEventListener('compositionend', (ev) => {\r\n this.isCompositing = false;\r\n });\r\n }\r\n}\r\n\r\nexport class InputStateTracker {\r\n state = {\r\n mouseDown: false,\r\n mouseIn: false,\r\n focusIn: false,\r\n };\r\n private _removeEvents: Action | null = null;\r\n private _removePointerEvents: Action | null = null;\r\n readonly onChanged = new Callbacks>();\r\n constructor(readonly dom: HTMLElement) {\r\n this._removeEvents = listenEvents(dom, ['mouseenter', 'mouseleave', 'focusin', 'focusout'], (e) => {\r\n switch (e.type) {\r\n case 'mouseenter':\r\n this.stateChanged('mouseIn', true);\r\n break;\r\n case 'mouseleave':\r\n this.stateChanged('mouseIn', false);\r\n break;\r\n case 'focusin':\r\n this.stateChanged('focusIn', true);\r\n break;\r\n case 'focusout':\r\n this.stateChanged('focusIn', false);\r\n break;\r\n }\r\n }).remove;\r\n\r\n this._removePointerEvents = listenPointerEvents(dom, (e) => {\r\n if (e.action == 'down') {\r\n this.stateChanged('mouseDown', true);\r\n return 'track';\r\n } else if (e.action == 'up') {\r\n this.stateChanged('mouseDown', false);\r\n }\r\n }).remove;\r\n }\r\n private stateChanged(state: T, val: InputStateTracker['state'][T]) {\r\n this.state[state] = val;\r\n this.onChanged.invoke(state);\r\n }\r\n removeListeners() {\r\n this._removeEvents?.();\r\n this._removePointerEvents?.();\r\n this._removePointerEvents = this._removeEvents = null;\r\n }\r\n}\r\n\r\n\r\nexport interface IId {\r\n id: keyof any;\r\n}\r\n\r\nexport class DataUpdatingHelper {\r\n items: Iterable;\r\n update(newData: Iterable) {\r\n const oldData = this.items;\r\n var dataDict: Record = {};\r\n for (const n of newData) {\r\n dataDict[this.dataSelectId(n)] = n;\r\n }\r\n var itemDict: Record = {};\r\n var removed: T[] = [];\r\n for (const d of oldData) {\r\n const id = this.selectId(d);\r\n if (dataDict[id] !== undefined) {\r\n itemDict[id] = d;\r\n } else {\r\n removed.push(d);\r\n }\r\n }\r\n for (let i = removed.length - 1; i >= 0; i--)\r\n this.removeItem(removed[i]);\r\n var pos = 0;\r\n for (const n of newData) {\r\n const d = itemDict[this.dataSelectId(n)];\r\n if (d !== undefined) {\r\n this.updateItem(d, n);\r\n } else {\r\n this.addItem(n, pos);\r\n }\r\n pos++;\r\n }\r\n }\r\n updateOrRebuildAll(newData: Iterable) {\r\n this.update(newData);\r\n if (!this.isSame(newData)) this.rebuildAll(newData);\r\n }\r\n isSame(newData: Iterable) {\r\n var t = this.items[Symbol.iterator]();\r\n for (const n of newData) {\r\n var d = t.next();\r\n if (d.done) return false;\r\n if (this.selectId(d.value) !== this.dataSelectId(n)) return false;\r\n }\r\n if (!t.next().done) return false;\r\n return true;\r\n }\r\n rebuildAll(newData: Iterable) {\r\n var oldData = this.items;\r\n if (oldData instanceof Array) {\r\n for (let i = oldData.length - 1; i >= 0; i--) {\r\n this.removeItem(oldData[i]);\r\n }\r\n } else {\r\n for (const o of oldData) {\r\n this.removeItem(o);\r\n }\r\n }\r\n let i = 0;\r\n for (const n of newData) {\r\n this.addItem(n, i++);\r\n }\r\n }\r\n protected selectId(obj: T): any { return obj.id; }\r\n protected dataSelectId(obj: TData): any { return obj.id; }\r\n addItem(obj: TData, pos: number) { }\r\n updateItem(old: T, data: TData) { }\r\n removeItem(obj: T) { }\r\n}","// file: I18n.ts\n\nexport interface I18nData {\n [lang: string]: LangObj;\n}\n\nexport type LangObj = Record;\n\n/** Internationalization (aka i18n) helper class */\nexport class I18n {\n data: I18nData = {};\n curLang = 'en';\n missing = new Map();\n /** Get i18n string for `key`, return `key` when not found. */\n get(key, arg?: any[]): string {\n return this.get2(key, arg) || key;\n }\n /** Get i18n string for `key`, return `null` when not found. */\n get2(key, arg?: any[], lang?: string): string | null {\n lang = lang || this.curLang;\n var langObj = this.data[lang];\n if (!langObj) {\n console.log('i18n missing lang: ' + lang);\n return null;\n }\n var r = langObj[key];\n if (!r) {\n if (!this.missing.has(key)) {\n this.missing.set(key, 1);\n console.log('i18n missing key: ' + key);\n }\n return null;\n }\n if (arg) {\n for (const key in arg) {\n if (arg.hasOwnProperty(key)) {\n const val = arg[key];\n r = r.replace('{' + key + '}', val);\n // Note that it only replaces the first occurrence.\n }\n }\n }\n return r;\n }\n /** Fills data with an 2darray */\n add2dArray(array: [...string[][]]) {\n const langObjs: LangObj[] = [];\n const langs = array[0];\n for (const lang of langs) {\n langObjs.push(this.data[lang] = this.data[lang] || {});\n }\n for (let i = 1; i < array.length; i++) {\n const line = array[i];\n const key = line[0];\n for (let j = 0; j < line.length; j++) {\n const val = line[j];\n langObjs[j][key] = val;\n }\n }\n }\n renderElements(elements) {\n console.log('i18n elements rendering');\n elements.forEach(x => {\n for (const node of x.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // console.log('node', node);\n var r = this.get2(node.beforeI18n || node.textContent);\n if (r) {\n node.beforeI18n = node.beforeI18n || node.textContent;\n node.textContent = r;\n }\n else {\n if (node.beforeI18n) {\n node.textContent = node.beforeI18n;\n }\n console.log('missing key for node', node);\n }\n }\n }\n });\n }\n /**\n * Detect the best available language using\n * the user language preferences provided by the browser.\n * @param langs Available languages\n */\n static detectLanguage(langs: string[]) {\n var cur: string | null = null;\n var curIdx = -1;\n var languages: string[] = [];\n // ['en-US'] -> ['en-US', 'en']\n (navigator.languages || [navigator.language]).forEach(lang => {\n languages.push(lang);\n if (lang.indexOf('-') > 0)\n languages.push(lang.substr(0, lang.indexOf('-')));\n });\n langs.forEach((l) => {\n var idx = languages.indexOf(l);\n if (!cur || (idx !== -1 && idx < curIdx)) {\n cur = l;\n curIdx = idx;\n }\n });\n return cur || langs[0];\n }\n}\n\nexport function createStringBuilder(i18n: I18n) {\n var arrBuilder = createArrayBuilder(i18n);\n\n return function (literals: TemplateStringsArray, ...placeholders: any[]) {\n if (placeholders.length === 0) {\n return i18n.get(literals[0]);\n }\n return arrBuilder(literals, ...placeholders).join('');\n }\n}\n\nexport function createArrayBuilder(i18n: I18n) {\n var formatCache = new WeakMap();\n var parseCache = new Map();\n\n return function (literals: TemplateStringsArray, ...placeholders: T): (string | T)[] {\n if (placeholders.length === 0) {\n return [i18n.get(literals[0])];\n }\n\n // Generate format string from template string if it's not cached:\n let format = formatCache.get(literals);\n if (format === undefined) {\n format = '';\n for (let i = 0; i < literals.length; i++) {\n const lit = literals[i];\n format += lit;\n if (i < placeholders.length) {\n format += '{' + i + '}';\n }\n }\n formatCache.set(literals, format);\n }\n\n const translatedFormat = i18n.get(format);\n\n // Also cache parsed template\n let parsed = parseCache.get(translatedFormat);\n if (parsed === undefined) {\n parsed = parseTemplate(translatedFormat);\n }\n\n return parsed.map(x => typeof x == 'number' ? placeholders[x] : x);\n }\n}\n\nfunction parseTemplate(template: string): (string | number)[] {\n const result: (string | number)[] = [];\n let state = 0; // 0: normal / 1: after '{' / 2: after '}' / 3: after '{' and numbers\n let buf = '';\n for (let i = 0; i < template.length; i++) {\n const ch = template[i];\n switch (ch) {\n case '{':\n if (state == 0) state = 1;\n else if (state == 1) { state = 0; buf += '{'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n case '}':\n if (state == 3) { state = 0; result.push(+buf); buf = ''; }\n else if (state == 0) { state = 2; }\n else if (state == 2) { state = 0; buf += '}'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n default:\n if (state == 2) throw new Error(`Expected '}', got '${ch}' at ${i}`);\n else if (state == 1) { state = 3; if (buf) result.push(buf); buf = ''; }\n buf += ch;\n }\n }\n if (state != 0) throw new Error(\"Unexpected end of template string\");\n if (buf) result.push(buf);\n return result;\n}\n\nexport var i18n = new I18n();\n\nexport const I = createStringBuilder(i18n);\n","export const version = \"1.10.4\""],"names":["_object_assign","Object","assign","_object_hasOwnProperty","prototype","hasOwnProperty","strPadLeft","str","len","ch","length","formatDuration","sec","isNaN","Math","round","min","floor","toString","fileSizeUnits","formatFileSize","size","unit","toFixed","formatDateTime","date","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","toLocaleString","numLimit","num","max","createName","nameFunc","existsFunc","base64EncodeUtf8","btoa","encodeURIComponent","replace","match","p1","String","fromCharCode","sleepAsync","time","Promise","resolve","setTimeout","arrayRemove","array","val","i","splice","arrayInsert","pos","undefined","push","arrayMap","arr","func","Array","map","idx","ret","item","arrayForeach","foreachFlaten","it","arrayFind","find","arraySum","sum","x","objectApply","obj","kv","keys","key","call","indexOf","objectInit","startsWith","Callbacks","add","mod","a","b","readBlobAsDataUrl","blob","reject","reader","FileReader","onload","ev","result","onerror","readAsDataURL","remove","this","constructor","_cbs","_cbs_invoking","_hook","_invoking","onChanged","_a","invoke","args","Error","forEach","apply","error","console","clear","callback","Set","_b","delete","waitOnce","arguments","cb","accessedRefs","Ref","value","_value","_onChanged","from","ref","computed","deps","updateValue","dep","endRefCollect","Lazy","_func","rawValue","Semaphore","init","queue","maxCount","runningCount","enter","prom","res","exit","window","queueMicrotask","shift","run","CancelToken","cancelled","onCancelled","cancel","throwIfCancelled","AutoResetEvent","_whenNotify","_callback","wait","r","set","EventRegistrations","list","event","removeAll","pop","View","dom","parentView","_position","_domctx","BuildDOMCtx","_dom","_baseView","_mountState","MountState","Unmounted","_onActive","_childViews","view","domExprCreated","getView","position","ensureDom","domCreated","baseView","mountState","hidden","createDom","buildView","postCreateDom","updateDom","document","createElement","debugging","dataset","update","mountStateChanged","state","trace","child","getDomById","id","dict","updateWith","updateAllWith","updateAll","toggleClass","clsName","force","getDOM","addChild","appendView","appendChild","onActive","addEventListener","e","handleKeyDown","code","rect","getBoundingClientRect","MouseEvent","clientX","clientY","y","relatedTarget","preventDefault","childViews","addView","_registerChild","Mounted","Mounting","_insertToDom","changeMountState","items","removeView","_ensureItem","_removeFromDom","removeAllView","removeFromParent","updateChildren","insertBefore","tryGetDOM","idom","Node","parent","childView","warnMountingView","buildDOM","data","mountView","unmountView","ContainerView","super","Symbol","iterator","get","actions","setDict","node","addUpdateAction","action","TextAction","textContent","HiddenAction","UpdateAction","tryHandleValues","ctx","createTextNode","buildDomCore","ttl","JsxNode","tag","ele","reg","exec","classList","substr","createElementFromTag","buildDOMHandleKey","className","styleKey","styleVal","style","attrs","childs","buildDom","jsxBuildCore","c","jsxBuild","jsxFactory","jsx","clearChildren","lastChild","removeChild","replaceChild","newChild","element","clsList","toggle","contains","fadeout","options","duration","end","finish","removeEventListener","onTransitionend","eventPhase","Event","AT_TARGET","finished","onFinished","startBlockingDetect","threshold","begin","lastRun","setInterval","info","Timer","cancelFunc","timeout","tryCancel","handle","clearTimeout","interval","clearInterval","animationFrame","requestAnimationFrame","cancelAnimationFrame","listenPointerEvents","touchDown","mouseDown","type","point","mousemove","mouseup","touchStart","ct","changedTouches","touch","touchmove","touchend","touches","listenEvent","handler","listenEvents","events","injectCss","css","head","text","TextCompositionWatcher","isCompositing","_isCompositing","onCompositingChanged","InputStateTracker","mouseIn","focusIn","_removeEvents","_removePointerEvents","stateChanged","removeListeners","DataUpdatingHelper","newData","oldData","dataDict","n","dataSelectId","itemDict","removed","d","selectId","removeItem","updateItem","addItem","updateOrRebuildAll","isSame","rebuildAll","t","next","done","o","old","I18n","curLang","missing","Map","arg","get2","lang","langObj","log","has","add2dArray","langObjs","langs","line","j","renderElements","elements","childNodes","nodeType","TEXT_NODE","beforeI18n","detectLanguage","cur","curIdx","languages","navigator","language","l","createStringBuilder","i18n","arrBuilder","createArrayBuilder","literals","placeholders","join","formatCache","WeakMap","parseCache","format","translatedFormat","parsed","template","buf","parseTemplate","I","version"],"mappings":"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"} \ No newline at end of file diff --git a/dist/webfxcore.min.js b/dist/webfxcore.min.js index f9d1737..59296db 100644 --- a/dist/webfxcore.min.js +++ b/dist/webfxcore.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).webfx={})}(this,(function(t){"use strict";var e=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{c(i.next(t))}catch(t){s(t)}}function a(t){try{c(i.throw(t))}catch(t){s(t)}}function c(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}c((i=i.apply(t,e||[])).next())}))};const n=Object.assign,i=Object.prototype.hasOwnProperty;function o(t,e,n=" "){for(;t.length=0)){const i=e[n];t[n]=i}}return t}function l(t,e,n){if(e)for(const o in e)if(i.call(e,o)&&(!n||n.indexOf(o)>=0)){const n=e[o];o.startsWith("on")&&t[o]instanceof f?t[o].add(n):t[o]=n}return t}Array.prototype.remove=function(t){r(this,t)};const f=class{constructor(){this._cbs=void 0,this._cbs_invoking=void 0,this._hook=void 0,this._invoking=!1}get onChanged(){var t;return null!==(t=this._hook)&&void 0!==t||(this._hook=new f),this._hook}get length(){return this._cbs?this._cbs.size:0}invoke(...t){var e;if(this._cbs){if(this._invoking)throw new Error("Cannot invoke callbacks during invocation");if(this._invoking=!0,this._cbs.forEach((e=>{try{e.apply(this,t)}catch(t){console.error("Error in callback",t)}})),this._cbs_invoking)for(const t of this._cbs_invoking)this._cbs.add(t);null===(e=this._cbs_invoking)||void 0===e||e.clear(),this._invoking=!1}}add(t){var e,n;return void 0===this._cbs&&(this._cbs=new Set),this._invoking?(null!==(e=this._cbs_invoking)&&void 0!==e||(this._cbs_invoking=new Set),this._cbs_invoking.add(t)):this._cbs.add(t),null===(n=this._hook)||void 0===n||n.invoke(!0,t),t}remove(t){var e,n;void 0!==this._cbs&&(this._invoking&&(null===(e=this._cbs_invoking)||void 0===e||e.delete(t)),this._cbs.delete(t),null===(n=this._hook)||void 0===n||n.invoke(!1,t))}waitOnce(t){if(0===arguments.length)return new Promise(((t,e)=>{const n=(...e)=>{this.remove(n),t(e)};this.add(n)}));if(!t)throw new Error("Invalid callback");{const e=(...n)=>(this.remove(e),t(...n));this.add(e)}}};class v{constructor(t){this._value=void 0,this._onChanged=void 0,this._value=t}get onChanged(){return this._onChanged||(this._onChanged=new f),this._onChanged}get value(){return this._value}set value(t){this._value=t,this._onChanged&&this.onChanged.invoke(this)}static from(t){const e=new v;return e._value=t,e}}class m{constructor(e){this.parentView=void 0,this._position=void 0,this._domctx=new E,this._dom=void 0,this._baseView=void 0,this._mountState=t.MountState.Unmounted,this._onActive=void 0,this._childViews=void 0,this._domctx.view=this,e&&this.domExprCreated(e)}static getView(t){return t instanceof m?t:new m(t)}get position(){return this._position}get dom(){return this.ensureDom(),this._dom}get domCreated(){return!!this._dom}get baseView(){return this._baseView}get mountState(){return this._mountState}get hidden(){return this.dom.hidden}set hidden(t){this.dom.hidden=t}ensureDom(){if(!this._dom){var t=this.createDom();this.domExprCreated(t)}}domExprCreated(t){var e=A(t,this._domctx);e instanceof m?(this._baseView=e,this._dom=e.dom):this._dom=e,this.postCreateDom(),this.updateDom()}createDom(){return document.createElement("div")}postCreateDom(){m.debugging&&this.dom.dataset&&(this.dom.dataset.webfx=t.MountState[this._mountState])}updateDom(){this._domctx.update()}mountStateChanged(e){if(e!=this._mountState){if(this._mountState=e,m.debugging&&!this._baseView&&this.domCreated&&this.dom.dataset&&(this.dom.dataset.webfx==t.MountState[e]&&console.trace("mountState on the DOM is changed by other view",e,this),this.dom.dataset.webfx=t.MountState[e]),this._baseView)this._baseView.mountStateChanged(e);else if(this._childViews)for(const t of this._childViews)t.mountStateChanged(e)}else console.trace("mountState unchanged",e,this)}getDomById(t){var e,n;return this.ensureDom(),null!==(n=null===(e=this._domctx.dict)||void 0===e?void 0:e[t])&&void 0!==n?n:null}updateWith(t){u(this,t),this.updateDom()}updateAllWith(t){u(this,t),this.updateAll()}toggleClass(t,e){P(this.dom,t,e)}getDOM(){return this.dom}addChild(t){const e=A(t,this._domctx);e instanceof m?this.appendView(e):this.dom.appendChild(e)}get onActive(){return this._onActive||(this._onActive=new f,this.dom.addEventListener("click",(t=>{this._onActive.invoke(t)})),this.dom.addEventListener("keydown",(t=>{this.handleKeyDown(t)}))),this._onActive}handleKeyDown(t){var e;if("Enter"===t.code){const n=this.dom.getBoundingClientRect();null===(e=this._onActive)||void 0===e||e.invoke(new MouseEvent("click",{clientX:n.x,clientY:n.y,relatedTarget:this.dom})),t.preventDefault()}}get childViews(){return this._baseView?this._baseView.childViews:(this._childViews||(this._childViews=[]),this._childViews)}appendView(t){this.addView(t)}addView(e,n){this._registerChild(e,n,!1),this._mountState==t.MountState.Mounted&&e.mountStateChanged(t.MountState.Mounting),this._insertToDom(e,n),this._mountState!=t.MountState.Unmounted&&e.mountStateChanged(this._mountState)}_registerChild(e,n,i=!0){const o=this.childViews;if(e.parentView)throw new Error("the view is already in a container view");if(e.parentView=this,void 0===n)e._position=o.length,o.push(e);else{o.splice(n,0,e);for(let t=n;t{n.addChild(O(t,e,n._domctx))}:i=>{var o;const s=O(i,e,t);s instanceof m?(n.appendChild(s.dom),null===(o=null==t?void 0:t.view)||void 0===o||o._registerChild(s)):_(n,s)}),n}addChild(t){null==this.child&&(this.child=[]),this.child.push(t)}}function O(t,e,n){if(e--<0)throw new Error("ran out of TTL");if(t instanceof m)return t;var i=S(t,n);if(i)return i;if(t instanceof L)return t.buildView(n,e);throw console.error("Unknown node type",t),new Error("Unknown node type")}function T(t,e,...n){if("string"==typeof t)return new L(t,e,n);{const i=(null==e?void 0:e.args)?new t(...e.args):new t;return new L(i,e,n)}}const N=T;function F(t){for(;t.lastChild;)t.removeChild(t.lastChild)}function P(t,e,n){var i=t.classList;return i.toggle?i.toggle(e,n):(void 0===n&&(n=!i.contains(e)),n?i.add(e):i.remove(e),n)}function U(t,e,n){var i=!1,o=function(t){if("track"===e({type:"mouse",ev:t,point:t,action:"down"})){var n=function(t){e({type:"mouse",ev:t,point:t,action:"move"})},i=function(t){document.removeEventListener("mousemove",n,!0),document.removeEventListener("mouseup",i,!0),e({type:"mouse",ev:t,point:t,action:"up"})};document.addEventListener("mousemove",n,!0),document.addEventListener("mouseup",i,!0)}},s=function(o){var s=o.changedTouches[0],r=e({type:"touch",touch:"start",ev:o,point:s,action:i?"move":"down"});if(!i&&"track"===r){i=!0;var a=function(t){var n=t.changedTouches[0];e({type:"touch",touch:"move",ev:t,point:n,action:"move"})},c=function(n){0===n.touches.length&&(i=!1,t.removeEventListener("touchmove",a),t.removeEventListener("touchend",c),t.removeEventListener("touchcancel",c));var o=n.changedTouches[0];e({type:"touch",touch:"end",ev:n,point:o,action:i?"move":"up"})};t.addEventListener("touchmove",a,n),t.addEventListener("touchend",c,n),t.addEventListener("touchcancel",c,n)}};return t.addEventListener("mousedown",o,n),t.addEventListener("touchstart",s,n),{remove:()=>{t.removeEventListener("mousedown",o,n),t.removeEventListener("touchstart",s,n)}}}function j(t,e,n){return e.forEach((e=>t.addEventListener(e,n))),{remove:()=>e.forEach((e=>t.removeEventListener(e,n)))}}class B{constructor(){this.data={},this.curLang="en",this.missing=new Map}get(t,e){return this.get2(t,e)||t}get2(t,e,n){n=n||this.curLang;var i=this.data[n];if(!i)return console.log("i18n missing lang: "+n),null;var o=i[t];if(!o)return this.missing.has(t)||(this.missing.set(t,1),console.log("i18n missing key: "+t)),null;if(e)for(const t in e)if(e.hasOwnProperty(t)){const n=e[t];o=o.replace("{"+t+"}",n)}return o}add2dArray(t){const e=[],n=t[0];for(const t of n)e.push(this.data[t]=this.data[t]||{});for(let n=1;n{for(const n of t.childNodes)if(n.nodeType===Node.TEXT_NODE){var e=this.get2(n.beforeI18n||n.textContent);e?(n.beforeI18n=n.beforeI18n||n.textContent,n.textContent=e):(n.beforeI18n&&(n.textContent=n.beforeI18n),console.log("missing key for node",n))}}))}static detectLanguage(t){var e=null,n=-1,i=[];return(navigator.languages||[navigator.language]).forEach((t=>{i.push(t),t.indexOf("-")>0&&i.push(t.substr(0,t.indexOf("-")))})),t.forEach((t=>{var o=i.indexOf(t);(!e||-1!==o&&o"number"==typeof t?o[t]:t))}}var $=new B;const W=R($);t.AutoResetEvent=class{constructor(){this._whenNotify=null,this._callback=null}wait(){return this._whenNotify||(this._whenNotify=new Promise((t=>{this._callback=()=>{this._callback=this._whenNotify=null,t()}}))),this._whenNotify}set(){this._callback&&this._callback()}},t.BuildDOMCtx=E,t.Callbacks=f,t.CancelToken=class{constructor(){this.cancelled=!1,this.onCancelled=new f}cancel(){this.cancelled||(this.cancelled=!0,this.onCancelled.invoke())}throwIfCancelled(){if(this.cancelled)throw new Error("operation cancelled.")}},t.ContainerView=b,t.DataUpdatingHelper=class{update(t){const e=this.items;var n={};for(const e of t)n[this.dataSelectId(e)]=e;var i={},o=[];for(const t of e){const e=this.selectId(t);void 0!==n[e]?i[e]=t:o.push(t)}for(let t=o.length-1;t>=0;t--)this.removeItem(o[t]);var s=0;for(const e of t){const t=i[this.dataSelectId(e)];void 0!==t?this.updateItem(t,e):this.addItem(e,s),s++}}updateOrRebuildAll(t){this.update(t),this.isSame(t)||this.rebuildAll(t)}isSame(t){var e=this.items[Symbol.iterator]();for(const i of t){var n=e.next();if(n.done)return!1;if(this.selectId(n.value)!==this.dataSelectId(i))return!1}return!!e.next().done}rebuildAll(t){var e=this.items;if(e instanceof Array)for(let t=e.length-1;t>=0;t--)this.removeItem(e[t]);else for(const t of e)this.removeItem(t);let n=0;for(const e of t)this.addItem(e,n++)}selectId(t){return t.id}dataSelectId(t){return t.id}addItem(t,e){}updateItem(t,e){}removeItem(t){}},t.EventRegistrations=class{constructor(){this.list=[]}add(t,e){return this.list.push({event:t,func:e}),t.add(e),e}removeAll(){for(;this.list.length;){var t=this.list.pop();t.event.remove(t.func)}}},t.I=W,t.I18n=B,t.InputStateTracker=class{constructor(t){this.dom=t,this.state={mouseDown:!1,mouseIn:!1,focusIn:!1},this._removeEvents=null,this._removePointerEvents=null,this.onChanged=new f,this._removeEvents=j(t,["mouseenter","mouseleave","focusin","focusout"],(t=>{switch(t.type){case"mouseenter":this.stateChanged("mouseIn",!0);break;case"mouseleave":this.stateChanged("mouseIn",!1);break;case"focusin":this.stateChanged("focusIn",!0);break;case"focusout":this.stateChanged("focusIn",!1)}})).remove,this._removePointerEvents=U(t,(t=>{if("down"==t.action)return this.stateChanged("mouseDown",!0),"track";"up"==t.action&&this.stateChanged("mouseDown",!1)})).remove}stateChanged(t,e){this.state[t]=e,this.onChanged.invoke(t)}removeListeners(){var t,e;null===(t=this._removeEvents)||void 0===t||t.call(this),null===(e=this._removePointerEvents)||void 0===e||e.call(this),this._removePointerEvents=this._removeEvents=null}},t.JsxNode=L,t.Lazy=class{constructor(t){this._func=t,this._value=void 0}get computed(){return!this._func}get rawValue(){return this._value}get value(){return this._func&&(this._value=this._func(),this._func=void 0),this._value}},t.Ref=v,t.Semaphore=class{constructor(t){this.queue=new Array,this.maxCount=1,this.runningCount=0,l(this,t)}enter(){if(this.runningCount===this.maxCount){var t,e=new Promise((e=>{t=e}));return this.queue.push(t),e}return this.runningCount++,Promise.resolve()}exit(){this.runningCount===this.maxCount&&this.queue.length?window.queueMicrotask?window.queueMicrotask(this.queue.shift()):setTimeout(this.queue.shift(),0):this.runningCount--}run(t){return e(this,void 0,void 0,(function*(){yield this.enter();try{yield t()}finally{this.exit()}}))}},t.TextCompositionWatcher=class{get isCompositing(){return this._isCompositing}set isCompositing(t){this._isCompositing=t,this.onCompositingChanged.invoke()}constructor(t){this.onCompositingChanged=new f,this._isCompositing=!1,this.dom=g(t),this.dom.addEventListener("compositionstart",(t=>{this.isCompositing=!0})),this.dom.addEventListener("compositionend",(t=>{this.isCompositing=!1}))}},t.Timer=class{constructor(t){this.callback=t,this.cancelFunc=void 0}timeout(t){this.tryCancel();var e=setTimeout(this.callback,t);this.cancelFunc=()=>window.clearTimeout(e)}interval(t){this.tryCancel();var e=setInterval(this.callback,t);this.cancelFunc=()=>window.clearInterval(e)}animationFrame(){this.tryCancel();var t=requestAnimationFrame(this.callback);this.cancelFunc=()=>cancelAnimationFrame(t)}tryCancel(){this.cancelFunc&&(this.cancelFunc(),this.cancelFunc=void 0)}},t.View=m,t.addChild=_,t.appendView=w,t.arrayFind=h,t.arrayForeach=c,t.arrayInsert=function(t,e,n){void 0===n?t.push(e):t.splice(n,0,e)},t.arrayMap=a,t.arrayRemove=r,t.arraySum=function(t,e){var n=0;return c(t,(t=>{var i=e(t);i&&(n+=i)})),n},t.base64EncodeUtf8=function(t){return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode("0x"+e)})))},t.buildDOM=I,t.buildView=A,t.clearChildren=F,t.createArrayBuilder=q,t.createName=function(t,e){for(let n=0;;n++){let i=t(n);if(!e(i))return i}},t.createStringBuilder=R,t.fadeout=function(t,e){const{className:n="fading-out",duration:i=500,remove:o=!0}=e||{};t.classList.add(n);var s=null,r=(e=!0)=>{r&&(r=null,t.removeEventListener("transitionend",a),t.classList.remove(n),o&&e&&t.remove(),e&&(null==s||s()))},a=function(t){t.eventPhase===Event.AT_TARGET&&(null==r||r())};return t.addEventListener("transitionend",a),setTimeout(r,i),{get finished(){return!r},onFinished(t){return r?s=t:t(),this},cancel(t=!1){null==r||r(t)}}},t.foreachFlaten=d,t.formatDateTime=function(t){var e=new Date;return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()?t.toLocaleTimeString():t.toLocaleString()},t.formatDuration=function(t){if("number"!=typeof t||isNaN(t))return"--:--";t=Math.round(t);var e=Math.floor(t/60);return t%=60,o(e.toString(),2,"0")+":"+o(t.toString(),2,"0")},t.formatFileSize=function(t){if("number"!=typeof t||isNaN(t))return"NaN";for(var e=0;e=1024;)e++,t/=1024;return(e>0?t.toFixed(2):t)+" "+s[e]},t.getDOM=g,t.i18n=$,t.injectCss=function(t,e){var n,i;(null!==(n=null==e?void 0:e.parent)&&void 0!==n?n:document.head).appendChild(I({tag:null!==(i=null==e?void 0:e.tag)&&void 0!==i?i:"style",text:t}))},t.jsx=N,t.jsxBuild=function(t,e){return O(t,64,e||new E)},t.jsxFactory=T,t.listenEvent=function(t,e,n){return t.addEventListener(e,n),{remove:()=>t.removeEventListener(e,n)}},t.listenEvents=j,t.listenPointerEvents=U,t.mod=function(t,e){return t<0&&(t=e+t),t%e},t.mountView=function(e,n){n.mountStateChanged(t.MountState.Mounting),e.appendChild(n.dom),n.mountStateChanged(t.MountState.Mounted)},t.numLimit=function(t,e,n){return tn?n:t},t.objectApply=u,t.objectInit=l,t.readBlobAsDataUrl=function(t){return new Promise(((e,n)=>{var i=new FileReader;i.onload=t=>{e(i.result)},i.onerror=t=>n(),i.readAsDataURL(t)}))},t.replaceChild=function(t,e){F(t),e&&t.appendChild(e)},t.sleepAsync=function(t){return new Promise((e=>{setTimeout(e,t)}))},t.startBlockingDetect=function(t=20){var e=Date.now(),n=Date.now();setInterval((()=>{var i=Date.now();i-n>=t&&console.info(`[Blocking] ${(i-e)/1e3}s: blocked for ${i-n} ms`),n=i}),1)},t.strPadLeft=o,t.toggleClass=P,t.tryGetDOM=p,t.unmountView=function(e,n){n.dom.remove(),n.mountStateChanged(t.MountState.Unmounted)},t.version="1.10.3",Object.defineProperty(t,"__esModule",{value:!0})})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).webfx={})}(this,(function(t){"use strict";var e=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,s){function r(t){try{c(i.next(t))}catch(t){s(t)}}function a(t){try{c(i.throw(t))}catch(t){s(t)}}function c(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}c((i=i.apply(t,e||[])).next())}))};const n=Object.assign,i=Object.prototype.hasOwnProperty;function o(t,e,n=" "){for(;t.length=0)){const i=e[n];t[n]=i}}return t}function l(t,e,n){if(e)for(const o in e)if(i.call(e,o)&&(!n||n.indexOf(o)>=0)){const n=e[o];o.startsWith("on")&&t[o]instanceof f?t[o].add(n):t[o]=n}return t}Array.prototype.remove=function(t){r(this,t)};const f=class{constructor(){this._cbs=void 0,this._cbs_invoking=void 0,this._hook=void 0,this._invoking=!1}get onChanged(){var t;return null!==(t=this._hook)&&void 0!==t||(this._hook=new f),this._hook}get length(){return this._cbs?this._cbs.size:0}invoke(...t){var e;if(this._cbs){if(this._invoking)throw new Error("Cannot invoke callbacks during invocation");if(this._invoking=!0,this._cbs.forEach((e=>{try{e.apply(this,t)}catch(t){console.error("Error in callback",t)}})),this._cbs_invoking)for(const t of this._cbs_invoking)this._cbs.add(t);null===(e=this._cbs_invoking)||void 0===e||e.clear(),this._invoking=!1}}add(t){var e,n;return void 0===this._cbs&&(this._cbs=new Set),this._invoking?(null!==(e=this._cbs_invoking)&&void 0!==e||(this._cbs_invoking=new Set),this._cbs_invoking.add(t)):this._cbs.add(t),null===(n=this._hook)||void 0===n||n.invoke(!0,t),t}remove(t){var e,n;void 0!==this._cbs&&(this._invoking&&(null===(e=this._cbs_invoking)||void 0===e||e.delete(t)),this._cbs.delete(t),null===(n=this._hook)||void 0===n||n.invoke(!1,t))}waitOnce(t){if(0===arguments.length)return new Promise(((t,e)=>{const n=(...e)=>{this.remove(n),t(e)};this.add(n)}));if(!t)throw new Error("Invalid callback");{const e=(...n)=>(this.remove(e),t(...n));this.add(e)}}};let v=null;class m{constructor(t){this._value=void 0,this._onChanged=void 0,this._value=t}get onChanged(){return this._onChanged||(this._onChanged=new f),this._onChanged}get value(){return v&&v.add(this),this._value}set value(t){this._value=t,this._onChanged&&this.onChanged.invoke(this)}static from(t){const e=new m;return e._value=t,e}static computed(t){const e=new m;let n=null;const i=()=>{if(n)for(const t of n)t.onChanged.remove(i);v=new Set;const o=t();n=function(){const t=v;return v=null,t}();for(const t of n)t.onChanged.add(i);e.value=o};return i(),e}}class p{constructor(e){this.parentView=void 0,this._position=void 0,this._domctx=new V,this._dom=void 0,this._baseView=void 0,this._mountState=t.MountState.Unmounted,this._onActive=void 0,this._childViews=void 0,this._domctx.view=this,e&&this.domExprCreated(e)}static getView(t){return t instanceof p?t:new p(t)}get position(){return this._position}get dom(){return this.ensureDom(),this._dom}get domCreated(){return!!this._dom}get baseView(){return this._baseView}get mountState(){return this._mountState}get hidden(){return this.dom.hidden}set hidden(t){this.dom.hidden=t}ensureDom(){if(!this._dom){var t=this.createDom();this.domExprCreated(t)}}domExprCreated(t){var e=L(t,this._domctx);e instanceof p?(this._baseView=e,this._dom=e.dom):this._dom=e,this.postCreateDom(),this.updateDom()}createDom(){return document.createElement("div")}postCreateDom(){p.debugging&&this.dom.dataset&&(this.dom.dataset.webfx=t.MountState[this._mountState])}updateDom(){this._domctx.update()}mountStateChanged(e){if(e!=this._mountState){if(this._mountState=e,p.debugging&&!this._baseView&&this.domCreated&&this.dom.dataset&&(this.dom.dataset.webfx==t.MountState[e]&&console.trace("mountState on the DOM is changed by other view",e,this),this.dom.dataset.webfx=t.MountState[e]),this._baseView)this._baseView.mountStateChanged(e);else if(this._childViews)for(const t of this._childViews)t.mountStateChanged(e)}else console.trace("mountState unchanged",e,this)}getDomById(t){var e,n;return this.ensureDom(),null!==(n=null===(e=this._domctx.dict)||void 0===e?void 0:e[t])&&void 0!==n?n:null}updateWith(t){u(this,t),this.updateDom()}updateAllWith(t){u(this,t),this.updateAll()}toggleClass(t,e){U(this.dom,t,e)}getDOM(){return this.dom}addChild(t){const e=L(t,this._domctx);e instanceof p?this.appendView(e):this.dom.appendChild(e)}get onActive(){return this._onActive||(this._onActive=new f,this.dom.addEventListener("click",(t=>{this._onActive.invoke(t)})),this.dom.addEventListener("keydown",(t=>{this.handleKeyDown(t)}))),this._onActive}handleKeyDown(t){var e;if("Enter"===t.code){const n=this.dom.getBoundingClientRect();null===(e=this._onActive)||void 0===e||e.invoke(new MouseEvent("click",{clientX:n.x,clientY:n.y,relatedTarget:this.dom})),t.preventDefault()}}get childViews(){return this._baseView?this._baseView.childViews:(this._childViews||(this._childViews=[]),this._childViews)}appendView(t){this.addView(t)}addView(e,n){this._registerChild(e,n,!1),this._mountState==t.MountState.Mounted&&e.mountStateChanged(t.MountState.Mounting),this._insertToDom(e,n),this._mountState!=t.MountState.Unmounted&&e.mountStateChanged(this._mountState)}_registerChild(e,n,i=!0){const o=this.childViews;if(e.parentView)throw new Error("the view is already in a container view");if(e.parentView=this,void 0===n)e._position=o.length,o.push(e);else{o.splice(n,0,e);for(let t=n;t{n.addChild(T(t,e,n._domctx))}:i=>{var o;const s=T(i,e,t);s instanceof p?(n.appendChild(s.dom),null===(o=null==t?void 0:t.view)||void 0===o||o._registerChild(s)):C(n,s)}),n}addChild(t){null==this.child&&(this.child=[]),this.child.push(t)}}function T(t,e,n){if(e--<0)throw new Error("ran out of TTL");if(t instanceof p)return t;var i=D(t,n);if(i)return i;if(t instanceof O)return t.buildView(n,e);throw console.error("Unknown node type",t),new Error("Unknown node type")}function N(t,e,...n){if("string"==typeof t)return new O(t,e,n);{const i=(null==e?void 0:e.args)?new t(...e.args):new t;return new O(i,e,n)}}const F=N;function P(t){for(;t.lastChild;)t.removeChild(t.lastChild)}function U(t,e,n){var i=t.classList;return i.toggle?i.toggle(e,n):(void 0===n&&(n=!i.contains(e)),n?i.add(e):i.remove(e),n)}function j(t,e,n){var i=!1,o=function(t){if("track"===e({type:"mouse",ev:t,point:t,action:"down"})){var n=function(t){e({type:"mouse",ev:t,point:t,action:"move"})},i=function(t){document.removeEventListener("mousemove",n,!0),document.removeEventListener("mouseup",i,!0),e({type:"mouse",ev:t,point:t,action:"up"})};document.addEventListener("mousemove",n,!0),document.addEventListener("mouseup",i,!0)}},s=function(o){var s=o.changedTouches[0],r=e({type:"touch",touch:"start",ev:o,point:s,action:i?"move":"down"});if(!i&&"track"===r){i=!0;var a=function(t){var n=t.changedTouches[0];e({type:"touch",touch:"move",ev:t,point:n,action:"move"})},c=function(n){0===n.touches.length&&(i=!1,t.removeEventListener("touchmove",a),t.removeEventListener("touchend",c),t.removeEventListener("touchcancel",c));var o=n.changedTouches[0];e({type:"touch",touch:"end",ev:n,point:o,action:i?"move":"up"})};t.addEventListener("touchmove",a,n),t.addEventListener("touchend",c,n),t.addEventListener("touchcancel",c,n)}};return t.addEventListener("mousedown",o,n),t.addEventListener("touchstart",s,n),{remove:()=>{t.removeEventListener("mousedown",o,n),t.removeEventListener("touchstart",s,n)}}}function B(t,e,n){return e.forEach((e=>t.addEventListener(e,n))),{remove:()=>e.forEach((e=>t.removeEventListener(e,n)))}}class R{constructor(){this.data={},this.curLang="en",this.missing=new Map}get(t,e){return this.get2(t,e)||t}get2(t,e,n){n=n||this.curLang;var i=this.data[n];if(!i)return console.log("i18n missing lang: "+n),null;var o=i[t];if(!o)return this.missing.has(t)||(this.missing.set(t,1),console.log("i18n missing key: "+t)),null;if(e)for(const t in e)if(e.hasOwnProperty(t)){const n=e[t];o=o.replace("{"+t+"}",n)}return o}add2dArray(t){const e=[],n=t[0];for(const t of n)e.push(this.data[t]=this.data[t]||{});for(let n=1;n{for(const n of t.childNodes)if(n.nodeType===Node.TEXT_NODE){var e=this.get2(n.beforeI18n||n.textContent);e?(n.beforeI18n=n.beforeI18n||n.textContent,n.textContent=e):(n.beforeI18n&&(n.textContent=n.beforeI18n),console.log("missing key for node",n))}}))}static detectLanguage(t){var e=null,n=-1,i=[];return(navigator.languages||[navigator.language]).forEach((t=>{i.push(t),t.indexOf("-")>0&&i.push(t.substr(0,t.indexOf("-")))})),t.forEach((t=>{var o=i.indexOf(t);(!e||-1!==o&&o"number"==typeof t?o[t]:t))}}var W=new R;const z=q(W);t.AutoResetEvent=class{constructor(){this._whenNotify=null,this._callback=null}wait(){return this._whenNotify||(this._whenNotify=new Promise((t=>{this._callback=()=>{this._callback=this._whenNotify=null,t()}}))),this._whenNotify}set(){this._callback&&this._callback()}},t.BuildDOMCtx=V,t.Callbacks=f,t.CancelToken=class{constructor(){this.cancelled=!1,this.onCancelled=new f}cancel(){this.cancelled||(this.cancelled=!0,this.onCancelled.invoke())}throwIfCancelled(){if(this.cancelled)throw new Error("operation cancelled.")}},t.ContainerView=y,t.DataUpdatingHelper=class{update(t){const e=this.items;var n={};for(const e of t)n[this.dataSelectId(e)]=e;var i={},o=[];for(const t of e){const e=this.selectId(t);void 0!==n[e]?i[e]=t:o.push(t)}for(let t=o.length-1;t>=0;t--)this.removeItem(o[t]);var s=0;for(const e of t){const t=i[this.dataSelectId(e)];void 0!==t?this.updateItem(t,e):this.addItem(e,s),s++}}updateOrRebuildAll(t){this.update(t),this.isSame(t)||this.rebuildAll(t)}isSame(t){var e=this.items[Symbol.iterator]();for(const i of t){var n=e.next();if(n.done)return!1;if(this.selectId(n.value)!==this.dataSelectId(i))return!1}return!!e.next().done}rebuildAll(t){var e=this.items;if(e instanceof Array)for(let t=e.length-1;t>=0;t--)this.removeItem(e[t]);else for(const t of e)this.removeItem(t);let n=0;for(const e of t)this.addItem(e,n++)}selectId(t){return t.id}dataSelectId(t){return t.id}addItem(t,e){}updateItem(t,e){}removeItem(t){}},t.EventRegistrations=class{constructor(){this.list=[]}add(t,e){return this.list.push({event:t,func:e}),t.add(e),e}removeAll(){for(;this.list.length;){var t=this.list.pop();t.event.remove(t.func)}}},t.I=z,t.I18n=R,t.InputStateTracker=class{constructor(t){this.dom=t,this.state={mouseDown:!1,mouseIn:!1,focusIn:!1},this._removeEvents=null,this._removePointerEvents=null,this.onChanged=new f,this._removeEvents=B(t,["mouseenter","mouseleave","focusin","focusout"],(t=>{switch(t.type){case"mouseenter":this.stateChanged("mouseIn",!0);break;case"mouseleave":this.stateChanged("mouseIn",!1);break;case"focusin":this.stateChanged("focusIn",!0);break;case"focusout":this.stateChanged("focusIn",!1)}})).remove,this._removePointerEvents=j(t,(t=>{if("down"==t.action)return this.stateChanged("mouseDown",!0),"track";"up"==t.action&&this.stateChanged("mouseDown",!1)})).remove}stateChanged(t,e){this.state[t]=e,this.onChanged.invoke(t)}removeListeners(){var t,e;null===(t=this._removeEvents)||void 0===t||t.call(this),null===(e=this._removePointerEvents)||void 0===e||e.call(this),this._removePointerEvents=this._removeEvents=null}},t.JsxNode=O,t.Lazy=class{constructor(t){this._func=t,this._value=void 0}get computed(){return!this._func}get rawValue(){return this._value}get value(){return this._func&&(this._value=this._func(),this._func=void 0),this._value}},t.Ref=m,t.Semaphore=class{constructor(t){this.queue=new Array,this.maxCount=1,this.runningCount=0,l(this,t)}enter(){if(this.runningCount===this.maxCount){var t,e=new Promise((e=>{t=e}));return this.queue.push(t),e}return this.runningCount++,Promise.resolve()}exit(){this.runningCount===this.maxCount&&this.queue.length?window.queueMicrotask?window.queueMicrotask(this.queue.shift()):setTimeout(this.queue.shift(),0):this.runningCount--}run(t){return e(this,void 0,void 0,(function*(){yield this.enter();try{yield t()}finally{this.exit()}}))}},t.TextCompositionWatcher=class{get isCompositing(){return this._isCompositing}set isCompositing(t){this._isCompositing=t,this.onCompositingChanged.invoke()}constructor(t){this.onCompositingChanged=new f,this._isCompositing=!1,this.dom=w(t),this.dom.addEventListener("compositionstart",(t=>{this.isCompositing=!0})),this.dom.addEventListener("compositionend",(t=>{this.isCompositing=!1}))}},t.Timer=class{constructor(t){this.callback=t,this.cancelFunc=void 0}timeout(t){this.tryCancel();var e=setTimeout(this.callback,t);this.cancelFunc=()=>window.clearTimeout(e)}interval(t){this.tryCancel();var e=setInterval(this.callback,t);this.cancelFunc=()=>window.clearInterval(e)}animationFrame(){this.tryCancel();var t=requestAnimationFrame(this.callback);this.cancelFunc=()=>cancelAnimationFrame(t)}tryCancel(){this.cancelFunc&&(this.cancelFunc(),this.cancelFunc=void 0)}},t.View=p,t.addChild=C,t.appendView=_,t.arrayFind=h,t.arrayForeach=c,t.arrayInsert=function(t,e,n){void 0===n?t.push(e):t.splice(n,0,e)},t.arrayMap=a,t.arrayRemove=r,t.arraySum=function(t,e){var n=0;return c(t,(t=>{var i=e(t);i&&(n+=i)})),n},t.base64EncodeUtf8=function(t){return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode("0x"+e)})))},t.buildDOM=A,t.buildView=L,t.clearChildren=P,t.createArrayBuilder=$,t.createName=function(t,e){for(let n=0;;n++){let i=t(n);if(!e(i))return i}},t.createStringBuilder=q,t.fadeout=function(t,e){const{className:n="fading-out",duration:i=500,remove:o=!0}=e||{};t.classList.add(n);var s=null,r=(e=!0)=>{r&&(r=null,t.removeEventListener("transitionend",a),t.classList.remove(n),o&&e&&t.remove(),e&&(null==s||s()))},a=function(t){t.eventPhase===Event.AT_TARGET&&(null==r||r())};return t.addEventListener("transitionend",a),setTimeout(r,i),{get finished(){return!r},onFinished(t){return r?s=t:t(),this},cancel(t=!1){null==r||r(t)}}},t.foreachFlaten=d,t.formatDateTime=function(t){var e=new Date;return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()?t.toLocaleTimeString():t.toLocaleString()},t.formatDuration=function(t){if("number"!=typeof t||isNaN(t))return"--:--";t=Math.round(t);var e=Math.floor(t/60);return t%=60,o(e.toString(),2,"0")+":"+o(t.toString(),2,"0")},t.formatFileSize=function(t){if("number"!=typeof t||isNaN(t))return"NaN";for(var e=0;e=1024;)e++,t/=1024;return(e>0?t.toFixed(2):t)+" "+s[e]},t.getDOM=w,t.i18n=W,t.injectCss=function(t,e){var n,i;(null!==(n=null==e?void 0:e.parent)&&void 0!==n?n:document.head).appendChild(A({tag:null!==(i=null==e?void 0:e.tag)&&void 0!==i?i:"style",text:t}))},t.jsx=F,t.jsxBuild=function(t,e){return T(t,64,e||new V)},t.jsxFactory=N,t.listenEvent=function(t,e,n){return t.addEventListener(e,n),{remove:()=>t.removeEventListener(e,n)}},t.listenEvents=B,t.listenPointerEvents=j,t.mod=function(t,e){return t<0&&(t=e+t),t%e},t.mountView=function(e,n){n.mountStateChanged(t.MountState.Mounting),e.appendChild(n.dom),n.mountStateChanged(t.MountState.Mounted)},t.numLimit=function(t,e,n){return tn?n:t},t.objectApply=u,t.objectInit=l,t.readBlobAsDataUrl=function(t){return new Promise(((e,n)=>{var i=new FileReader;i.onload=t=>{e(i.result)},i.onerror=t=>n(),i.readAsDataURL(t)}))},t.replaceChild=function(t,e){P(t),e&&t.appendChild(e)},t.sleepAsync=function(t){return new Promise((e=>{setTimeout(e,t)}))},t.startBlockingDetect=function(t=20){var e=Date.now(),n=Date.now();setInterval((()=>{var i=Date.now();i-n>=t&&console.info(`[Blocking] ${(i-e)/1e3}s: blocked for ${i-n} ms`),n=i}),1)},t.strPadLeft=o,t.toggleClass=U,t.tryGetDOM=g,t.unmountView=function(e,n){n.dom.remove(),n.mountStateChanged(t.MountState.Unmounted)},t.version="1.10.4",Object.defineProperty(t,"__esModule",{value:!0})})); //# sourceMappingURL=webfxcore.min.js.map diff --git a/dist/webfxcore.min.js.map b/dist/webfxcore.min.js.map index 7b71386..af31944 100644 --- a/dist/webfxcore.min.js.map +++ b/dist/webfxcore.min.js.map @@ -1 +1 @@ -{"version":3,"file":"webfxcore.min.js","sources":["https://github.com/lideming/webfx/raw/v1.10.3/packages/utils/src/utils.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/view.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/buildDOM.ts","https://github.com/lideming/webfx/raw/v1.10.3/src/lib/viewUtils.ts","https://github.com/lideming/webfx/raw/v1.10.3/packages/i18n/src/i18n.ts","https://github.com/lideming/webfx/raw/v1.10.3/version"],"sourcesContent":["// file: utils.ts\n\nconst _object_assign = Object.assign;\nconst _object_hasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Time & formatting utils:\n\nexport function strPadLeft(str: string, len: number, ch: string = ' ') {\n while (str.length < len) {\n str = ch + str;\n }\n return str;\n}\n\nexport function formatDuration(sec: number | any) {\n if (typeof sec !== 'number' || isNaN(sec)) return '--:--';\n sec = Math.round(sec);\n var min = Math.floor(sec / 60);\n sec %= 60;\n return strPadLeft(min.toString(), 2, '0') + ':' + strPadLeft(sec.toString(), 2, '0');\n}\n\nconst fileSizeUnits = ['B', 'KB', 'MB', 'GB', 'TB'];\nexport function formatFileSize(size: number | any) {\n if (typeof size !== \"number\" || isNaN(size)) return 'NaN';\n var unit = 0;\n while (unit < fileSizeUnits.length - 1 && size >= 1024) {\n unit++;\n size /= 1024;\n }\n return (unit > 0 ? size.toFixed(2) : size) + ' ' + fileSizeUnits[unit];\n}\n\nexport function formatDateTime(date: Date) {\n var now = new Date();\n var sameday = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n return sameday ? date.toLocaleTimeString() : date.toLocaleString();\n}\n\nexport function numLimit(num: number, min: number, max: number) {\n return (num < min || typeof num != 'number' || isNaN(num)) ? min :\n (num > max) ? max : num;\n}\n\nexport function createName(nameFunc: (num: number) => string, existsFunc: (str: string) => boolean) {\n for (let num = 0; ; num++) {\n let str = nameFunc(num);\n if (!existsFunc(str)) return str;\n }\n}\n\n/** \n * btoa, but supports Unicode and uses UTF-8 encoding.\n * @see https://stackoverflow.com/questions/30106476\n */\nexport function base64EncodeUtf8(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\n function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1) as any);\n }));\n}\n\nexport function sleepAsync(time: number): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport function arrayRemove(array: T[], val: T) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === val) {\n array.splice(i, 1);\n i--;\n }\n }\n}\n\nexport function arrayInsert(array: T[], val: T, pos?: number) {\n if (pos === undefined) array.push(val);\n else array.splice(pos, 0, val);\n}\n\nexport function arrayMap(arr: Iterable, func: (item: T, idx: number) => TRet) {\n if (arr instanceof Array) return arr.map(func);\n var idx = 0;\n var ret = new Array((arr as any).length);\n for (var item of arr) {\n ret[idx] = (func(item, idx));\n idx++;\n }\n return ret;\n}\n\nexport function arrayForeach(arr: Iterable, func: (item: T, idx: number) => void) {\n var idx = 0;\n for (var item of arr) {\n func(item, idx++);\n }\n}\n\n\nexport function foreachFlaten(arr: T[], func: Action) {\n for (const it of arr) {\n if (it instanceof Array) {\n foreachFlaten(it as T[], func);\n } else {\n func(it);\n }\n }\n}\n\nexport function arrayFind(arr: Iterable, func: (item: T, idx: number) => any): T | null {\n if (arr instanceof Array) return arr.find(func);\n var idx = 0;\n for (var item of arr) {\n if (func(item, idx++)) return item;\n }\n return null;\n}\n\nexport function arraySum(arr: Iterable, func: (item: T) => number | null | undefined) {\n var sum = 0;\n arrayForeach(arr, (x) => {\n var val = func(x);\n if (val) sum += val;\n });\n return sum;\n}\n\nexport function objectApply(obj: Partial, kv?: Partial, keys?: Array) {\n if (kv) {\n if (!keys) return _object_assign(obj, kv);\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n obj[key] = val;\n }\n }\n }\n return obj;\n}\n\nexport function objectInit(obj: T, kv?: ObjectInit, keys?: Array) {\n if (kv) {\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n if (key.startsWith(\"on\") && obj[key] instanceof Callbacks) {\n (obj[key] as Callbacks).add(val);\n } else {\n obj[key] = val;\n }\n }\n }\n }\n return obj;\n}\n\nexport function mod(a: number, b: number): number {\n if (a < 0) a = b + a;\n return a % b;\n}\n\nexport function readBlobAsDataUrl(blob: Blob) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (ev) => {\n resolve(reader.result as string);\n };\n reader.onerror = (ev) => reject();\n reader.readAsDataURL(blob);\n });\n}\n\nArray.prototype.remove = function (item) {\n arrayRemove(this, item);\n};\n\ndeclare global {\n interface Array {\n /**\n * (Extension method) remove the specified item from array.\n * @param item The item to be removed from array\n */\n remove(item: T): void;\n }\n}\n\nexport type ObjectInit = Partial>;\n\nexport type ConvertObjectWithCallbacks = {\n [P in keyof T]: P extends `on${string}` ? CallbackInit : T[P];\n};\n\nexport type CallbackInit = T extends Callbacks ? T | U : T;\n\n// Some interesting function types:\nexport type AnyFunc = (...args: any) => any;\nexport type Action = (arg: T) => void;\nexport type Func = () => TRet;\nexport type AsyncFunc = Func>;\n\nexport type FuncOrVal = T | Func;\n\nclass CallbacksImpl {\n private _cbs: Set | undefined = undefined;\n private _cbs_invoking: Set | undefined = undefined;\n private _hook?: Callbacks<(adding: boolean, func: T) => void> = undefined;\n private _invoking = false;\n get onChanged() {\n this._hook ??= new Callbacks();\n return this._hook;\n }\n get length() { return this._cbs ? this._cbs.size : 0; }\n invoke(...args: Parameters) {\n if (!this._cbs) return;\n if (this._invoking) throw new Error(\"Cannot invoke callbacks during invocation\");\n this._invoking = true;\n this._cbs.forEach((x: (...args: any) => void) => {\n try {\n x.apply(this, args);\n } catch (error) {\n console.error(\"Error in callback\", error);\n }\n });\n if (this._cbs_invoking) {\n for (const x of this._cbs_invoking) {\n this._cbs.add(x);\n }\n }\n this._cbs_invoking?.clear();\n this._invoking = false;\n }\n add(callback: T) {\n if (this._cbs === undefined) {\n this._cbs = new Set();\n }\n if (this._invoking) {\n this._cbs_invoking ??= new Set();\n this._cbs_invoking.add(callback);\n } else {\n this._cbs.add(callback);\n }\n this._hook?.invoke(true, callback);\n return callback;\n }\n remove(callback: T) {\n if (this._cbs === undefined) return;\n if (this._invoking) {\n this._cbs_invoking?.delete(callback);\n }\n this._cbs.delete(callback);\n this._hook?.invoke(false, callback);\n }\n\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n waitOnce(callback?: T) {\n if (arguments.length === 0) {\n return new Promise>((resolve, reject) => {\n const cb = ((...args) => {\n this.remove(cb);\n resolve(args);\n }) as T;\n this.add(cb);\n });\n } else if (callback) {\n const cb = ((...args) => {\n this.remove(cb);\n return callback(...args);\n }) as T;\n this.add(cb);\n } else {\n throw new Error(\"Invalid callback\");\n }\n }\n}\n\nexport interface Callbacks {\n invoke(...args: Parameters): void;\n add(callback: T): T;\n remove(callback: T): void;\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n readonly length: number;\n readonly onChanged: Callbacks<(adding: boolean, func: T) => void>;\n}\nexport const Callbacks: { new (): Callbacks; } = CallbacksImpl;\n\nexport class Ref {\n private _value: T | undefined = undefined;\n private _onChanged: Callbacks>> | undefined = undefined;\n constructor(value?: T) {\n this._value = value;\n }\n get onChanged() {\n if (!this._onChanged) this._onChanged = new Callbacks();\n return this._onChanged;\n }\n get value() { return this._value; }\n set value(val) {\n this._value = val;\n if (this._onChanged) this.onChanged.invoke(this);\n }\n static from(value: T) {\n const ref = new Ref();\n ref._value = value;\n return ref as (Ref & { value: T });\n }\n}\n\nexport class Lazy {\n private _func?: Func;\n private _value?: T;\n get computed() { return !this._func; }\n get rawValue() { return this._value; }\n get value(): T {\n if (this._func) {\n this._value = this._func();\n this._func = undefined;\n }\n return this._value!;\n }\n constructor(func: Func) {\n this._func = func;\n this._value = undefined;\n }\n}\n\nexport class Semaphore {\n queue = new Array();\n maxCount = 1;\n runningCount = 0;\n constructor(init: ObjectInit) {\n objectInit(this, init);\n }\n enter(): Promise {\n if (this.runningCount === this.maxCount) {\n var resolve: Action;\n var prom = new Promise((res) => { resolve = res; });\n this.queue.push(resolve!);\n return prom;\n } else {\n this.runningCount++;\n return Promise.resolve();\n }\n }\n exit() {\n if (this.runningCount === this.maxCount && this.queue.length) {\n if (window.queueMicrotask) {\n window.queueMicrotask(this.queue.shift() as any);\n } else {\n setTimeout(this.queue.shift()!, 0);\n }\n } else {\n this.runningCount--;\n }\n }\n async run(func: () => Promise) {\n await this.enter();\n try {\n await func();\n } finally {\n this.exit();\n }\n }\n}\n\n/** Just like CancellationToken[Source] on .NET */\nexport class CancelToken {\n cancelled = false;\n onCancelled = new Callbacks();\n cancel() {\n if (this.cancelled) return;\n this.cancelled = true;\n this.onCancelled.invoke();\n }\n throwIfCancelled() {\n if (this.cancelled)\n throw new Error(\"operation cancelled.\");\n }\n}\n\nexport class AutoResetEvent {\n private _whenNotify: Promise | null = null;\n private _callback: Action | null = null;\n\n wait() {\n if (!this._whenNotify) {\n this._whenNotify = new Promise(r => {\n this._callback = () => {\n this._callback = this._whenNotify = null;\n r();\n };\n });\n }\n return this._whenNotify;\n }\n set() {\n this._callback && this._callback();\n }\n}\n\nexport class EventRegistrations {\n list: { event: Callbacks; func: AnyFunc; }[] = [];\n add(event: Callbacks, func: T) {\n this.list.push({ event, func });\n event.add(func);\n return func;\n }\n removeAll() {\n while (this.list.length) {\n var r = this.list.pop()!;\n r.event.remove(r.func);\n }\n }\n}\n","import { Action, Callbacks, objectApply, arrayFind, arrayForeach, arrayMap } from \"@yuuza/utils\";\nimport { buildDOM, BuildDOMCtx, BuildDomExpr, buildView, IDOM, IView, JsxNode, MountState } from \"./buildDOM\";\nimport { toggleClass } from \"./viewUtils\";\n\n\nexport class View implements IView {\n constructor(dom?: BuildDomExpr) {\n this._domctx.view = this;\n if (dom) this.domExprCreated(dom);\n }\n\n static getView(obj: BuildDomExpr) { return obj instanceof View ? obj : new View(obj); }\n\n static debugging = false;\n\n public parentView?: View = undefined;\n public _position?: number = undefined;\n get position() { return this._position; }\n\n private _domctx = new BuildDOMCtx();\n\n protected _dom: T | undefined = undefined;\n public get dom() {\n this.ensureDom();\n return this._dom!;\n }\n public get domCreated() { return !!this._dom; }\n\n private _baseView: View | undefined = undefined;\n public get baseView() { return this._baseView; }\n\n private _mountState: MountState = MountState.Unmounted;\n public get mountState() { return this._mountState; }\n\n public get hidden() { return this.dom.hidden; }\n public set hidden(val: boolean) { this.dom.hidden = val; }\n\n public ensureDom() {\n if (!this._dom) {\n var r = this.createDom();\n this.domExprCreated(r);\n }\n }\n\n private domExprCreated(r: BuildDomExpr) {\n var view = buildView(r, this._domctx);\n if (view instanceof View) {\n this._baseView = view;\n this._dom = view.dom as T;\n } else {\n this._dom = view as T;\n }\n this.postCreateDom();\n this.updateDom();\n }\n\n protected createDom(): BuildDomExpr {\n return document.createElement('div');\n }\n\n /** Will be called when the dom is created */\n protected postCreateDom() {\n if (View.debugging) {\n if (this.dom.dataset)\n this.dom.dataset['webfx'] = MountState[this._mountState];\n }\n }\n\n /** Will be called when the dom is created, after postCreateDom() */\n public updateDom() {\n this._domctx.update();\n }\n\n /** Will be called when the mounting state is changed */\n public mountStateChanged(state: MountState) {\n if (state == this._mountState) {\n console.trace(\"mountState unchanged\", state, this);\n return;\n }\n this._mountState = state;\n if (View.debugging) {\n if (!this._baseView && this.domCreated && this.dom.dataset) {\n if (this.dom.dataset['webfx'] == MountState[state]) {\n console.trace('mountState on the DOM is changed by other view', state, this);\n }\n this.dom.dataset['webfx'] = MountState[state];\n }\n }\n if (this._baseView) {\n // let the baseView do the rest\n this._baseView.mountStateChanged(state);\n return;\n }\n if (this._childViews) for (const child of this._childViews) {\n child.mountStateChanged(state);\n }\n }\n\n public getDomById(id: string): HTMLElement | null {\n this.ensureDom();\n return this._domctx.dict?.[id] ?? null;\n }\n\n /** Assign key-values and call `updateDom()` */\n updateWith(kv: Partial) {\n objectApply(this, kv);\n this.updateDom();\n }\n updateAllWith(kv: Partial) {\n objectApply(this, kv);\n this.updateAll();\n }\n toggleClass(clsName: string, force?: boolean) {\n toggleClass(this.dom, clsName, force);\n }\n\n // Implements `IDOMInstance`\n // appendView(view: View) { this.dom.appendChild(view.dom); }\n getDOM() { return this.dom; }\n addChild(child: BuildDomExpr) {\n const view = buildView(child, this._domctx);\n if (view instanceof View) {\n this.appendView(view);\n } else {\n this.dom.appendChild(view);\n }\n }\n\n private _onActive: Callbacks> | undefined = undefined;\n get onActive() {\n if (!this._onActive) {\n this._onActive = new Callbacks>();\n this.dom.addEventListener('click', (e: MouseEvent) => {\n this._onActive!.invoke(e);\n });\n this.dom.addEventListener('keydown', (e: KeyboardEvent) => {\n this.handleKeyDown(e);\n });\n }\n return this._onActive;\n }\n\n handleKeyDown(e: KeyboardEvent) {\n if (e.code === 'Enter') {\n const rect = this.dom.getBoundingClientRect();\n this._onActive?.invoke(new MouseEvent('click', {\n clientX: rect.x, clientY: rect.y,\n relatedTarget: this.dom\n }));\n e.preventDefault();\n }\n }\n\n private _childViews: View[] | undefined = undefined;\n get childViews(): View[] {\n // Return the childViews of the baseView if exists\n if (this._baseView) { return this._baseView.childViews; }\n\n // Lazy creating childViews array\n if (!this._childViews) this._childViews = [];\n return this._childViews;\n }\n appendView(view: View) {\n this.addView(view);\n }\n addView(view: View, pos?: number) {\n this._registerChild(view, pos, false);\n if (this._mountState == MountState.Mounted) view.mountStateChanged(MountState.Mounting);\n this._insertToDom(view, pos);\n if (this._mountState != MountState.Unmounted) view.mountStateChanged(this._mountState);\n }\n _registerChild(view: View, pos?: number, changeMountState = true) {\n const items = this.childViews;\n if (view.parentView) throw new Error('the view is already in a container view');\n view.parentView = this;\n if (pos === undefined) {\n view._position = items.length;\n items.push(view);\n } else {\n items.splice(pos, 0, view);\n for (let i = pos; i < items.length; i++) {\n items[i]._position = i;\n }\n }\n if (changeMountState && this._mountState != MountState.Unmounted) {\n view.mountStateChanged(this._mountState);\n }\n }\n removeView(view: View | number) {\n view = this._ensureItem(view);\n this._removeFromDom(view);\n var pos = view._position!;\n view.parentView = view._position = undefined;\n this.childViews.splice(pos, 1);\n for (let i = pos; i < this.childViews.length; i++) {\n this.childViews[i]._position = i;\n }\n if (this._mountState != MountState.Unmounted) {\n view.mountStateChanged(MountState.Unmounted);\n }\n }\n removeAllView() {\n while (this.childViews.length) this.removeView(this.childViews.length - 1);\n }\n removeFromParent() {\n if (this.parentView) this.parentView.removeView(this);\n }\n /** updateDom() then updateChildren() */\n updateAll() {\n this.updateDom();\n if (this.baseView) return this.baseView.updateAll();\n this.updateChildren();\n }\n /** Call updateDom() on the whole tree */\n updateChildren() {\n if (this._childViews) for (const child of this._childViews) {\n child.updateAll();\n }\n }\n protected _insertToDom(item: View, pos?: number) {\n if (pos == undefined) this.dom.appendChild(item.dom);\n else this.dom.insertBefore(item.dom, this.childViews[pos + 1]?.dom || null);\n }\n protected _removeFromDom(item: View) {\n if (item.domCreated) item.dom.remove();\n }\n protected _ensureItem(item: View | number) {\n if (typeof item === 'number') item = this.childViews[item];\n else if (!item) throw new Error('item is null or undefined.');\n else if (item.parentView !== this) throw new Error('the item is not in this listview.');\n return item;\n }\n\n}\n\nexport function tryGetDOM(idom: IDOM | null | undefined) {\n if (!idom) return idom;\n if (idom instanceof View) {\n return idom.getDOM();\n } else if (idom instanceof Node) {\n return idom;\n } else if (idom && \"getDOM\" in idom) {\n return idom.getDOM();\n }\n}\n\nexport function getDOM(idom: IDOM) {\n var dom = tryGetDOM(idom);\n if (!dom) {\n console.error(\"getDOM():\", idom);\n throw new Error(\"getDOM(): unsupported parameter: \" + idom);\n }\n return dom;\n}\n\nexport function appendView(parent: IDOM, childView: View) {\n warnMountingView(parent, childView);\n getDOM(parent).appendChild(childView.dom);\n}\n\nexport function addChild(parent: IDOM, child: BuildDomExpr) {\n // fast path\n if (parent instanceof View) parent.addChild(child);\n else if (parent instanceof Node) {\n warnMountingView(parent, child);\n parent.appendChild(buildDOM(child));\n }\n // slow path\n else if ('addChild' in parent) {\n parent.addChild(child);\n } else {\n console.error(\"addChild():\", { parent, child });\n throw new Error(\"addChild(): unsupported parent\");\n }\n}\n\nfunction warnMountingView(parent: IDOM, child: BuildDomExpr) {\n if (child instanceof View) {\n const data = { parent, child };\n if (parent instanceof Node)\n console.trace(\"Should use `mountView()` to mount a view to DOM.\", data);\n else\n console.trace(\"Should use `View.addChild()` or `View.appendView()` to add a view into another view.\", data);\n }\n}\n\nexport function mountView(parent: Node, view: View) {\n view.mountStateChanged(MountState.Mounting);\n parent.appendChild(view.dom);\n view.mountStateChanged(MountState.Mounted);\n}\n\nexport function unmountView(parent: Node, view: View) {\n view.dom.remove();\n view.mountStateChanged(MountState.Unmounted);\n}\n\ndeclare global {\n interface Node {\n /** @deprecated Use the exported function `getDOM()` instead. */\n getDOM(): this;\n /** @deprecated Use the exported function `appendView()` instead. */\n appendView(view: View);\n /** @deprecated Use the exported function `addChild()` instead. */\n addChild(child: BuildDomExpr): void;\n }\n}\n\n\nNode.prototype.getDOM = function () {\n console.trace(\"webfx: Node.getDOM() is deprecated. Please use the exported function `getDOM()` instead.\");\n return this;\n};\n\nNode.prototype.addChild = function (child) {\n console.trace(\"webfx: Node.addChild() is deprecated. Please use the exported function `addChild()` instead.\");\n addChild(this, child);\n};\n\nNode.prototype.appendView = function (this: Node, view: View) {\n console.trace(\"webfx: Node.appendView() is deprecated. Please use the exported function `appendView()` instead.\");\n appendView(this, view);\n};\n\nexport class ContainerView extends View {\n addView(view: T, pos?: number): void {\n return super.addView(view, pos);\n }\n removeView(view: T | number): void {\n super.removeView(view);\n }\n protected _insertToDom(item: T, pos: number): void {\n super._insertToDom(item, pos);\n }\n protected _removeFromDom(item: T): void {\n super._removeFromDom(item);\n }\n protected _ensureItem(item: T | number): T {\n return super._ensureItem(item) as T;\n }\n\n get items() { return this.childViews as T[]; }\n [Symbol.iterator]() { return (this.childViews as T[])[Symbol.iterator](); }\n get length() { return this.childViews.length; }\n get(idx: number) {\n return this.childViews[idx] as T;\n }\n map(func: (lvi: T) => TRet) { return arrayMap(this, func); }\n find(func: (lvi: T, idx: number) => any) { return arrayFind(this, func); }\n forEach(func: (lvi: T, idx: number) => void) { return arrayForeach(this, func); }\n}\n","import { Action, Callbacks, ConvertObjectWithCallbacks, foreachFlaten, Func, FuncOrVal, Ref } from \"@yuuza/utils\";\nimport { addChild, getDOM, View } from \"./view\";\n\n// BuildDOM types & implementation:\nexport type BuildDomExpr = string | BuildDomNode | HTMLElement | Node | IDOM;\n\nexport type IDOM = Node | View | IView;\n\nexport enum MountState {\n /** The view is unmounted. */\n Unmounted,\n /** The view will be mounted soon. */\n Mounting,\n /** The view is mounted (i.e. the DOM is in the document). */\n Mounted,\n}\n\nexport interface IView {\n getDOM(): HTMLElement;\n addChild(child: BuildDomExpr): void;\n mountStateChanged(state: MountState): void;\n}\n\nexport type BuildDomTag = string;\n\nexport type BuildDomReturn = HTMLElement | Text | Node;\n\nexport interface BuildDomNode {\n tag?: BuildDomTag;\n\n child?: BuildDomExpr[] | BuildDomExpr;\n\n text?: FuncOrVal;\n hidden?: FuncOrVal;\n init?: Action;\n update?: Action;\n\n ref?: Ref;\n\n _id?: string;\n /** @deprecated Use `_id` instead */\n _key?: string;\n\n [key: string]: any;\n}\n\nexport class BuildDOMCtx {\n dict: Record | undefined = undefined;\n actions: DOMUpdateAction[] | undefined = undefined;\n view: View | undefined = undefined;\n\n setDict(key: string, node: HTMLElement) {\n if (!this.dict) this.dict = {};\n this.dict[key] = node;\n }\n addUpdateAction(action: DOMUpdateAction) {\n if (!this.actions) this.actions = [];\n this.actions.push(action);\n }\n update() {\n if (!this.actions) return;\n for (const a of this.actions) {\n a.run();\n }\n }\n}\n\ninterface DOMUpdateAction {\n run(): void;\n}\n\nclass TextAction implements DOMUpdateAction {\n constructor(readonly node: Node, readonly func: Func) { }\n run() {\n this.node.textContent = this.func();\n }\n}\n\nclass HiddenAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Func) { }\n run() {\n this.node.hidden = this.func();\n }\n}\n\nclass UpdateAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Action) { }\n run() {\n this.func(this.node);\n }\n}\n\nvar createElementFromTag = function (tag: BuildDomTag): HTMLElement {\n var reg = /[#\\.^]?[\\w\\-]+/y;\n var match;\n var ele;\n while (match = reg.exec(tag)) {\n var val = match[0];\n var ch = val[0];\n if (ch === '.') {\n ele.classList.add(val.substr(1));\n } else if (ch === '#') {\n ele.id = val.substr(1);\n } else {\n if (ele) throw new Error('unexpected multiple tags');\n ele = document.createElement(val);\n }\n }\n return ele;\n};\n\nfunction tryHandleValues(obj: BuildDomExpr, ctx: BuildDOMCtx | null) {\n if (typeof (obj) === 'string') { return document.createTextNode(obj); }\n if (typeof obj === 'function') {\n const val = (obj as any)();\n if (!val || typeof val !== 'object') {\n const node = document.createTextNode(val);\n ctx?.addUpdateAction(new TextAction(node, obj));\n return node;\n } else {\n throw new Error('Unexpected function return value');\n }\n }\n if (Node && obj instanceof Node) return obj as Node;\n return null;\n}\n\nvar buildDomCore = function (obj: BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null): BuildDomReturn {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n var r = tryHandleValues(obj, ctx);\n if (r) return r;\n if (obj instanceof JsxNode) {\n obj = obj.buildView(ctx, ttl);\n if (!(obj instanceof View)) return obj as Node;\n }\n if (obj instanceof View) {\n ctx?.view?._registerChild(obj);\n return obj.getDOM();\n }\n // if ('getDOM' in (obj as any)) return (obj as any).getDOM();\n const tag = (obj as BuildDomNode).tag;\n if (!tag) throw new Error('no tag');\n var node = createElementFromTag(tag);\n for (var key in obj as any) {\n if (obj.hasOwnProperty(key)) {\n var val = obj[key];\n buildDOMHandleKey(key, val, node, ctx, ttl);\n }\n }\n const init = obj['init'];\n if (init) init(node);\n\n return node;\n};\n\nvar buildDOMHandleKey = function (key: string, val: any, node: HTMLElement, ctx: BuildDOMCtx | null, ttl: number) {\n if (key === 'child') {\n if (val instanceof Array) {\n foreachFlaten(val, function (val) {\n node.appendChild(buildDomCore(val, ttl, ctx));\n });\n } else {\n node.appendChild(buildDomCore(val, ttl, ctx));\n }\n } else if (key === '_id' || key === '_key') {\n ctx!.setDict(val, node);\n } else if (key === 'ref') {\n (val as Ref).value = node;\n } else if (key === 'text') {\n if (typeof val === 'function') {\n ctx!.addUpdateAction(new TextAction(node, val));\n } else {\n node.textContent = val;\n }\n } else if (key === 'class') {\n node.className = val;\n } else if (key === 'style' && typeof val === 'object') {\n for (const styleKey in val) {\n if (Object.prototype.hasOwnProperty.call(val, styleKey)) {\n const styleVal = val[styleKey];\n node.style[styleKey] = styleVal;\n }\n }\n } else if (key === 'hidden' && typeof val === 'function') {\n ctx!.addUpdateAction(new HiddenAction(node, val));\n } else if (key === 'update' && typeof val === 'function') {\n ctx!.addUpdateAction(new UpdateAction(node, val));\n } else if (key === 'init') {\n // no-op\n } else {\n node[key] = val;\n }\n};\n\n/** \n * Build a DOM tree from a JavaScript object.\n * @example\n * buildDOM({\n * tag: 'div.item#firstitem',\n * onclick: () => console.info('clicked'),\n * child: [\n * 'Name: ',\n * { tag: 'span.name', text: name },\n * ],\n * });\n */\nexport function buildDOM(obj: BuildDomExpr, ctx?: BuildDOMCtx): T {\n return buildDomCore(obj, 32, ctx || null) as T;\n};\n\n/** Get a View instance or a DOM Node. View is preferred. */\nexport function buildView(obj: BuildDomExpr, ctx?: BuildDOMCtx): View | Node {\n if (obj instanceof View) {\n return obj;\n } else if (obj instanceof JsxNode) {\n return obj.buildView(ctx as any, 64);\n } else {\n return buildDOM(obj, ctx);\n }\n}\n\nexport class JsxNode {\n tag: T | string;\n attrs: Record | undefined;\n child: any[] | undefined;\n constructor(tag: any, attrs: Record | undefined, childs: any[] | undefined) {\n this.tag = tag;\n this.attrs = attrs;\n this.child = childs;\n }\n getDOM(): HTMLElement {\n return this.buildDom(null, 64) as any;\n }\n buildDom(ctx: BuildDOMCtx | null, ttl: number) {\n return getDOM(this.buildView(ctx, ttl));\n }\n buildView(ctx: BuildDOMCtx | null, ttl: number)\n : T extends IDOM ? T : T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : HTMLElement {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n let view: Node | View;\n if (typeof this.tag === 'string') {\n // tag is an HTML tag\n const dom = document.createElement(this.tag);\n view = dom;\n if (this.attrs) {\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n buildDOMHandleKey(key, val, dom, ctx, ttl);\n }\n }\n const init = this.attrs['init'];\n if (init) init(dom);\n }\n } else {\n // tag is a View\n view = this.tag as View;\n if (this.attrs) {\n let init: Action | null = null;\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n if (key == \"init\") {\n init = val;\n } else if (key == \"ref\") {\n (val as Ref).value = view;\n } else if (key.startsWith(\"on\") && view[key] instanceof Callbacks) {\n (view[key] as Callbacks).add(val);\n } else {\n view[key] = val;\n }\n }\n }\n if (init) init(view);\n }\n }\n if (this.child) {\n if (view instanceof View) {\n foreachFlaten(this.child, it => {\n (view as View).addChild(jsxBuildCore(it, ttl, (view as View)['_domctx']) as any);\n });\n } else {\n foreachFlaten(this.child, it => {\n const c = jsxBuildCore(it, ttl, ctx);\n if (c instanceof View) {\n (view as Node).appendChild(c.dom);\n ctx?.view?._registerChild(c);\n } else {\n addChild(view, c);\n }\n });\n }\n }\n return view as any;\n }\n addChild(child: IDOM): void {\n if (this.child == null) this.child = [];\n this.child.push(child);\n }\n}\n\nfunction jsxBuildCore(node: JsxNode | BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null) {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n if (node instanceof View) return node;\n var r = tryHandleValues(node, ctx);\n if (r) return r;\n if (node instanceof JsxNode) {\n return node.buildView(ctx, ttl);\n } else {\n console.error(\"Unknown node type\", node);\n throw new Error(\"Unknown node type\");\n }\n}\n\nexport function jsxBuild(node: JsxNode, ctx?: BuildDOMCtx): T {\n return jsxBuildCore(node, 64, ctx || new BuildDOMCtx());\n}\n\nexport type JsxTag = JsxDOMTag | JsxCtorTag;\nexport type JsxCtorTag = new (...args) => IDOM;;\nexport type JsxDOMTag = keyof HTMLElementTagNameMap;\n\nexport type JsxTagInstance =\n T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] :\n T extends (new (...args) => infer U) ? U extends IDOM ? U :\n never : never;\n\nexport type JsxAttrs =\n T extends JsxCtorTag ? JsxCtorAttrs :\n T extends JsxDOMTag ? JsxDOMAttrs :\n never;\n\nexport type JsxCtorAttrs> = {\n args?: ConstructorParameters;\n init?: Action;\n} & Partial>;\n\nexport type JsxDOMAttrs = Omit & Partial>;\n\nexport function jsxFactory>(tag: T, attrs: JsxAttrs, ...childs: any)\n : JsxNode {\n if (typeof tag === 'string') {\n return new JsxNode(tag, attrs, childs) as any;\n } else {\n const view = attrs?.args ?\n new (tag as any)(...attrs.args) :\n new (tag as any)();\n return new JsxNode(view, attrs, childs) as any;\n }\n}\n\nexport const jsx = jsxFactory;\n","import { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { buildDOM, IDOM } from \"./buildDOM\";\r\nimport { getDOM } from \"./view\";\r\n\r\n\r\nexport function clearChildren(node: Node) {\r\n while (node.lastChild) node.removeChild(node.lastChild);\r\n}\r\n\r\n/** Remove all children from the node (if needed) and append one (if present) */\r\nexport function replaceChild(node: Node, newChild?: Node) {\r\n clearChildren(node);\r\n if (newChild) node.appendChild(newChild);\r\n}\r\n\r\n/** Add or remove a classname for the element\r\n * @param force - true -> add; false -> remove; undefined -> toggle.\r\n */\r\nexport function toggleClass(element: HTMLElement, clsName: string, force?: boolean) {\r\n var clsList = element.classList;\r\n if (clsList.toggle) return clsList.toggle(clsName, force);\r\n if (force === undefined) force = !clsList.contains(clsName);\r\n if (force) clsList.add(clsName);\r\n else clsList.remove(clsName);\r\n return force;\r\n}\r\n\r\nexport interface FadeOutOptions {\r\n className?: string;\r\n duration?: number;\r\n remove?: boolean;\r\n}\r\n\r\nexport interface FadeoutResult {\r\n readonly finished: boolean;\r\n onFinished(callback: Action): this;\r\n cancel(finish?: boolean): void;\r\n}\r\n\r\n/** Fade out the element and remove it */\r\nexport function fadeout(element: HTMLElement, options?: FadeOutOptions): FadeoutResult {\r\n const { className = 'fading-out', duration = 500, remove = true } = options || {};\r\n element.classList.add(className);\r\n var cb: Action | null = null;\r\n var end: Action | null = (finish = true) => {\r\n if (!end) return; // use a random variable as flag ;)\r\n end = null;\r\n element.removeEventListener('transitionend', onTransitionend);\r\n element.classList.remove(className);\r\n if (remove && finish) {\r\n element.remove();\r\n }\r\n finish && cb?.();\r\n };\r\n var onTransitionend = function (e: TransitionEvent) {\r\n if (e.eventPhase === Event.AT_TARGET) end?.();\r\n };\r\n element.addEventListener('transitionend', onTransitionend);\r\n setTimeout(end, duration); // failsafe\r\n return {\r\n get finished() { return !end; },\r\n onFinished(callback: Action) {\r\n if (!end) callback();\r\n else cb = callback;\r\n return this;\r\n },\r\n cancel(finish = false) {\r\n end?.(finish);\r\n }\r\n };\r\n}\r\n\r\nexport function startBlockingDetect(threshold = 20) {\r\n var begin = Date.now();\r\n var lastRun = Date.now();\r\n setInterval(() => {\r\n var now = Date.now();\r\n if (now - lastRun >= threshold) {\r\n console.info(`[Blocking] ${(now - begin) / 1000}s: blocked for ${now - lastRun} ms`);\r\n }\r\n lastRun = now;\r\n }, 1);\r\n}\r\n\r\nexport class Timer {\r\n callback: () => void;\r\n cancelFunc: (() => void) | undefined;\r\n constructor(callback: () => void) {\r\n this.callback = callback;\r\n this.cancelFunc = undefined;\r\n }\r\n timeout(time: number) {\r\n this.tryCancel();\r\n var handle = setTimeout(this.callback, time);\r\n this.cancelFunc = () => window.clearTimeout(handle);\r\n }\r\n interval(time: number) {\r\n this.tryCancel();\r\n var handle = setInterval(this.callback, time);\r\n this.cancelFunc = () => window.clearInterval(handle);\r\n }\r\n animationFrame() {\r\n this.tryCancel();\r\n var handle = requestAnimationFrame(this.callback);\r\n this.cancelFunc = () => cancelAnimationFrame(handle);\r\n }\r\n tryCancel() {\r\n if (this.cancelFunc) {\r\n this.cancelFunc();\r\n this.cancelFunc = undefined;\r\n }\r\n }\r\n}\r\n\r\nexport type PtrEvent = ({\r\n type: 'mouse';\r\n ev: MouseEvent;\r\n} | {\r\n type: 'touch';\r\n touch: 'start' | 'move' | 'end';\r\n ev: TouchEvent;\r\n}) & {\r\n action: 'down' | 'move' | 'up';\r\n point: MouseEvent | Touch;\r\n};\r\n\r\nexport function listenPointerEvents(element: HTMLElement, callback: (e: PtrEvent) => void | 'track', options?: AddEventListenerOptions) {\r\n var touchDown = false;\r\n var mouseDown = function (e: MouseEvent) {\r\n if (callback({ type: 'mouse', ev: e, point: e, action: 'down' }) === 'track') {\r\n var mousemove = function (e: MouseEvent) {\r\n callback({ type: 'mouse', ev: e, point: e, action: 'move' });\r\n };\r\n var mouseup = function (e: MouseEvent) {\r\n document.removeEventListener('mousemove', mousemove, true);\r\n document.removeEventListener('mouseup', mouseup, true);\r\n callback({ type: 'mouse', ev: e, point: e, action: 'up' });\r\n };\r\n document.addEventListener('mousemove', mousemove, true);\r\n document.addEventListener('mouseup', mouseup, true);\r\n }\r\n };\r\n var touchStart = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n var ret = callback({\r\n type: 'touch', touch: 'start', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'down'\r\n });\r\n if (!touchDown && ret === 'track') {\r\n touchDown = true;\r\n var touchmove = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n callback({ type: 'touch', touch: 'move', ev: e, point: ct, action: 'move' });\r\n };\r\n var touchend = function (e: TouchEvent) {\r\n if (e.touches.length === 0) {\r\n touchDown = false;\r\n element.removeEventListener('touchmove', touchmove);\r\n element.removeEventListener('touchend', touchend);\r\n element.removeEventListener('touchcancel', touchend);\r\n }\r\n var ct = e.changedTouches[0];\r\n callback({\r\n type: 'touch', touch: 'end', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'up'\r\n });\r\n };\r\n element.addEventListener('touchmove', touchmove, options);\r\n element.addEventListener('touchend', touchend, options);\r\n element.addEventListener('touchcancel', touchend, options);\r\n }\r\n };\r\n element.addEventListener('mousedown', mouseDown, options);\r\n element.addEventListener('touchstart', touchStart, options);\r\n return {\r\n remove: () => {\r\n element.removeEventListener('mousedown', mouseDown, options);\r\n element.removeEventListener('touchstart', touchStart, options);\r\n }\r\n };\r\n}\r\n\r\nexport function listenEvent(element: HTMLElement, event: K,\r\n handler: (ev: HTMLElementEventMap[K]) => any) {\r\n element.addEventListener(event, handler);\r\n return {\r\n remove: () => element.removeEventListener(event, handler)\r\n };\r\n}\r\n\r\nexport function listenEvents>(element: HTMLElement, events: K,\r\n handler: (ev: HTMLElementEventMap[K[number]]) => any) {\r\n events.forEach(event => element.addEventListener(event, handler));\r\n return {\r\n remove: () => events.forEach(event => element.removeEventListener(event, handler))\r\n };\r\n}\r\n\r\nexport function injectCss(css: string, options?: { parent?: Node, tag?: string; }) {\r\n const parent = options?.parent ?? document.head;\r\n parent.appendChild(buildDOM({ tag: options?.tag ?? 'style', text: css }));\r\n}\r\n\r\nexport class TextCompositionWatcher {\r\n dom: HTMLElement;\r\n onCompositingChanged = new Callbacks();\r\n private _isCompositing = false;\r\n get isCompositing() { return this._isCompositing; }\r\n set isCompositing(val) {\r\n this._isCompositing = val;\r\n this.onCompositingChanged.invoke();\r\n }\r\n constructor(dom: IDOM) {\r\n this.dom = getDOM(dom) as HTMLElement;\r\n this.dom.addEventListener('compositionstart', (ev) => {\r\n this.isCompositing = true;\r\n });\r\n this.dom.addEventListener('compositionend', (ev) => {\r\n this.isCompositing = false;\r\n });\r\n }\r\n}\r\n\r\nexport class InputStateTracker {\r\n state = {\r\n mouseDown: false,\r\n mouseIn: false,\r\n focusIn: false,\r\n };\r\n private _removeEvents: Action | null = null;\r\n private _removePointerEvents: Action | null = null;\r\n readonly onChanged = new Callbacks>();\r\n constructor(readonly dom: HTMLElement) {\r\n this._removeEvents = listenEvents(dom, ['mouseenter', 'mouseleave', 'focusin', 'focusout'], (e) => {\r\n switch (e.type) {\r\n case 'mouseenter':\r\n this.stateChanged('mouseIn', true);\r\n break;\r\n case 'mouseleave':\r\n this.stateChanged('mouseIn', false);\r\n break;\r\n case 'focusin':\r\n this.stateChanged('focusIn', true);\r\n break;\r\n case 'focusout':\r\n this.stateChanged('focusIn', false);\r\n break;\r\n }\r\n }).remove;\r\n\r\n this._removePointerEvents = listenPointerEvents(dom, (e) => {\r\n if (e.action == 'down') {\r\n this.stateChanged('mouseDown', true);\r\n return 'track';\r\n } else if (e.action == 'up') {\r\n this.stateChanged('mouseDown', false);\r\n }\r\n }).remove;\r\n }\r\n private stateChanged(state: T, val: InputStateTracker['state'][T]) {\r\n this.state[state] = val;\r\n this.onChanged.invoke(state);\r\n }\r\n removeListeners() {\r\n this._removeEvents?.();\r\n this._removePointerEvents?.();\r\n this._removePointerEvents = this._removeEvents = null;\r\n }\r\n}\r\n\r\n\r\nexport interface IId {\r\n id: keyof any;\r\n}\r\n\r\nexport class DataUpdatingHelper {\r\n items: Iterable;\r\n update(newData: Iterable) {\r\n const oldData = this.items;\r\n var dataDict: Record = {};\r\n for (const n of newData) {\r\n dataDict[this.dataSelectId(n)] = n;\r\n }\r\n var itemDict: Record = {};\r\n var removed: T[] = [];\r\n for (const d of oldData) {\r\n const id = this.selectId(d);\r\n if (dataDict[id] !== undefined) {\r\n itemDict[id] = d;\r\n } else {\r\n removed.push(d);\r\n }\r\n }\r\n for (let i = removed.length - 1; i >= 0; i--)\r\n this.removeItem(removed[i]);\r\n var pos = 0;\r\n for (const n of newData) {\r\n const d = itemDict[this.dataSelectId(n)];\r\n if (d !== undefined) {\r\n this.updateItem(d, n);\r\n } else {\r\n this.addItem(n, pos);\r\n }\r\n pos++;\r\n }\r\n }\r\n updateOrRebuildAll(newData: Iterable) {\r\n this.update(newData);\r\n if (!this.isSame(newData)) this.rebuildAll(newData);\r\n }\r\n isSame(newData: Iterable) {\r\n var t = this.items[Symbol.iterator]();\r\n for (const n of newData) {\r\n var d = t.next();\r\n if (d.done) return false;\r\n if (this.selectId(d.value) !== this.dataSelectId(n)) return false;\r\n }\r\n if (!t.next().done) return false;\r\n return true;\r\n }\r\n rebuildAll(newData: Iterable) {\r\n var oldData = this.items;\r\n if (oldData instanceof Array) {\r\n for (let i = oldData.length - 1; i >= 0; i--) {\r\n this.removeItem(oldData[i]);\r\n }\r\n } else {\r\n for (const o of oldData) {\r\n this.removeItem(o);\r\n }\r\n }\r\n let i = 0;\r\n for (const n of newData) {\r\n this.addItem(n, i++);\r\n }\r\n }\r\n protected selectId(obj: T): any { return obj.id; }\r\n protected dataSelectId(obj: TData): any { return obj.id; }\r\n addItem(obj: TData, pos: number) { }\r\n updateItem(old: T, data: TData) { }\r\n removeItem(obj: T) { }\r\n}","// file: I18n.ts\n\nexport interface I18nData {\n [lang: string]: LangObj;\n}\n\nexport type LangObj = Record;\n\n/** Internationalization (aka i18n) helper class */\nexport class I18n {\n data: I18nData = {};\n curLang = 'en';\n missing = new Map();\n /** Get i18n string for `key`, return `key` when not found. */\n get(key, arg?: any[]): string {\n return this.get2(key, arg) || key;\n }\n /** Get i18n string for `key`, return `null` when not found. */\n get2(key, arg?: any[], lang?: string): string | null {\n lang = lang || this.curLang;\n var langObj = this.data[lang];\n if (!langObj) {\n console.log('i18n missing lang: ' + lang);\n return null;\n }\n var r = langObj[key];\n if (!r) {\n if (!this.missing.has(key)) {\n this.missing.set(key, 1);\n console.log('i18n missing key: ' + key);\n }\n return null;\n }\n if (arg) {\n for (const key in arg) {\n if (arg.hasOwnProperty(key)) {\n const val = arg[key];\n r = r.replace('{' + key + '}', val);\n // Note that it only replaces the first occurrence.\n }\n }\n }\n return r;\n }\n /** Fills data with an 2darray */\n add2dArray(array: [...string[][]]) {\n const langObjs: LangObj[] = [];\n const langs = array[0];\n for (const lang of langs) {\n langObjs.push(this.data[lang] = this.data[lang] || {});\n }\n for (let i = 1; i < array.length; i++) {\n const line = array[i];\n const key = line[0];\n for (let j = 0; j < line.length; j++) {\n const val = line[j];\n langObjs[j][key] = val;\n }\n }\n }\n renderElements(elements) {\n console.log('i18n elements rendering');\n elements.forEach(x => {\n for (const node of x.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // console.log('node', node);\n var r = this.get2(node.beforeI18n || node.textContent);\n if (r) {\n node.beforeI18n = node.beforeI18n || node.textContent;\n node.textContent = r;\n }\n else {\n if (node.beforeI18n) {\n node.textContent = node.beforeI18n;\n }\n console.log('missing key for node', node);\n }\n }\n }\n });\n }\n /**\n * Detect the best available language using\n * the user language preferences provided by the browser.\n * @param langs Available languages\n */\n static detectLanguage(langs: string[]) {\n var cur: string | null = null;\n var curIdx = -1;\n var languages: string[] = [];\n // ['en-US'] -> ['en-US', 'en']\n (navigator.languages || [navigator.language]).forEach(lang => {\n languages.push(lang);\n if (lang.indexOf('-') > 0)\n languages.push(lang.substr(0, lang.indexOf('-')));\n });\n langs.forEach((l) => {\n var idx = languages.indexOf(l);\n if (!cur || (idx !== -1 && idx < curIdx)) {\n cur = l;\n curIdx = idx;\n }\n });\n return cur || langs[0];\n }\n}\n\nexport function createStringBuilder(i18n: I18n) {\n var arrBuilder = createArrayBuilder(i18n);\n\n return function (literals: TemplateStringsArray, ...placeholders: any[]) {\n if (placeholders.length === 0) {\n return i18n.get(literals[0]);\n }\n return arrBuilder(literals, ...placeholders).join('');\n }\n}\n\nexport function createArrayBuilder(i18n: I18n) {\n var formatCache = new WeakMap();\n var parseCache = new Map();\n\n return function (literals: TemplateStringsArray, ...placeholders: T): (string | T)[] {\n if (placeholders.length === 0) {\n return [i18n.get(literals[0])];\n }\n\n // Generate format string from template string if it's not cached:\n let format = formatCache.get(literals);\n if (format === undefined) {\n format = '';\n for (let i = 0; i < literals.length; i++) {\n const lit = literals[i];\n format += lit;\n if (i < placeholders.length) {\n format += '{' + i + '}';\n }\n }\n formatCache.set(literals, format);\n }\n\n const translatedFormat = i18n.get(format);\n\n // Also cache parsed template\n let parsed = parseCache.get(translatedFormat);\n if (parsed === undefined) {\n parsed = parseTemplate(translatedFormat);\n }\n\n return parsed.map(x => typeof x == 'number' ? placeholders[x] : x);\n }\n}\n\nfunction parseTemplate(template: string): (string | number)[] {\n const result: (string | number)[] = [];\n let state = 0; // 0: normal / 1: after '{' / 2: after '}' / 3: after '{' and numbers\n let buf = '';\n for (let i = 0; i < template.length; i++) {\n const ch = template[i];\n switch (ch) {\n case '{':\n if (state == 0) state = 1;\n else if (state == 1) { state = 0; buf += '{'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n case '}':\n if (state == 3) { state = 0; result.push(+buf); buf = ''; }\n else if (state == 0) { state = 2; }\n else if (state == 2) { state = 0; buf += '}'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n default:\n if (state == 2) throw new Error(`Expected '}', got '${ch}' at ${i}`);\n else if (state == 1) { state = 3; if (buf) result.push(buf); buf = ''; }\n buf += ch;\n }\n }\n if (state != 0) throw new Error(\"Unexpected end of template string\");\n if (buf) result.push(buf);\n return result;\n}\n\nexport var i18n = new I18n();\n\nexport const I = createStringBuilder(i18n);\n","export const version = \"1.10.3\""],"names":["_object_assign","Object","assign","_object_hasOwnProperty","prototype","hasOwnProperty","strPadLeft","str","len","ch","length","fileSizeUnits","arrayRemove","array","val","i","splice","arrayMap","arr","func","Array","map","idx","ret","item","arrayForeach","foreachFlaten","it","arrayFind","find","objectApply","obj","kv","keys","key","call","indexOf","objectInit","startsWith","Callbacks","add","remove","this","constructor","_cbs","undefined","_cbs_invoking","_hook","_invoking","onChanged","_a","size","invoke","args","Error","forEach","x","apply","error","console","clear","callback","Set","_b","delete","waitOnce","arguments","Promise","resolve","reject","cb","Ref","value","_value","_onChanged","from","ref","View","dom","parentView","_position","_domctx","BuildDOMCtx","_dom","_baseView","_mountState","MountState","Unmounted","_onActive","_childViews","view","domExprCreated","getView","position","ensureDom","domCreated","baseView","mountState","hidden","r","createDom","buildView","postCreateDom","updateDom","document","createElement","debugging","dataset","update","mountStateChanged","state","trace","child","getDomById","id","dict","updateWith","updateAllWith","updateAll","toggleClass","clsName","force","getDOM","addChild","appendView","appendChild","onActive","addEventListener","e","handleKeyDown","code","rect","getBoundingClientRect","MouseEvent","clientX","clientY","y","relatedTarget","preventDefault","childViews","addView","pos","_registerChild","Mounted","Mounting","_insertToDom","changeMountState","items","push","removeView","_ensureItem","_removeFromDom","removeAllView","removeFromParent","updateChildren","insertBefore","tryGetDOM","idom","Node","parent","childView","warnMountingView","buildDOM","data","ContainerView","super","Symbol","iterator","get","exports","actions","setDict","node","addUpdateAction","action","a","run","TextAction","textContent","HiddenAction","UpdateAction","tryHandleValues","ctx","createTextNode","buildDomCore","ttl","JsxNode","tag","match","ele","reg","exec","classList","substr","createElementFromTag","buildDOMHandleKey","init","className","styleKey","styleVal","style","attrs","childs","buildDom","jsxBuildCore","c","jsxFactory","jsx","clearChildren","lastChild","removeChild","element","clsList","toggle","contains","listenPointerEvents","options","touchDown","mouseDown","type","ev","point","mousemove","mouseup","removeEventListener","touchStart","ct","changedTouches","touch","touchmove","touchend","touches","listenEvents","events","handler","event","I18n","curLang","missing","Map","arg","get2","lang","langObj","log","has","set","replace","add2dArray","langObjs","langs","line","j","renderElements","elements","childNodes","nodeType","TEXT_NODE","beforeI18n","detectLanguage","cur","curIdx","languages","navigator","language","l","createStringBuilder","i18n","arrBuilder","createArrayBuilder","literals","placeholders","join","formatCache","WeakMap","parseCache","format","translatedFormat","parsed","template","result","buf","parseTemplate","I","_whenNotify","_callback","wait","cancelled","onCancelled","cancel","throwIfCancelled","newData","oldData","dataDict","n","dataSelectId","itemDict","removed","d","selectId","removeItem","updateItem","addItem","updateOrRebuildAll","isSame","rebuildAll","t","next","done","o","old","list","removeAll","pop","mouseIn","focusIn","_removeEvents","_removePointerEvents","stateChanged","removeListeners","_func","computed","rawValue","queue","maxCount","runningCount","enter","prom","res","exit","window","queueMicrotask","shift","setTimeout","isCompositing","_isCompositing","onCompositingChanged","cancelFunc","timeout","time","tryCancel","handle","clearTimeout","interval","setInterval","clearInterval","animationFrame","requestAnimationFrame","cancelAnimationFrame","sum","btoa","encodeURIComponent","p1","String","fromCharCode","nameFunc","existsFunc","num","duration","end","finish","onTransitionend","eventPhase","Event","AT_TARGET","finished","onFinished","date","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","toLocaleString","sec","isNaN","Math","round","min","floor","toString","unit","toFixed","css","head","text","b","max","blob","reader","FileReader","onload","onerror","readAsDataURL","newChild","threshold","begin","lastRun","info"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"webfxcore.min.js","sources":["https://github.com/lideming/webfx/raw/v1.10.4/packages/utils/src/utils.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/view.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/buildDOM.ts","https://github.com/lideming/webfx/raw/v1.10.4/src/lib/viewUtils.ts","https://github.com/lideming/webfx/raw/v1.10.4/packages/i18n/src/i18n.ts","https://github.com/lideming/webfx/raw/v1.10.4/version"],"sourcesContent":["// file: utils.ts\n\nconst _object_assign = Object.assign;\nconst _object_hasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Time & formatting utils:\n\nexport function strPadLeft(str: string, len: number, ch: string = ' ') {\n while (str.length < len) {\n str = ch + str;\n }\n return str;\n}\n\nexport function formatDuration(sec: number | any) {\n if (typeof sec !== 'number' || isNaN(sec)) return '--:--';\n sec = Math.round(sec);\n var min = Math.floor(sec / 60);\n sec %= 60;\n return strPadLeft(min.toString(), 2, '0') + ':' + strPadLeft(sec.toString(), 2, '0');\n}\n\nconst fileSizeUnits = ['B', 'KB', 'MB', 'GB', 'TB'];\nexport function formatFileSize(size: number | any) {\n if (typeof size !== \"number\" || isNaN(size)) return 'NaN';\n var unit = 0;\n while (unit < fileSizeUnits.length - 1 && size >= 1024) {\n unit++;\n size /= 1024;\n }\n return (unit > 0 ? size.toFixed(2) : size) + ' ' + fileSizeUnits[unit];\n}\n\nexport function formatDateTime(date: Date) {\n var now = new Date();\n var sameday = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n return sameday ? date.toLocaleTimeString() : date.toLocaleString();\n}\n\nexport function numLimit(num: number, min: number, max: number) {\n return (num < min || typeof num != 'number' || isNaN(num)) ? min :\n (num > max) ? max : num;\n}\n\nexport function createName(nameFunc: (num: number) => string, existsFunc: (str: string) => boolean) {\n for (let num = 0; ; num++) {\n let str = nameFunc(num);\n if (!existsFunc(str)) return str;\n }\n}\n\n/** \n * btoa, but supports Unicode and uses UTF-8 encoding.\n * @see https://stackoverflow.com/questions/30106476\n */\nexport function base64EncodeUtf8(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\n function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1) as any);\n }));\n}\n\nexport function sleepAsync(time: number): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nexport function arrayRemove(array: T[], val: T) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === val) {\n array.splice(i, 1);\n i--;\n }\n }\n}\n\nexport function arrayInsert(array: T[], val: T, pos?: number) {\n if (pos === undefined) array.push(val);\n else array.splice(pos, 0, val);\n}\n\nexport function arrayMap(arr: Iterable, func: (item: T, idx: number) => TRet) {\n if (arr instanceof Array) return arr.map(func);\n var idx = 0;\n var ret = new Array((arr as any).length);\n for (var item of arr) {\n ret[idx] = (func(item, idx));\n idx++;\n }\n return ret;\n}\n\nexport function arrayForeach(arr: Iterable, func: (item: T, idx: number) => void) {\n var idx = 0;\n for (var item of arr) {\n func(item, idx++);\n }\n}\n\n\nexport function foreachFlaten(arr: T[], func: Action) {\n for (const it of arr) {\n if (it instanceof Array) {\n foreachFlaten(it as T[], func);\n } else {\n func(it);\n }\n }\n}\n\nexport function arrayFind(arr: Iterable, func: (item: T, idx: number) => any): T | null {\n if (arr instanceof Array) return arr.find(func);\n var idx = 0;\n for (var item of arr) {\n if (func(item, idx++)) return item;\n }\n return null;\n}\n\nexport function arraySum(arr: Iterable, func: (item: T) => number | null | undefined) {\n var sum = 0;\n arrayForeach(arr, (x) => {\n var val = func(x);\n if (val) sum += val;\n });\n return sum;\n}\n\nexport function objectApply(obj: Partial, kv?: Partial, keys?: Array) {\n if (kv) {\n if (!keys) return _object_assign(obj, kv);\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n obj[key] = val;\n }\n }\n }\n return obj;\n}\n\nexport function objectInit(obj: T, kv?: ObjectInit, keys?: Array) {\n if (kv) {\n for (const key in kv as any) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key as any) >= 0)) {\n const val = kv[key];\n if (key.startsWith(\"on\") && obj[key] instanceof Callbacks) {\n (obj[key] as Callbacks).add(val);\n } else {\n obj[key] = val;\n }\n }\n }\n }\n return obj;\n}\n\nexport function mod(a: number, b: number): number {\n if (a < 0) a = b + a;\n return a % b;\n}\n\nexport function readBlobAsDataUrl(blob: Blob) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (ev) => {\n resolve(reader.result as string);\n };\n reader.onerror = (ev) => reject();\n reader.readAsDataURL(blob);\n });\n}\n\nArray.prototype.remove = function (item) {\n arrayRemove(this, item);\n};\n\ndeclare global {\n interface Array {\n /**\n * (Extension method) remove the specified item from array.\n * @param item The item to be removed from array\n */\n remove(item: T): void;\n }\n}\n\nexport type ObjectInit = Partial>;\n\nexport type ConvertObjectWithCallbacks = {\n [P in keyof T]: P extends `on${string}` ? CallbackInit : T[P];\n};\n\nexport type CallbackInit = T extends Callbacks ? T | U : T;\n\n// Some interesting function types:\nexport type AnyFunc = (...args: any) => any;\nexport type Action = (arg: T) => void;\nexport type Func = () => TRet;\nexport type AsyncFunc = Func>;\n\nexport type FuncOrVal = T | Func;\n\nclass CallbacksImpl {\n private _cbs: Set | undefined = undefined;\n private _cbs_invoking: Set | undefined = undefined;\n private _hook?: Callbacks<(adding: boolean, func: T) => void> = undefined;\n private _invoking = false;\n get onChanged() {\n this._hook ??= new Callbacks();\n return this._hook;\n }\n get length() { return this._cbs ? this._cbs.size : 0; }\n invoke(...args: Parameters) {\n if (!this._cbs) return;\n if (this._invoking) throw new Error(\"Cannot invoke callbacks during invocation\");\n this._invoking = true;\n this._cbs.forEach((x: (...args: any) => void) => {\n try {\n x.apply(this, args);\n } catch (error) {\n console.error(\"Error in callback\", error);\n }\n });\n if (this._cbs_invoking) {\n for (const x of this._cbs_invoking) {\n this._cbs.add(x);\n }\n }\n this._cbs_invoking?.clear();\n this._invoking = false;\n }\n add(callback: T) {\n if (this._cbs === undefined) {\n this._cbs = new Set();\n }\n if (this._invoking) {\n this._cbs_invoking ??= new Set();\n this._cbs_invoking.add(callback);\n } else {\n this._cbs.add(callback);\n }\n this._hook?.invoke(true, callback);\n return callback;\n }\n remove(callback: T) {\n if (this._cbs === undefined) return;\n if (this._invoking) {\n this._cbs_invoking?.delete(callback);\n }\n this._cbs.delete(callback);\n this._hook?.invoke(false, callback);\n }\n\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n waitOnce(callback?: T) {\n if (arguments.length === 0) {\n return new Promise>((resolve, reject) => {\n const cb = ((...args) => {\n this.remove(cb);\n resolve(args);\n }) as T;\n this.add(cb);\n });\n } else if (callback) {\n const cb = ((...args) => {\n this.remove(cb);\n return callback(...args);\n }) as T;\n this.add(cb);\n } else {\n throw new Error(\"Invalid callback\");\n }\n }\n}\n\nexport interface Callbacks {\n invoke(...args: Parameters): void;\n add(callback: T): T;\n remove(callback: T): void;\n waitOnce(): Promise>;\n waitOnce(callback: T): void;\n readonly length: number;\n readonly onChanged: Callbacks<(adding: boolean, func: T) => void>;\n}\nexport const Callbacks: { new (): Callbacks; } = CallbacksImpl;\n\nlet accessedRefs: Set> | null = null;\n\nfunction beginRefCollect() {\n accessedRefs = new Set>()\n}\n\nfunction endRefCollect() {\n const result = accessedRefs;\n accessedRefs = null;\n return result!;\n}\n\nexport class Ref {\n private _value: T | undefined = undefined;\n private _onChanged: Callbacks>> | undefined = undefined;\n constructor(value?: T) {\n this._value = value;\n }\n get onChanged() {\n if (!this._onChanged) this._onChanged = new Callbacks();\n return this._onChanged;\n }\n get value() {\n if (accessedRefs) accessedRefs.add(this);\n return this._value;\n }\n set value(val) {\n this._value = val;\n if (this._onChanged) this.onChanged.invoke(this);\n }\n static from(value: T) {\n const ref = new Ref();\n ref._value = value;\n return ref as (Ref & { value: T });\n }\n static computed(func: Func) {\n const ref = new Ref();\n let deps: Set> | null = null;\n const updateValue = () => {\n if (deps) {\n for (const dep of deps) {\n dep.onChanged.remove(updateValue);\n }\n }\n beginRefCollect();\n const value = func();\n deps = endRefCollect();\n for (const dep of deps) {\n dep.onChanged.add(updateValue);\n }\n ref.value = value;\n };\n updateValue();\n return ref;\n }\n}\n\nexport class Lazy {\n private _func?: Func;\n private _value?: T;\n get computed() { return !this._func; }\n get rawValue() { return this._value; }\n get value(): T {\n if (this._func) {\n this._value = this._func();\n this._func = undefined;\n }\n return this._value!;\n }\n constructor(func: Func) {\n this._func = func;\n this._value = undefined;\n }\n}\n\nexport class Semaphore {\n queue = new Array();\n maxCount = 1;\n runningCount = 0;\n constructor(init: ObjectInit) {\n objectInit(this, init);\n }\n enter(): Promise {\n if (this.runningCount === this.maxCount) {\n var resolve: Action;\n var prom = new Promise((res) => { resolve = res; });\n this.queue.push(resolve!);\n return prom;\n } else {\n this.runningCount++;\n return Promise.resolve();\n }\n }\n exit() {\n if (this.runningCount === this.maxCount && this.queue.length) {\n if (window.queueMicrotask) {\n window.queueMicrotask(this.queue.shift() as any);\n } else {\n setTimeout(this.queue.shift()!, 0);\n }\n } else {\n this.runningCount--;\n }\n }\n async run(func: () => Promise) {\n await this.enter();\n try {\n await func();\n } finally {\n this.exit();\n }\n }\n}\n\n/** Just like CancellationToken[Source] on .NET */\nexport class CancelToken {\n cancelled = false;\n onCancelled = new Callbacks();\n cancel() {\n if (this.cancelled) return;\n this.cancelled = true;\n this.onCancelled.invoke();\n }\n throwIfCancelled() {\n if (this.cancelled)\n throw new Error(\"operation cancelled.\");\n }\n}\n\nexport class AutoResetEvent {\n private _whenNotify: Promise | null = null;\n private _callback: Action | null = null;\n\n wait() {\n if (!this._whenNotify) {\n this._whenNotify = new Promise(r => {\n this._callback = () => {\n this._callback = this._whenNotify = null;\n r();\n };\n });\n }\n return this._whenNotify;\n }\n set() {\n this._callback && this._callback();\n }\n}\n\nexport class EventRegistrations {\n list: { event: Callbacks; func: AnyFunc; }[] = [];\n add(event: Callbacks, func: T) {\n this.list.push({ event, func });\n event.add(func);\n return func;\n }\n removeAll() {\n while (this.list.length) {\n var r = this.list.pop()!;\n r.event.remove(r.func);\n }\n }\n}\n","import { Action, Callbacks, objectApply, arrayFind, arrayForeach, arrayMap } from \"@yuuza/utils\";\nimport { buildDOM, BuildDOMCtx, BuildDomExpr, buildView, IDOM, IView, JsxNode, MountState } from \"./buildDOM\";\nimport { toggleClass } from \"./viewUtils\";\n\n\nexport class View implements IView {\n constructor(dom?: BuildDomExpr) {\n this._domctx.view = this;\n if (dom) this.domExprCreated(dom);\n }\n\n static getView(obj: BuildDomExpr) { return obj instanceof View ? obj : new View(obj); }\n\n static debugging = false;\n\n public parentView?: View = undefined;\n public _position?: number = undefined;\n get position() { return this._position; }\n\n private _domctx = new BuildDOMCtx();\n\n protected _dom: T | undefined = undefined;\n public get dom() {\n this.ensureDom();\n return this._dom!;\n }\n public get domCreated() { return !!this._dom; }\n\n private _baseView: View | undefined = undefined;\n public get baseView() { return this._baseView; }\n\n private _mountState: MountState = MountState.Unmounted;\n public get mountState() { return this._mountState; }\n\n public get hidden() { return this.dom.hidden; }\n public set hidden(val: boolean) { this.dom.hidden = val; }\n\n public ensureDom() {\n if (!this._dom) {\n var r = this.createDom();\n this.domExprCreated(r);\n }\n }\n\n private domExprCreated(r: BuildDomExpr) {\n var view = buildView(r, this._domctx);\n if (view instanceof View) {\n this._baseView = view;\n this._dom = view.dom as T;\n } else {\n this._dom = view as T;\n }\n this.postCreateDom();\n this.updateDom();\n }\n\n protected createDom(): BuildDomExpr {\n return document.createElement('div');\n }\n\n /** Will be called when the dom is created */\n protected postCreateDom() {\n if (View.debugging) {\n if (this.dom.dataset)\n this.dom.dataset['webfx'] = MountState[this._mountState];\n }\n }\n\n /** Will be called when the dom is created, after postCreateDom() */\n public updateDom() {\n this._domctx.update();\n }\n\n /** Will be called when the mounting state is changed */\n public mountStateChanged(state: MountState) {\n if (state == this._mountState) {\n console.trace(\"mountState unchanged\", state, this);\n return;\n }\n this._mountState = state;\n if (View.debugging) {\n if (!this._baseView && this.domCreated && this.dom.dataset) {\n if (this.dom.dataset['webfx'] == MountState[state]) {\n console.trace('mountState on the DOM is changed by other view', state, this);\n }\n this.dom.dataset['webfx'] = MountState[state];\n }\n }\n if (this._baseView) {\n // let the baseView do the rest\n this._baseView.mountStateChanged(state);\n return;\n }\n if (this._childViews) for (const child of this._childViews) {\n child.mountStateChanged(state);\n }\n }\n\n public getDomById(id: string): HTMLElement | null {\n this.ensureDom();\n return this._domctx.dict?.[id] ?? null;\n }\n\n /** Assign key-values and call `updateDom()` */\n updateWith(kv: Partial) {\n objectApply(this, kv);\n this.updateDom();\n }\n updateAllWith(kv: Partial) {\n objectApply(this, kv);\n this.updateAll();\n }\n toggleClass(clsName: string, force?: boolean) {\n toggleClass(this.dom, clsName, force);\n }\n\n // Implements `IDOMInstance`\n // appendView(view: View) { this.dom.appendChild(view.dom); }\n getDOM() { return this.dom; }\n addChild(child: BuildDomExpr) {\n const view = buildView(child, this._domctx);\n if (view instanceof View) {\n this.appendView(view);\n } else {\n this.dom.appendChild(view);\n }\n }\n\n private _onActive: Callbacks> | undefined = undefined;\n get onActive() {\n if (!this._onActive) {\n this._onActive = new Callbacks>();\n this.dom.addEventListener('click', (e: MouseEvent) => {\n this._onActive!.invoke(e);\n });\n this.dom.addEventListener('keydown', (e: KeyboardEvent) => {\n this.handleKeyDown(e);\n });\n }\n return this._onActive;\n }\n\n handleKeyDown(e: KeyboardEvent) {\n if (e.code === 'Enter') {\n const rect = this.dom.getBoundingClientRect();\n this._onActive?.invoke(new MouseEvent('click', {\n clientX: rect.x, clientY: rect.y,\n relatedTarget: this.dom\n }));\n e.preventDefault();\n }\n }\n\n private _childViews: View[] | undefined = undefined;\n get childViews(): View[] {\n // Return the childViews of the baseView if exists\n if (this._baseView) { return this._baseView.childViews; }\n\n // Lazy creating childViews array\n if (!this._childViews) this._childViews = [];\n return this._childViews;\n }\n appendView(view: View) {\n this.addView(view);\n }\n addView(view: View, pos?: number) {\n this._registerChild(view, pos, false);\n if (this._mountState == MountState.Mounted) view.mountStateChanged(MountState.Mounting);\n this._insertToDom(view, pos);\n if (this._mountState != MountState.Unmounted) view.mountStateChanged(this._mountState);\n }\n _registerChild(view: View, pos?: number, changeMountState = true) {\n const items = this.childViews;\n if (view.parentView) throw new Error('the view is already in a container view');\n view.parentView = this;\n if (pos === undefined) {\n view._position = items.length;\n items.push(view);\n } else {\n items.splice(pos, 0, view);\n for (let i = pos; i < items.length; i++) {\n items[i]._position = i;\n }\n }\n if (changeMountState && this._mountState != MountState.Unmounted) {\n view.mountStateChanged(this._mountState);\n }\n }\n removeView(view: View | number) {\n view = this._ensureItem(view);\n this._removeFromDom(view);\n var pos = view._position!;\n view.parentView = view._position = undefined;\n this.childViews.splice(pos, 1);\n for (let i = pos; i < this.childViews.length; i++) {\n this.childViews[i]._position = i;\n }\n if (this._mountState != MountState.Unmounted) {\n view.mountStateChanged(MountState.Unmounted);\n }\n }\n removeAllView() {\n while (this.childViews.length) this.removeView(this.childViews.length - 1);\n }\n removeFromParent() {\n if (this.parentView) this.parentView.removeView(this);\n }\n /** updateDom() then updateChildren() */\n updateAll() {\n this.updateDom();\n if (this.baseView) return this.baseView.updateAll();\n this.updateChildren();\n }\n /** Call updateDom() on the whole tree */\n updateChildren() {\n if (this._childViews) for (const child of this._childViews) {\n child.updateAll();\n }\n }\n protected _insertToDom(item: View, pos?: number) {\n if (pos == undefined) this.dom.appendChild(item.dom);\n else this.dom.insertBefore(item.dom, this.childViews[pos + 1]?.dom || null);\n }\n protected _removeFromDom(item: View) {\n if (item.domCreated) item.dom.remove();\n }\n protected _ensureItem(item: View | number) {\n if (typeof item === 'number') item = this.childViews[item];\n else if (!item) throw new Error('item is null or undefined.');\n else if (item.parentView !== this) throw new Error('the item is not in this listview.');\n return item;\n }\n\n}\n\nexport function tryGetDOM(idom: IDOM | null | undefined) {\n if (!idom) return idom;\n if (idom instanceof View) {\n return idom.getDOM();\n } else if (idom instanceof Node) {\n return idom;\n } else if (idom && \"getDOM\" in idom) {\n return idom.getDOM();\n }\n}\n\nexport function getDOM(idom: IDOM) {\n var dom = tryGetDOM(idom);\n if (!dom) {\n console.error(\"getDOM():\", idom);\n throw new Error(\"getDOM(): unsupported parameter: \" + idom);\n }\n return dom;\n}\n\nexport function appendView(parent: IDOM, childView: View) {\n warnMountingView(parent, childView);\n getDOM(parent).appendChild(childView.dom);\n}\n\nexport function addChild(parent: IDOM, child: BuildDomExpr) {\n // fast path\n if (parent instanceof View) parent.addChild(child);\n else if (parent instanceof Node) {\n warnMountingView(parent, child);\n parent.appendChild(buildDOM(child));\n }\n // slow path\n else if ('addChild' in parent) {\n parent.addChild(child);\n } else {\n console.error(\"addChild():\", { parent, child });\n throw new Error(\"addChild(): unsupported parent\");\n }\n}\n\nfunction warnMountingView(parent: IDOM, child: BuildDomExpr) {\n if (child instanceof View) {\n const data = { parent, child };\n if (parent instanceof Node)\n console.trace(\"Should use `mountView()` to mount a view to DOM.\", data);\n else\n console.trace(\"Should use `View.addChild()` or `View.appendView()` to add a view into another view.\", data);\n }\n}\n\nexport function mountView(parent: Node, view: View) {\n view.mountStateChanged(MountState.Mounting);\n parent.appendChild(view.dom);\n view.mountStateChanged(MountState.Mounted);\n}\n\nexport function unmountView(parent: Node, view: View) {\n view.dom.remove();\n view.mountStateChanged(MountState.Unmounted);\n}\n\ndeclare global {\n interface Node {\n /** @deprecated Use the exported function `getDOM()` instead. */\n getDOM(): this;\n /** @deprecated Use the exported function `appendView()` instead. */\n appendView(view: View);\n /** @deprecated Use the exported function `addChild()` instead. */\n addChild(child: BuildDomExpr): void;\n }\n}\n\n\nNode.prototype.getDOM = function () {\n console.trace(\"webfx: Node.getDOM() is deprecated. Please use the exported function `getDOM()` instead.\");\n return this;\n};\n\nNode.prototype.addChild = function (child) {\n console.trace(\"webfx: Node.addChild() is deprecated. Please use the exported function `addChild()` instead.\");\n addChild(this, child);\n};\n\nNode.prototype.appendView = function (this: Node, view: View) {\n console.trace(\"webfx: Node.appendView() is deprecated. Please use the exported function `appendView()` instead.\");\n appendView(this, view);\n};\n\nexport class ContainerView extends View {\n addView(view: T, pos?: number): void {\n return super.addView(view, pos);\n }\n removeView(view: T | number): void {\n super.removeView(view);\n }\n protected _insertToDom(item: T, pos: number): void {\n super._insertToDom(item, pos);\n }\n protected _removeFromDom(item: T): void {\n super._removeFromDom(item);\n }\n protected _ensureItem(item: T | number): T {\n return super._ensureItem(item) as T;\n }\n\n get items() { return this.childViews as T[]; }\n [Symbol.iterator]() { return (this.childViews as T[])[Symbol.iterator](); }\n get length() { return this.childViews.length; }\n get(idx: number) {\n return this.childViews[idx] as T;\n }\n map(func: (lvi: T) => TRet) { return arrayMap(this, func); }\n find(func: (lvi: T, idx: number) => any) { return arrayFind(this, func); }\n forEach(func: (lvi: T, idx: number) => void) { return arrayForeach(this, func); }\n}\n","import { Action, Callbacks, ConvertObjectWithCallbacks, foreachFlaten, Func, FuncOrVal, Ref } from \"@yuuza/utils\";\nimport { addChild, getDOM, View } from \"./view\";\n\n// BuildDOM types & implementation:\nexport type BuildDomExpr = string | BuildDomNode | HTMLElement | Node | IDOM;\n\nexport type IDOM = Node | View | IView;\n\nexport enum MountState {\n /** The view is unmounted. */\n Unmounted,\n /** The view will be mounted soon. */\n Mounting,\n /** The view is mounted (i.e. the DOM is in the document). */\n Mounted,\n}\n\nexport interface IView {\n getDOM(): HTMLElement;\n addChild(child: BuildDomExpr): void;\n mountStateChanged(state: MountState): void;\n}\n\nexport type BuildDomTag = string;\n\nexport type BuildDomReturn = HTMLElement | Text | Node;\n\nexport interface BuildDomNode {\n tag?: BuildDomTag;\n\n child?: BuildDomExpr[] | BuildDomExpr;\n\n text?: FuncOrVal;\n hidden?: FuncOrVal;\n init?: Action;\n update?: Action;\n\n ref?: Ref;\n\n _id?: string;\n /** @deprecated Use `_id` instead */\n _key?: string;\n\n [key: string]: any;\n}\n\nexport class BuildDOMCtx {\n dict: Record | undefined = undefined;\n actions: DOMUpdateAction[] | undefined = undefined;\n view: View | undefined = undefined;\n\n setDict(key: string, node: HTMLElement) {\n if (!this.dict) this.dict = {};\n this.dict[key] = node;\n }\n addUpdateAction(action: DOMUpdateAction) {\n if (!this.actions) this.actions = [];\n this.actions.push(action);\n }\n update() {\n if (!this.actions) return;\n for (const a of this.actions) {\n a.run();\n }\n }\n}\n\ninterface DOMUpdateAction {\n run(): void;\n}\n\nclass TextAction implements DOMUpdateAction {\n constructor(readonly node: Node, readonly func: Func) { }\n run() {\n this.node.textContent = this.func();\n }\n}\n\nclass HiddenAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Func) { }\n run() {\n this.node.hidden = this.func();\n }\n}\n\nclass UpdateAction implements DOMUpdateAction {\n constructor(readonly node: HTMLElement, readonly func: Action) { }\n run() {\n this.func(this.node);\n }\n}\n\nvar createElementFromTag = function (tag: BuildDomTag): HTMLElement {\n var reg = /[#\\.^]?[\\w\\-]+/y;\n var match;\n var ele;\n while (match = reg.exec(tag)) {\n var val = match[0];\n var ch = val[0];\n if (ch === '.') {\n ele.classList.add(val.substr(1));\n } else if (ch === '#') {\n ele.id = val.substr(1);\n } else {\n if (ele) throw new Error('unexpected multiple tags');\n ele = document.createElement(val);\n }\n }\n return ele;\n};\n\nfunction tryHandleValues(obj: BuildDomExpr, ctx: BuildDOMCtx | null) {\n if (typeof (obj) === 'string') { return document.createTextNode(obj); }\n if (typeof obj === 'function') {\n const val = (obj as any)();\n if (!val || typeof val !== 'object') {\n const node = document.createTextNode(val);\n ctx?.addUpdateAction(new TextAction(node, obj));\n return node;\n } else {\n throw new Error('Unexpected function return value');\n }\n }\n if (Node && obj instanceof Node) return obj as Node;\n return null;\n}\n\nvar buildDomCore = function (obj: BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null): BuildDomReturn {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n var r = tryHandleValues(obj, ctx);\n if (r) return r;\n if (obj instanceof JsxNode) {\n obj = obj.buildView(ctx, ttl);\n if (!(obj instanceof View)) return obj as Node;\n }\n if (obj instanceof View) {\n ctx?.view?._registerChild(obj);\n return obj.getDOM();\n }\n // if ('getDOM' in (obj as any)) return (obj as any).getDOM();\n const tag = (obj as BuildDomNode).tag;\n if (!tag) throw new Error('no tag');\n var node = createElementFromTag(tag);\n for (var key in obj as any) {\n if (obj.hasOwnProperty(key)) {\n var val = obj[key];\n buildDOMHandleKey(key, val, node, ctx, ttl);\n }\n }\n const init = obj['init'];\n if (init) init(node);\n\n return node;\n};\n\nvar buildDOMHandleKey = function (key: string, val: any, node: HTMLElement, ctx: BuildDOMCtx | null, ttl: number) {\n if (key === 'child') {\n if (val instanceof Array) {\n foreachFlaten(val, function (val) {\n node.appendChild(buildDomCore(val, ttl, ctx));\n });\n } else {\n node.appendChild(buildDomCore(val, ttl, ctx));\n }\n } else if (key === '_id' || key === '_key') {\n ctx!.setDict(val, node);\n } else if (key === 'ref') {\n (val as Ref).value = node;\n } else if (key === 'text') {\n if (typeof val === 'function') {\n ctx!.addUpdateAction(new TextAction(node, val));\n } else {\n node.textContent = val;\n }\n } else if (key === 'class') {\n node.className = val;\n } else if (key === 'style' && typeof val === 'object') {\n for (const styleKey in val) {\n if (Object.prototype.hasOwnProperty.call(val, styleKey)) {\n const styleVal = val[styleKey];\n node.style[styleKey] = styleVal;\n }\n }\n } else if (key === 'hidden' && typeof val === 'function') {\n ctx!.addUpdateAction(new HiddenAction(node, val));\n } else if (key === 'update' && typeof val === 'function') {\n ctx!.addUpdateAction(new UpdateAction(node, val));\n } else if (key === 'init') {\n // no-op\n } else {\n node[key] = val;\n }\n};\n\n/** \n * Build a DOM tree from a JavaScript object.\n * @example\n * buildDOM({\n * tag: 'div.item#firstitem',\n * onclick: () => console.info('clicked'),\n * child: [\n * 'Name: ',\n * { tag: 'span.name', text: name },\n * ],\n * });\n */\nexport function buildDOM(obj: BuildDomExpr, ctx?: BuildDOMCtx): T {\n return buildDomCore(obj, 32, ctx || null) as T;\n};\n\n/** Get a View instance or a DOM Node. View is preferred. */\nexport function buildView(obj: BuildDomExpr, ctx?: BuildDOMCtx): View | Node {\n if (obj instanceof View) {\n return obj;\n } else if (obj instanceof JsxNode) {\n return obj.buildView(ctx as any, 64);\n } else {\n return buildDOM(obj, ctx);\n }\n}\n\nexport class JsxNode {\n tag: T | string;\n attrs: Record | undefined;\n child: any[] | undefined;\n constructor(tag: any, attrs: Record | undefined, childs: any[] | undefined) {\n this.tag = tag;\n this.attrs = attrs;\n this.child = childs;\n }\n getDOM(): HTMLElement {\n return this.buildDom(null, 64) as any;\n }\n buildDom(ctx: BuildDOMCtx | null, ttl: number) {\n return getDOM(this.buildView(ctx, ttl));\n }\n buildView(ctx: BuildDOMCtx | null, ttl: number)\n : T extends IDOM ? T : T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : HTMLElement {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n let view: Node | View;\n if (typeof this.tag === 'string') {\n // tag is an HTML tag\n const dom = document.createElement(this.tag);\n view = dom;\n if (this.attrs) {\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n buildDOMHandleKey(key, val, dom, ctx, ttl);\n }\n }\n const init = this.attrs['init'];\n if (init) init(dom);\n }\n } else {\n // tag is a View\n view = this.tag as View;\n if (this.attrs) {\n let init: Action | null = null;\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n if (key == \"init\") {\n init = val;\n } else if (key == \"ref\") {\n (val as Ref).value = view;\n } else if (key.startsWith(\"on\") && view[key] instanceof Callbacks) {\n (view[key] as Callbacks).add(val);\n } else {\n view[key] = val;\n }\n }\n }\n if (init) init(view);\n }\n }\n if (this.child) {\n if (view instanceof View) {\n foreachFlaten(this.child, it => {\n (view as View).addChild(jsxBuildCore(it, ttl, (view as View)['_domctx']) as any);\n });\n } else {\n foreachFlaten(this.child, it => {\n const c = jsxBuildCore(it, ttl, ctx);\n if (c instanceof View) {\n (view as Node).appendChild(c.dom);\n ctx?.view?._registerChild(c);\n } else {\n addChild(view, c);\n }\n });\n }\n }\n return view as any;\n }\n addChild(child: IDOM): void {\n if (this.child == null) this.child = [];\n this.child.push(child);\n }\n}\n\nfunction jsxBuildCore(node: JsxNode | BuildDomExpr, ttl: number, ctx: BuildDOMCtx | null) {\n if (ttl-- < 0) throw new Error('ran out of TTL');\n if (node instanceof View) return node;\n var r = tryHandleValues(node, ctx);\n if (r) return r;\n if (node instanceof JsxNode) {\n return node.buildView(ctx, ttl);\n } else {\n console.error(\"Unknown node type\", node);\n throw new Error(\"Unknown node type\");\n }\n}\n\nexport function jsxBuild(node: JsxNode, ctx?: BuildDOMCtx): T {\n return jsxBuildCore(node, 64, ctx || new BuildDOMCtx());\n}\n\nexport type JsxTag = JsxDOMTag | JsxCtorTag;\nexport type JsxCtorTag = new (...args) => IDOM;;\nexport type JsxDOMTag = keyof HTMLElementTagNameMap;\n\nexport type JsxTagInstance =\n T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] :\n T extends (new (...args) => infer U) ? U extends IDOM ? U :\n never : never;\n\nexport type JsxAttrs =\n T extends JsxCtorTag ? JsxCtorAttrs :\n T extends JsxDOMTag ? JsxDOMAttrs :\n never;\n\nexport type JsxCtorAttrs> = {\n args?: ConstructorParameters;\n init?: Action;\n} & Partial>;\n\nexport type JsxDOMAttrs = Omit & Partial>;\n\nexport function jsxFactory>(tag: T, attrs: JsxAttrs, ...childs: any)\n : JsxNode {\n if (typeof tag === 'string') {\n return new JsxNode(tag, attrs, childs) as any;\n } else {\n const view = attrs?.args ?\n new (tag as any)(...attrs.args) :\n new (tag as any)();\n return new JsxNode(view, attrs, childs) as any;\n }\n}\n\nexport const jsx = jsxFactory;\n","import { Action, Callbacks } from \"@yuuza/utils\";\r\nimport { buildDOM, IDOM } from \"./buildDOM\";\r\nimport { getDOM } from \"./view\";\r\n\r\n\r\nexport function clearChildren(node: Node) {\r\n while (node.lastChild) node.removeChild(node.lastChild);\r\n}\r\n\r\n/** Remove all children from the node (if needed) and append one (if present) */\r\nexport function replaceChild(node: Node, newChild?: Node) {\r\n clearChildren(node);\r\n if (newChild) node.appendChild(newChild);\r\n}\r\n\r\n/** Add or remove a classname for the element\r\n * @param force - true -> add; false -> remove; undefined -> toggle.\r\n */\r\nexport function toggleClass(element: HTMLElement, clsName: string, force?: boolean) {\r\n var clsList = element.classList;\r\n if (clsList.toggle) return clsList.toggle(clsName, force);\r\n if (force === undefined) force = !clsList.contains(clsName);\r\n if (force) clsList.add(clsName);\r\n else clsList.remove(clsName);\r\n return force;\r\n}\r\n\r\nexport interface FadeOutOptions {\r\n className?: string;\r\n duration?: number;\r\n remove?: boolean;\r\n}\r\n\r\nexport interface FadeoutResult {\r\n readonly finished: boolean;\r\n onFinished(callback: Action): this;\r\n cancel(finish?: boolean): void;\r\n}\r\n\r\n/** Fade out the element and remove it */\r\nexport function fadeout(element: HTMLElement, options?: FadeOutOptions): FadeoutResult {\r\n const { className = 'fading-out', duration = 500, remove = true } = options || {};\r\n element.classList.add(className);\r\n var cb: Action | null = null;\r\n var end: Action | null = (finish = true) => {\r\n if (!end) return; // use a random variable as flag ;)\r\n end = null;\r\n element.removeEventListener('transitionend', onTransitionend);\r\n element.classList.remove(className);\r\n if (remove && finish) {\r\n element.remove();\r\n }\r\n finish && cb?.();\r\n };\r\n var onTransitionend = function (e: TransitionEvent) {\r\n if (e.eventPhase === Event.AT_TARGET) end?.();\r\n };\r\n element.addEventListener('transitionend', onTransitionend);\r\n setTimeout(end, duration); // failsafe\r\n return {\r\n get finished() { return !end; },\r\n onFinished(callback: Action) {\r\n if (!end) callback();\r\n else cb = callback;\r\n return this;\r\n },\r\n cancel(finish = false) {\r\n end?.(finish);\r\n }\r\n };\r\n}\r\n\r\nexport function startBlockingDetect(threshold = 20) {\r\n var begin = Date.now();\r\n var lastRun = Date.now();\r\n setInterval(() => {\r\n var now = Date.now();\r\n if (now - lastRun >= threshold) {\r\n console.info(`[Blocking] ${(now - begin) / 1000}s: blocked for ${now - lastRun} ms`);\r\n }\r\n lastRun = now;\r\n }, 1);\r\n}\r\n\r\nexport class Timer {\r\n callback: () => void;\r\n cancelFunc: (() => void) | undefined;\r\n constructor(callback: () => void) {\r\n this.callback = callback;\r\n this.cancelFunc = undefined;\r\n }\r\n timeout(time: number) {\r\n this.tryCancel();\r\n var handle = setTimeout(this.callback, time);\r\n this.cancelFunc = () => window.clearTimeout(handle);\r\n }\r\n interval(time: number) {\r\n this.tryCancel();\r\n var handle = setInterval(this.callback, time);\r\n this.cancelFunc = () => window.clearInterval(handle);\r\n }\r\n animationFrame() {\r\n this.tryCancel();\r\n var handle = requestAnimationFrame(this.callback);\r\n this.cancelFunc = () => cancelAnimationFrame(handle);\r\n }\r\n tryCancel() {\r\n if (this.cancelFunc) {\r\n this.cancelFunc();\r\n this.cancelFunc = undefined;\r\n }\r\n }\r\n}\r\n\r\nexport type PtrEvent = ({\r\n type: 'mouse';\r\n ev: MouseEvent;\r\n} | {\r\n type: 'touch';\r\n touch: 'start' | 'move' | 'end';\r\n ev: TouchEvent;\r\n}) & {\r\n action: 'down' | 'move' | 'up';\r\n point: MouseEvent | Touch;\r\n};\r\n\r\nexport function listenPointerEvents(element: HTMLElement, callback: (e: PtrEvent) => void | 'track', options?: AddEventListenerOptions) {\r\n var touchDown = false;\r\n var mouseDown = function (e: MouseEvent) {\r\n if (callback({ type: 'mouse', ev: e, point: e, action: 'down' }) === 'track') {\r\n var mousemove = function (e: MouseEvent) {\r\n callback({ type: 'mouse', ev: e, point: e, action: 'move' });\r\n };\r\n var mouseup = function (e: MouseEvent) {\r\n document.removeEventListener('mousemove', mousemove, true);\r\n document.removeEventListener('mouseup', mouseup, true);\r\n callback({ type: 'mouse', ev: e, point: e, action: 'up' });\r\n };\r\n document.addEventListener('mousemove', mousemove, true);\r\n document.addEventListener('mouseup', mouseup, true);\r\n }\r\n };\r\n var touchStart = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n var ret = callback({\r\n type: 'touch', touch: 'start', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'down'\r\n });\r\n if (!touchDown && ret === 'track') {\r\n touchDown = true;\r\n var touchmove = function (e: TouchEvent) {\r\n var ct = e.changedTouches[0];\r\n callback({ type: 'touch', touch: 'move', ev: e, point: ct, action: 'move' });\r\n };\r\n var touchend = function (e: TouchEvent) {\r\n if (e.touches.length === 0) {\r\n touchDown = false;\r\n element.removeEventListener('touchmove', touchmove);\r\n element.removeEventListener('touchend', touchend);\r\n element.removeEventListener('touchcancel', touchend);\r\n }\r\n var ct = e.changedTouches[0];\r\n callback({\r\n type: 'touch', touch: 'end', ev: e, point: ct,\r\n action: touchDown ? 'move' : 'up'\r\n });\r\n };\r\n element.addEventListener('touchmove', touchmove, options);\r\n element.addEventListener('touchend', touchend, options);\r\n element.addEventListener('touchcancel', touchend, options);\r\n }\r\n };\r\n element.addEventListener('mousedown', mouseDown, options);\r\n element.addEventListener('touchstart', touchStart, options);\r\n return {\r\n remove: () => {\r\n element.removeEventListener('mousedown', mouseDown, options);\r\n element.removeEventListener('touchstart', touchStart, options);\r\n }\r\n };\r\n}\r\n\r\nexport function listenEvent(element: HTMLElement, event: K,\r\n handler: (ev: HTMLElementEventMap[K]) => any) {\r\n element.addEventListener(event, handler);\r\n return {\r\n remove: () => element.removeEventListener(event, handler)\r\n };\r\n}\r\n\r\nexport function listenEvents>(element: HTMLElement, events: K,\r\n handler: (ev: HTMLElementEventMap[K[number]]) => any) {\r\n events.forEach(event => element.addEventListener(event, handler));\r\n return {\r\n remove: () => events.forEach(event => element.removeEventListener(event, handler))\r\n };\r\n}\r\n\r\nexport function injectCss(css: string, options?: { parent?: Node, tag?: string; }) {\r\n const parent = options?.parent ?? document.head;\r\n parent.appendChild(buildDOM({ tag: options?.tag ?? 'style', text: css }));\r\n}\r\n\r\nexport class TextCompositionWatcher {\r\n dom: HTMLElement;\r\n onCompositingChanged = new Callbacks();\r\n private _isCompositing = false;\r\n get isCompositing() { return this._isCompositing; }\r\n set isCompositing(val) {\r\n this._isCompositing = val;\r\n this.onCompositingChanged.invoke();\r\n }\r\n constructor(dom: IDOM) {\r\n this.dom = getDOM(dom) as HTMLElement;\r\n this.dom.addEventListener('compositionstart', (ev) => {\r\n this.isCompositing = true;\r\n });\r\n this.dom.addEventListener('compositionend', (ev) => {\r\n this.isCompositing = false;\r\n });\r\n }\r\n}\r\n\r\nexport class InputStateTracker {\r\n state = {\r\n mouseDown: false,\r\n mouseIn: false,\r\n focusIn: false,\r\n };\r\n private _removeEvents: Action | null = null;\r\n private _removePointerEvents: Action | null = null;\r\n readonly onChanged = new Callbacks>();\r\n constructor(readonly dom: HTMLElement) {\r\n this._removeEvents = listenEvents(dom, ['mouseenter', 'mouseleave', 'focusin', 'focusout'], (e) => {\r\n switch (e.type) {\r\n case 'mouseenter':\r\n this.stateChanged('mouseIn', true);\r\n break;\r\n case 'mouseleave':\r\n this.stateChanged('mouseIn', false);\r\n break;\r\n case 'focusin':\r\n this.stateChanged('focusIn', true);\r\n break;\r\n case 'focusout':\r\n this.stateChanged('focusIn', false);\r\n break;\r\n }\r\n }).remove;\r\n\r\n this._removePointerEvents = listenPointerEvents(dom, (e) => {\r\n if (e.action == 'down') {\r\n this.stateChanged('mouseDown', true);\r\n return 'track';\r\n } else if (e.action == 'up') {\r\n this.stateChanged('mouseDown', false);\r\n }\r\n }).remove;\r\n }\r\n private stateChanged(state: T, val: InputStateTracker['state'][T]) {\r\n this.state[state] = val;\r\n this.onChanged.invoke(state);\r\n }\r\n removeListeners() {\r\n this._removeEvents?.();\r\n this._removePointerEvents?.();\r\n this._removePointerEvents = this._removeEvents = null;\r\n }\r\n}\r\n\r\n\r\nexport interface IId {\r\n id: keyof any;\r\n}\r\n\r\nexport class DataUpdatingHelper {\r\n items: Iterable;\r\n update(newData: Iterable) {\r\n const oldData = this.items;\r\n var dataDict: Record = {};\r\n for (const n of newData) {\r\n dataDict[this.dataSelectId(n)] = n;\r\n }\r\n var itemDict: Record = {};\r\n var removed: T[] = [];\r\n for (const d of oldData) {\r\n const id = this.selectId(d);\r\n if (dataDict[id] !== undefined) {\r\n itemDict[id] = d;\r\n } else {\r\n removed.push(d);\r\n }\r\n }\r\n for (let i = removed.length - 1; i >= 0; i--)\r\n this.removeItem(removed[i]);\r\n var pos = 0;\r\n for (const n of newData) {\r\n const d = itemDict[this.dataSelectId(n)];\r\n if (d !== undefined) {\r\n this.updateItem(d, n);\r\n } else {\r\n this.addItem(n, pos);\r\n }\r\n pos++;\r\n }\r\n }\r\n updateOrRebuildAll(newData: Iterable) {\r\n this.update(newData);\r\n if (!this.isSame(newData)) this.rebuildAll(newData);\r\n }\r\n isSame(newData: Iterable) {\r\n var t = this.items[Symbol.iterator]();\r\n for (const n of newData) {\r\n var d = t.next();\r\n if (d.done) return false;\r\n if (this.selectId(d.value) !== this.dataSelectId(n)) return false;\r\n }\r\n if (!t.next().done) return false;\r\n return true;\r\n }\r\n rebuildAll(newData: Iterable) {\r\n var oldData = this.items;\r\n if (oldData instanceof Array) {\r\n for (let i = oldData.length - 1; i >= 0; i--) {\r\n this.removeItem(oldData[i]);\r\n }\r\n } else {\r\n for (const o of oldData) {\r\n this.removeItem(o);\r\n }\r\n }\r\n let i = 0;\r\n for (const n of newData) {\r\n this.addItem(n, i++);\r\n }\r\n }\r\n protected selectId(obj: T): any { return obj.id; }\r\n protected dataSelectId(obj: TData): any { return obj.id; }\r\n addItem(obj: TData, pos: number) { }\r\n updateItem(old: T, data: TData) { }\r\n removeItem(obj: T) { }\r\n}","// file: I18n.ts\n\nexport interface I18nData {\n [lang: string]: LangObj;\n}\n\nexport type LangObj = Record;\n\n/** Internationalization (aka i18n) helper class */\nexport class I18n {\n data: I18nData = {};\n curLang = 'en';\n missing = new Map();\n /** Get i18n string for `key`, return `key` when not found. */\n get(key, arg?: any[]): string {\n return this.get2(key, arg) || key;\n }\n /** Get i18n string for `key`, return `null` when not found. */\n get2(key, arg?: any[], lang?: string): string | null {\n lang = lang || this.curLang;\n var langObj = this.data[lang];\n if (!langObj) {\n console.log('i18n missing lang: ' + lang);\n return null;\n }\n var r = langObj[key];\n if (!r) {\n if (!this.missing.has(key)) {\n this.missing.set(key, 1);\n console.log('i18n missing key: ' + key);\n }\n return null;\n }\n if (arg) {\n for (const key in arg) {\n if (arg.hasOwnProperty(key)) {\n const val = arg[key];\n r = r.replace('{' + key + '}', val);\n // Note that it only replaces the first occurrence.\n }\n }\n }\n return r;\n }\n /** Fills data with an 2darray */\n add2dArray(array: [...string[][]]) {\n const langObjs: LangObj[] = [];\n const langs = array[0];\n for (const lang of langs) {\n langObjs.push(this.data[lang] = this.data[lang] || {});\n }\n for (let i = 1; i < array.length; i++) {\n const line = array[i];\n const key = line[0];\n for (let j = 0; j < line.length; j++) {\n const val = line[j];\n langObjs[j][key] = val;\n }\n }\n }\n renderElements(elements) {\n console.log('i18n elements rendering');\n elements.forEach(x => {\n for (const node of x.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // console.log('node', node);\n var r = this.get2(node.beforeI18n || node.textContent);\n if (r) {\n node.beforeI18n = node.beforeI18n || node.textContent;\n node.textContent = r;\n }\n else {\n if (node.beforeI18n) {\n node.textContent = node.beforeI18n;\n }\n console.log('missing key for node', node);\n }\n }\n }\n });\n }\n /**\n * Detect the best available language using\n * the user language preferences provided by the browser.\n * @param langs Available languages\n */\n static detectLanguage(langs: string[]) {\n var cur: string | null = null;\n var curIdx = -1;\n var languages: string[] = [];\n // ['en-US'] -> ['en-US', 'en']\n (navigator.languages || [navigator.language]).forEach(lang => {\n languages.push(lang);\n if (lang.indexOf('-') > 0)\n languages.push(lang.substr(0, lang.indexOf('-')));\n });\n langs.forEach((l) => {\n var idx = languages.indexOf(l);\n if (!cur || (idx !== -1 && idx < curIdx)) {\n cur = l;\n curIdx = idx;\n }\n });\n return cur || langs[0];\n }\n}\n\nexport function createStringBuilder(i18n: I18n) {\n var arrBuilder = createArrayBuilder(i18n);\n\n return function (literals: TemplateStringsArray, ...placeholders: any[]) {\n if (placeholders.length === 0) {\n return i18n.get(literals[0]);\n }\n return arrBuilder(literals, ...placeholders).join('');\n }\n}\n\nexport function createArrayBuilder(i18n: I18n) {\n var formatCache = new WeakMap();\n var parseCache = new Map();\n\n return function (literals: TemplateStringsArray, ...placeholders: T): (string | T)[] {\n if (placeholders.length === 0) {\n return [i18n.get(literals[0])];\n }\n\n // Generate format string from template string if it's not cached:\n let format = formatCache.get(literals);\n if (format === undefined) {\n format = '';\n for (let i = 0; i < literals.length; i++) {\n const lit = literals[i];\n format += lit;\n if (i < placeholders.length) {\n format += '{' + i + '}';\n }\n }\n formatCache.set(literals, format);\n }\n\n const translatedFormat = i18n.get(format);\n\n // Also cache parsed template\n let parsed = parseCache.get(translatedFormat);\n if (parsed === undefined) {\n parsed = parseTemplate(translatedFormat);\n }\n\n return parsed.map(x => typeof x == 'number' ? placeholders[x] : x);\n }\n}\n\nfunction parseTemplate(template: string): (string | number)[] {\n const result: (string | number)[] = [];\n let state = 0; // 0: normal / 1: after '{' / 2: after '}' / 3: after '{' and numbers\n let buf = '';\n for (let i = 0; i < template.length; i++) {\n const ch = template[i];\n switch (ch) {\n case '{':\n if (state == 0) state = 1;\n else if (state == 1) { state = 0; buf += '{'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n case '}':\n if (state == 3) { state = 0; result.push(+buf); buf = ''; }\n else if (state == 0) { state = 2; }\n else if (state == 2) { state = 0; buf += '}'; }\n else throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n default:\n if (state == 2) throw new Error(`Expected '}', got '${ch}' at ${i}`);\n else if (state == 1) { state = 3; if (buf) result.push(buf); buf = ''; }\n buf += ch;\n }\n }\n if (state != 0) throw new Error(\"Unexpected end of template string\");\n if (buf) result.push(buf);\n return result;\n}\n\nexport var i18n = new I18n();\n\nexport const I = createStringBuilder(i18n);\n","export const version = \"1.10.4\""],"names":["_object_assign","Object","assign","_object_hasOwnProperty","prototype","hasOwnProperty","strPadLeft","str","len","ch","length","fileSizeUnits","arrayRemove","array","val","i","splice","arrayMap","arr","func","Array","map","idx","ret","item","arrayForeach","foreachFlaten","it","arrayFind","find","objectApply","obj","kv","keys","key","call","indexOf","objectInit","startsWith","Callbacks","add","remove","this","constructor","_cbs","undefined","_cbs_invoking","_hook","_invoking","onChanged","_a","size","invoke","args","Error","forEach","x","apply","error","console","clear","callback","Set","_b","delete","waitOnce","arguments","Promise","resolve","reject","cb","accessedRefs","Ref","value","_value","_onChanged","from","ref","computed","deps","updateValue","dep","result","endRefCollect","View","dom","parentView","_position","_domctx","BuildDOMCtx","_dom","_baseView","_mountState","MountState","Unmounted","_onActive","_childViews","view","domExprCreated","getView","position","ensureDom","domCreated","baseView","mountState","hidden","r","createDom","buildView","postCreateDom","updateDom","document","createElement","debugging","dataset","update","mountStateChanged","state","trace","child","getDomById","id","dict","updateWith","updateAllWith","updateAll","toggleClass","clsName","force","getDOM","addChild","appendView","appendChild","onActive","addEventListener","e","handleKeyDown","code","rect","getBoundingClientRect","MouseEvent","clientX","clientY","y","relatedTarget","preventDefault","childViews","addView","pos","_registerChild","Mounted","Mounting","_insertToDom","changeMountState","items","push","removeView","_ensureItem","_removeFromDom","removeAllView","removeFromParent","updateChildren","insertBefore","tryGetDOM","idom","Node","parent","childView","warnMountingView","buildDOM","data","ContainerView","super","Symbol","iterator","get","exports","actions","setDict","node","addUpdateAction","action","a","run","TextAction","textContent","HiddenAction","UpdateAction","tryHandleValues","ctx","createTextNode","buildDomCore","ttl","JsxNode","tag","match","ele","reg","exec","classList","substr","createElementFromTag","buildDOMHandleKey","init","className","styleKey","styleVal","style","attrs","childs","buildDom","jsxBuildCore","c","jsxFactory","jsx","clearChildren","lastChild","removeChild","element","clsList","toggle","contains","listenPointerEvents","options","touchDown","mouseDown","type","ev","point","mousemove","mouseup","removeEventListener","touchStart","ct","changedTouches","touch","touchmove","touchend","touches","listenEvents","events","handler","event","I18n","curLang","missing","Map","arg","get2","lang","langObj","log","has","set","replace","add2dArray","langObjs","langs","line","j","renderElements","elements","childNodes","nodeType","TEXT_NODE","beforeI18n","detectLanguage","cur","curIdx","languages","navigator","language","l","createStringBuilder","i18n","arrBuilder","createArrayBuilder","literals","placeholders","join","formatCache","WeakMap","parseCache","format","translatedFormat","parsed","template","buf","parseTemplate","I","_whenNotify","_callback","wait","cancelled","onCancelled","cancel","throwIfCancelled","newData","oldData","dataDict","n","dataSelectId","itemDict","removed","d","selectId","removeItem","updateItem","addItem","updateOrRebuildAll","isSame","rebuildAll","t","next","done","o","old","list","removeAll","pop","mouseIn","focusIn","_removeEvents","_removePointerEvents","stateChanged","removeListeners","_func","rawValue","queue","maxCount","runningCount","enter","prom","res","exit","window","queueMicrotask","shift","setTimeout","isCompositing","_isCompositing","onCompositingChanged","cancelFunc","timeout","time","tryCancel","handle","clearTimeout","interval","setInterval","clearInterval","animationFrame","requestAnimationFrame","cancelAnimationFrame","sum","btoa","encodeURIComponent","p1","String","fromCharCode","nameFunc","existsFunc","num","duration","end","finish","onTransitionend","eventPhase","Event","AT_TARGET","finished","onFinished","date","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","toLocaleString","sec","isNaN","Math","round","min","floor","toString","unit","toFixed","css","head","text","b","max","blob","reader","FileReader","onload","onerror","readAsDataURL","newChild","threshold","begin","lastRun","info"],"mappings":"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"} \ No newline at end of file