diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rx.ts | 37 | 
1 files changed, 24 insertions, 13 deletions
@@ -470,12 +470,22 @@ function appendChild(state: State, element: Element, child: Html, lastAdded?: No    } else if (isTag(child)) {      const { tagName, attributes, children, onmount, onunmount } = child -    const childElement = document.createElement(tagName) +    const s = isSvg(tagName) + +    const childElement = s +        ? document.createElementNS('http://www.w3.org/2000/svg', tagName) +        : document.createElement(tagName) + +    const setAttr = s +        ? (key: any, value: any) => childElement.setAttribute(key, value) +        // @ts-ignore +        : (key: any, value: any) => childElement[key] = value +      const cancelAttributes = Object.entries(attributes).map(([key, value]) => {        if (isRx<AttributeValue>(value)) { -        return rxRun(state, value, newValue => setAttribute(state, childElement, key, newValue)) +        return rxRun(state, value, newValue => setAttribute(state, setAttr, element, key, newValue))        } else { -        setAttribute(state, childElement, key, value) +        setAttribute(state, setAttr, element, key, value)        }      }) @@ -647,6 +657,11 @@ function appendChild(state: State, element: Element, child: Html, lastAdded?: No    }  } +const svgElements = ['svg', 'circle', 'polygon', 'line', 'rect', 'ellipse', 'text'] +function isSvg(tagName: string): boolean { +    return !(svgElements.indexOf(tagName) === -1) +} +  function isTag<A>(x: any): x is Tag {    return x !== undefined && x.type === "Tag"  } @@ -683,26 +698,22 @@ function appendNode(base: Element, node: Node, lastAdded?: Node) {    }  } -function setAttribute(state: State, element: Element, key: string, attribute: AttributeValue) { +function setAttribute(state: State, setAttr: (key: any, value: any) => void, element: Element, key: string, attribute: AttributeValue) {    if (attribute === undefined) {      // Do nothing    } else if (attribute === true) { -    // @ts-ignore -    element[key] = 'true' +    setAttr(key, 'true')    } else if (attribute === false) {      // @ts-ignore      if (key in element) { -      // @ts-ignore -      element[key] = false +      setAttr(key, false)      }    } else if (typeof attribute === "number") { -    // @ts-ignore -    element[key] = attribute.toString() +    setAttr(key, attribute.toString())    } else if (typeof attribute === "string") { -    // @ts-ignore -    element[key] = attribute +    setAttr(key, attribute)    } else {      // @ts-ignore -    element[key] = (event: Event) => attribute(event) +    setAttr(key, (event: Event) => attribute(event))    }  }  | 
