Home Assistant Git Exporter
This commit is contained in:
@@ -0,0 +1,292 @@
|
||||
/*!
|
||||
* SVGInjector v2.1.5 - Fast, caching, dynamic inline SVG DOM injection library
|
||||
* https://github.com/flobacher/SVGInjector2
|
||||
* forked from:
|
||||
* https://github.com/iconic/SVGInjector
|
||||
*
|
||||
* Copyright (c) 2015 flobacher <flo@digital-fuse.net>
|
||||
* @license MIT
|
||||
*
|
||||
* original Copyright (c) 2014 Waybury <hello@waybury.com>
|
||||
* @license MIT
|
||||
*/
|
||||
! function(e, t) {
|
||||
"use strict";
|
||||
var r = function() {
|
||||
function r(e) {
|
||||
r.instanceCounter++, this.init(e)
|
||||
}
|
||||
var n, i, s, l, a, o, c, u, f, p, d, v, g, m, h, b, y, S, A, C, x, k, N, w, j, E, I, F, T, G, V = "http://www.w3.org/2000/svg",
|
||||
O = "http://www.w3.org/1999/xlink",
|
||||
q = ["sprite"];
|
||||
return s = [], r.instanceCounter = 0, r.prototype.init = function(r) {
|
||||
r = r || {}, n = {}, o = {}, o.isLocal = "file:" === e.location.protocol, o.hasSvgSupport = t.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"), i = {
|
||||
count: 0,
|
||||
elements: []
|
||||
}, l = {}, a = {}, a.evalScripts = r.evalScripts || "always", a.pngFallback = r.pngFallback || !1, a.svgFallbackDir = r.svgFallbackDir || !1, a.onlyInjectVisiblePart = r.onlyInjectVisiblePart || !0, a.keepStylesClass = void 0 === r.keepStylesClass ? "" : r.keepStylesClass, a.spriteClassName = void 0 === r.spriteClassName ? "sprite" : r.spriteClassName, a.spriteClassIdName = void 0 === r.spriteClassIdName ? "sprite--" : r.spriteClassIdName, a.removeStylesClass = void 0 === r.removeStylesClass ? "icon" : r.removeStylesClass, a.removeAllStyles = void 0 !== r.removeAllStyles && r.removeAllStyles, a.fallbackClassName = void 0 === r.fallbackClassName ? q : r.fallbackClassName, a.prefixStyleTags = void 0 === r.prefixStyleTags || r.prefixStyleTags, a.spritesheetURL = void 0 !== r.spritesheetURL && "" !== r.spritesheetURL && r.spritesheetURL, a.prefixFragIdClass = a.spriteClassIdName, a.forceFallbacks = void 0 !== r.forceFallbacks && r.forceFallbacks, a.forceFallbacks && (o.hasSvgSupport = !1), x(t.querySelector("html"), "no-svg", o.hasSvgSupport), o.hasSvgSupport && void 0 === r.removeStylesClass && C(a.removeStylesClass)
|
||||
}, r.prototype.inject = function(e, t, r) {
|
||||
if (void 0 !== e.length)
|
||||
if (0 === e.length) t && t(0);
|
||||
else {
|
||||
var n = 0,
|
||||
i = this;
|
||||
I.call(e, function(s) {
|
||||
i.injectElement(s, function(i) {
|
||||
r && "function" == typeof r && r(i), t && e.length === ++n && t(n)
|
||||
})
|
||||
})
|
||||
}
|
||||
else e ? this.injectElement(e, function(n) {
|
||||
r && "function" == typeof r && r(n), t && t(1), e = null
|
||||
}) : t && t(0)
|
||||
}, G = r.prototype.injectElement = function(e, t) {
|
||||
var r, n = e.getAttribute("data-src") || e.getAttribute("src");
|
||||
if (!n) {
|
||||
if (!a.spritesheetURL) return;
|
||||
if ("" === (r = h(e))) return;
|
||||
n = a.spritesheetURL + "#" + r
|
||||
}
|
||||
e.setAttribute("data-src", n);
|
||||
var s = n.split("#");
|
||||
1 === s.length && s.push("");
|
||||
var l;
|
||||
if (!/\.svg/i.test(n)) return void t("Attempted to inject a file with a non-svg extension: " + n);
|
||||
if (!o.hasSvgSupport) {
|
||||
var f = e.getAttribute("data-fallback") || e.getAttribute("data-png");
|
||||
return void(f ? (e.setAttribute("src", f), t(null)) : a.pngFallback ? (s.length > 1 && s[1] ? (l = s[1] + ".png", j(a.fallbackClassName) ? c(e, s[1], a.fallbackClassName) : w(a.fallbackClassName) ? a.fallbackClassName(e, s[1]) : "string" == typeof a.fallbackClassName ? E(e, a.fallbackClassName) : e.setAttribute("src", a.pngFallback + "/" + l)) : (l = n.split("/").pop().replace(".svg", ".png"), e.setAttribute("src", a.pngFallback + "/" + l)), t(null)) : t("This browser does not support SVG and no PNG fallback was defined."))
|
||||
}
|
||||
j(a.fallbackClassName) && u(e, s[1], a.fallbackClassName), -1 === i.elements.indexOf(e) && (i.elements.push(e), A(t, n, e))
|
||||
}, r.prototype.getEnv = function() {
|
||||
return o
|
||||
}, r.prototype.getConfig = function() {
|
||||
return a
|
||||
}, c = function(e, t, r) {
|
||||
var n = void 0 === r ? q : r.slice(0);
|
||||
I.call(n, function(e, r) {
|
||||
n[r] = e.replace("%s", t)
|
||||
}), E(e, n)
|
||||
}, u = function(e, t, r) {
|
||||
r = void 0 === r ? q.slice(0) : r.slice(0);
|
||||
var n, i, s = e.getAttribute("class");
|
||||
void 0 !== s && null !== s && (i = s.split(" ")) && (I.call(r, function(e) {
|
||||
e = e.replace("%s", t), (n = i.indexOf(e)) >= 0 && (i[n] = "")
|
||||
}), e.setAttribute("class", N(i.join(" "))))
|
||||
}, p = function(e, t, r, n) {
|
||||
var i = 0;
|
||||
return e.textContent = e.textContent.replace(/url\(('|")*#.+('|")*(?=\))/g, function(e) {
|
||||
return i++, e + "-" + t
|
||||
}), i
|
||||
}, f = function(e, t) {
|
||||
var r, n, i, s, l, a, o, c, u, f, p, d, v, g, m, h, b = [
|
||||
// {
|
||||
// def: "linearGradient",
|
||||
// attrs: ["fill", "stroke"]
|
||||
// },
|
||||
{
|
||||
def: "radialGradient",
|
||||
attrs: ["fill", "stroke"]
|
||||
}, {
|
||||
def: "clipPath",
|
||||
attrs: ["clip-path"]
|
||||
}, {
|
||||
def: "mask",
|
||||
attrs: ["mask"]
|
||||
}, {
|
||||
def: "filter",
|
||||
attrs: ["filter"]
|
||||
}, {
|
||||
def: "color-profile",
|
||||
attrs: ["color-profile"]
|
||||
}, {
|
||||
def: "cursor",
|
||||
attrs: ["cursor"]
|
||||
}, {
|
||||
def: "marker",
|
||||
attrs: ["marker", "marker-start", "marker-mid", "marker-end"]
|
||||
}];
|
||||
I.call(b, function(b) {
|
||||
for (n = e.querySelectorAll(b.def + "[id]"), s = 0, i = n.length; s < i; s++) {
|
||||
for (r = n[s].id + "-" + t, c = b.attrs, f = 0, u = c.length; f < u; f++)
|
||||
for (l = e.querySelectorAll("[" + c[f] + '="url(#' + n[s].id + ')"]'), o = 0, a = l.length; o < a; o++) l[o].setAttribute(c[f], "url(#" + r + ")");
|
||||
for (p = e.querySelectorAll("[*|href]"), g = [], v = 0, d = p.length; v < d; v++) p[v].getAttributeNS(O, "href").toString() === "#" + n[s].id && g.push(p[v]);
|
||||
for (h = 0, m = g.length; h < m; h++) g[h].setAttributeNS(O, "href", "#" + r);
|
||||
n[s].id = r
|
||||
}
|
||||
})
|
||||
}, d = function(e, t, r) {
|
||||
var n;
|
||||
void 0 === r && (r = ["id", "viewBox"]);
|
||||
for (var i = 0; i < e.attributes.length; i++) n = e.attributes.item(i), r.indexOf(n.name) < 0 && t.setAttribute(n.name, n.value)
|
||||
}, v = function(e) {
|
||||
var r = t.createElementNS(V, "svg");
|
||||
return I.call(e.childNodes, function(e) {
|
||||
r.appendChild(e.cloneNode(!0))
|
||||
}), d(e, r), r
|
||||
}, g = function(e, t, r) {
|
||||
var n, i, s, l, a, o, c = r.getAttribute("data-src").split("#"),
|
||||
u = e.textContent,
|
||||
f = "",
|
||||
p = function(e, t, r) {
|
||||
r[t] = "." + s + " " + e
|
||||
};
|
||||
if (c.length > 1) i = c[1], s = i + "-" + t, n = new RegExp("\\." + i + " ", "g"), e.textContent = u.replace(n, "." + s + " ");
|
||||
else {
|
||||
for (l = c[0].split("/"), s = l[l.length - 1].replace(".svg", "") + "-" + t, n = new RegExp("([\\s\\S]*?){([\\s\\S]*?)}", "g"); null !== (a = n.exec(u));) {
|
||||
o = a[1].trim().split(", "), o.forEach(p);
|
||||
f += o.join(", ") + "{" + a[2] + "}\n"
|
||||
}
|
||||
e.textContent = f
|
||||
}
|
||||
r.setAttribute("class", r.getAttribute("class") + " " + s)
|
||||
}, m = function(e) {
|
||||
var t = e.getAttribute("class");
|
||||
return t ? t.trim().split(" ") : []
|
||||
}, h = function(e) {
|
||||
var t = m(e),
|
||||
r = "";
|
||||
return I.call(t, function(e) {
|
||||
e.indexOf(a.spriteClassIdName) >= 0 && (r = e.replace(a.spriteClassIdName, ""))
|
||||
}), r
|
||||
}, b = function(e, t, r) {
|
||||
var n, i, s, l, a, o, c = null,
|
||||
u = !1,
|
||||
f = !1,
|
||||
p = null;
|
||||
if (void 0 === r) n = c = t.cloneNode(!0), c.getAttribute("width") || t.getAttribute("width") || (f = !0);
|
||||
else if (!(n = t.getElementById(r))) return;
|
||||
if (s = n.getAttribute("viewBox"), i = s.split(" "), !c) {
|
||||
if (n instanceof SVGSymbolElement) c = v(n), f = u = !0;
|
||||
else if (n instanceof SVGViewElement) {
|
||||
if (p = null, e.onlyInjectVisiblePart) {
|
||||
var d = '*[width="' + i[2] + '"][height="' + i[3] + '"]';
|
||||
l = {}, 0 === Math.abs(parseInt(i[0])) ? d += ":not([x])" : (l.x = i[0], d += '[x="' + i[0] + '"]'), 0 === Math.abs(parseInt(i[1])) ? d += ":not([y])" : (l.y = i[1], d += '[y="' + i[1] + '"]'), o = t.querySelectorAll(d), o.length, p = o[0]
|
||||
}
|
||||
if (p && p instanceof SVGSVGElement) {
|
||||
c = p.cloneNode(!0);
|
||||
for (var g in l) "width" !== g && "height" !== g && c.removeAttribute(g)
|
||||
} else if (p && p instanceof SVGUseElement) {
|
||||
var h = t.getElementById(p.getAttributeNS(O, "href").substr(1));
|
||||
c = v(h), s = h.getAttribute("viewBox"), i = s.split(" "), f = u = !0
|
||||
} else f = u = !0, c = t.cloneNode(!0)
|
||||
}
|
||||
a = m(c);
|
||||
var b = e.prefixFragIdClass + r;
|
||||
a.indexOf(b) < 0 && (a.push(b), c.setAttribute("class", a.join(" ")))
|
||||
}
|
||||
return u && c.setAttribute("viewBox", i.join(" ")), f && (c.setAttribute("width", i[2] + "px"), c.setAttribute("height", i[3] + "px")), c.setAttribute("xmlns", V), c.setAttribute("xmlns:xlink", O), c
|
||||
}, y = function(e, t, r, n) {
|
||||
s[e] = s[e] || [], s[e].push({
|
||||
callback: r,
|
||||
fragmentId: t,
|
||||
element: n,
|
||||
name: name
|
||||
})
|
||||
}, S = function(e) {
|
||||
for (var t, r = 0, n = s[e].length; r < n; r++) ! function(r) {
|
||||
setTimeout(function() {
|
||||
t = s[e][r], k(e, t.fragmentId, t.callback, t.element, t.name)
|
||||
}, 0)
|
||||
}(r)
|
||||
}, A = function(t, r, i) {
|
||||
var s, l, a, c, u;
|
||||
if (s = r.split("#"), l = s[0], a = 2 === s.length ? s[1] : void 0, void 0 !== a && (u = l.split("/"), c = u[u.length - 1].replace(".svg", "")), void 0 !== n[l]) n[l] instanceof SVGSVGElement ? k(l, a, t, i, c) : y(l, a, t, i, c);
|
||||
else {
|
||||
if (!e.XMLHttpRequest) return t("Browser does not support XMLHttpRequest"), !1;
|
||||
n[l] = {}, y(l, a, t, i, c);
|
||||
var f = new XMLHttpRequest;
|
||||
f.onreadystatechange = function() {
|
||||
if (4 === f.readyState) {
|
||||
if (404 === f.status || null === f.responseXML) return t("Unable to load SVG file: " + l), !1;
|
||||
if (!(200 === f.status || o.isLocal && 0 === f.status)) return t("There was a problem injecting the SVG: " + f.status + " " + f.statusText), !1;
|
||||
if (f.responseXML instanceof Document) n[l] = f.responseXML.documentElement;
|
||||
else if (DOMParser && DOMParser instanceof Function) {
|
||||
var e;
|
||||
try {
|
||||
var i = new DOMParser;
|
||||
e = i.parseFromString(f.responseText, "text/xml")
|
||||
} catch (t) {
|
||||
e = void 0
|
||||
}
|
||||
if (!e || e.getElementsByTagName("parsererror").length) return t("Unable to parse SVG file: " + r), !1;
|
||||
n[l] = e.documentElement
|
||||
}
|
||||
S(l)
|
||||
}
|
||||
}, f.open("GET", l), f.overrideMimeType && f.overrideMimeType("text/xml"), f.send()
|
||||
}
|
||||
}, C = function(e) {
|
||||
var r = "svg." + e + " {fill: currentColor;}",
|
||||
n = t.head || t.getElementsByTagName("head")[0],
|
||||
i = t.createElement("style");
|
||||
i.type = "text/css", i.styleSheet ? i.styleSheet.cssText = r : i.appendChild(t.createTextNode(r)), n.appendChild(i)
|
||||
}, x = function(e, t, r) {
|
||||
r ? e.className.replace(t, "") : e.className += " " + t
|
||||
}, k = function(t, r, s, o, c) {
|
||||
var u, v, h, y, S, A, C, x;
|
||||
if (void 0 === (u = b(a, n[t], r)) || "string" == typeof u) return S = o.getAttribute("data-fallback-svg"), S = !(!S && !a.svgFallbackDir) && a.svgFallbackDir + "/" + r + ".svg", S ? (o.setAttribute("data-src", S), i.elements.splice(i.elements.indexOf(o), 1), G(o, s)) : s(u), !1;
|
||||
u.setAttribute("role", "img"), I.call(u.children || [], function(e) {
|
||||
e instanceof SVGDefsElement || e instanceof SVGTitleElement || e instanceof SVGDescElement || e.setAttribute("role", "presentation")
|
||||
}), y = o.getAttribute("aria-hidden") || u.getAttribute("aria-hidden"), y ? (u.setAttribute("aria-hidden", "true"), C = u.querySelector("title"), x = u.querySelector("desc"), C && u.removeChild(C), x && u.removeChild(x)) : (h = F("desc", u, o, r, !1), v = F("title", u, o, r, !1), (h.length > 0 || v.length > 0) && (A = v + " " + h, u.setAttribute("aria-labelledby", A.trim()))), d(o, u, ["class"]);
|
||||
var k = [].concat(u.getAttribute("class") || [], "injected-svg", o.getAttribute("class") || []).join(" ");
|
||||
u.setAttribute("class", N(k)), f(u, i.count, c), u.removeAttribute("xmlns:a");
|
||||
for (var w, j, E = u.querySelectorAll("script"), T = [], V = 0, O = E.length; V < O; V++)(j = E[V].getAttribute("type")) && "application/ecmascript" !== j && "application/javascript" !== j || (w = E[V].innerText || E[V].textContent, T.push(w), u.removeChild(E[V]));
|
||||
if (T.length > 0 && ("always" === a.evalScripts || "once" === a.evalScripts && !l[t])) {
|
||||
for (var q = 0, L = T.length; q < L; q++) new Function(T[q])(e);
|
||||
l[t] = !0
|
||||
}
|
||||
var M = u.querySelectorAll("style");
|
||||
I.call(M, function(e) {
|
||||
var t = m(u),
|
||||
r = !0;
|
||||
(t.indexOf(a.removeStylesClass) >= 0 || a.removeAllStyles) && t.indexOf(a.keepStylesClass) < 0 ? e.parentNode.removeChild(e) : (p(e, i.count, u, c) > 0 && (r = !1), a.prefixStyleTags && (g(e, i.count, u, c), r = !1), r && (e.textContent += ""))
|
||||
}), o.parentNode?.replaceChild(u, o), delete i.elements[i.elements.indexOf(o)], i.count++, s(u)
|
||||
}, N = function(e) {
|
||||
e = e.split(" ");
|
||||
for (var t = {}, r = e.length, n = []; r--;) t.hasOwnProperty(e[r]) || (t[e[r]] = 1, n.unshift(e[r]));
|
||||
return n.join(" ")
|
||||
}, w = function(e) {
|
||||
return !!(e && e.constructor && e.call && e.apply)
|
||||
}, j = function(e) {
|
||||
return "[object Array]" === Object.prototype.toString.call(e)
|
||||
}, E = function(e, t) {
|
||||
var r = e.getAttribute("class");
|
||||
r = r || "", j(t) && (t = t.join(" ")), t = r + " " + t, e.setAttribute("class", N(t))
|
||||
}, I = Array.prototype.forEach || function(e, t) {
|
||||
if (void 0 === this || null === this || "function" != typeof e) throw new TypeError;
|
||||
var r, n = this.length >>> 0;
|
||||
for (r = 0; r < n; ++r) r in this && e.call(t, this[r], r, this)
|
||||
}, F = function(e, t, r, n, s) {
|
||||
var l, a = n ? n + "-" : "";
|
||||
return a += e + "-" + i.count, l = r.querySelector(e), l ? T(e, t, l.textContent, a, t.firstChild) : (l = t.querySelector(e), l ? l.setAttribute("id", a) : s ? T(e, t, n, a, t.firstChild) : a = ""), a
|
||||
}, T = function(e, r, n, i, s) {
|
||||
var l, a = r.querySelector(e);
|
||||
return l = t.createElementNS(V, e), l.appendChild(t.createTextNode(n)), l.setAttribute("id", i), r.insertBefore(l, s), a && a.parentNode.removeChild(a), l
|
||||
}, r
|
||||
}();
|
||||
"object" == typeof angular ? angular.module("svginjector", []).provider("svgInjectorOptions", function() {
|
||||
var e = {};
|
||||
return {
|
||||
set: function(t) {
|
||||
e = t
|
||||
},
|
||||
$get: function() {
|
||||
return e
|
||||
}
|
||||
}
|
||||
}).factory("svgInjectorFactory", ["svgInjectorOptions", function(e) {
|
||||
return new r(e)
|
||||
}]).directive("svg", ["svgInjectorFactory", function(e) {
|
||||
var t = e.getConfig();
|
||||
return {
|
||||
restrict: "E",
|
||||
link: function(r, n, i) {
|
||||
i.class && i.class.indexOf(t.spriteClassIdName) >= 0 ? i.$observe("class", function() {
|
||||
e.inject(n[0])
|
||||
}) : (i.dataSrc || i.src) && e.inject(n[0])
|
||||
}
|
||||
}
|
||||
}]) : "object" == typeof module && "object" == typeof module.exports ? module.exports = r : "function" == typeof define && define.amd ? define(function() {
|
||||
return r
|
||||
}) : "object" == typeof e && (e.SVGInjector = r)
|
||||
}(window, document);
|
||||
//# sourceMappingURL=./dist/svg-injector.map.js
|
||||
@@ -0,0 +1,704 @@
|
||||
#
|
||||
# File : sak-css-definitions.yaml
|
||||
# Project : Home Assistant
|
||||
# Repository: https://github.com/AmoebeLabs/Home-Assistant-Config
|
||||
#
|
||||
# Author: Mars @ AmoebeLabs.com
|
||||
#
|
||||
# License: CC BY-SA, https://creativecommons.org/licenses/by/4.0/
|
||||
#
|
||||
# -----
|
||||
# Description:
|
||||
# Swiss Army Knife CSS class definitions used to style tools
|
||||
#
|
||||
###############################################################################
|
||||
#sak_css_definitions:
|
||||
- descr: sak-overwrite
|
||||
content: >
|
||||
.sak-state__value {
|
||||
--descr: extra-css;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
#
|
||||
# Toolsets
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
- descr: Toolset
|
||||
content: >
|
||||
.toolset__group-outer {
|
||||
overflow: visible;
|
||||
/*filter: drop-shadow(0px 1px 1px rgba(0,0,0,0.8));*/
|
||||
/*filter: url(#shadow);*/
|
||||
}
|
||||
.toolset__group {
|
||||
overflow: visible;
|
||||
/*filter: drop-shadow(0px 1px 1px rgba(0,0,0,0.8));*/
|
||||
/*filter: url(#shadow);*/
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Tools in slphabetical order
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
- descr: ArcSlider tool
|
||||
content: >
|
||||
.sak-circslider__group-inner {
|
||||
pointer-events: none;
|
||||
}
|
||||
#as-thumb-group {
|
||||
overflow: visible;
|
||||
pointer-events: all;
|
||||
}
|
||||
#as-label {
|
||||
overflow: visible;
|
||||
}
|
||||
.sak-circslider {
|
||||
overflow: visible;
|
||||
fill: none;
|
||||
stroke: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
.sak-circslider__capture {
|
||||
overflow: visible;
|
||||
pointer-events: all;
|
||||
fill: none;
|
||||
stroke-width: 0;
|
||||
touch-action: manipulation;
|
||||
fill: grey;
|
||||
fill-opacity: 0.1;
|
||||
stroke-width: 0em;
|
||||
stroke: red;
|
||||
}
|
||||
.sak-circslider__active {
|
||||
stroke: var(--theme-sys-color-primary);
|
||||
stroke-width: 4em;
|
||||
pointer-events: all;
|
||||
}
|
||||
.sak-circslider__track {
|
||||
fill: none;
|
||||
stroke-width: 2em;
|
||||
stroke: var(--theme-sys-elevation-surface-neutral10);
|
||||
overflow: visible;
|
||||
pointer-events: all;
|
||||
}
|
||||
.sak-circslider__thumb {
|
||||
overflow: visible;
|
||||
fill: var(--theme-sys-color-primary);
|
||||
fill-opacity: 1;
|
||||
transform-origin: center;
|
||||
transform-box: fill-box;
|
||||
}
|
||||
.sak-circslider__value {
|
||||
overflow: visible;
|
||||
fill: var(--primary-text-color);
|
||||
font-size: 8em;
|
||||
font-weight: 400;
|
||||
dominant-baseline: central;
|
||||
pointer-events: none;
|
||||
}
|
||||
.sak-circslider__uom {
|
||||
overflow: visible;
|
||||
fill: var(--primary-text-color);
|
||||
text-anchor: middle;
|
||||
dominant-baseline: central;
|
||||
opacity: 0.7;
|
||||
letter-spacing: 0.05em;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
- descr: Area tool
|
||||
content: >
|
||||
.sak-area {
|
||||
}
|
||||
|
||||
.sak-area__area {
|
||||
font-size: 3em;
|
||||
fill: var(--primary-text-color);
|
||||
opacity: 0.8;
|
||||
text-anchor: middle;
|
||||
dominant-baseline: central;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
- descr: Badge tool
|
||||
content: >
|
||||
.sak-badge {
|
||||
}
|
||||
.sak-badge__left {
|
||||
stroke-width: 0;
|
||||
fill: grey;
|
||||
}
|
||||
.sak-badge__right {
|
||||
stroke-width: 0;
|
||||
fill: var(--theme-gradient-color-03, darkgrey);
|
||||
}
|
||||
|
||||
- descr: Barchart tool
|
||||
content: >
|
||||
.sak-barchart {
|
||||
}
|
||||
.sak-barchart__line {
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
|
||||
- descr: Circle tool
|
||||
content: >
|
||||
.sak-circle {
|
||||
}
|
||||
.sak-circle__circle {
|
||||
fill: var(--primary-background-color);
|
||||
}
|
||||
|
||||
- descr: Ellipse tool
|
||||
content: >
|
||||
.sak-ellipse {
|
||||
}
|
||||
.sak-ellipse__ellipse {
|
||||
fill: var(--primary-background-color);
|
||||
}
|
||||
|
||||
- descr: Horseshoe tool
|
||||
content: >
|
||||
.sak-horseshoe {
|
||||
}
|
||||
.sak-horseshoe__todo {
|
||||
}
|
||||
|
||||
- descr: Icon tool
|
||||
content: >
|
||||
.sak-icon {
|
||||
}
|
||||
.sak-icon__icon {
|
||||
--mdc-icon-size: 100%;
|
||||
align-self: center;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
fill: var(--primary-text-color);
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
|
||||
- descr: Line tool
|
||||
content: >
|
||||
.sak-line {
|
||||
overflow: visible;
|
||||
}
|
||||
.sak-line__line {
|
||||
stroke-linecap: round;
|
||||
stroke: var(--primary-text-color);
|
||||
opacity: 1.0;
|
||||
stroke-width: 2;
|
||||
}
|
||||
|
||||
- descr: Entity Name tool
|
||||
content: >
|
||||
.sak-name {
|
||||
overflow: visible;
|
||||
}
|
||||
.sak-name__name {
|
||||
font-size: 3em;
|
||||
fill: var(--primary-text-color);
|
||||
opacity: 1.0;
|
||||
text-anchor: middle;
|
||||
dominant-baseline: central;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
- descr: Polygon tool
|
||||
content: >
|
||||
.sak-polygon {
|
||||
overflow: visible;
|
||||
}
|
||||
.sak-polygon__regpoly {
|
||||
stroke: var(--primary-text-color);
|
||||
fill: var(--primary-background-color);
|
||||
fill-rule: nonzero;
|
||||
}
|
||||
|
||||
- descr: Rectangle tool
|
||||
content: >
|
||||
.sak-rectangle {
|
||||
overflow: visible;
|
||||
}
|
||||
.sak-rectangle__rectangle {
|
||||
stroke-linecap: round;
|
||||
stroke: var(--primary-text-color);
|
||||
opacity: 1.0;
|
||||
stroke-width: 2em;
|
||||
fill: var(--primary-background-color);
|
||||
}
|
||||
|
||||
- descr: RectEx tool
|
||||
content: >
|
||||
.sak-rectex {
|
||||
}
|
||||
.sak-rectex__rectex {
|
||||
stroke-linecap: round;
|
||||
stroke: var(--primary-text-color);
|
||||
opacity: 1.0;
|
||||
stroke-width: 0;
|
||||
fill: var(--primary-background-color);
|
||||
}
|
||||
|
||||
- descr: Segmented arc tool
|
||||
content: >
|
||||
.sak-segarc {
|
||||
}
|
||||
.sak-segarc__background {
|
||||
stroke-linecap: round;
|
||||
fill: var(--primary-background-color);
|
||||
stroke-width: 0;
|
||||
fill-rule: evenodd;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
.sak-segarc__foreground {
|
||||
stroke-linecap: round;
|
||||
fill: var(--primary-color);
|
||||
stroke: none;
|
||||
stroke-width: 0.5;
|
||||
fill-rule: evenodd;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
|
||||
- descr: Slider tool
|
||||
content: >
|
||||
#rs-thumb-group {
|
||||
overflow: visible;
|
||||
}
|
||||
#rs-label {
|
||||
overflow: visible;
|
||||
}
|
||||
.sak-slider {
|
||||
pointer-events: none;
|
||||
overflow: visible;
|
||||
}
|
||||
.sak-slider__capture {
|
||||
overflow: visible;
|
||||
pointer-events: all;
|
||||
fill: none;
|
||||
stroke-width: 0;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
.sak-slider__track {
|
||||
overflow: visible;
|
||||
fill-opacity: 0.38;
|
||||
stroke-width: 0;
|
||||
stroke: var(--primary-text-color);
|
||||
fill: var(--switch-unchecked-track-color);
|
||||
transition: all .5s ease;
|
||||
pointer-events: none;
|
||||
}
|
||||
.sak-slider__thumb {
|
||||
overflow: visible;
|
||||
--thumb-stroke: var(--secondary-text-color);
|
||||
stroke: var(--thumb-stroke);
|
||||
fill: var(--primary-background-color);
|
||||
pointer-events: none;
|
||||
}
|
||||
.sak-slider__value {
|
||||
overflow: visible;
|
||||
fill: var(--primary-text-color);
|
||||
font-size: 8em;
|
||||
font-weight: 400;
|
||||
transition: all .5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
pointer-events: none;
|
||||
dominant-baseline: central;
|
||||
}
|
||||
.sak-slider__uom {
|
||||
overflow: visible;
|
||||
fill: var(--primary-text-color);
|
||||
text-anchor: middle;
|
||||
dominant-baseline: central;
|
||||
opacity: 0.7;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
- descr: Entity state/units tool
|
||||
content: >
|
||||
.sak-state {
|
||||
}
|
||||
.sak-state__value {
|
||||
--descr: original;
|
||||
font-size: 3em;
|
||||
fill: var(--primary-text-color);
|
||||
opacity: 1.0;
|
||||
text-anchor: middle;
|
||||
dominant-baseline: central;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
.sak-state__uom {
|
||||
fill: var(--primary-text-color);
|
||||
text-anchor: middle;
|
||||
dominant-baseline: central;
|
||||
opacity: 0.7;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
- descr: Switch tool
|
||||
content: >
|
||||
.sak-switch {
|
||||
}
|
||||
.sak-switch__track {
|
||||
fill-opacity: 0.38;
|
||||
stroke-width: 0;
|
||||
stroke: var(--primary-text-color);
|
||||
fill: var(--primary-background-color);
|
||||
transition: all .5s ease;
|
||||
pointer-events: none;
|
||||
}
|
||||
.sak-switch__thumb {
|
||||
--thumb-stroke: var(--secondary-text-color);
|
||||
stroke: var(--thumb-stroke);
|
||||
fill: var(--primary-background-color);
|
||||
transition: all .5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
- descr: Text tool
|
||||
content: >
|
||||
.sak-text {
|
||||
}
|
||||
.sak-text__text {
|
||||
font-size: 3em;
|
||||
fill: var(--primary-text-color);
|
||||
opacity: 1.0;
|
||||
text-anchor: middle;
|
||||
dominant-baseline: central;
|
||||
}
|
||||
|
||||
- descr: Usersvg tool
|
||||
content: >
|
||||
.sak-usersvg__group {
|
||||
}
|
||||
.sak-usersvg__image {
|
||||
}
|
||||
|
||||
#
|
||||
# CSS Animations using keyframes
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
- descr: CSS Animations
|
||||
content: >
|
||||
@keyframes blinkingText {
|
||||
0%{ opacity: 0%; }
|
||||
49%{ opacity: 0%; }
|
||||
60%{ opacity: 100%; }
|
||||
99%{ opacity: 100%; }
|
||||
100%{ opacity: 0%; }
|
||||
}
|
||||
|
||||
@keyframes zoomOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0;
|
||||
transform: scale3d(0.3, 0.3, 0.3);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes bounce {
|
||||
from,
|
||||
20%,
|
||||
53%,
|
||||
80%,
|
||||
to {
|
||||
animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
40%,
|
||||
43% {
|
||||
animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
|
||||
transform: translate3d(0, -30px, 0);
|
||||
}
|
||||
70% {
|
||||
animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
|
||||
transform: translate3d(0, -15px, 0);
|
||||
}
|
||||
90% {
|
||||
transform: translate3d(0, -4px, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes flash {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes flash {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes flashold {
|
||||
from,
|
||||
50%,
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
25%,
|
||||
75% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes headShake {
|
||||
0% {
|
||||
transform: translateX(0);
|
||||
}
|
||||
6.5% {
|
||||
transform: translateX(-6px) rotateY(-9deg);
|
||||
}
|
||||
18.5% {
|
||||
transform: translateX(5px) rotateY(7deg);
|
||||
}
|
||||
31.5% {
|
||||
transform: translateX(-3px) rotateY(-5deg);
|
||||
}
|
||||
43.5% {
|
||||
transform: translateX(2px) rotateY(3deg);
|
||||
}
|
||||
50% {
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes heartBeat {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
}
|
||||
14% {
|
||||
transform: scale(1.3);
|
||||
}
|
||||
28% {
|
||||
transform: scale(1);
|
||||
}
|
||||
42% {
|
||||
transform: scale(1.3);
|
||||
}
|
||||
70% {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes jello {
|
||||
from,
|
||||
11.1%,
|
||||
to {
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
22.2% {
|
||||
transform: skewX(-12.5deg) skewY(-12.5deg);
|
||||
}
|
||||
33.3% {
|
||||
transform: skewX(6.25deg) skewY(6.25deg);
|
||||
}
|
||||
44.4% {
|
||||
transform: skewX(-3.125deg) skewY(-3.125deg);
|
||||
}
|
||||
55.5% {
|
||||
transform: skewX(1.5625deg) skewY(1.5625deg);
|
||||
}
|
||||
66.6% {
|
||||
transform: skewX(-0.78125deg) skewY(-0.78125deg);
|
||||
}
|
||||
77.7% {
|
||||
transform: skewX(0.390625deg) skewY(0.390625deg);
|
||||
}
|
||||
88.8% {
|
||||
transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
from {
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
50% {
|
||||
transform: scale3d(1.05, 1.05, 1.05);
|
||||
}
|
||||
to {
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rubberBand {
|
||||
from {
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
30% {
|
||||
transform: scale3d(1.25, 0.75, 1);
|
||||
}
|
||||
40% {
|
||||
transform: scale3d(0.75, 1.25, 1);
|
||||
}
|
||||
50% {
|
||||
transform: scale3d(1.15, 0.85, 1);
|
||||
}
|
||||
65% {
|
||||
transform: scale3d(0.95, 1.05, 1);
|
||||
}
|
||||
75% {
|
||||
transform: scale3d(1.05, 0.95, 1);
|
||||
}
|
||||
to {
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shake {
|
||||
from,
|
||||
to {
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
10%,
|
||||
30%,
|
||||
50%,
|
||||
70%,
|
||||
90% {
|
||||
transform: translate3d(-10px, 0, 0);
|
||||
}
|
||||
20%,
|
||||
40%,
|
||||
60%,
|
||||
80% {
|
||||
transform: translate3d(10px, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes swing {
|
||||
20% {
|
||||
transform: rotate3d(0, 0, 1, 15deg);
|
||||
}
|
||||
40% {
|
||||
transform: rotate3d(0, 0, 1, -10deg);
|
||||
}
|
||||
60% {
|
||||
transform: rotate3d(0, 0, 1, 5deg);
|
||||
}
|
||||
80% {
|
||||
transform: rotate3d(0, 0, 1, -5deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate3d(0, 0, 1, 0deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes tada {
|
||||
from {
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
10%,
|
||||
20% {
|
||||
transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);
|
||||
}
|
||||
30%,
|
||||
50%,
|
||||
70%,
|
||||
90% {
|
||||
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
|
||||
}
|
||||
40%,
|
||||
60%,
|
||||
80% {
|
||||
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
|
||||
}
|
||||
to {
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes wobble {
|
||||
from {
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
15% {
|
||||
transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
|
||||
}
|
||||
30% {
|
||||
transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
|
||||
}
|
||||
45% {
|
||||
transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
|
||||
}
|
||||
60% {
|
||||
transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
|
||||
}
|
||||
75% {
|
||||
transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
|
||||
}
|
||||
to {
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0);
|
||||
transform: rotate(0);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0);
|
||||
transform: rotate(0);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@keyframes spinold {
|
||||
from {
|
||||
-webkit-transform: -webkit-rotate(0deg);
|
||||
transform:rotate(0deg);
|
||||
}
|
||||
to {
|
||||
-webkit-transform: -webkit-rotate(360deg);
|
||||
transform:rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spinn {
|
||||
100% {
|
||||
-webkit-transform: -webkit-rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes spinn {
|
||||
100% {
|
||||
-webkit-transform: -webkit-rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin-stop {
|
||||
100% {
|
||||
-webkit-transform: -webkit-rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,427 @@
|
||||
#
|
||||
# File : sak-svg-definitions.yaml
|
||||
# Project : Home Assistant
|
||||
# Repository: https://github.com/AmoebeLabs/Home-Assistant-Config
|
||||
#
|
||||
# Author: Mars @ AmoebeLabs.com
|
||||
#
|
||||
# License: CC BY-SA, https://creativecommons.org/licenses/by/4.0/
|
||||
#
|
||||
# -----
|
||||
# Description:
|
||||
# Swiss Army Knife SVG <def> definitions
|
||||
#
|
||||
###############################################################################
|
||||
#sak_svg_definitions:
|
||||
# Light color temperature gradient
|
||||
# HA uses: linear-gradient( right, rgb(255, 160, 0) 0%, white 50%, rgb(166, 209, 255) 100% );
|
||||
# Then converted to SVG using https://www.kmhcreative.com/downloads/CSS2SVG.htm gives:
|
||||
|
||||
# ===== Inset shadow filters =====
|
||||
|
||||
# SVG inner shadow on rgba fill: https://codepen.io/salsita/pen/qBbmYMw
|
||||
# Damien Jurado Poster Rebound: https://codepen.io/dylanbaumann/pen/wevMwB
|
||||
- descr: sak-inset-1 filter
|
||||
content: |
|
||||
<filter id="sak-inset-1" x="-50%" y="-50%" width="400%" height="400%">
|
||||
<feComponentTransfer in=SourceAlpha>
|
||||
<feFuncA type="table" tableValues="1 0" />
|
||||
</feComponentTransfer>
|
||||
<feGaussianBlur stdDeviation="1"/>
|
||||
<feOffset dx="0" dy="1" result="offsetblur"/>
|
||||
<feFlood flood-color="rgba(0, 0, 0, 0.3)" result="color"/>
|
||||
<feComposite in2="offsetblur" operator="in"/>
|
||||
<feComposite in2="SourceAlpha" operator="in" />
|
||||
<feMerge>
|
||||
<feMergeNode in="SourceGraphic" />
|
||||
<feMergeNode />
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
# SVG Inset Shadow: https://codepen.io/mattrosno/pen/zxpNwd
|
||||
- descr: sak-inset-2 filter
|
||||
content: |
|
||||
<filter id="sak-inset-2">
|
||||
<!-- Shadow Offset -->
|
||||
<feOffset
|
||||
dx='1'
|
||||
dy='1'
|
||||
/>
|
||||
<!-- Shadow Blur -->
|
||||
<feGaussianBlur
|
||||
stdDeviation='0.5'
|
||||
result='offset-blur'
|
||||
/>
|
||||
<!-- Invert the drop shadow
|
||||
to create an inner shadow -->
|
||||
<feComposite
|
||||
operator='out'
|
||||
in='SourceGraphic'
|
||||
in2='offset-blur'
|
||||
result='inverse'
|
||||
/>
|
||||
<!-- Color & Opacity -->
|
||||
<feFlood
|
||||
flood-color='black'
|
||||
flood-opacity='0.4'
|
||||
result='color'
|
||||
/>
|
||||
<!-- Clip color inside shadow -->
|
||||
<feComposite
|
||||
operator='in'
|
||||
in='color'
|
||||
in2='inverse'
|
||||
result='shadow'
|
||||
/>
|
||||
<!-- Put shadow over original object -->
|
||||
<feComposite
|
||||
operator='over'
|
||||
in='shadow'
|
||||
in2='SourceGraphic'
|
||||
/>
|
||||
</filter>
|
||||
|
||||
# ===== Neumorphic filters =====
|
||||
- descr: sak-neumorphic filters
|
||||
content: |
|
||||
<!-- Neumorphic filter -->
|
||||
<!-- -->
|
||||
<!-- Light Shadow, #FFFFFF at 50%, x:-6, Y:-6, Blur:16 -->
|
||||
<!-- Dark Shadow: #d1cdc7 at 50%, x:6, y:6, Blur:16 -->
|
||||
<!-- Main Background: #efeeee -->
|
||||
<!-- Shape Background: #efeeee -->
|
||||
<!-- Optional Border: #fff at 20% Alpha -->
|
||||
<!-- Dark Shadow was: 0d2750 -->
|
||||
|
||||
<!-- 2021.11.17 -->
|
||||
<!-- Performance with inset shadow and width/height=150% seems to be optimal setting -->
|
||||
<!-- Smaller settings give clipping, and larger settings performance hits -->
|
||||
<!-- Absolute settings (userSpaceOnUse) seem to be difficult to find right settings -->
|
||||
<filter id="is-1" x="-25%" y="-25%" width="150%" height="150%">
|
||||
<feComponentTransfer in=SourceAlpha>
|
||||
<feFuncA type="table" tableValues="1 0" />
|
||||
</feComponentTransfer>
|
||||
<feGaussianBlur stdDeviation="1"/>
|
||||
<feOffset dx="2" dy="2" result="offsetblur"/>
|
||||
<feFlood flood-color="#0d2750" flood-opacity="0.5" result="color"/>
|
||||
<feComposite in2="offsetblur" operator="in"/>
|
||||
<feComposite in2="SourceAlpha" operator="in" />
|
||||
<feMerge>
|
||||
<feMergeNode in="SourceGraphic" />
|
||||
<feMergeNode />
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="is-1b" filterUnits="userSpaceOnUse" x="-200" y="-200" width="1000" height="1000">
|
||||
<feComponentTransfer in=SourceAlpha>
|
||||
<feFuncA type="table" tableValues="1 0" />
|
||||
</feComponentTransfer>
|
||||
<feGaussianBlur stdDeviation="1"/>
|
||||
<feOffset dx="2" dy="2" result="offsetblur"/>
|
||||
<feFlood flood-color="#0d2750" flood-opacity="0.5" result="color"/>
|
||||
<feComposite in2="offsetblur" operator="in"/>
|
||||
<feComposite in2="SourceAlpha" operator="in" />
|
||||
<feMerge>
|
||||
<feMergeNode in="SourceGraphic" />
|
||||
<feMergeNode />
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- Using feComposite in="offsetblur" operator="in" instead of in2 gives a -->
|
||||
<!-- much larger shadow area, much deeper! WHY?? -->
|
||||
|
||||
<filter id="nm-2" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feComponentTransfer in=SourceAlpha out=transfer>
|
||||
<feFuncA type="table" tableValues="1 0" />
|
||||
</feComponentTransfer>
|
||||
|
||||
<feGaussianBlur input="transfer" stdDeviation="5" result="blurdark"/>
|
||||
<feOffset input="blurdark" dx="12" dy="12" result="offsetblurdark"/>
|
||||
<feFlood input="offsetblurdark" flood-color="#d1cdc7" flood-opacity="0.4" result="colordark"/>
|
||||
|
||||
<feGaussianBlur input="transfer" stdDeviation="5" result="blurlight"/>
|
||||
<feOffset input="blurlight" dx="-12" dy="-12" result="offsetblurlight"/>
|
||||
<feFlood input="offsetblurlight" flood-color="white" flood-opacity="0.9" result="colorlight"/>
|
||||
|
||||
<feComposite in="offsetblurdark" operator="in"/>
|
||||
<feComposite in="SourceAlpha" operator="in" />
|
||||
|
||||
<feMerge>
|
||||
<feMergeNode in="SourceGraphic" />
|
||||
<feMergeNode />
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="filter-yoksel" x="-20%" y="-20%" width="140%" height="140%" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" color-interpolation-filters="linearRGB">
|
||||
<feFlood flood-color="#eeebe7" flood-opacity="0.7" x="0%" y="0%" width="100%" height="100%" result="flood2"/>
|
||||
<feComposite in="flood2" in2="SourceAlpha" operator="out" x="0%" y="0%" width="100%" height="100%" result="composite5"/>
|
||||
<feOffset dx="-9" dy="-7" x="0%" y="0%" width="100%" height="100%" in="composite5" result="offset1"/>
|
||||
<feGaussianBlur stdDeviation="3 10" x="0%" y="0%" width="100%" height="100%" in="offset1" edgeMode="none" result="blur2"/>
|
||||
<feComposite in="merge3" in2="SourceAlpha" operator="in" x="0%" y="0%" width="100%" height="100%" result="composite7"/>
|
||||
<feFlood flood-color="#0f0f0f" flood-opacity="1" x="0%" y="0%" width="100%" height="100%" result="flood4"/>
|
||||
<feComposite in="flood4" in2="SourceAlpha" operator="out" x="0%" y="0%" width="100%" height="100%" result="composite8"/>
|
||||
<feOffset dx="6" dy="6" x="0%" y="0%" width="100%" height="100%" in="merge3" result="offset2"/>
|
||||
<feGaussianBlur stdDeviation="3 10" x="0%" y="0%" width="100%" height="100%" in="offset2" edgeMode="none" result="blur3"/>
|
||||
<feComposite in="blur3" in2="SourceAlpha" operator="in" x="0%" y="0%" width="100%" height="100%" result="composite9"/>
|
||||
<feMerge x="0%" y="0%" width="100%" height="100%" result="merge3">
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
<feMergeNode in="composite7"/>
|
||||
<feMergeNode in="composite9"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- 2021.11.15 -->
|
||||
<!-- For some reason, changing the filter width/height from 160% to 600% improves performance on iOS 15 -->
|
||||
|
||||
<!-- second try... -->
|
||||
<filter id="filter" x="-50%" y="-50%" width="300%" height="300%">
|
||||
<feFlood flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="flood2"/>
|
||||
<feComposite in="flood2" in2="SourceAlpha" operator="out" result="composite5"/>
|
||||
<feOffset dx="-6" dy="-6" in="composite5" result="offset1"/>
|
||||
<feGaussianBlur stdDeviation="5" in="offset1" edgeMode="none" result="blur2"/>
|
||||
<feComposite in="blur2" in2="SourceAlpha" operator="in" result="composite7"/>
|
||||
|
||||
<!-- flood-color="#777777" -->
|
||||
<feFlood flood-color="var(--cs-theme-shadow-darker)" flood-opacity="1" result="flood4"/>
|
||||
<feComposite in="flood4" in2="SourceAlpha" operator="out" result="composite8"/>
|
||||
<feOffset dx="6" dy="6" in="composite8" result="offset2"/>
|
||||
<feGaussianBlur stdDeviation="15" in="offset2" edgeMode="none" result="blur3"/>
|
||||
<feComposite in="blur3" in2="SourceAlpha" operator="in" result="composite9"/>
|
||||
|
||||
<feMerge result="merge3">
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
<feMergeNode in="composite7"/>
|
||||
<feMergeNode in="composite9"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="filterb" filterUnits="userSpaceOnUse" x="-200" y="-200" width="1000" height="1000">
|
||||
<feFlood flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="flood2"/>
|
||||
<feComposite in="flood2" in2="SourceAlpha" operator="out" result="composite5"/>
|
||||
<feOffset dx="-6" dy="-6" in="composite5" result="offset1"/>
|
||||
<feGaussianBlur stdDeviation="5" in="offset1" edgeMode="none" result="blur2"/>
|
||||
<feComposite in="blur2" in2="SourceAlpha" operator="in" result="composite7"/>
|
||||
|
||||
<!-- flood-color="#777777" -->
|
||||
<feFlood flood-color="var(--cs-theme-shadow-darker)" flood-opacity="1" result="flood4"/>
|
||||
<feComposite in="flood4" in2="SourceAlpha" operator="out" result="composite8"/>
|
||||
<feOffset dx="6" dy="6" in="composite8" result="offset2"/>
|
||||
<feGaussianBlur stdDeviation="15" in="offset2" edgeMode="none" result="blur3"/>
|
||||
<feComposite in="blur3" in2="SourceAlpha" operator="in" result="composite9"/>
|
||||
|
||||
<feMerge result="merge3">
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
<feMergeNode in="composite7"/>
|
||||
<feMergeNode in="composite9"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="bold" x="-50%" y="-50%" width="240%" height="240%">
|
||||
<feFlood flood-color="#FFFFFF" flood-opacity="0.8" result="flood2"/>
|
||||
<feComposite in="flood2" in2="SourceAlpha" operator="out" result="composite5"/>
|
||||
<feOffset dx="12" dy="12" in="composite5" result="offset1"/>
|
||||
<feGaussianBlur stdDeviation="5" in="offset1" edgeMode="none" result="blur2"/>
|
||||
<feComposite in="blur2" in2="SourceAlpha" operator="in" result="composite7"/>
|
||||
|
||||
<feFlood flood-color="#777777" flood-opacity="0.6" result="flood4"/>
|
||||
<feComposite in="flood4" in2="SourceAlpha" operator="out" result="composite8"/>
|
||||
<feOffset dx="-12" dy="-12" in="composite8" result="offset2"/>
|
||||
<feGaussianBlur stdDeviation="15" in="offset2" edgeMode="none" result="blur3"/>
|
||||
<feComposite in="blur3" in2="SourceAlpha" operator="in" result="composite9"/>
|
||||
|
||||
<feMerge result="merge3">
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
<feMergeNode in="composite7"/>
|
||||
<feMergeNode in="composite9"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="filterss" x="-20%" y="-20%" width="140%" height="140%">
|
||||
<feFlood flood-color="#eeebe7" flood-opacity="0.9" result="flood2"/>
|
||||
<feComposite in="flood2" in2="SourceAlpha" operator="out" result="composite5"/>
|
||||
<feOffset dx="-15" dy="-15" in="composite5" result="offset1"/>
|
||||
<feGaussianBlur stdDeviation="5" in="offset1" edgeMode="none" result="blur2"/>
|
||||
<feComposite in="blur2" in2="SourceAlpha" operator="in" result="composite7"/>
|
||||
|
||||
<feFlood flood-color="#0f0f0f" flood-opacity="1" result="flood4"/>
|
||||
<feComposite in="flood4" in2="SourceAlpha" operator="out" result="composite8"/>
|
||||
<feOffset dx="6" dy="6" in="composite8" result="offset2"/>
|
||||
<feGaussianBlur stdDeviation="5" in="offset2" edgeMode="none" result="blur3"/>
|
||||
<feComposite in="blur3" in2="SourceAlpha" operator="in" result="composite9"/>
|
||||
|
||||
<feMerge result="merge3">
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
<feMergeNode in="composite7"/>
|
||||
<feMergeNode in="composite9"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- flood-color="#d1cdc7" -->
|
||||
<!-- flood-color="#FFFFFF" -->
|
||||
<filter id="nm-11" x="-50%" y="-50%" width="300%" height="300%">
|
||||
<feDropShadow stdDeviation="5" in="SourceGraphic"
|
||||
dx="6" dy="6" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5" result="dropShadow"
|
||||
</feDropShadow>
|
||||
<feDropShadow stdDeviation="4.5" in="SourceGraphic"
|
||||
dx="-6" dy="-6" flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="dropShadow1"/>
|
||||
<feMerge result="merge">
|
||||
<feMergeNode in="dropShadow1"/>
|
||||
<feMergeNode in="dropShadow"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- 2021.11.15 -->
|
||||
<!-- For some reason, changing the filter width/height from 300% to 600% improves performance on iOS 15 -->
|
||||
<!-- Changing this value to 3000% improves performance also, but pixelates some of the views, so unusable! -->
|
||||
<!-- A value of 1000% seems to be a good value too! Switching views is now instant again for some reason! -->
|
||||
<!-- However, some views (sake5) becomes very, very, very slow. Views sake4 and sake6 are very fast. -->
|
||||
<!-- 2021.11.17 -->
|
||||
<!-- Let's settle for now with x/y=-10% and width/height=120%. This is actually the default for svg filters... -->
|
||||
|
||||
<filter id="sak-nm-default" x="-10%" y="-10%" width="120%" height="120%">
|
||||
<feDropShadow stdDeviation="5" in="SourceGraphic" dx="6" dy="6" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5" result="dropShadow"/>
|
||||
<feDropShadow stdDeviation="4.5" in="SourceGraphic" dx="-6" dy="-6" flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="dropShadow1"/>
|
||||
<feMerge result="merge">
|
||||
<feMergeNode in="dropShadow1"/>
|
||||
<feMergeNode in="dropShadow"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="nm-1" x="-10%" y="-10%" width="120%" height="120%">
|
||||
<feDropShadow stdDeviation="5" in="SourceGraphic" dx="6" dy="6" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5" result="dropShadow"/>
|
||||
<feDropShadow stdDeviation="4.5" in="SourceGraphic" dx="-6" dy="-6" flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="dropShadow1"/>
|
||||
<feMerge result="merge">
|
||||
<feMergeNode in="dropShadow1"/>
|
||||
<feMergeNode in="dropShadow"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="sak-nm-default-b" filterUnits="userSpaceOnUse" x="-100" y="-100" width="5000" height="800">
|
||||
<feDropShadow stdDeviation="5" in="SourceGraphic" dx="6" dy="6" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5" result="dropShadow"/>
|
||||
<feDropShadow stdDeviation="4.5" in="SourceGraphic" dx="-6" dy="-6" flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="dropShadow1"/>
|
||||
<feMerge result="merge">
|
||||
<feMergeNode in="dropShadow1"/>
|
||||
<feMergeNode in="dropShadow"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="nm-1b" filterUnits="userSpaceOnUse" x="-200" y="-200" width="2000" height="2000">
|
||||
<feDropShadow stdDeviation="5" in="SourceGraphic" dx="6" dy="6" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5" result="dropShadow"/>
|
||||
<feDropShadow stdDeviation="4.5" in="SourceGraphic" dx="-6" dy="-6" flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="dropShadow1"/>
|
||||
<feMerge result="merge">
|
||||
<feMergeNode in="dropShadow1"/>
|
||||
<feMergeNode in="dropShadow"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="nm-1-reverse" x="-10%" y="-10%" width="120%" height="120%">
|
||||
<feDropShadow stdDeviation="4.5" in="SourceGraphic" dx="-6" dy="-6" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5" result="dropShadow"/>
|
||||
<feDropShadow stdDeviation="5" in="SourceGraphic" dx="6" dy="6" flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="dropShadow1"/>
|
||||
<feMerge result="merge">
|
||||
<feMergeNode in="dropShadow1"/>
|
||||
<feMergeNode in="dropShadow"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="nm-1b-reverse" filterUnits="userSpaceOnUse" primitiveUnits="userSpaceOnUse" x="0" y="0" width="1000" height="1000">
|
||||
<feDropShadow stdDeviation="4.5" in="SourceGraphic" dx="-6" dy="-6" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5" result="dropShadow"/>
|
||||
<feDropShadow stdDeviation="5" in="SourceGraphic" dx="6" dy="6" flood-color="var(--cs-theme-shadow-lighter)" flood-opacity="1" result="dropShadow1"/>
|
||||
<feMerge result="merge">
|
||||
<feMergeNode in="dropShadow1"/>
|
||||
<feMergeNode in="dropShadow"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
# ===== Drop shadow filters =====
|
||||
|
||||
- descr: shadow from https://css-tricks.com/adding-shadows-to-svg-icons-with-css-and-svg-filters/
|
||||
content: |
|
||||
<filter id='shadow' color-interpolation-filters="sRGB">
|
||||
<feDropShadow dx="2" dy="2" stdDeviation="3" flood-color="var(--cs-theme-shadow-darker)" flood-opacity="0.5"/>
|
||||
</filter>
|
||||
|
||||
- descr: sak-drop-shadow filters
|
||||
content: |
|
||||
<filter id="sak-drop-1" y="-50%" x="-50%" width="200%" height="400%">
|
||||
<feDropShadow dx="0" dy="1.5" flood-color="var(--cs-theme-shadow-darker)" stdDeviation=".3"/>
|
||||
</filter>
|
||||
|
||||
<filter id="sak-drop-1a" y="-50%" x="-50%" width="200%" height="400%">
|
||||
<feDropShadow dx="1" dy="2" flood-color="var(--cs-theme-shadow-darker)" stdDeviation=".5"/>
|
||||
</filter>
|
||||
|
||||
<filter id="sak-drop-1b" y="-50%" x="-50%" width="200%" height="400%">
|
||||
<feDropShadow dx="2" dy="4" flood-color="var(--cs-theme-shadow-darker)" stdDeviation="6"/>
|
||||
</filter>
|
||||
|
||||
<filter id="sak-drop-2" width="10" height="10">
|
||||
<feDropShadow dx="2" dy="3" flood-color="var(--cs-theme-shadow-darker)" stdDeviation="0.5"/>
|
||||
</filter>
|
||||
|
||||
<filter id="sak-drop-3" x="0" y="0" width="200%" height="200%">
|
||||
<feOffset result="offOut" in="SourceAlpha" dx="20" dy="20" />
|
||||
<feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
|
||||
<feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
|
||||
</filter>
|
||||
|
||||
<filter id="sak-drop-4" x="0" y="0" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="1" />
|
||||
</filter>
|
||||
|
||||
# ===== Markers (testing segmented arc) =====
|
||||
|
||||
- descr: sak-markers
|
||||
content: |
|
||||
<marker viewBox="0 0 200 200" id="markerCircle" markerWidth="8" markerHeight="8" refX="5" refY="5">
|
||||
<circle cx="5" cy="5" r="3" style="stroke: none; fill:currentColor;"/>
|
||||
</marker>
|
||||
|
||||
<marker viewBox="0 0 200 200" id="markerArrow" markerWidth="13" markerHeight="13" refX="2" refY="6"
|
||||
orient="auto">
|
||||
<path d="M2,2 L2,11 L10,6 L2,2" style="fill: currentColor;" />
|
||||
</marker>
|
||||
|
||||
# ===== Clip path test =====
|
||||
|
||||
- descr: sak-clip-path tests
|
||||
content: |
|
||||
<rect id="cliprect" width="100%" height="100%" fill="none" stroke="none" rx="3" />
|
||||
<clipPath id="clip">
|
||||
<use xlink:href="#cliprect"/>
|
||||
</clipPath>
|
||||
|
||||
# ===== Gradients =====
|
||||
|
||||
- descr: sak-gradients
|
||||
content: |
|
||||
<linearGradient id="sak-light-brightness-gradient" x1="1" x2="0">
|
||||
<stop stop-color="#eeeeee"/>
|
||||
<stop offset="1" stop-color="#555555"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="sak-light-brightness-gradient--orange" x1="1" x2="0">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="darkorange"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="sak-light-brightness-gradient--reverse" x1="1" x2="0">
|
||||
<stop stop-color="#555555"/>
|
||||
<stop offset="1" stop-color="#eeeeee"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="sak-light-color-temperature-gradient" x1="1" x2="0">
|
||||
<stop stop-color="#ffa000"/>
|
||||
<stop offset=".5" stop-color="#fff"/>
|
||||
<stop offset="1" stop-color="#a6d1ff"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="sak-boiler-setpoint-blue-orange-gradient" x1="1" x2="0">
|
||||
<stop stop-color="#ff8c00"/>
|
||||
<stop offset="1" stop-color="#0094ff"/>
|
||||
</linearGradient>
|
||||
|
||||
<radialGradient id="sak-mask-radial-gradient">
|
||||
<stop offset="0" stop-color="white" stop-opacity="1"/>
|
||||
<stop offset="0.8" stop-color="white" stop-opacity="0.8"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
@@ -0,0 +1,6 @@
|
||||
#definitions: !include_dir_merge_named definitions
|
||||
definitions:
|
||||
sak_css_definitions:
|
||||
!include sak-css-definitions.yml
|
||||
sak_svg_definitions:
|
||||
!include sak-svg-definitions.yml
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user