import { spread } from "@storyteller/framework"; import { match } from "@storyteller/utility"; import { LitElement, TemplateResult, html, nothing, unsafeCSS } from "lit"; import { customElement, property } from "lit/decorators.js"; import { unsafeSVG } from "lit/directives/unsafe-svg.js"; import farCrosshairs from "@fortawesome/fontawesome-pro/svgs/regular/crosshairs.svg?raw"; import farVideo from "@fortawesome/fontawesome-pro/svgs/regular/video.svg?raw"; import fasCircleQuestion from "@fortawesome/fontawesome-pro/svgs/solid/circle-question.svg?raw"; import fasKey from "@fortawesome/fontawesome-pro/svgs/solid/key.svg?raw"; import farCube from "@fortawesome/fontawesome-pro/svgs/regular/cube.svg?raw"; import farGlobe from "@fortawesome/fontawesome-pro/svgs/regular/globe.svg?raw"; import farUpDownLeftRight from "@fortawesome/fontawesome-pro/svgs/regular/arrows-up-down-left-right.svg?raw"; import fasPlay from "@fortawesome/fontawesome-pro/svgs/solid/play.svg?raw"; import fasPause from "@fortawesome/fontawesome-pro/svgs/solid/pause.svg?raw"; import fasFwdStep from "@fortawesome/fontawesome-pro/svgs/solid/forward-step.svg?raw"; import fasFwdFast from "@fortawesome/fontawesome-pro/svgs/solid/forward-fast.svg?raw"; import fasBwdStep from "@fortawesome/fontawesome-pro/svgs/solid/backward-step.svg?raw"; import fasBwdFast from "@fortawesome/fontawesome-pro/svgs/solid/backward-fast.svg?raw"; import fasQuestion from "@fortawesome/fontawesome-pro/svgs/solid/question.svg?raw"; import farRotate from "@fortawesome/fontawesome-pro/svgs/regular/arrows-rotate.svg?raw"; import farScale from "@fortawesome/fontawesome-pro/svgs/regular/arrow-up-right-and-arrow-down-left-from-center.svg?raw"; import fasCaretRight from "@fortawesome/fontawesome-pro/svgs/solid/caret-right.svg?raw"; import fasFloppyDisk from "@fortawesome/fontawesome-pro/svgs/solid/floppy-disk.svg?raw"; import farSkeleton from "@fortawesome/fontawesome-pro/svgs/regular/skeleton.svg?raw"; import farBone from "@fortawesome/fontawesome-pro/svgs/regular/bone.svg?raw"; import fasBrightness from "@fortawesome/fontawesome-pro/svgs/solid/brightness.svg?raw"; import fasCheck from "@fortawesome/fontawesome-pro/svgs/solid/check.svg?raw"; import fasXmark from "@fortawesome/fontawesome-pro/svgs/solid/xmark.svg?raw"; import fasCircleCheck from "@fortawesome/fontawesome-pro/svgs/solid/circle-check.svg?raw"; import fasCircleXmark from "@fortawesome/fontawesome-pro/svgs/solid/circle-xmark.svg?raw"; import fasMinus from "@fortawesome/fontawesome-pro/svgs/solid/minus.svg?raw"; import fasListTree from "@fortawesome/fontawesome-pro/svgs/solid/list-tree.svg?raw"; import fasBars from "@fortawesome/fontawesome-pro/svgs/solid/bars.svg?raw"; import fasPlusLarge from "@fortawesome/fontawesome-pro/svgs/solid/plus-large.svg?raw"; import farFileImport from "@fortawesome/fontawesome-pro/svgs/regular/file-import.svg?raw"; import farPhotoFilmMusic from "@fortawesome/fontawesome-pro/svgs/regular/photo-film-music.svg?raw"; import fasChevronDown from "@fortawesome/fontawesome-pro/svgs/solid/chevron-down.svg?raw"; import farVolume from "@fortawesome/fontawesome-pro/svgs/regular/volume.svg?raw"; import farFilm from "@fortawesome/fontawesome-pro/svgs/regular/film.svg?raw"; import fasPersonRunning from "@fortawesome/fontawesome-pro/svgs/solid/person-running.svg?raw"; import farMountainSun from "@fortawesome/fontawesome-pro/svgs/regular/mountain-sun.svg?raw"; import farArrowRightToBracket from "@fortawesome/fontawesome-pro/svgs/regular/arrow-right-to-bracket.svg?raw"; import farMagnifyingGlass from "@fortawesome/fontawesome-pro/svgs/regular/magnifying-glass.svg?raw"; import fasHouse from "@fortawesome/fontawesome-pro/svgs/solid/house.svg?raw"; import customCylinder from "../assets/icons/cylinder.svg?raw"; import customSphere from "../assets/icons/sphere.svg?raw"; import customTorus from "../assets/icons/torus.svg?raw"; import styles from "./icon.element.scss?inline"; @customElement("sts-icon") export class IconElement extends LitElement { static override styles = unsafeCSS(styles); @property() icon = ""; protected override render = () => html` `; } const RENDER_RESULTS = new Map(); function renderSvg(iconId: string) { if (RENDER_RESULTS.has(iconId)) return RENDER_RESULTS.get(iconId)!; const svgSrc = match (iconId, { "bars": () => fasBars, "bone": () => farBone, "bwd-fast": () => fasBwdFast, "bwd-step": () => fasBwdStep, "caret-right": () => fasCaretRight, "check": () => fasCheck, "chevron-down": () => fasChevronDown, "circle-check": () => fasCircleCheck, "circle-question": () => fasCircleQuestion, "circle-xmark": () => fasCircleXmark, "crosshairs": () => farCrosshairs, "cube": () => farCube, "cylinder": () => customCylinder, "figure": () => fasPersonRunning, "file-import": () => farFileImport, "film": () => farFilm, "floppy-disk": () => fasFloppyDisk, "fwd-fast": () => fasFwdFast, "fwd-step": () => fasFwdStep, "home": () => fasHouse, "import": () => farArrowRightToBracket, "key": () => fasKey, "light": () => fasBrightness, "list-tree": () => fasListTree, "minus": () => fasMinus, "globe": () => farGlobe, "photo-film-music": () => farPhotoFilmMusic, "play": () => fasPlay, "pause": () => fasPause, "plus-large": () => fasPlusLarge, "question": () => fasQuestion, "rotate": () => farRotate, "scale": () => farScale, "scene": () => farMountainSun, "search": () => farMagnifyingGlass, "skeleton": () => farSkeleton, "sphere": () => customSphere, "torus": () => customTorus, "up-down-left-right": () => farUpDownLeftRight, "video": () => farVideo, "volume": () => farVolume, "xmark": () => fasXmark, _: () => null, }); if (!svgSrc) return nothing; const [, attrsString, body] = svgSrc.match(/(.+?)<\/svg>/s)!; const attrs = Object.fromEntries( Array.from(attrsString.matchAll(/([-:_a-zA-Z0-9]+)(?:=['"]?([^'"]*)['"]?)/g)) .map(([, attr, value]) => [attr, value]) ); const result = html` ${unsafeSVG(body)} `; RENDER_RESULTS.set(iconId, result); return result; }