diff --git a/packages/csx/src/vdom/render.js b/packages/csx/src/vdom/render.js index 36dcee5..a856e2d 100644 --- a/packages/csx/src/vdom/render.js +++ b/packages/csx/src/vdom/render.js @@ -62,6 +62,10 @@ export function render(vnode, opts = {}) { let {item, meta, previous} = state.queue.splice(0,1)[0]; let renderer = meta.renderer; if(!renderer) throw new Error("No renderer for vnode", item.vnode); + + // SVG handling.. + if(!item.inSvg && item.vnode?.type === 'svg') item.inSvg = true; + else if(item.inSvg && item.vnode?.type === 'foreignObject') item.inSvg = false; // Create the element if no matching existing element was set let newlyCreated = false; diff --git a/packages/csx/src/vdom/renderers/nodetree.js b/packages/csx/src/vdom/renderers/nodetree.js index 4ed6bef..8d09911 100644 --- a/packages/csx/src/vdom/renderers/nodetree.js +++ b/packages/csx/src/vdom/renderers/nodetree.js @@ -13,6 +13,10 @@ const VNODEPROP_IGNORE = { ['ref']: true }; +let namespace = { + svg: "http://www.w3.org/2000/svg" +} + /** * Takes care of rendering a typical VNode (like div, span or any custom-element) * @@ -28,7 +32,11 @@ export const NodeTreeRenderer = { let vnode = item.vnode; if(typeof(vnode.type) === 'string'){ // String-type -> DOM - return item.document.createElement(vnode.type); + if(item.inSvg){ + return item.document.createElementNS(namespace.svg, vnode.type); + }else{ + return item.document.createElement(vnode.type); + } }else if(vnode.type?.tagName){ // Object-type -> CUSTOM-ELEMENT return item.document.createElement(vnode.type.tagName); @@ -90,7 +98,8 @@ export const NodeTreeRenderer = { } // TODO might want to support objects for defining events, so we can specifiy passive or not, and other event options }else{ - if(!VNODEPROP_EXCLUDE_DIRECT[key]){ + if(!VNODEPROP_EXCLUDE_DIRECT[key] && !item.inSvg){ + // TODO there are many properties we do not want to be setting directly.. (transform attr on svg's is a good example...) // Unless otherwise excluded, set the prop directly on the Element as well (because this is what we'd typically want to do passing complex objects into custom-elements) host[key] = newVal; } diff --git a/rollup.config.js b/rollup.config.js index b85f7fb..8a4cd9b 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -34,6 +34,30 @@ export default [ }) ] }, + // SVG test + { + input: 'test/svg/index.jsx', + output: { + file: 'public/svg/index.js', + format: 'iife', // immediately-invoked function expression — suitable for + + \ No newline at end of file diff --git a/test/svg/index.jsx b/test/svg/index.jsx new file mode 100644 index 0000000..f11c494 --- /dev/null +++ b/test/svg/index.jsx @@ -0,0 +1,11 @@ +import {render} from "../../packages/csx"; +import style from "./index.scss"; +import {SvgLoader} from "./svg-loader"; + +document.body.appendChild(render()); +document.body.appendChild(render( +
+

SVG Loader

+ +
+)); \ No newline at end of file diff --git a/test/svg/index.scss b/test/svg/index.scss new file mode 100644 index 0000000..1229903 --- /dev/null +++ b/test/svg/index.scss @@ -0,0 +1,19 @@ +html{ + width: 100%; + height: 100%; +} + +body{ + display: flex; + flex-direction: column; + overflow: auto; + + width: 100%; + height: 100%; + padding: 0; + margin: 0; +} + +.center-me{ + align-self: center; +} \ No newline at end of file diff --git a/test/svg/svg-loader.jsx b/test/svg/svg-loader.jsx new file mode 100644 index 0000000..e7958b6 --- /dev/null +++ b/test/svg/svg-loader.jsx @@ -0,0 +1,55 @@ +import {CustomElement, defineElement, Host, ShadowDOM, State} from "../../packages/csx"; +import loaderComponentShadowStyle from './svg-loader.shadow.scss'; + +// TODO configurability, like inverted and not with props... + +@defineElement('svg-loader') +export class SvgLoader extends CustomElement{ + // Constructor + constructor(){ + super(); + } + + // Private properties + + // Properties + + // Handlers + + // CustomElement + render(){ + return ( + + + + +
+
+ + + + + + + + + + +
+ + + +
+
+
+ ) + } +} diff --git a/test/svg/svg-loader.shadow.scss b/test/svg/svg-loader.shadow.scss new file mode 100644 index 0000000..67a4a96 --- /dev/null +++ b/test/svg/svg-loader.shadow.scss @@ -0,0 +1,10 @@ +:host{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .spinner{ + padding: .5rem; + } +} \ No newline at end of file