@api-client/ui 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +1 -0
- package/build/src/index.d.ts +3 -0
- package/build/src/index.d.ts.map +1 -1
- package/build/src/index.js +4 -0
- package/build/src/index.js.map +1 -1
- package/build/src/lib/Dom.d.ts +5 -0
- package/build/src/lib/Dom.d.ts.map +1 -0
- package/build/src/lib/Dom.js +24 -0
- package/build/src/lib/Dom.js.map +1 -0
- package/build/src/md/button/internals/base.d.ts +27 -0
- package/build/src/md/button/internals/base.d.ts.map +1 -1
- package/build/src/md/button/internals/base.js +90 -1
- package/build/src/md/button/internals/base.js.map +1 -1
- package/build/src/md/icons/internals/Icon.js +2 -2
- package/build/src/md/icons/internals/Icon.js.map +1 -1
- package/build/src/md/list/internals/List.d.ts +1 -1
- package/build/src/md/list/internals/List.d.ts.map +1 -1
- package/build/src/md/list/internals/List.js +4 -4
- package/build/src/md/list/internals/List.js.map +1 -1
- package/build/src/md/list/internals/ListItem.d.ts +1 -0
- package/build/src/md/list/internals/ListItem.d.ts.map +1 -1
- package/build/src/md/list/internals/ListItem.js +10 -10
- package/build/src/md/list/internals/ListItem.js.map +1 -1
- package/build/src/md/list/internals/ListItem.styles.d.ts.map +1 -1
- package/build/src/md/list/internals/ListItem.styles.js +2 -20
- package/build/src/md/list/internals/ListItem.styles.js.map +1 -1
- package/build/src/md/menu/index.d.ts +4 -0
- package/build/src/md/menu/index.d.ts.map +1 -0
- package/build/src/md/menu/index.js +4 -0
- package/build/src/md/menu/index.js.map +1 -0
- package/build/src/md/menu/internal/Menu.d.ts +76 -0
- package/build/src/md/menu/internal/Menu.d.ts.map +1 -0
- package/build/src/md/menu/internal/Menu.js +235 -0
- package/build/src/md/menu/internal/Menu.js.map +1 -0
- package/build/src/md/menu/internal/Menu.styles.d.ts +3 -0
- package/build/src/md/menu/internal/Menu.styles.d.ts.map +1 -0
- package/build/src/md/menu/internal/Menu.styles.js +185 -0
- package/build/src/md/menu/internal/Menu.styles.js.map +1 -0
- package/build/src/md/menu/internal/MenuItem.d.ts +77 -0
- package/build/src/md/menu/internal/MenuItem.d.ts.map +1 -0
- package/build/src/md/menu/internal/MenuItem.js +216 -0
- package/build/src/md/menu/internal/MenuItem.js.map +1 -0
- package/build/src/md/menu/internal/MenuItem.styles.d.ts +3 -0
- package/build/src/md/menu/internal/MenuItem.styles.d.ts.map +1 -0
- package/build/src/md/menu/internal/MenuItem.styles.js +64 -0
- package/build/src/md/menu/internal/MenuItem.styles.js.map +1 -0
- package/build/src/md/menu/internal/SubMenu.d.ts +56 -0
- package/build/src/md/menu/internal/SubMenu.d.ts.map +1 -0
- package/build/src/md/menu/internal/SubMenu.js +171 -0
- package/build/src/md/menu/internal/SubMenu.js.map +1 -0
- package/build/src/md/menu/internal/SubMenu.styles.d.ts +3 -0
- package/build/src/md/menu/internal/SubMenu.styles.d.ts.map +1 -0
- package/build/src/md/menu/internal/SubMenu.styles.js +8 -0
- package/build/src/md/menu/internal/SubMenu.styles.js.map +1 -0
- package/build/src/md/menu/ui-menu-item.d.ts +20 -0
- package/build/src/md/menu/ui-menu-item.d.ts.map +1 -0
- package/build/src/md/menu/ui-menu-item.js +37 -0
- package/build/src/md/menu/ui-menu-item.js.map +1 -0
- package/build/src/md/menu/ui-menu.d.ts +22 -0
- package/build/src/md/menu/ui-menu.d.ts.map +1 -0
- package/build/src/md/menu/ui-menu.js +38 -0
- package/build/src/md/menu/ui-menu.js.map +1 -0
- package/build/src/md/menu/ui-sub-menu.d.ts +20 -0
- package/build/src/md/menu/ui-sub-menu.d.ts.map +1 -0
- package/build/src/md/menu/ui-sub-menu.js +37 -0
- package/build/src/md/menu/ui-sub-menu.js.map +1 -0
- package/build/src/mixins/FileDropMixin.d.ts.map +1 -1
- package/build/src/mixins/FileDropMixin.js +7 -8
- package/build/src/mixins/FileDropMixin.js.map +1 -1
- package/build/src/mixins/RenderableMixin.d.ts.map +1 -1
- package/build/src/mixins/RenderableMixin.js +2 -3
- package/build/src/mixins/RenderableMixin.js.map +1 -1
- package/demo/md/index.html +2 -0
- package/demo/md/menu/index.html +19 -0
- package/demo/md/menu/index.ts +154 -0
- package/package.json +2 -3
- package/src/index.ts +5 -0
- package/src/lib/Dom.ts +26 -0
- package/src/md/button/internals/base.ts +77 -0
- package/src/md/icons/internals/Icon.ts +2 -2
- package/src/md/list/internals/List.ts +4 -4
- package/src/md/list/internals/ListItem.styles.ts +2 -20
- package/src/md/list/internals/ListItem.ts +11 -11
- package/src/md/menu/README.md +253 -0
- package/src/md/menu/index.ts +3 -0
- package/src/md/menu/internal/Menu.styles.ts +185 -0
- package/src/md/menu/internal/Menu.ts +205 -0
- package/src/md/menu/internal/MenuItem.styles.ts +64 -0
- package/src/md/menu/internal/MenuItem.ts +217 -0
- package/src/md/menu/internal/SubMenu.styles.ts +8 -0
- package/src/md/menu/internal/SubMenu.ts +179 -0
- package/src/md/menu/ui-menu-item.ts +25 -0
- package/src/md/menu/ui-menu.ts +26 -0
- package/src/md/menu/ui-sub-menu.ts +25 -0
- package/src/mixins/FileDropMixin.ts +106 -107
- package/src/mixins/RenderableMixin.ts +107 -108
- package/test/md/menu/Menu.test.ts +509 -0
- package/test/md/menu/MenuIntegration.test.ts +426 -0
- package/test/md/menu/MenuItem.test.ts +361 -0
- package/test/md/menu/SubMenu.test.ts +411 -0
- /package/test/{ui → md}/button/UiButton.test.ts +0 -0
- /package/test/{ui → md}/button/UiIconButton.test.ts +0 -0
- /package/test/{ui → md}/chip/UiChip.test.ts +0 -0
- /package/test/{ui → md}/collapse/UiCollapse.test.ts +0 -0
- /package/test/{ui → md}/collapse/flex-layout.test.ts +0 -0
- /package/test/{ui → md}/date-time/DateTime.test.ts +0 -0
- /package/test/{ui → md}/dialog/UiDialog.test.ts +0 -0
- /package/test/{ui → md}/progress/UiProgressElement.test.ts +0 -0
- /package/test/{ui → md}/progress/UiRangeElement.test.ts +0 -0
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
3
3
|
import { html, TemplateResult, LitElement } from 'lit'
|
|
4
4
|
import { property } from 'lit/decorators.js'
|
|
5
|
-
import { dedupeMixin } from '@open-wc/dedupe-mixin'
|
|
6
5
|
import '../md/icons/ui-icon.js'
|
|
7
6
|
|
|
8
7
|
export const dragEnterHandler = Symbol('dragEnterHandler')
|
|
@@ -39,126 +38,126 @@ export declare class FileDropMixinInterface {
|
|
|
39
38
|
*
|
|
40
39
|
* @mixin
|
|
41
40
|
*/
|
|
42
|
-
export const FileDropMixin =
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
export const FileDropMixin = <T extends Constructor<LitElement>>(
|
|
42
|
+
superClass: T
|
|
43
|
+
): Constructor<FileDropMixinInterface> & T => {
|
|
44
|
+
class MyMixinClass extends superClass {
|
|
45
|
+
@property({ type: Boolean }) accessor dropTargetActive: boolean
|
|
46
|
+
|
|
47
|
+
dropTarget: HTMLElement = document.body
|
|
48
|
+
|
|
49
|
+
constructor(...args: any[]) {
|
|
50
|
+
super(...args)
|
|
51
|
+
this[dragEnterHandler] = this[dragEnterHandler].bind(this)
|
|
52
|
+
this[dragLeaveHandler] = this[dragLeaveHandler].bind(this)
|
|
53
|
+
this[dragOverHandler] = this[dragOverHandler].bind(this)
|
|
54
|
+
this[dropHandler] = this[dropHandler].bind(this)
|
|
55
|
+
|
|
56
|
+
this.dropTargetActive = false
|
|
57
|
+
}
|
|
46
58
|
|
|
47
|
-
|
|
59
|
+
override connectedCallback(): void {
|
|
60
|
+
const { dropTarget } = this
|
|
61
|
+
dropTarget.addEventListener('dragenter', this[dragEnterHandler])
|
|
62
|
+
dropTarget.addEventListener('dragleave', this[dragLeaveHandler])
|
|
63
|
+
dropTarget.addEventListener('dragover', this[dragOverHandler])
|
|
64
|
+
dropTarget.addEventListener('drop', this[dropHandler])
|
|
65
|
+
super.connectedCallback()
|
|
66
|
+
}
|
|
48
67
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
68
|
+
override disconnectedCallback(): void {
|
|
69
|
+
const { dropTarget } = this
|
|
70
|
+
dropTarget.removeEventListener('dragenter', this[dragEnterHandler])
|
|
71
|
+
dropTarget.removeEventListener('dragleave', this[dragLeaveHandler])
|
|
72
|
+
dropTarget.removeEventListener('dragover', this[dragOverHandler])
|
|
73
|
+
dropTarget.removeEventListener('drop', this[dropHandler])
|
|
74
|
+
super.disconnectedCallback()
|
|
75
|
+
}
|
|
55
76
|
|
|
56
|
-
|
|
57
|
-
|
|
77
|
+
/**
|
|
78
|
+
* Processes dropped to the page files
|
|
79
|
+
* @param files The list of dropped files
|
|
80
|
+
* @abstract This is to be implemented by the platform bindings
|
|
81
|
+
*/
|
|
82
|
+
async processDroppedFiles(files: FileList): Promise<void> {
|
|
83
|
+
// ...
|
|
84
|
+
}
|
|
58
85
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
86
|
+
/**
|
|
87
|
+
* @returns The template for the drop file message
|
|
88
|
+
*/
|
|
89
|
+
dropTargetTemplate(): TemplateResult {
|
|
90
|
+
return html`
|
|
91
|
+
<div class="drop-info">
|
|
92
|
+
<ui-icon icon="fileDownload" class="drop-icon"></ui-icon>
|
|
93
|
+
<p class="drop-message">Drop the file here</p>
|
|
94
|
+
</div>
|
|
95
|
+
`
|
|
96
|
+
}
|
|
67
97
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
dropTarget.removeEventListener('dragleave', this[dragLeaveHandler])
|
|
72
|
-
dropTarget.removeEventListener('dragover', this[dragOverHandler])
|
|
73
|
-
dropTarget.removeEventListener('drop', this[dropHandler])
|
|
74
|
-
super.disconnectedCallback()
|
|
98
|
+
[dragEnterHandler](e: DragEvent): void {
|
|
99
|
+
if (!e.dataTransfer) {
|
|
100
|
+
return
|
|
75
101
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
* Processes dropped to the page files
|
|
79
|
-
* @param files The list of dropped files
|
|
80
|
-
* @abstract This is to be implemented by the platform bindings
|
|
81
|
-
*/
|
|
82
|
-
async processDroppedFiles(files: FileList): Promise<void> {
|
|
83
|
-
// ...
|
|
102
|
+
if (![...e.dataTransfer.types].includes('Files')) {
|
|
103
|
+
return
|
|
84
104
|
}
|
|
105
|
+
e.preventDefault()
|
|
106
|
+
this.dropTarget.classList.add('drop-target')
|
|
107
|
+
this.dropTargetActive = true
|
|
108
|
+
e.dataTransfer.effectAllowed = 'copy'
|
|
109
|
+
}
|
|
85
110
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
dropTargetTemplate(): TemplateResult {
|
|
90
|
-
return html`
|
|
91
|
-
<div class="drop-info">
|
|
92
|
-
<ui-icon icon="fileDownload" class="drop-icon"></ui-icon>
|
|
93
|
-
<p class="drop-message">Drop the file here</p>
|
|
94
|
-
</div>
|
|
95
|
-
`
|
|
111
|
+
[dragLeaveHandler](e: DragEvent): void {
|
|
112
|
+
if (!e.dataTransfer) {
|
|
113
|
+
return
|
|
96
114
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (!e.dataTransfer) {
|
|
100
|
-
return
|
|
101
|
-
}
|
|
102
|
-
if (![...e.dataTransfer.types].includes('Files')) {
|
|
103
|
-
return
|
|
104
|
-
}
|
|
105
|
-
e.preventDefault()
|
|
106
|
-
this.dropTarget.classList.add('drop-target')
|
|
107
|
-
this.dropTargetActive = true
|
|
108
|
-
e.dataTransfer.effectAllowed = 'copy'
|
|
115
|
+
if (![...e.dataTransfer.types].includes('Files')) {
|
|
116
|
+
return
|
|
109
117
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return
|
|
117
|
-
}
|
|
118
|
-
const node = e.target as HTMLElement
|
|
119
|
-
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
120
|
-
return
|
|
121
|
-
}
|
|
122
|
-
if (node !== this.dropTarget && !node.classList.contains('drop-info')) {
|
|
123
|
-
return
|
|
124
|
-
}
|
|
125
|
-
e.preventDefault()
|
|
126
|
-
this.dropTarget.classList.remove('drop-target')
|
|
127
|
-
this.dropTargetActive = false
|
|
118
|
+
const node = e.target as HTMLElement
|
|
119
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
if (node !== this.dropTarget && !node.classList.contains('drop-info')) {
|
|
123
|
+
return
|
|
128
124
|
}
|
|
125
|
+
e.preventDefault()
|
|
126
|
+
this.dropTarget.classList.remove('drop-target')
|
|
127
|
+
this.dropTargetActive = false
|
|
128
|
+
}
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
if (node !== this.dropTarget && !node.classList.contains('drop-info')) {
|
|
142
|
-
return
|
|
143
|
-
}
|
|
144
|
-
e.preventDefault()
|
|
145
|
-
this.dropTarget.classList.add('drop-target')
|
|
146
|
-
this.dropTargetActive = true
|
|
130
|
+
[dragOverHandler](e: DragEvent): void {
|
|
131
|
+
if (!e.dataTransfer) {
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
if (![...e.dataTransfer.types].includes('Files')) {
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
const node = e.target as HTMLElement
|
|
138
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
139
|
+
return
|
|
147
140
|
}
|
|
141
|
+
if (node !== this.dropTarget && !node.classList.contains('drop-info')) {
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
e.preventDefault()
|
|
145
|
+
this.dropTarget.classList.add('drop-target')
|
|
146
|
+
this.dropTargetActive = true
|
|
147
|
+
}
|
|
148
148
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
if (![...e.dataTransfer.types].includes('Files')) {
|
|
154
|
-
return
|
|
155
|
-
}
|
|
156
|
-
e.preventDefault()
|
|
157
|
-
this.dropTarget.classList.remove('drop-target')
|
|
158
|
-
this.dropTargetActive = false
|
|
159
|
-
this.processDroppedFiles(e.dataTransfer.files)
|
|
149
|
+
[dropHandler](e: DragEvent): void {
|
|
150
|
+
if (!e.dataTransfer) {
|
|
151
|
+
return
|
|
160
152
|
}
|
|
153
|
+
if (![...e.dataTransfer.types].includes('Files')) {
|
|
154
|
+
return
|
|
155
|
+
}
|
|
156
|
+
e.preventDefault()
|
|
157
|
+
this.dropTarget.classList.remove('drop-target')
|
|
158
|
+
this.dropTargetActive = false
|
|
159
|
+
this.processDroppedFiles(e.dataTransfer.files)
|
|
161
160
|
}
|
|
162
|
-
return MyMixinClass as Constructor<FileDropMixinInterface> & T
|
|
163
161
|
}
|
|
164
|
-
|
|
162
|
+
return MyMixinClass as Constructor<FileDropMixinInterface> & T
|
|
163
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { dedupeMixin } from '@open-wc/dedupe-mixin'
|
|
3
2
|
import { html, TemplateResult, render, nothing } from 'lit'
|
|
4
3
|
import reactive from '../decorators/reactive.js'
|
|
5
4
|
|
|
@@ -65,124 +64,124 @@ export declare class RenderableMixinInterface {
|
|
|
65
64
|
*
|
|
66
65
|
* @mixin
|
|
67
66
|
*/
|
|
68
|
-
export const RenderableMixin =
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
67
|
+
export const RenderableMixin = <T extends Constructor<any>>(
|
|
68
|
+
superClass: T
|
|
69
|
+
): Constructor<RenderableMixinInterface> & T => {
|
|
70
|
+
class RenderableMixinClass extends superClass {
|
|
71
|
+
/**
|
|
72
|
+
* Determines whether the initial render had run and the `firstRender()`
|
|
73
|
+
* function was called.
|
|
74
|
+
*
|
|
75
|
+
* @default false
|
|
76
|
+
*/
|
|
77
|
+
@reactive() accessor firstRendered = false;
|
|
78
|
+
|
|
79
|
+
[renderingValue] = false;
|
|
80
|
+
|
|
81
|
+
[hasPendingUpdatePromise] = false;
|
|
82
|
+
|
|
83
|
+
[updateResolver]?: (value?: any) => void
|
|
84
|
+
|
|
85
|
+
#updateComplete?: Promise<boolean>
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @type A promise resolved when the render finished.
|
|
89
|
+
*/
|
|
90
|
+
get updateComplete(): Promise<boolean> | undefined {
|
|
91
|
+
return this.#updateComplete
|
|
92
|
+
}
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
/**
|
|
95
|
+
* True when rendering debouncer is running.
|
|
96
|
+
*/
|
|
97
|
+
get rendering(): boolean {
|
|
98
|
+
return this[renderingValue]
|
|
99
|
+
}
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
101
|
+
constructor(...args: any[]) {
|
|
102
|
+
super(...args)
|
|
103
|
+
this[setUpdatePromise]()
|
|
104
|
+
}
|
|
105
105
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Helper function to be overridden by child classes. It is called when the view
|
|
108
|
+
* is rendered for the first time.
|
|
109
|
+
*/
|
|
110
|
+
firstRender(): void {
|
|
111
|
+
//
|
|
112
|
+
}
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
114
|
+
/**
|
|
115
|
+
* A function called when the template has been rendered
|
|
116
|
+
*/
|
|
117
|
+
updated(): void {
|
|
118
|
+
//
|
|
119
|
+
}
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
121
|
+
/**
|
|
122
|
+
* This to be used by the child classes to render page template.
|
|
123
|
+
* @returns Application page template
|
|
124
|
+
*/
|
|
125
|
+
pageTemplate(): TemplateResult | typeof nothing {
|
|
126
|
+
return html``
|
|
127
|
+
}
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
this[renderingValue] = true
|
|
141
|
-
if (!this[hasPendingUpdatePromise]) {
|
|
142
|
-
this[setUpdatePromise]()
|
|
143
|
-
}
|
|
144
|
-
requestAnimationFrame(() => {
|
|
145
|
-
this[renderingValue] = false
|
|
146
|
-
this[renderPage]()
|
|
147
|
-
})
|
|
129
|
+
/**
|
|
130
|
+
* The main render function. Sub classes should not override this method.
|
|
131
|
+
* Override `[renderPage]()` instead.
|
|
132
|
+
*
|
|
133
|
+
* The function calls `[renderPage]()` in a micro task so it is safe to call this
|
|
134
|
+
* multiple time in the same event loop.
|
|
135
|
+
*/
|
|
136
|
+
render(): void {
|
|
137
|
+
if (this.rendering) {
|
|
138
|
+
return
|
|
148
139
|
}
|
|
149
|
-
|
|
150
|
-
[
|
|
151
|
-
|
|
152
|
-
if (!root) {
|
|
153
|
-
// eslint-disable-next-line no-console
|
|
154
|
-
console.warn(`The <div id="app"></div> is not in the document.`)
|
|
155
|
-
return
|
|
156
|
-
}
|
|
157
|
-
if (!this.firstRendered) {
|
|
158
|
-
this.firstRendered = true
|
|
159
|
-
// cleanup any pre-existing content.
|
|
160
|
-
Array.from(root.childNodes).forEach((node) => node.parentNode?.removeChild(node))
|
|
161
|
-
setTimeout(() => this.firstRender())
|
|
162
|
-
}
|
|
163
|
-
render(this.pageTemplate(), root, { host: this })
|
|
164
|
-
this[resolveUpdatePromise]()
|
|
165
|
-
this.updated()
|
|
140
|
+
this[renderingValue] = true
|
|
141
|
+
if (!this[hasPendingUpdatePromise]) {
|
|
142
|
+
this[setUpdatePromise]()
|
|
166
143
|
}
|
|
144
|
+
requestAnimationFrame(() => {
|
|
145
|
+
this[renderingValue] = false
|
|
146
|
+
this[renderPage]()
|
|
147
|
+
})
|
|
148
|
+
}
|
|
167
149
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
150
|
+
[renderPage](): void {
|
|
151
|
+
const root = document.querySelector('#app') as HTMLElement
|
|
152
|
+
if (!root) {
|
|
153
|
+
// eslint-disable-next-line no-console
|
|
154
|
+
console.warn(`The <div id="app"></div> is not in the document.`)
|
|
155
|
+
return
|
|
156
|
+
}
|
|
157
|
+
if (!this.firstRendered) {
|
|
158
|
+
this.firstRendered = true
|
|
159
|
+
// cleanup any pre-existing content.
|
|
160
|
+
Array.from(root.childNodes).forEach((node) => node.parentNode?.removeChild(node))
|
|
161
|
+
setTimeout(() => this.firstRender())
|
|
173
162
|
}
|
|
163
|
+
render(this.pageTemplate(), root, { host: this })
|
|
164
|
+
this[resolveUpdatePromise]()
|
|
165
|
+
this.updated()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
[setUpdatePromise](): void {
|
|
169
|
+
this.#updateComplete = new Promise((resolve) => {
|
|
170
|
+
this[updateResolver] = resolve
|
|
171
|
+
this[hasPendingUpdatePromise] = true
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
174
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
175
|
+
[resolveUpdatePromise](): void {
|
|
176
|
+
if (!this[hasPendingUpdatePromise]) {
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
this[hasPendingUpdatePromise] = false
|
|
180
|
+
const resolver = this[updateResolver]
|
|
181
|
+
if (resolver) {
|
|
182
|
+
resolver()
|
|
184
183
|
}
|
|
185
184
|
}
|
|
186
|
-
return RenderableMixinClass as Constructor<RenderableMixinInterface> & T
|
|
187
185
|
}
|
|
188
|
-
|
|
186
|
+
return RenderableMixinClass as Constructor<RenderableMixinInterface> & T
|
|
187
|
+
}
|