|
| 1 | +import Component from '@glimmer/component'; |
| 2 | +import { tracked } from '@glimmer/tracking'; |
| 3 | + |
1 | 4 | import { modifier } from 'ember-modifier';
|
2 |
| -import { cell } from 'ember-resources'; |
3 | 5 |
|
4 |
| -import type { TOC } from '@ember/component/template-only'; |
| 6 | +const attachShadow = modifier((element: Element, [set]: [(shadowRoot: HTMLDivElement) => void]) => { |
| 7 | + let shadow = element.attachShadow({ mode: 'open' }); |
| 8 | + let div = document.createElement('div'); |
5 | 9 |
|
6 |
| -type SetShadow = ReturnType<typeof cell<ShadowRoot>>['set']; |
| 10 | + shadow.appendChild(div); |
7 | 11 |
|
8 |
| -const attachShadow = modifier((element: Element, [setShadow]: [SetShadow]) => { |
9 |
| - setShadow(element.attachShadow({ mode: 'open' })); |
| 12 | + set(div); |
10 | 13 | });
|
11 | 14 |
|
12 | 15 | // index.html has the production-fingerprinted references to these links
|
13 | 16 | // Ideally, we'd have some pre-processor scan everything for references to
|
14 | 17 | // assets in public, but idk how to set that up
|
15 | 18 | const getStyles = () => [...document.head.querySelectorAll('link')].map((link) => link.href);
|
16 | 19 |
|
17 |
| -const shadowRoot = () => cell<ShadowRoot>(); |
18 |
| - |
19 |
| -export const Shadowed: TOC<{ |
| 20 | +export class Shadowed extends Component<{ |
20 | 21 | Element: HTMLDivElement;
|
21 | 22 | Args: {
|
22 | 23 | omitStyles?: boolean;
|
23 | 24 | };
|
24 | 25 | Blocks: { default: [] };
|
25 |
| -}> = <template> |
26 |
| - {{#let (shadowRoot) as |shadow|}} |
27 |
| - {{! @glint-ignore }} |
28 |
| - <div data-shadow {{attachShadow shadow.set}} ...attributes></div> |
| 26 | +}> { |
| 27 | + @tracked shadow: HTMLDivElement | undefined; |
| 28 | + |
| 29 | + setShadow = async (shadowRoot: HTMLDivElement) => { |
| 30 | + await Promise.resolve(); |
| 31 | + |
| 32 | + this.shadow = shadowRoot; |
| 33 | + }; |
| 34 | + |
| 35 | + <template> |
| 36 | + <div data-shadow {{attachShadow this.setShadow}} ...attributes></div> |
29 | 37 |
|
30 |
| - {{#if shadow.current}} |
31 |
| - {{#in-element shadow.current}} |
| 38 | + {{#if this.shadow}} |
| 39 | + {{#in-element this.shadow}} |
32 | 40 | {{#unless @omitStyles}}
|
33 |
| - {{#let (getStyles) as |styles|}} |
34 |
| - {{#each styles as |styleHref|}} |
35 |
| - <link rel="stylesheet" href={{styleHref}} /> |
36 |
| - {{/each}} |
37 |
| - {{/let}} |
| 41 | + {{#each (getStyles) as |styleHref|}} |
| 42 | + <link rel="stylesheet" href={{styleHref}} /> |
| 43 | + {{/each}} |
38 | 44 | {{/unless}}
|
39 | 45 |
|
40 | 46 | {{yield}}
|
41 | 47 | {{/in-element}}
|
42 | 48 | {{/if}}
|
43 |
| - {{/let}} |
44 |
| -</template>; |
| 49 | + </template> |
| 50 | +} |
45 | 51 |
|
46 | 52 | export default Shadowed;
|
0 commit comments