import React, { useState } from "react"; import ReactDOM from "react-dom"; import _SvgVocabulary from "./svg-vocabulary.json"; import type { SvgSymbolData, SvgSymbolElement } from "./vocabulary"; const APP_ID = "app"; const appEl = document.getElementById(APP_ID); const SvgVocabulary: SvgSymbolData[] = _SvgVocabulary as any; const STROKE_REPLACEMENT_COLOR = "#000000"; const FILL_REPLACEMENT_COLOR = "#ffffff"; if (!appEl) { throw new Error(`Unable to find #${APP_ID}!`); } type SvgSymbolContext = { stroke: string; fill: string; }; type SvgSymbolProps = { data: SvgSymbolData; scale?: number; } & SvgSymbolContext; const px = (value: number) => `${value}px`; function reactifySvgSymbolElement( ctx: SvgSymbolContext, el: SvgSymbolElement, key: number ): JSX.Element { let { fill, stroke } = el.props; if (fill === STROKE_REPLACEMENT_COLOR) { // The fill represents a "shadow" area, so use our stroke color here. fill = ctx.stroke; } else if (fill === FILL_REPLACEMENT_COLOR) { fill = ctx.fill; } if (stroke === STROKE_REPLACEMENT_COLOR) { stroke = ctx.stroke; } return React.createElement( el.tagName, { ...el.props, id: undefined, fill, stroke, key, }, el.children.map(reactifySvgSymbolElement.bind(null, ctx)) ); } const SvgSymbol: React.FC = (props) => { const d = props.data; const scale = props.scale || 1; return ( {props.data.layers.map(reactifySvgSymbolElement.bind(null, props))} ); }; const App: React.FC<{}> = () => { const [stroke, setStroke] = useState("#000000"); const [fill, setFill] = useState("#ffffff"); return ( <>

Mythic Symbolic Vocabulary

setStroke(e.target.value)} id="stroke" />{" "} setFill(e.target.value)} id="fill" />

{SvgVocabulary.map((symbolData) => (
{symbolData.name}
))} ); }; ReactDOM.render(, appEl);