Files
ha-dashboard-studio/dashboard_studio/web/icons.js
T
veenm 79d4a0f011 Dashboard Studio 1.14.0: new cards, kiosk announcements, guest mode, templates, sharing and phone app
- Seven new cards: parcels, air quality, water and gas usage, solar forecast, garage and gate, sports, Formula One
- Kiosk: announcements from automations, tab rotation, guest mode, click sound
- Editor: templates, widget presets, undo history, alignment guides, Lovelace import, share link and QR code, theme variants, suggestions, touch and hold actions
- Phones: installable app with shortcuts, offline states, tab swipe, pull to refresh, bottom sheets, haptics, phone/large visibility, landscape layout, editing on the phone, away tab
- Fixed: the weather forecast and to-do list could stay on Loading…

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 21:08:42 +01:00

202 lines
16 KiB
JavaScript

/* One consistent line-icon set (24px grid, 1.8 stroke, round joins).
* Icons.svg(name) returns inline SVG; unknown names return "" so callers can
* fall back to whatever text (e.g. an emoji) the person typed. */
(function () {
const P = {
bulb: "M9 18h6M10 21h4M12 3a6 6 0 0 0-3.6 10.8c.6.5 1 1.2 1.1 2V17h5v-1.2c.1-.8.5-1.5 1.1-2A6 6 0 0 0 12 3z",
plug: "M9 3v5M15 3v5M7 8h10v3a5 5 0 0 1-10 0V8zM12 16v5",
fan: "M12 13.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM12 10.5C12 6 13 3 15.5 3S19 5.5 16 8.5L13.3 11M13.4 12.8c3.8 2.3 5.9 4.7 4.6 6.9s-4.3 1.3-5.4-2.8L12 13.5M10.7 12.6C6.8 14.8 3.7 15.4 2.4 13.2s1-4.2 5-3l3.2.8",
thermometer: "M10 13.5V5a2 2 0 1 1 4 0v8.5a4 4 0 1 1-4 0zM12 9v6",
droplet: "M12 3s6 6.5 6 11a6 6 0 0 1-12 0c0-4.5 6-11 6-11z",
bolt: "M13 2L4 14h7l-1 8 9-12h-7l1-8z",
battery: "M3 8h15a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1zM21.5 11v2",
door: "M6 21V4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v17M4 21h16M14.5 12.5v.01",
"door-open": "M4 21h16M6 21V4a1 1 0 0 1 1-1h4M11 3l7 2.5V21M11 3v18M14 12.5v.01",
window: "M5 3h14v18H5zM12 3v18M5 12h14",
person: "M12 8a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zM6 21v-2a6 6 0 0 1 12 0v2",
lock: "M6 11h12v10H6zM8 11V7a4 4 0 0 1 8 0v4",
unlock: "M6 11h12v10H6zM8 11V7a4 4 0 0 1 7.5-2",
speaker: "M11 5L6 9H3v6h3l5 4V5zM15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13",
music: "M9 18V5l11-2v13M9 18a3 3 0 1 1-6 0 3 3 0 0 1 6 0zM20 16a3 3 0 1 1-6 0 3 3 0 0 1 6 0z",
sparkles: "M11 3l1.8 4.7 4.7 1.8-4.7 1.8L11 16l-1.8-4.7L4.5 9.5l4.7-1.8zM18.5 14l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8z",
script: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM10 8.5l5 3.5-5 3.5z",
camera: "M4 7h3l2-3h6l2 3h3a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1zM12 17a4 4 0 1 0 0-8 4 4 0 0 0 0 8z",
home: "M3 11l9-8 9 8M5 9.5V21h14V9.5M10 21v-6h4v6",
car: "M3 13l2-5.2A2 2 0 0 1 6.9 6.5h10.2A2 2 0 0 1 19 7.8L21 13v4a1 1 0 0 1-1 1h-.5M3 13v4a1 1 0 0 0 1 1h.5M3 13h18M8 18h8M8 18a2 2 0 1 1-4 0 2 2 0 0 1 4 0zM20 18a2 2 0 1 1-4 0 2 2 0 0 1 4 0z",
sun: "M12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10zM12 1.5v2M12 20.5v2M4.6 4.6l1.4 1.4M18 18l1.4 1.4M1.5 12h2M20.5 12h2M4.6 19.4L6 18M18 6l1.4-1.4",
moon: "M20.5 13.5A8.5 8.5 0 1 1 10.5 3.5a6.5 6.5 0 0 0 10 10z",
cloud: "M7 19a4.5 4.5 0 0 1-.6-9A6 6 0 0 1 18 9.5a4.75 4.75 0 0 1-.5 9.5z",
"cloud-sun": "M8.5 6.2A4 4 0 0 1 15 7M5 9.5L3.8 9M8.5 2.5V1.5M3.5 4.5l1 1M8 21a3.8 3.8 0 0 1-.5-7.6 5.3 5.3 0 0 1 10.2-1A4.3 4.3 0 0 1 17.5 21z",
rain: "M7 15a4.5 4.5 0 0 1-.6-9A6 6 0 0 1 18 5.5a4.75 4.75 0 0 1-.5 9.5zM8 22l1-3M12 22l1-3M16 22l1-3",
snow: "M7 15a4.5 4.5 0 0 1-.6-9A6 6 0 0 1 18 5.5a4.75 4.75 0 0 1-.5 9.5zM8 19v.01M12 19v.01M16 19v.01M10 22v.01M14 22v.01",
storm: "M7 15a4.5 4.5 0 0 1-.6-9A6 6 0 0 1 18 5.5a4.75 4.75 0 0 1-.5 9.5zM12.5 14l-2 4h3.5l-2 4",
fog: "M4 9h16M4 13h16M6 17h12M8 5h8",
wind: "M3 8h11a3 3 0 1 0-3-3M3 12h16a3 3 0 1 1-3 3M3 16h8",
plus: "M12 5v14M5 12h14",
minus: "M5 12h14",
gauge: "M4.2 18a9 9 0 1 1 15.6 0M12 14l4-5",
power: "M12 3v9M6.3 6.3a8 8 0 1 0 11.4 0",
garage: "M3 21V9l9-6 9 6v12M7 21v-9h10v9M7 15h10M7 18h10",
shield: "M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z",
bin: "M4 6h16M6 6l1.2 12.2a1 1 0 0 0 1 .8h7.6a1 1 0 0 0 1-.8L18 6M9 6V3.5h6V6M8.5 21.5a1 1 0 1 0 0-.01M15.5 21.5a1 1 0 1 0 0-.01M10 10v5M14 10v5",
tabs: "M3 5h7v14H3zM13 6h8M13 10h8M13 14h5",
washer: "M5 3h14a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zM4 7.5h16M7 5.3h.01M10 5.3h.01M12 18.5a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9zM9.6 14.6c1-.8 1.9-.8 2.9 0s1.9.8 2.9 0",
dryer: "M5 3h14a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zM4 7.5h16M7 5.3h.01M10 5.3h.01M12 18.5a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9zM10.5 12c.8.8.8 1.6 0 2.4M13.5 12c.8.8.8 1.6 0 2.4",
dishwasher: "M5 3h14a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zM4 8h16M8 5.5h.01M11 5.5h.01M8 12v5M12 12v5M16 12v5",
eye: "M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z",
"eye-off": "M3 3l18 18M10.6 5.1A10.6 10.6 0 0 1 12 5c6.5 0 10 7 10 7a17.7 17.7 0 0 1-3.2 4.1M6.6 6.6A17.6 17.6 0 0 0 2 12s3.5 7 10 7a9.7 9.7 0 0 0 5.4-1.6M9.9 9.9a3 3 0 0 0 4.2 4.2",
hscroll: "M3 6h5v12H3zM10 6h5v12h-5zM17 6h4M17 18h4M21 6v12",
swipe: "M6 4h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM9 21h.01M12 21h.01M15 21h.01",
sofa: "M5 11V8a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v3M3 12a2 2 0 0 1 4 0v2h10v-2a2 2 0 0 1 4 0v5H3zM5 17v2M19 17v2",
stop: "M7 7h10v10H7z",
calendar: "M4 6a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zM4 10h16M8 3v4M16 3v4M8 14h.01M12 14h.01M16 14h.01M8 17h.01M12 17h.01",
clock: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 7v5l3 2",
chart: "M3 3v18h18M7 15l4-4 3 3 6-6",
list: "M9 6h12M9 12h12M9 18h12M4 6h.01M4 12h.01M4 18h.01",
text: "M4 6h16M4 12h16M4 18h10",
heading: "M6 4v16M18 4v16M6 12h12",
image: "M4 4h16v16H4zM4 16l5-5 4 4 3-3 4 4M15 9a1 1 0 1 0 0-.01",
globe: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM3 12h18M12 3c2.5 2.5 3.5 5.5 3.5 9s-1 6.5-3.5 9c-2.5-2.5-3.5-5.5-3.5-9s1-6.5 3.5-9z",
tile: "M4 4h7v7H4zM13 4h7v7h-7zM4 13h7v7H4zM13 13h7v7h-7z",
number: "M5 9h14M5 15h14M10 4L8 20M16 4l-2 16",
button: "M6 7h12a3 3 0 0 1 3 3v4a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-4a3 3 0 0 1 3-3zM9 12h6",
undo: "M9 14L4 9l5-5M4 9h11a5 5 0 0 1 0 10h-3",
redo: "M15 14l5-5-5-5M20 9H9a5 5 0 0 0 0 10h3",
more: "M5 12h.01M12 12h.01M19 12h.01",
expand: "M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5",
close: "M6 6l12 12M18 6L6 18",
copy: "M9 9h11v11H9zM5 15H4V4h11v1",
trash: "M4 7h16M10 11v6M14 11v6M6 7l1 13h10l1-13M9 7V4h6v3",
kiosk: "M5 3h14a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zM11 18h2",
edit: "M4 20h4L19 9l-4-4L4 16zM14 6l4 4",
check: "M5 12l5 5 9-10",
chevron: "M6 9l6 6 6-6",
cable: "M7 3v4M12 3v4M5 7h9v3a4.5 4.5 0 0 1-9 0zM9.5 14.5V17a3 3 0 0 0 3 3h3a3 3 0 0 0 3-3V8",
pin: "M12 21s7-6.2 7-11.5a7 7 0 0 0-14 0C5 14.8 12 21 12 21zM12 12a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z",
toggle: "M7 7h10a5 5 0 0 1 0 10H7A5 5 0 0 1 7 7zM16 14.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z",
robot: "M5 9h14v10H5zM12 5v4M12 5h.01M9 13h.01M15 13h.01M9 16h6",
flame: "M12 3c1 3 5 5 5 10a5 5 0 0 1-10 0c0-2.5 1.5-4 2.5-5 .5 2 1.5 3 2.5 3 0-3-1-5 0-8z",
pulse: "M3 12h4l3-7 4 14 3-7h4",
vacuum: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z",
snowflake: "M12 2v20M4 7l16 10M20 7L4 17M9 3.5l3 2 3-2M9 20.5l3-2 3 2",
exit: "M14 4h5a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-5M10 16l-4-4 4-4M6 12h10",
road: "M8 3L4 21M16 3l4 18M12 4v3M12 10.5v3M12 17v3",
// filled glyphs
play: "M7 4.5v15a.8.8 0 0 0 1.2.7l12-7.5a.8.8 0 0 0 0-1.4l-12-7.5A.8.8 0 0 0 7 4.5z",
pause: "M6 4h4v16H6zM14 4h4v16h-4z",
next: "M4 5.2v13.6a.7.7 0 0 0 1.1.6L15 12.6a.7.7 0 0 0 0-1.2L5.1 4.6a.7.7 0 0 0-1.1.6zM17 4h3v16h-3z",
prev: "M20 5.2v13.6a.7.7 0 0 1-1.1.6L9 12.6a.7.7 0 0 1 0-1.2l9.9-6.8a.7.7 0 0 1 1.1.6zM4 4h3v16H4z",
// rooms
bed: "M3 18v-7a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v7M3 15h18M7 9V7a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v2M3 18v2M21 18v2",
bath: "M4 12h16v3a4 4 0 0 1-4 4H8a4 4 0 0 1-4-4zM6 12V6a2 2 0 0 1 3.5-1.3M7 19l-1 2M17 19l1 2",
shower: "M4 21V8a4 4 0 0 1 8 0M9 8h6M11 12v.01M13 14v.01M15 12v.01M11 16v.01M15 16v.01M13 18v.01",
kitchen: "M4 10h16v6a4 4 0 0 1-4 4H8a4 4 0 0 1-4-4zM2 10h20M9 6c0-1 1-1.5 1-2.5M14 6c0-1 1-1.5 1-2.5",
dining: "M7 3v8M5 3v4a2 2 0 0 0 4 0V3M7 11v10M17 3c-2 0-3 2-3 5s1 4 3 4v9",
desk: "M3 10h18M5 10v9M19 10v9M14 14h5M8 4h8v6H8z",
kids: "M12 21a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM9.5 13h.01M14.5 13h.01M10 16.5c1 .7 3 .7 4 0M7 8.5 5 6M17 8.5 19 6",
laundry: "M4 9h16l-1.5 11a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM8 9l3-5M16 9l-3-5M9 13v4M15 13v4",
stairs: "M3 20h5v-4h4v-4h4V8h5",
tree: "M12 22v-6M12 16a5 5 0 0 0 5-5 5 5 0 0 0-2-4 4 4 0 0 0-6 0 5 5 0 0 0-2 4 5 5 0 0 0 5 5z",
plant: "M12 21v-8M12 13c0-4 3-7 7-7 0 4-3 7-7 7zM12 15c0-3-2.5-5.5-6-5.5 0 3.5 2.5 5.5 6 5.5zM8 21h8",
// tools
wrench: "M14.7 6.3a4 4 0 0 0-5.4 5.2L3 17.8V21h3.2l6.3-6.3a4 4 0 0 0 5.2-5.4l-2.6 2.6-2.4-.6-.6-2.4z",
hammer: "M14 6l4 4M11 3l6 6-2 2-6-6zM13 9l-9 9a1.5 1.5 0 0 0 2 2l9-9",
toolbox: "M3 9h18v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1zM8 9V6a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v3M3 14h18M10 14v2M14 14v2",
sliders: "M4 6h10M18 6h2M4 12h4M12 12h8M4 18h12M14 4v4M8 10v4M16 16v4",
key: "M8 15a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM12 11h9M18 11v3M15 11v2",
// appliances
fridge: "M6 2h12a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1zM5 10h14M9 5v2M9 13v3",
oven: "M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zM3 8h18M7 5.5h.01M11 5.5h.01M7 12h10v5H7z",
microwave: "M3 5h18a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zM5 8h11v8H5zM19 8v.01M19 11v.01M19 14v2",
kettle: "M6 9h10l1 10a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1zM7 9l1-4h6l1 4M16 11h2a2 2 0 0 1 0 4h-1.5M9 3h4",
coffee: "M5 9h11v6a5 5 0 0 1-5 5h-1a5 5 0 0 1-5-5zM16 11h1.5a2.5 2.5 0 0 1 0 5H16M8 3c0 1 1 1.5 1 2.5M12 3c0 1 1 1.5 1 2.5",
tv: "M3 5h18a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zM8 21h8M12 18v3",
radiator: "M6 4v16M10 4v16M14 4v16M18 4v16M4 7h16M4 17h16",
purifier: "M7 3h10a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zM9 7h6M9 10h6M12 17a2 2 0 1 0 0-4 2 2 0 0 0 0 4z",
aircon: "M3 5h18a1 1 0 0 1 1 1v6H2V6a1 1 0 0 1 1-1zM5 9h14M7 15c0 1.5-1 2-1 3M12 15c0 1.5-1 2-1 3M17 15c0 1.5-1 2-1 3",
// devices
phone: "M8 2h8a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1zM11 18h2",
laptop: "M5 5h14a1 1 0 0 1 1 1v9H4V6a1 1 0 0 1 1-1zM2 18h20l-1.5 2h-17z",
wifi: "M2 9a15 15 0 0 1 20 0M5 12.5a10 10 0 0 1 14 0M8.5 16a5 5 0 0 1 7 0M12 19.5v.01",
printer: "M7 8V3h10v5M17 16h4v-6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v6h4M7 13h10v8H7z",
server: "M4 3h16v7H4zM4 14h16v7H4zM8 6.5h.01M8 17.5h.01",
gamepad: "M6 8h12a4 4 0 0 1 4 4v1a4 4 0 0 1-7 2.6L14 15h-4l-1 .6A4 4 0 0 1 2 13v-1a4 4 0 0 1 4-4zM7 10v4M5 12h4M15.5 11.5v.01M17.5 13.5v.01",
headphones: "M4 15v-3a8 8 0 0 1 16 0v3M4 15a2 2 0 0 1 2-2h1v7H6a2 2 0 0 1-2-2zM20 15a2 2 0 0 0-2-2h-1v7h1a2 2 0 0 0 2-2z",
bell: "M6 16v-5a6 6 0 0 1 12 0v5l2 2H4zM10 20a2 2 0 0 0 4 0",
smoke: "M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM4 12a8 8 0 0 0 16 0M7 4.5c1.5-1 3-1.5 5-1.5s3.5.5 5 1.5",
leak: "M12 3s5 5.5 5 9a5 5 0 0 1-10 0c0-3.5 5-9 5-9zM3 21h18M6 18h.01M18 18h.01",
solar: "M4 4h16l2 10H2zM2 14h20M8 4l-1 10M16 4l1 10M3 9h18M12 14v4M8 21h8",
charger: "M6 3h8a1 1 0 0 1 1 1v17H5V4a1 1 0 0 1 1-1zM3 21h14M15 9h2a2 2 0 0 1 2 2v5a1.5 1.5 0 0 0 3 0V8l-3-3M10 7l-2 4h4l-2 4",
lamp: "M9 3h6l3 7H6zM12 10v10M8 21h8",
ceiling: "M12 2v5M7 12a5 5 0 0 1 10 0zM9 15l-1 2M12 15v3M15 15l1 2",
ledstrip: "M3 8h18v8H3zM6 11v2M10 11v2M14 11v2M18 11v2",
blinds: "M4 3h16M5 3v18M19 3v18M5 7h14M5 11h14M5 15h14M12 15v4",
curtain: "M3 3h18M5 3c0 6 1 12 3 18M19 3c0 6-1 12-3 18M8 3c0 4 .5 9 2 13M16 3c0 4-.5 9-2 13",
fence: "M3 21V7l3-3 3 3v14M15 21V7l3-3 3 3v14M3 11h18M3 17h18",
mailbox: "M4 10a4 4 0 0 1 8 0v9H4zM12 10h6a2 2 0 0 1 2 2v7h-8M8 19v2M16 8V3h3v2h-3",
paw: "M12 13c-3 0-5 3-5 5a2 2 0 0 0 2 2c1 0 2-.5 3-.5s2 .5 3 .5a2 2 0 0 0 2-2c0-2-2-5-5-5zM4.5 9.5a1.5 2 0 1 0 3 0 1.5 2 0 1 0-3 0M16.5 9.5a1.5 2 0 1 0 3 0 1.5 2 0 1 0-3 0M8 5.5a1.5 2 0 1 0 3 0 1.5 2 0 1 0-3 0M13 5.5a1.5 2 0 1 0 3 0 1.5 2 0 1 0-3 0",
bike: "M2 17.5a3.5 3.5 0 1 0 7 0 3.5 3.5 0 1 0-7 0M15 17.5a3.5 3.5 0 1 0 7 0 3.5 3.5 0 1 0-7 0M5.5 17.5 9 10h6l3.5 7.5M9 10 8 7H6M15 10l-2.5 7.5",
// for the new cards and the editor
sunrise: "M12 3v5M8.5 6.5 12 3l3.5 3.5M6.3 14.3 5 13M17.7 14.3 19 13M8 18a4 4 0 0 1 8 0M2 21h20",
sunset: "M12 8V3M8.5 4.5 12 8l3.5-3.5M6.3 14.3 5 13M17.7 14.3 19 13M8 18a4 4 0 0 1 8 0M2 21h20",
umbrella: "M3 12a9 9 0 0 1 18 0zM12 12v7a2 2 0 0 0 4 0",
timer: "M12 21a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM12 9v4l2.5 2M10 2h4M19 5l1.5-1.5",
checkbox: "M5 4h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM8 12l3 3 5-6",
circle: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z",
history: "M3 12a9 9 0 1 0 3-6.7M3 4v5h5M12 7v5l3 2",
search: "M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM21 21l-5-5",
people: "M9 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM3 20v-1a6 6 0 0 1 12 0v1M16 5a3 3 0 0 1 0 6M21 20v-1a5 5 0 0 0-3-4.6",
palette: "M12 21a9 9 0 1 1 9-9c0 2-1.5 3-3 3h-2a2 2 0 0 0-1.5 3.3A1.5 1.5 0 0 1 12 21zM7.5 11.5v.01M10 7.5v.01M14.5 7.5v.01M17 11.5v.01",
keypad: "M6 4h.01M12 4h.01M18 4h.01M6 10h.01M12 10h.01M18 10h.01M6 16h.01M12 16h.01M18 16h.01M12 21h.01",
"arrow-up": "M12 19V5M5 12l7-7 7 7",
"arrow-down": "M12 5v14M19 12l-7 7-7-7",
"copy-to": "M9 9h11v11H9zM5 15H4V4h11v1M13 14.5h4M15 12.5l2 2-2 2",
package: "M21 8l-9-5-9 5v8l9 5 9-5zM3 8l9 5 9-5M12 13v8M7.5 5.5l9 5",
trophy: "M8 4h8v5a4 4 0 0 1-8 0zM8 6H5a3 3 0 0 0 3 4M16 6h3a3 3 0 0 1-3 4M12 13v4M8 21h8M10 17h4v4h-4z",
flag: "M5 21V4M5 4h11l-2 4 2 4H5",
share: "M12 3v12M8 7l4-4 4 4M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-7",
qr: "M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h2v2h-2zM18 14h2M14 18h2M18 18h2v2M17 17h1",
layout: "M4 4h16v6H4zM4 14h7v6H4zM15 14h5v6h-5z",
bookmark: "M6 3h12v18l-6-4-6 4z",
megaphone: "M3 10v4h4l7 5V5L7 10zM17 9a4 4 0 0 1 0 6M19.5 6.5a8 8 0 0 1 0 11",
import: "M12 3v12M8 11l4 4 4-4M5 19h14",
refresh: "M20 11a8 8 0 1 0-2.3 5.7M20 4v7h-7",
air: "M3 8h10a3 3 0 1 0-3-3M3 12h15a3 3 0 1 1-3 3M3 16h7",
gate: "M3 21V5M21 21V5M3 9h18M3 15h18M8 9v6M13 9v6M18 9v6",
};
const FILLED = new Set(["play", "pause", "next", "prev"]);
// Dutch (and some English) words for the icon search, so "keuken" or "slaapkamer" find something.
const WORDS = {
bed: "slaapkamer bedroom", bath: "badkamer bad bathroom", shower: "douche badkamer", kitchen: "keuken koken pan", dining: "eetkamer eten bestek",
desk: "kantoor bureau werkkamer office", kids: "kinderkamer kind baby", laundry: "was wasmand washok", stairs: "trap overloop", tree: "tuin boom garden",
plant: "plant bloem", sofa: "woonkamer bank living", garage: "garage", home: "huis thuis", wrench: "gereedschap moersleutel tool",
hammer: "hamer gereedschap klus", toolbox: "gereedschapskist klus", sliders: "instellingen regelaar", key: "sleutel", fridge: "koelkast vriezer",
oven: "oven fornuis", microwave: "magnetron", kettle: "waterkoker thee", coffee: "koffie", tv: "televisie scherm", radiator: "verwarming radiator heater",
purifier: "luchtreiniger luchtbevochtiger", aircon: "airco koeling", phone: "telefoon mobiel", laptop: "laptop computer", wifi: "wifi router netwerk internet",
printer: "printer", server: "server nas", gamepad: "spelcomputer games console", headphones: "koptelefoon", bell: "deurbel bel melding",
smoke: "rookmelder brand", leak: "lekkage water", solar: "zonnepanelen zon", charger: "laadpaal auto laden", lamp: "lamp staande lamp",
ceiling: "plafondlamp hanglamp", ledstrip: "ledstrip", blinds: "jaloezie lamellen rolluik", curtain: "gordijn", fence: "hek poort", mailbox: "brievenbus post",
paw: "huisdier hond kat", bike: "fiets", bulb: "lamp licht", plug: "stopcontact stekker", fan: "ventilator", thermometer: "temperatuur thermostaat",
droplet: "water vocht", washer: "wasmachine", dryer: "droger", dishwasher: "vaatwasser", vacuum: "stofzuiger robot", car: "auto", lock: "slot",
camera: "camera", speaker: "speaker luidspreker", music: "muziek", door: "deur", window: "raam", timer: "timer kookwekker", people: "personen familie",
package: "pakket pakje post bezorging doos", trophy: "sport wedstrijd beker voetbal", flag: "vlag formule 1 race", air: "lucht luchtkwaliteit co2",
gate: "hek poort oprit", megaphone: "omroep mededeling bericht", share: "delen", qr: "qr code", bookmark: "favoriet bewaren",
};
/** Icon names matching a search, by name or by the words above. */
function search(filter) {
const f = String(filter || "").trim().toLowerCase();
return Object.keys(P).filter((n) => !FILLED.has(n)).sort().filter((n) => !f || n.includes(f) || (WORDS[n] || "").includes(f));
}
window.Icons = {
names: Object.keys(P).filter((n) => !FILLED.has(n)),
search,
has: (n) => Object.prototype.hasOwnProperty.call(P, n),
svg(name, cls = "") {
if (!this.has(name)) return "";
return `<svg class="i ${FILLED.has(name) ? "f" : ""} ${cls}" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="${P[name]}"/></svg>`;
},
};
})();