diff --git a/packages/common/package.json b/packages/common/package.json index e69e99d115be452ecfa4e2b6a65241e4d3b86f9e..9eb45ee185ba10bc2f3696e5b43f847a3fdbe7ac 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -32,7 +32,6 @@ "@sentry/browser": "^5.6.3", "bulma": "^0.7.5", "i18next": "^17.0.11", - "lit-element": "^2.2.1", - "material-design-icons-svg": "^3.0.0" + "lit-element": "^2.2.1" } } diff --git a/packages/common/rollup.config.js b/packages/common/rollup.config.js index df03bbdc45b68b63bb4e92e15a59f4c3b1da40c4..be3234b91424e106bebb8e515dcd8cc1c83172b6 100644 --- a/packages/common/rollup.config.js +++ b/packages/common/rollup.config.js @@ -45,7 +45,7 @@ export default { copy({ targets: [ {src: 'assets/index.html', dest: 'dist'}, - {src: 'node_modules/material-design-icons-svg/paths/*.json', dest: 'dist/local/' + pkg.name + '/icons'}, + {src: 'assets/icons/*.svg', dest: 'dist/local/' + pkg.name + '/icons'}, ], }), (process.env.ROLLUP_WATCH === 'true') ? serve({contentBase: 'dist', host: '127.0.0.1', port: 8002}) : false diff --git a/packages/common/vpu-common-demo.js b/packages/common/vpu-common-demo.js index 304138331fa21f4f916b986612e1ada34d552ae1..60d4c96e468e9ed552f54d7765bc45d2a7d87cf8 100644 --- a/packages/common/vpu-common-demo.js +++ b/packages/common/vpu-common-demo.js @@ -1,9 +1,9 @@ import {i18n} from './i18n.js'; -import {css, html} from 'lit-element'; +import {css, html, unsafeCSS} from 'lit-element'; import * as commonUtils from './utils.js'; import './vpu-mini-spinner.js'; import './vpu-spinner.js'; -import './vpu-icon.js'; +import {getIconCSS} from './vpu-icon.js'; import './vpu-button.js'; import VPULitElement from './vpu-lit-element.js'; import bulmaCSSPath from "bulma/css/bulma.min.css"; @@ -35,6 +35,10 @@ class VpuCommonDemo extends VPULitElement { return css` h1.title {margin-bottom: 1em;} div.container {margin-bottom: 1.5em;} + + a:after { + ${ unsafeCSS(getIconCSS('bolt')) }; + } `; } @@ -80,11 +84,12 @@ class VpuCommonDemo extends VPULitElement { <div class="container"> <label class="label">Icons</label> <div class="control"> - <vpu-icon name="access-point-network-off"></vpu-icon> - <vpu-icon style="color: green"></vpu-icon> - <vpu-icon style="color: red"></vpu-icon> - <vpu-icon style="color: blue"></vpu-icon> - <vpu-icon style="color: orange" name="menu-down"></vpu-icon> + <p style="text-decoration: underline">Foo <vpu-icon name="cloudnetwork"></vpu-icon> bar</p> + <p style="font-size: 2em;">Foo <vpu-icon name="cloudnetwork"></vpu-icon> bar</p> + <p style="font-size: 2em; color: orange">Foo <vpu-icon name="cloudnetwork"></vpu-icon> bar</p> + <span style="background-color: #000"><a href="#" style=" color: #fff">foobar</a></span> + <br> + <vpu-icon style="color: green; height: 50px; border: #000 solid 1px"></vpu-icon> </div> </div> <div class="container"> diff --git a/packages/common/vpu-icon.js b/packages/common/vpu-icon.js index 2d2d3218355d4b19d919131053fb980ba2f06768..e3c2ed11467d346ab56153e5ad19a830205f721a 100644 --- a/packages/common/vpu-icon.js +++ b/packages/common/vpu-icon.js @@ -1,21 +1,64 @@ import {html, LitElement, css} from 'lit-element'; +import {unsafeHTML} from 'lit-html/directives/unsafe-html.js'; import {until} from 'lit-html/directives/until.js'; import * as commonUtils from './utils.js'; +// Use in case the icon fails to load +const errorIcon = ` +<svg version="1.1" id="Layer_2_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve"> +<g> + <path d="M38.2,98.7c-1.1,0-2.2-0.6-2.8-1.6c-0.5-0.8-0.6-1.8-0.3-2.6l8.9-37.8H24.5c-1.2,0-2.2-0.6-2.8-1.5c-0.6-1-0.7-2.2-0.1-3.2 + l0.2-0.3L54.9,3.1c0.9-1.6,2.3-1.8,2.8-1.8c1.1,0,2.2,0.6,2.8,1.6c0.5,0.8,0.6,1.7,0.3,2.6l-6.9,30.4L75.6,36 + c1.1,0,2.2,0.6,2.8,1.5c0.6,1,0.7,2.2,0.1,3.2l-0.2,0.3L40.8,97.4l-0.2,0.2C40.3,97.9,39.5,98.7,38.2,98.7z M28.6,51.2h18.1 + c1.8,0,3.2,1.5,3.2,3.4v0.3l-6.8,29l28.2-42.4l-20.3-0.1c-1.8,0-3.2-1.5-3.2-3.4v-0.3l5-21.9L28.6,51.2z M75.5,41.5 + C75.5,41.5,75.5,41.5,75.5,41.5L75.5,41.5z M51.1,35.9L51.1,35.9C51.2,35.9,51.1,35.9,51.1,35.9z"/> +</g> +</svg> +`; + +function getIconSVGURL(name) { + return commonUtils.getAssetURL('local/vpu-common/icons/' + encodeURI(name) + '.svg'); +} + +export function getIconCSS(name) { + const iconURL = getIconSVGURL(name); + return ` + background-color: currentColor; + mask-image: url(${ iconURL }); + -webkit-mask-image: url(${ iconURL }); + mask-size: contain; + mask-repeat: no-repeat; + mask-position: center center; + font-size: 1.1em; + content: "X"; + `; +} + +async function getSVGTextElement(name) { + const iconURL = getIconSVGURL(name); + const response = await fetch(iconURL); + if (!response.ok) { + return unsafeHTML(errorIcon); + } + let text = await response.text(); + if (text.indexOf('<svg') !== -1) + text = text.slice(text.indexOf('<svg')); + return unsafeHTML(text); +} + /** * For icon names see https://materialdesignicons.com/ */ class Icon extends LitElement { constructor() { super(); - this.name = "alert-circle"; - this.color = "black"; + this.name = "bolt"; } static get properties() { return { name: { type: String }, - color: { type: String }, }; } @@ -24,33 +67,26 @@ class Icon extends LitElement { :host { display: inline-block; height: 1em; - width: 1em; + top: .125em; + position: relative; + } + + svg { + height: 100%; + } + + svg path { + fill: currentColor; } `; } render() { - let iconPath = commonUtils.getAssetURL('local/vpu-common/icons/' + this.name + '.json'); - let svgPath = fetch(iconPath) - .then(response => { - if (!response.ok) { - console.error("Failed to load icon: " + this.name); - return "M0,0H24V24H0"; - } - return response.json(); - }); + let svg = getSVGTextElement(this.name); + let placeholder = unsafeHTML('<svg></svg>'); return html` - <style> - :host path { - fill: currentColor; - } - </style> - - <svg aria-labelledby="title" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="pointer-events: none; display: block; width: 100%; height: 100%;"> - <title id="title">${this.name}</title> - <path d=${until(svgPath)} /> - </svg> + ${until(svg, placeholder)} `; } }