@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.
Files changed (109) hide show
  1. package/.vscode/settings.json +1 -0
  2. package/build/src/index.d.ts +3 -0
  3. package/build/src/index.d.ts.map +1 -1
  4. package/build/src/index.js +4 -0
  5. package/build/src/index.js.map +1 -1
  6. package/build/src/lib/Dom.d.ts +5 -0
  7. package/build/src/lib/Dom.d.ts.map +1 -0
  8. package/build/src/lib/Dom.js +24 -0
  9. package/build/src/lib/Dom.js.map +1 -0
  10. package/build/src/md/button/internals/base.d.ts +27 -0
  11. package/build/src/md/button/internals/base.d.ts.map +1 -1
  12. package/build/src/md/button/internals/base.js +90 -1
  13. package/build/src/md/button/internals/base.js.map +1 -1
  14. package/build/src/md/icons/internals/Icon.js +2 -2
  15. package/build/src/md/icons/internals/Icon.js.map +1 -1
  16. package/build/src/md/list/internals/List.d.ts +1 -1
  17. package/build/src/md/list/internals/List.d.ts.map +1 -1
  18. package/build/src/md/list/internals/List.js +4 -4
  19. package/build/src/md/list/internals/List.js.map +1 -1
  20. package/build/src/md/list/internals/ListItem.d.ts +1 -0
  21. package/build/src/md/list/internals/ListItem.d.ts.map +1 -1
  22. package/build/src/md/list/internals/ListItem.js +10 -10
  23. package/build/src/md/list/internals/ListItem.js.map +1 -1
  24. package/build/src/md/list/internals/ListItem.styles.d.ts.map +1 -1
  25. package/build/src/md/list/internals/ListItem.styles.js +2 -20
  26. package/build/src/md/list/internals/ListItem.styles.js.map +1 -1
  27. package/build/src/md/menu/index.d.ts +4 -0
  28. package/build/src/md/menu/index.d.ts.map +1 -0
  29. package/build/src/md/menu/index.js +4 -0
  30. package/build/src/md/menu/index.js.map +1 -0
  31. package/build/src/md/menu/internal/Menu.d.ts +76 -0
  32. package/build/src/md/menu/internal/Menu.d.ts.map +1 -0
  33. package/build/src/md/menu/internal/Menu.js +235 -0
  34. package/build/src/md/menu/internal/Menu.js.map +1 -0
  35. package/build/src/md/menu/internal/Menu.styles.d.ts +3 -0
  36. package/build/src/md/menu/internal/Menu.styles.d.ts.map +1 -0
  37. package/build/src/md/menu/internal/Menu.styles.js +185 -0
  38. package/build/src/md/menu/internal/Menu.styles.js.map +1 -0
  39. package/build/src/md/menu/internal/MenuItem.d.ts +77 -0
  40. package/build/src/md/menu/internal/MenuItem.d.ts.map +1 -0
  41. package/build/src/md/menu/internal/MenuItem.js +216 -0
  42. package/build/src/md/menu/internal/MenuItem.js.map +1 -0
  43. package/build/src/md/menu/internal/MenuItem.styles.d.ts +3 -0
  44. package/build/src/md/menu/internal/MenuItem.styles.d.ts.map +1 -0
  45. package/build/src/md/menu/internal/MenuItem.styles.js +64 -0
  46. package/build/src/md/menu/internal/MenuItem.styles.js.map +1 -0
  47. package/build/src/md/menu/internal/SubMenu.d.ts +56 -0
  48. package/build/src/md/menu/internal/SubMenu.d.ts.map +1 -0
  49. package/build/src/md/menu/internal/SubMenu.js +171 -0
  50. package/build/src/md/menu/internal/SubMenu.js.map +1 -0
  51. package/build/src/md/menu/internal/SubMenu.styles.d.ts +3 -0
  52. package/build/src/md/menu/internal/SubMenu.styles.d.ts.map +1 -0
  53. package/build/src/md/menu/internal/SubMenu.styles.js +8 -0
  54. package/build/src/md/menu/internal/SubMenu.styles.js.map +1 -0
  55. package/build/src/md/menu/ui-menu-item.d.ts +20 -0
  56. package/build/src/md/menu/ui-menu-item.d.ts.map +1 -0
  57. package/build/src/md/menu/ui-menu-item.js +37 -0
  58. package/build/src/md/menu/ui-menu-item.js.map +1 -0
  59. package/build/src/md/menu/ui-menu.d.ts +22 -0
  60. package/build/src/md/menu/ui-menu.d.ts.map +1 -0
  61. package/build/src/md/menu/ui-menu.js +38 -0
  62. package/build/src/md/menu/ui-menu.js.map +1 -0
  63. package/build/src/md/menu/ui-sub-menu.d.ts +20 -0
  64. package/build/src/md/menu/ui-sub-menu.d.ts.map +1 -0
  65. package/build/src/md/menu/ui-sub-menu.js +37 -0
  66. package/build/src/md/menu/ui-sub-menu.js.map +1 -0
  67. package/build/src/mixins/FileDropMixin.d.ts.map +1 -1
  68. package/build/src/mixins/FileDropMixin.js +7 -8
  69. package/build/src/mixins/FileDropMixin.js.map +1 -1
  70. package/build/src/mixins/RenderableMixin.d.ts.map +1 -1
  71. package/build/src/mixins/RenderableMixin.js +2 -3
  72. package/build/src/mixins/RenderableMixin.js.map +1 -1
  73. package/demo/md/index.html +2 -0
  74. package/demo/md/menu/index.html +19 -0
  75. package/demo/md/menu/index.ts +154 -0
  76. package/package.json +2 -3
  77. package/src/index.ts +5 -0
  78. package/src/lib/Dom.ts +26 -0
  79. package/src/md/button/internals/base.ts +77 -0
  80. package/src/md/icons/internals/Icon.ts +2 -2
  81. package/src/md/list/internals/List.ts +4 -4
  82. package/src/md/list/internals/ListItem.styles.ts +2 -20
  83. package/src/md/list/internals/ListItem.ts +11 -11
  84. package/src/md/menu/README.md +253 -0
  85. package/src/md/menu/index.ts +3 -0
  86. package/src/md/menu/internal/Menu.styles.ts +185 -0
  87. package/src/md/menu/internal/Menu.ts +205 -0
  88. package/src/md/menu/internal/MenuItem.styles.ts +64 -0
  89. package/src/md/menu/internal/MenuItem.ts +217 -0
  90. package/src/md/menu/internal/SubMenu.styles.ts +8 -0
  91. package/src/md/menu/internal/SubMenu.ts +179 -0
  92. package/src/md/menu/ui-menu-item.ts +25 -0
  93. package/src/md/menu/ui-menu.ts +26 -0
  94. package/src/md/menu/ui-sub-menu.ts +25 -0
  95. package/src/mixins/FileDropMixin.ts +106 -107
  96. package/src/mixins/RenderableMixin.ts +107 -108
  97. package/test/md/menu/Menu.test.ts +509 -0
  98. package/test/md/menu/MenuIntegration.test.ts +426 -0
  99. package/test/md/menu/MenuItem.test.ts +361 -0
  100. package/test/md/menu/SubMenu.test.ts +411 -0
  101. /package/test/{ui → md}/button/UiButton.test.ts +0 -0
  102. /package/test/{ui → md}/button/UiIconButton.test.ts +0 -0
  103. /package/test/{ui → md}/chip/UiChip.test.ts +0 -0
  104. /package/test/{ui → md}/collapse/UiCollapse.test.ts +0 -0
  105. /package/test/{ui → md}/collapse/flex-layout.test.ts +0 -0
  106. /package/test/{ui → md}/date-time/DateTime.test.ts +0 -0
  107. /package/test/{ui → md}/dialog/UiDialog.test.ts +0 -0
  108. /package/test/{ui → md}/progress/UiProgressElement.test.ts +0 -0
  109. /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 = dedupeMixin(
43
- <T extends Constructor<LitElement>>(superClass: T): Constructor<FileDropMixinInterface> & T => {
44
- class MyMixinClass extends superClass {
45
- @property({ type: Boolean }) accessor dropTargetActive: boolean
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
- dropTarget: HTMLElement = document.body
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
- 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)
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
- this.dropTargetActive = false
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
- 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
- }
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
- 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()
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
- * @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
- `
111
+ [dragLeaveHandler](e: DragEvent): void {
112
+ if (!e.dataTransfer) {
113
+ return
96
114
  }
97
-
98
- [dragEnterHandler](e: DragEvent): void {
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
- [dragLeaveHandler](e: DragEvent): void {
112
- if (!e.dataTransfer) {
113
- return
114
- }
115
- if (![...e.dataTransfer.types].includes('Files')) {
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
- [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
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
- [dropHandler](e: DragEvent): void {
150
- if (!e.dataTransfer) {
151
- return
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 = dedupeMixin(
69
- <T extends Constructor<any>>(superClass: T): 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
- }
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
- * True when rendering debouncer is running.
96
- */
97
- get rendering(): boolean {
98
- return this[renderingValue]
99
- }
94
+ /**
95
+ * True when rendering debouncer is running.
96
+ */
97
+ get rendering(): boolean {
98
+ return this[renderingValue]
99
+ }
100
100
 
101
- constructor(...args: any[]) {
102
- super(...args)
103
- this[setUpdatePromise]()
104
- }
101
+ constructor(...args: any[]) {
102
+ super(...args)
103
+ this[setUpdatePromise]()
104
+ }
105
105
 
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
- }
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
- * A function called when the template has been rendered
116
- */
117
- updated(): void {
118
- //
119
- }
114
+ /**
115
+ * A function called when the template has been rendered
116
+ */
117
+ updated(): void {
118
+ //
119
+ }
120
120
 
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
- }
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
- * 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
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
- [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())
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
- [setUpdatePromise](): void {
169
- this.#updateComplete = new Promise((resolve) => {
170
- this[updateResolver] = resolve
171
- this[hasPendingUpdatePromise] = true
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
- [resolveUpdatePromise](): void {
176
- if (!this[hasPendingUpdatePromise]) {
177
- return
178
- }
179
- this[hasPendingUpdatePromise] = false
180
- const resolver = this[updateResolver]
181
- if (resolver) {
182
- resolver()
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
+ }