[WIP] Allow custom elements to be rendered to light dom or shadow dom (open, closed)

pull/4073/head
Fabricio Leonardo Sodano Pascazi 6 years ago
parent 6a4956b403
commit 4692674cd9

2
package-lock.json generated

@ -1,6 +1,6 @@
{ {
"name": "svelte", "name": "svelte",
"version": "3.15.0", "version": "3.16.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

@ -22,6 +22,7 @@ const valid_options = [
'hydratable', 'hydratable',
'legacy', 'legacy',
'customElement', 'customElement',
'shadowDom',
'tag', 'tag',
'css', 'css',
'loopGuardTimeout', 'loopGuardTimeout',

@ -426,14 +426,19 @@ export default function dom(
} }
if (options.customElement) { if (options.customElement) {
const lightDom = options.shadowDom === 'none';
const declaration = b` const declaration = b`
class ${name} extends @SvelteElement { class ${name} extends @SvelteElement {
constructor(options) { constructor(options) {
super(); super();
${!lightDom && b`
this.attachShadow({ mode: '${options.shadowDom}' });
`}
${css.code && b`this.shadowRoot.innerHTML = \`<style>${css.code.replace(/\\/g, '\\\\')}${options.dev ? `\n/*# sourceMappingURL=${css.map.toUrl()} */` : ''}</style>\`;`} ${css.code && b`this.shadowRoot.innerHTML = \`<style>${css.code.replace(/\\/g, '\\\\')}${options.dev ? `\n/*# sourceMappingURL=${css.map.toUrl()} */` : ''}</style>\`;`}
@init(this, { target: this.shadowRoot }, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}, ${dirty}); @init(this, { target: ${lightDom ? 'this' : 'this.shadowRoot'} }, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}, ${dirty});
${dev_props_check} ${dev_props_check}

@ -119,6 +119,7 @@ export interface CompileOptions {
hydratable?: boolean; hydratable?: boolean;
legacy?: boolean; legacy?: boolean;
customElement?: boolean; customElement?: boolean;
shadowDom?: ShadowDomMode;
tag?: string; tag?: string;
css?: boolean; css?: boolean;
loopGuardTimeout?: number; loopGuardTimeout?: number;
@ -161,3 +162,7 @@ export interface Var {
subscribable?: boolean; subscribable?: boolean;
is_reactive_dependency?: boolean; is_reactive_dependency?: boolean;
} }
export type ShadowDomMode = 'none'
| 'open'
| 'closed'

@ -166,7 +166,6 @@ if (typeof HTMLElement === 'function') {
$$: T$$; $$: T$$;
constructor() { constructor() {
super(); super();
this.attachShadow({ mode: 'open' });
} }
connectedCallback() { connectedCallback() {

Loading…
Cancel
Save