feat(ui): expand card icon picker (44 -> 120 icons, +5 categories)

Add 76 new icons to the custom card-icon picker and introduce five new
categories: weather, nature, controls, status, office. Existing icon ids
are unchanged so persisted card icons keep resolving.

- icon-paths.ts: +36 Lucide path constants (weather, nature, room,
  office, media, hardware, lighting variants)
- device-icons.ts: extend IconCategory union and CATEGORIES; add
  registry entries with labels + search aliases
- en/ru/zh locales: 5 new category labels + 76 per-icon labels each
  (126 device.icon keys per locale, fully aligned)

Tabs scroll horizontally via existing overflow-x; no migration needed
(picker reads/writes ids by value, missing ids fall back to inheritance).
This commit is contained in:
2026-05-11 01:38:40 +03:00
parent 09792a9a05
commit cdf7d94652
5 changed files with 398 additions and 2 deletions
@@ -20,7 +20,12 @@ export type IconCategory =
| 'rooms' | 'rooms'
| 'media' | 'media'
| 'signal' | 'signal'
| 'ambience'; | 'ambience'
| 'weather'
| 'nature'
| 'controls'
| 'status'
| 'office';
export interface DeviceIconDef { export interface DeviceIconDef {
/** Stable identifier — persisted on the entity. */ /** Stable identifier — persisted on the entity. */
@@ -42,6 +47,11 @@ export const CATEGORIES: { id: IconCategory; label: string; i18n: string }[] = [
{ id: 'media', label: 'Media', i18n: 'device.icon.cat.media' }, { id: 'media', label: 'Media', i18n: 'device.icon.cat.media' },
{ id: 'signal', label: 'Signal', i18n: 'device.icon.cat.signal' }, { id: 'signal', label: 'Signal', i18n: 'device.icon.cat.signal' },
{ id: 'ambience', label: 'Ambience', i18n: 'device.icon.cat.ambience' }, { id: 'ambience', label: 'Ambience', i18n: 'device.icon.cat.ambience' },
{ id: 'weather', label: 'Weather', i18n: 'device.icon.cat.weather' },
{ id: 'nature', label: 'Nature', i18n: 'device.icon.cat.nature' },
{ id: 'controls', label: 'Controls', i18n: 'device.icon.cat.controls' },
{ id: 'status', label: 'Status', i18n: 'device.icon.cat.status' },
{ id: 'office', label: 'Office', i18n: 'device.icon.cat.office' },
]; ];
export const DEVICE_ICONS: DeviceIconDef[] = [ export const DEVICE_ICONS: DeviceIconDef[] = [
@@ -56,6 +66,16 @@ export const DEVICE_ICONS: DeviceIconDef[] = [
{ id: 'headphones', paths: P.headphones, label: 'Headphones', aliases: ['headset', 'cans'], category: 'hardware' }, { id: 'headphones', paths: P.headphones, label: 'Headphones', aliases: ['headset', 'cans'], category: 'hardware' },
{ id: 'usb', paths: P.usb, label: 'USB', aliases: ['cable', 'connector'], category: 'hardware' }, { id: 'usb', paths: P.usb, label: 'USB', aliases: ['cable', 'connector'], category: 'hardware' },
{ id: 'plug', paths: P.plug, label: 'Power plug', aliases: ['outlet', 'socket'], category: 'hardware' }, { id: 'plug', paths: P.plug, label: 'Power plug', aliases: ['outlet', 'socket'], category: 'hardware' },
{ id: 'phone', paths: P.smartphone, label: 'Phone', aliases: ['mobile', 'tablet', 'cell', 'smartphone'], category: 'hardware' },
{ id: 'package', paths: P.packageIcon, label: 'Device unit', aliases: ['box', 'package', 'module', 'crate'], category: 'hardware' },
{ id: 'code', paths: P.code, label: 'Code', aliases: ['script', 'firmware', 'dev'], category: 'hardware' },
{ id: 'laptop', paths: P.laptop, label: 'Laptop', aliases: ['notebook', 'macbook', 'computer'], category: 'hardware' },
{ id: 'server', paths: P.server, label: 'Server', aliases: ['rack', 'host', 'cluster', 'nas'], category: 'hardware' },
{ id: 'router', paths: P.router, label: 'Router', aliases: ['network', 'gateway', 'access point', 'ap'], category: 'hardware' },
{ id: 'webcam', paths: P.webcam, label: 'Webcam', aliases: ['cam', 'capture', 'video'], category: 'hardware' },
{ id: 'bot', paths: P.bot, label: 'Bot', aliases: ['robot', 'vacuum', 'automation', 'roomba'], category: 'hardware' },
{ id: 'watch', paths: P.watch, label: 'Smartwatch', aliases: ['wearable', 'wrist', 'fitness'], category: 'hardware' },
{ id: 'mcu', paths: P.memoryStick, label: 'Microcontroller', aliases: ['esp32', 'esp8266', 'arduino', 'mcu', 'chip', 'firmware'], category: 'hardware' },
// Lighting // Lighting
{ id: 'bulb', paths: P.lightbulb, label: 'Bulb', aliases: ['lamp', 'light', 'lightbulb'], category: 'lighting' }, { id: 'bulb', paths: P.lightbulb, label: 'Bulb', aliases: ['lamp', 'light', 'lightbulb'], category: 'lighting' },
@@ -65,6 +85,15 @@ export const DEVICE_ICONS: DeviceIconDef[] = [
{ id: 'lamp', paths: P.flaskConical, label: 'Floor lamp', aliases: ['standing', 'pendant'], category: 'lighting' }, { id: 'lamp', paths: P.flaskConical, label: 'Floor lamp', aliases: ['standing', 'pendant'], category: 'lighting' },
{ id: 'power', paths: P.power, label: 'Power', aliases: ['onoff', 'switch', 'standby'], category: 'lighting' }, { id: 'power', paths: P.power, label: 'Power', aliases: ['onoff', 'switch', 'standby'], category: 'lighting' },
{ id: 'palette', paths: P.palette, label: 'Palette', aliases: ['color', 'colour', 'paint'], category: 'lighting' }, { id: 'palette', paths: P.palette, label: 'Palette', aliases: ['color', 'colour', 'paint'], category: 'lighting' },
{ id: 'dim', paths: P.sunDim, label: 'Dim light', aliases: ['soft', 'low', 'mood'], category: 'lighting' },
{ id: 'ring', paths: P.circle, label: 'Ring light', aliases: ['halo', 'round', 'circle'], category: 'lighting' },
{ id: 'point', paths: P.circleDot, label: 'Point light', aliases: ['pinpoint', 'dot', 'pixel'], category: 'lighting' },
{ id: 'ceiling', paths: P.lampCeiling, label: 'Ceiling light', aliases: ['chandelier', 'pendant', 'hanging'], category: 'lighting' },
{ id: 'desk_lamp', paths: P.lampDesk, label: 'Desk lamp', aliases: ['task', 'workspace', 'pixar'], category: 'lighting' },
{ id: 'wall_light', paths: P.lampWallUp, label: 'Wall light', aliases: ['sconce', 'uplight', 'mounted'], category: 'lighting' },
{ id: 'flashlight', paths: P.flashlight, label: 'Flashlight', aliases: ['torch', 'beam', 'handheld'], category: 'lighting' },
{ id: 'bulb_off', paths: P.lightbulbOff, label: 'Bulb off', aliases: ['lightoff', 'dark', 'inactive', 'disabled'], category: 'lighting' },
{ id: 'candle', paths: P.candle, label: 'Candle', aliases: ['flame', 'wax', 'ambient', 'romantic'], category: 'lighting' },
// Rooms // Rooms
{ id: 'bed', paths: P.bed, label: 'Bedroom', aliases: ['sleep', 'bedroom'], category: 'rooms' }, { id: 'bed', paths: P.bed, label: 'Bedroom', aliases: ['sleep', 'bedroom'], category: 'rooms' },
@@ -74,6 +103,10 @@ export const DEVICE_ICONS: DeviceIconDef[] = [
{ id: 'home', paths: P.home, label: 'Home', aliases: ['house', 'household'], category: 'rooms' }, { id: 'home', paths: P.home, label: 'Home', aliases: ['house', 'household'], category: 'rooms' },
{ id: 'fan', paths: P.fan, label: 'Fan', aliases: ['cooling', 'air'], category: 'rooms' }, { id: 'fan', paths: P.fan, label: 'Fan', aliases: ['cooling', 'air'], category: 'rooms' },
{ id: 'thermostat', paths: P.thermometer, label: 'Thermostat', aliases: ['temperature', 'heating', 'climate'], category: 'rooms' }, { id: 'thermostat', paths: P.thermometer, label: 'Thermostat', aliases: ['temperature', 'heating', 'climate'], category: 'rooms' },
{ id: 'kitchen', paths: P.chefHat, label: 'Kitchen', aliases: ['cook', 'chef', 'food'], category: 'rooms' },
{ id: 'bath', paths: P.bath, label: 'Bathroom', aliases: ['bath', 'tub', 'shower'], category: 'rooms' },
{ id: 'garage', paths: P.warehouse, label: 'Garage', aliases: ['workshop', 'shed', 'storage'], category: 'rooms' },
{ id: 'outdoor', paths: P.trees, label: 'Outdoor', aliases: ['garden', 'yard', 'patio', 'park'], category: 'rooms' },
// Media // Media
{ id: 'monitor', paths: P.monitor, label: 'Monitor', aliases: ['display', 'screen'], category: 'media' }, { id: 'monitor', paths: P.monitor, label: 'Monitor', aliases: ['display', 'screen'], category: 'media' },
@@ -83,6 +116,11 @@ export const DEVICE_ICONS: DeviceIconDef[] = [
{ id: 'speaker', paths: P.volume2, label: 'Speaker', aliases: ['audio', 'output', 'monitor'], category: 'media' }, { id: 'speaker', paths: P.volume2, label: 'Speaker', aliases: ['audio', 'output', 'monitor'], category: 'media' },
{ id: 'music', paths: P.music, label: 'Music', aliases: ['note', 'audio'], category: 'media' }, { id: 'music', paths: P.music, label: 'Music', aliases: ['note', 'audio'], category: 'media' },
{ id: 'film', paths: P.film, label: 'Film', aliases: ['video', 'movie', 'reel'], category: 'media' }, { id: 'film', paths: P.film, label: 'Film', aliases: ['video', 'movie', 'reel'], category: 'media' },
{ id: 'projector', paths: P.projector, label: 'Projector', aliases: ['beamer', 'cinema', 'home theater'], category: 'media' },
{ id: 'camcorder', paths: P.video, label: 'Camcorder', aliases: ['video', 'recorder', 'cam'], category: 'media' },
{ id: 'disc', paths: P.disc, label: 'Disc', aliases: ['vinyl', 'record', 'cd', 'dvd'], category: 'media' },
{ id: 'image', paths: P.image, label: 'Image', aliases: ['picture', 'photo', 'still'], category: 'media' },
{ id: 'audio_file', paths: P.fileAudio, label: 'Audio file', aliases: ['sound', 'sample', 'track'], category: 'media' },
// Signal // Signal
{ id: 'wifi', paths: P.wifi, label: 'Wi-Fi', aliases: ['wireless', 'network'], category: 'signal' }, { id: 'wifi', paths: P.wifi, label: 'Wi-Fi', aliases: ['wireless', 'network'], category: 'signal' },
@@ -91,16 +129,73 @@ export const DEVICE_ICONS: DeviceIconDef[] = [
{ id: 'globe', paths: P.globe, label: 'Network', aliases: ['internet', 'web', 'world'], category: 'signal' }, { id: 'globe', paths: P.globe, label: 'Network', aliases: ['internet', 'web', 'world'], category: 'signal' },
{ id: 'cloud', paths: P.cloudSun, label: 'Cloud', aliases: ['weather', 'mqtt'], category: 'signal' }, { id: 'cloud', paths: P.cloudSun, label: 'Cloud', aliases: ['weather', 'mqtt'], category: 'signal' },
{ id: 'gps', paths: P.mapPin, label: 'Location', aliases: ['map', 'gps', 'pin', 'place'], category: 'signal' }, { id: 'gps', paths: P.mapPin, label: 'Location', aliases: ['map', 'gps', 'pin', 'place'], category: 'signal' },
{ id: 'send', paths: P.send, label: 'Send', aliases: ['push', 'publish', 'mqtt', 'transmit'], category: 'signal' },
// Ambience // Ambience
{ id: 'sun', paths: P.sun, label: 'Sun', aliases: ['daylight', 'sunny', 'bright'], category: 'ambience' }, { id: 'sun', paths: P.sun, label: 'Sun', aliases: ['daylight', 'sunny', 'bright'], category: 'ambience' },
{ id: 'moon', paths: P.moon, label: 'Moon', aliases: ['night', 'dark'], category: 'ambience' }, { id: 'moon', paths: P.moon, label: 'Moon', aliases: ['night', 'dark'], category: 'ambience' },
{ id: 'flame', paths: P.flame, label: 'Flame', aliases: ['fire', 'candle', 'warm'], category: 'ambience' }, { id: 'flame', paths: P.flame, label: 'Flame', aliases: ['fire', 'candle', 'warm'], category: 'ambience' },
{ id: 'leaf', paths: P.leaf, label: 'Leaf', aliases: ['plant', 'eco', 'nature', 'green'], category: 'ambience' },
{ id: 'star', paths: P.star, label: 'Star', aliases: ['favorite', 'special'], category: 'ambience' }, { id: 'star', paths: P.star, label: 'Star', aliases: ['favorite', 'special'], category: 'ambience' },
{ id: 'sparkles', paths: P.sparkles, label: 'Sparkles', aliases: ['effect', 'magic', 'glow'], category: 'ambience' }, { id: 'sparkles', paths: P.sparkles, label: 'Sparkles', aliases: ['effect', 'magic', 'glow'], category: 'ambience' },
{ id: 'gamepad', paths: P.gamepad2, label: 'Game', aliases: ['gaming', 'play'], category: 'ambience' }, { id: 'gamepad', paths: P.gamepad2, label: 'Game', aliases: ['gaming', 'play'], category: 'ambience' },
{ id: 'heart', paths: P.heart, label: 'Heart', aliases: ['love', 'favorite'], category: 'ambience' }, { id: 'heart', paths: P.heart, label: 'Heart', aliases: ['love', 'favorite'], category: 'ambience' },
// Weather
{ id: 'rain', paths: P.cloudRain, label: 'Rain', aliases: ['rainy', 'shower', 'drizzle', 'wet'], category: 'weather' },
{ id: 'snow', paths: P.cloudSnow, label: 'Snow', aliases: ['snowy', 'blizzard', 'cold'], category: 'weather' },
{ id: 'thunder', paths: P.cloudLightning, label: 'Thunder', aliases: ['lightning', 'storm', 'bolt'], category: 'weather' },
{ id: 'fog', paths: P.cloudFog, label: 'Fog', aliases: ['mist', 'haze', 'foggy'], category: 'weather' },
{ id: 'wind', paths: P.wind, label: 'Wind', aliases: ['breeze', 'gust', 'windy'], category: 'weather' },
{ id: 'snowflake', paths: P.snowflake, label: 'Snowflake', aliases: ['frost', 'ice', 'crystal'], category: 'weather' },
{ id: 'umbrella', paths: P.umbrella, label: 'Umbrella', aliases: ['rain', 'shelter', 'parasol'], category: 'weather' },
{ id: 'sunrise', paths: P.sunrise, label: 'Sunrise', aliases: ['dawn', 'morning', 'sunup'], category: 'weather' },
{ id: 'sunset', paths: P.sunset, label: 'Sunset', aliases: ['dusk', 'evening', 'twilight'], category: 'weather' },
// Nature
{ id: 'tree', paths: P.treeDeciduous, label: 'Tree', aliases: ['plant', 'oak', 'forest', 'wood'], category: 'nature' },
{ id: 'flower', paths: P.flower2, label: 'Flower', aliases: ['bloom', 'blossom', 'garden'], category: 'nature' },
{ id: 'mountain', paths: P.mountain, label: 'Mountain', aliases: ['peak', 'hill', 'summit', 'alpine'], category: 'nature' },
{ id: 'waves', paths: P.waves, label: 'Waves', aliases: ['water', 'ocean', 'sea', 'ripple'], category: 'nature' },
{ id: 'sprout', paths: P.sprout, label: 'Sprout', aliases: ['seedling', 'shoot', 'grow', 'eco'], category: 'nature' },
{ id: 'water_drops', paths: P.droplets, label: 'Water drops', aliases: ['humidity', 'liquid', 'wet', 'splash'], category: 'nature' },
{ id: 'leaf', paths: P.leaf, label: 'Leaf', aliases: ['plant', 'eco', 'nature', 'green'], category: 'nature' },
// Controls
{ id: 'switch', paths: P.toggleRight, label: 'Switch', aliases: ['toggle', 'on', 'off'], category: 'controls' },
{ id: 'slider', paths: P.slidersHorizontal, label: 'Slider', aliases: ['mixer', 'eq', 'level', 'dimmer'], category: 'controls' },
{ id: 'settings', paths: P.settings, label: 'Settings', aliases: ['cog', 'preferences', 'gear'], category: 'controls' },
{ id: 'refresh', paths: P.refreshCw, label: 'Refresh', aliases: ['reload', 'sync', 'cycle'], category: 'controls' },
{ id: 'undo', paths: P.undo2, label: 'Undo', aliases: ['back', 'revert'], category: 'controls' },
{ id: 'trash', paths: P.trash2, label: 'Trash', aliases: ['delete', 'remove', 'bin'], category: 'controls' },
{ id: 'link', paths: P.link, label: 'Link', aliases: ['chain', 'connect', 'url'], category: 'controls' },
{ id: 'search', paths: P.search, label: 'Search', aliases: ['find', 'magnify', 'lookup'], category: 'controls' },
{ id: 'add', paths: P.plus, label: 'Add', aliases: ['plus', 'new', 'create'], category: 'controls' },
{ id: 'show', paths: P.eye, label: 'Show', aliases: ['view', 'visible', 'preview'], category: 'controls' },
{ id: 'lock', paths: P.lock, label: 'Lock', aliases: ['secure', 'private', 'closed'], category: 'controls' },
{ id: 'key', paths: P.keyRound, label: 'Key', aliases: ['credential', 'token', 'auth'], category: 'controls' },
{ id: 'tool', paths: P.wrench, label: 'Tool', aliases: ['wrench', 'fix', 'maintenance'], category: 'controls' },
// Status
{ id: 'check', paths: P.check, label: 'Check', aliases: ['done', 'ok', 'tick'], category: 'status' },
{ id: 'ok', paths: P.circleCheck, label: 'OK', aliases: ['success', 'valid', 'good'], category: 'status' },
{ id: 'warning', paths: P.triangleAlert, label: 'Warning', aliases: ['caution', 'alert', 'attention'], category: 'status' },
{ id: 'help', paths: P.circleHelp, label: 'Help', aliases: ['question', 'unknown', 'about'], category: 'status' },
{ id: 'off', paths: P.circleOff, label: 'Disabled', aliases: ['disable', 'inactive', 'banned'], category: 'status' },
{ id: 'shield', paths: P.shield, label: 'Shield', aliases: ['secure', 'protect', 'guard'], category: 'status' },
{ id: 'target', paths: P.target, label: 'Target', aliases: ['goal', 'aim', 'focus'], category: 'status' },
{ id: 'pulse', paths: P.activity, label: 'Pulse', aliases: ['activity', 'live', 'heartbeat', 'metrics'], category: 'status' },
{ id: 'trend', paths: P.trendingUp, label: 'Trending', aliases: ['rising', 'up', 'graph'], category: 'status' },
{ id: 'battery', paths: P.batteryFull, label: 'Battery', aliases: ['power', 'charge', 'cell'], category: 'status' },
// Office
{ id: 'calendar', paths: P.calendar, label: 'Calendar', aliases: ['date', 'schedule', 'event'], category: 'office' },
{ id: 'mail', paths: P.mail, label: 'Mail', aliases: ['email', 'envelope', 'message'], category: 'office' },
{ id: 'coffee', paths: P.coffee, label: 'Coffee', aliases: ['drink', 'cafe', 'break'], category: 'office' },
{ id: 'briefcase', paths: P.briefcase, label: 'Briefcase', aliases: ['work', 'business', 'job'], category: 'office' },
{ id: 'doc', paths: P.fileText, label: 'Document', aliases: ['file', 'paper', 'text'], category: 'office' },
{ id: 'checklist', paths: P.clipboardList, label: 'Checklist', aliases: ['list', 'tasks', 'todo'], category: 'office' },
{ id: 'hashtag', paths: P.hash, label: 'Hashtag', aliases: ['tag', 'number', 'channel'], category: 'office' },
{ id: 'clock', paths: P.clock, label: 'Clock', aliases: ['time', 'hour', 'minute'], category: 'office' },
]; ];
const _byId: Record<string, DeviceIconDef> = Object.fromEntries( const _byId: Record<string, DeviceIconDef> = Object.fromEntries(
@@ -143,3 +143,61 @@ export const easingIn = '<path d="M4 20C13 20 16 18 20 4"/>';
export const easingOut = '<path d="M4 20C8 6 11 4 20 4"/>'; export const easingOut = '<path d="M4 20C8 6 11 4 20 4"/>';
export const easingInOut = '<path d="M4 20C12 20 12 4 20 4"/>'; export const easingInOut = '<path d="M4 20C12 20 12 4 20 4"/>';
export const easingSine = '<path d="M4 12C7 12 8 4 12 4S17 12 20 12"/>'; export const easingSine = '<path d="M4 12C7 12 8 4 12 4S17 12 20 12"/>';
// ─────────────────────────────────────────────────────────────
// Card-icon picker expansion — additional Lucide icons for the
// custom card-icon selector. These are surfaced through
// device-icons.ts but don't have type-resolution roles.
// ─────────────────────────────────────────────────────────────
// Weather
export const cloudRain = '<path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 14v6"/><path d="M8 14v6"/><path d="M12 16v6"/>';
export const cloudSnow = '<path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M8 15h.01"/><path d="M8 19h.01"/><path d="M12 17h.01"/><path d="M12 21h.01"/><path d="M16 15h.01"/><path d="M16 19h.01"/>';
export const cloudLightning = '<path d="M6 16.326A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 .5 8.973"/><path d="m13 12-3 5h4l-3 5"/>';
export const cloudFog = '<path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 17H7"/><path d="M17 21H9"/>';
export const wind = '<path d="M12.8 19.6A2 2 0 1 0 14 16H2"/><path d="M17.5 8a2.5 2.5 0 1 1 2 4H2"/><path d="M9.8 4.4A2 2 0 1 1 11 8H2"/>';
export const snowflake = '<line x1="2" x2="22" y1="12" y2="12"/><line x1="12" x2="12" y1="2" y2="22"/><path d="m20 16-4-4 4-4"/><path d="m4 8 4 4-4 4"/><path d="m16 4-4 4-4-4"/><path d="m8 20 4-4 4 4"/>';
export const umbrella = '<path d="M22 12a10.06 10.06 0 0 0-20 0Z"/><path d="M12 12v8a2 2 0 0 0 4 0"/><path d="M12 2v1"/>';
export const sunrise = '<path d="M12 2v8"/><path d="m4.93 10.93 1.41 1.41"/><path d="M2 18h2"/><path d="M20 18h2"/><path d="m19.07 10.93-1.41 1.41"/><path d="M22 22H2"/><path d="m8 6 4-4 4 4"/><path d="M16 18a4 4 0 0 0-8 0"/>';
export const sunset = '<path d="M12 10V2"/><path d="m4.93 10.93 1.41 1.41"/><path d="M2 18h2"/><path d="M20 18h2"/><path d="m19.07 10.93-1.41 1.41"/><path d="M22 22H2"/><path d="m16 6-4 4-4-4"/><path d="M16 18a4 4 0 0 0-8 0"/>';
// Nature
export const treeDeciduous = '<path d="M8 19a4 4 0 0 1-2.24-7.32A3.5 3.5 0 0 1 9 6.03V6a3 3 0 1 1 6 0v.04a3.5 3.5 0 0 1 3.24 5.65A4 4 0 0 1 16 19Z"/><path d="M12 19v3"/>';
export const flower2 = '<circle cx="12" cy="8" r="3"/><path d="M12 11v11"/><path d="M5 8a7 7 0 0 1 14 0"/><path d="M12 22c4.2 0 7-1.667 7-5-4.2 0-7 1.667-7 5Z"/><path d="M12 22c-4.2 0-7-1.667-7-5 4.2 0 7 1.667 7 5Z"/>';
export const mountain = '<path d="m8 3 4 8 5-5 5 15H2L8 3z"/>';
export const waves = '<path d="M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1"/><path d="M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1"/><path d="M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1"/>';
export const sprout = '<path d="M7 20h10"/><path d="M10 20c5.5-2.5.8-6.4 3-10"/><path d="M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z"/><path d="M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z"/>';
export const trees = '<path d="M10 10v.2A3 3 0 0 1 8.9 16H5a3 3 0 0 1-1-5.8V10a3 3 0 0 1 6 0Z"/><path d="M7 16v6"/><path d="M13 19h6"/><path d="M14 22V13"/><path d="M18 13a4 4 0 0 0 0-8 6 6 0 0 0-9.5-4"/>';
// Rooms (extended)
export const chefHat = '<path d="M17 21a1 1 0 0 0 1-1v-5.35c0-.457.316-.844.727-1.041a4 4 0 0 0-2.134-7.589 5 5 0 0 0-9.186 0 4 4 0 0 0-2.134 7.588c.411.198.727.585.727 1.041V20a1 1 0 0 0 1 1Z"/><path d="M6 17h12"/>';
export const bath = '<path d="M9 6 6.5 3.5a1.5 1.5 0 0 0-1-.5C4.683 3 4 3.683 4 4.5V17a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5"/><line x1="10" x2="8" y1="5" y2="7"/><line x1="2" x2="22" y1="12" y2="12"/><line x1="7" x2="7" y1="19" y2="21"/><line x1="17" x2="17" y1="19" y2="21"/>';
export const warehouse = '<path d="M22 8.35V20a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8.35A2 2 0 0 1 3.26 6.5l8-3.2a2 2 0 0 1 1.48 0l8 3.2A2 2 0 0 1 22 8.35Z"/><path d="M6 18h12"/><path d="M6 14h12"/><path d="M6 18v-8h12v8"/>';
// Office
export const calendar = '<path d="M8 2v4"/><path d="M16 2v4"/><rect width="18" height="18" x="3" y="4" rx="2"/><path d="M3 10h18"/>';
export const mail = '<rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/>';
export const coffee = '<path d="M10 2v2"/><path d="M14 2v2"/><path d="M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1"/><path d="M6 2v2"/>';
export const briefcase = '<path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/><rect width="20" height="14" x="2" y="6" rx="2"/>';
// Media (extended)
export const video = '<path d="m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5"/><rect x="2" y="6" width="14" height="12" rx="2"/>';
export const disc = '<circle cx="12" cy="12" r="10"/><path d="M6 12c0-1.7.7-3.2 1.8-4.2"/><circle cx="12" cy="12" r="2"/><path d="M18 12c0 1.7-.7 3.2-1.8 4.2"/>';
export const projector = '<path d="M5 7 3 5"/><path d="M9 6V3"/><path d="m13 7 2-2"/><circle cx="9" cy="13" r="3"/><path d="M11.83 12H20a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-2a2 2 0 0 1 2-2h.17"/><path d="M16 16h2"/>';
// Hardware (extended)
export const laptop = '<rect width="18" height="12" x="3" y="4" rx="2" ry="2"/><line x1="2" x2="22" y1="20" y2="20"/>';
export const server = '<rect width="20" height="8" x="2" y="2" rx="2" ry="2"/><rect width="20" height="8" x="2" y="14" rx="2" ry="2"/><line x1="6" x2="6.01" y1="6" y2="6"/><line x1="6" x2="6.01" y1="18" y2="18"/>';
export const router = '<rect width="20" height="8" x="2" y="14" rx="2"/><path d="M6.01 18H6"/><path d="M10.01 18H10"/><path d="M15 10v4"/><path d="M17.84 7.17a4 4 0 0 0-5.66 0"/><path d="M20.66 4.34a8 8 0 0 0-11.31 0"/>';
export const webcam = '<circle cx="12" cy="10" r="8"/><circle cx="12" cy="10" r="3"/><path d="M7 22h10"/><path d="M12 22v-4"/>';
export const bot = '<path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/>';
export const watch = '<circle cx="12" cy="12" r="6"/><polyline points="12 10 12 12 13 13"/><path d="m16.13 7.66-.81-4.05a2 2 0 0 0-2-1.61h-2.68a2 2 0 0 0-2 1.61l-.78 4.05"/><path d="m7.88 16.36.8 4a2 2 0 0 0 2 1.61h2.72a2 2 0 0 0 2-1.61l.81-4.05"/>';
export const memoryStick = '<path d="M6 19v-3"/><path d="M10 19v-3"/><path d="M14 19v-3"/><path d="M18 19v-3"/><path d="M8 11V9"/><path d="M16 11V9"/><path d="M12 11V9"/><path d="M2 15h20"/><path d="M2 7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v1.1a2 2 0 0 0 0 3.837V17a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-5.1a2 2 0 0 0 0-3.837Z"/>';
// Lighting (extended)
export const lampCeiling = '<path d="M12 2v5"/><path d="M6 7h12l-2 5H8z"/><path d="M9.17 12a3 3 0 1 0 5.66 0"/>';
export const lampDesk = '<path d="m18 1-3 9"/><path d="m14 5 9 3"/><path d="M16 6 6 16l4 4 10-10"/><path d="M3 22v-2c0-1.1.9-2 2-2h4a2 2 0 0 1 2 2v2H3Z"/>';
export const lampWallUp = '<path d="M11 4h6l3 7H8z"/><path d="M14 11v5a2 2 0 0 1-2 2H8"/><path d="M4 15v-3a6 6 0 0 1 6-6"/>';
export const flashlight = '<path d="M18 6c0 2-2 2-2 4v10a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2V10c0-2-2-2-2-4V2h12z"/><line x1="6" x2="18" y1="6" y2="6"/><line x1="12" x2="12" y1="12" y2="12"/>';
export const lightbulbOff = '<path d="M16.8 11.2c.8-.9 1.2-2 1.2-3.2a6 6 0 0 0-9.3-5"/><path d="m2 2 20 20"/><path d="M6.3 6.3a4.67 4.67 0 0 0 1.2 5.2c.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/>';
export const candle = '<path d="M3 14v6a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1v-6"/><path d="M7 14V8a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v6"/><path d="M12 6V4"/><path d="M12 2a1 1 0 0 1 1 1c0 1-1 1.5-1 2.5 0-1-1-1.5-1-2.5a1 1 0 0 1 1-1z"/>';
+81
View File
@@ -582,6 +582,87 @@
"device.icon.cat.media": "Media", "device.icon.cat.media": "Media",
"device.icon.cat.signal": "Signal", "device.icon.cat.signal": "Signal",
"device.icon.cat.ambience": "Ambience", "device.icon.cat.ambience": "Ambience",
"device.icon.cat.weather": "Weather",
"device.icon.cat.nature": "Nature",
"device.icon.cat.controls": "Controls",
"device.icon.cat.status": "Status",
"device.icon.cat.office": "Office",
"device.icon.phone": "Phone",
"device.icon.package": "Device unit",
"device.icon.code": "Code",
"device.icon.laptop": "Laptop",
"device.icon.server": "Server",
"device.icon.router": "Router",
"device.icon.webcam": "Webcam",
"device.icon.bot": "Bot",
"device.icon.watch": "Smartwatch",
"device.icon.mcu": "Microcontroller",
"device.icon.dim": "Dim light",
"device.icon.ring": "Ring light",
"device.icon.point": "Point light",
"device.icon.ceiling": "Ceiling light",
"device.icon.desk_lamp": "Desk lamp",
"device.icon.wall_light": "Wall light",
"device.icon.flashlight": "Flashlight",
"device.icon.bulb_off": "Bulb off",
"device.icon.candle": "Candle",
"device.icon.kitchen": "Kitchen",
"device.icon.bath": "Bathroom",
"device.icon.garage": "Garage",
"device.icon.outdoor": "Outdoor",
"device.icon.projector": "Projector",
"device.icon.camcorder": "Camcorder",
"device.icon.disc": "Disc",
"device.icon.image": "Image",
"device.icon.audio_file": "Audio file",
"device.icon.send": "Send",
"device.icon.rain": "Rain",
"device.icon.snow": "Snow",
"device.icon.thunder": "Thunder",
"device.icon.fog": "Fog",
"device.icon.wind": "Wind",
"device.icon.snowflake": "Snowflake",
"device.icon.umbrella": "Umbrella",
"device.icon.sunrise": "Sunrise",
"device.icon.sunset": "Sunset",
"device.icon.tree": "Tree",
"device.icon.flower": "Flower",
"device.icon.mountain": "Mountain",
"device.icon.waves": "Waves",
"device.icon.sprout": "Sprout",
"device.icon.water_drops": "Water drops",
"device.icon.leaf": "Leaf",
"device.icon.switch": "Switch",
"device.icon.slider": "Slider",
"device.icon.settings": "Settings",
"device.icon.refresh": "Refresh",
"device.icon.undo": "Undo",
"device.icon.trash": "Trash",
"device.icon.link": "Link",
"device.icon.search": "Search",
"device.icon.add": "Add",
"device.icon.show": "Show",
"device.icon.lock": "Lock",
"device.icon.key": "Key",
"device.icon.tool": "Tool",
"device.icon.check": "Check",
"device.icon.ok": "OK",
"device.icon.warning": "Warning",
"device.icon.help": "Help",
"device.icon.off": "Disabled",
"device.icon.shield": "Shield",
"device.icon.target": "Target",
"device.icon.pulse": "Pulse",
"device.icon.trend": "Trending",
"device.icon.battery": "Battery",
"device.icon.calendar": "Calendar",
"device.icon.mail": "Mail",
"device.icon.coffee": "Coffee",
"device.icon.briefcase": "Briefcase",
"device.icon.doc": "Document",
"device.icon.checklist": "Checklist",
"device.icon.hashtag": "Hashtag",
"device.icon.clock": "Clock",
"device.icon.entity.device": "Device", "device.icon.entity.device": "Device",
"device.icon.entity.target": "LED target", "device.icon.entity.target": "LED target",
"device.icon.entity.ha_light_target": "HA light target", "device.icon.entity.ha_light_target": "HA light target",
+81
View File
@@ -600,6 +600,87 @@
"device.icon.cat.media": "Медиа", "device.icon.cat.media": "Медиа",
"device.icon.cat.signal": "Сигнал", "device.icon.cat.signal": "Сигнал",
"device.icon.cat.ambience": "Атмосфера", "device.icon.cat.ambience": "Атмосфера",
"device.icon.cat.weather": "Погода",
"device.icon.cat.nature": "Природа",
"device.icon.cat.controls": "Управление",
"device.icon.cat.status": "Состояние",
"device.icon.cat.office": "Офис",
"device.icon.phone": "Телефон",
"device.icon.package": "Устройство",
"device.icon.code": "Код",
"device.icon.laptop": "Ноутбук",
"device.icon.server": "Сервер",
"device.icon.router": "Маршрутизатор",
"device.icon.webcam": "Веб-камера",
"device.icon.bot": "Бот",
"device.icon.watch": "Умные часы",
"device.icon.mcu": "Микроконтроллер",
"device.icon.dim": "Приглушённый свет",
"device.icon.ring": "Кольцевая лампа",
"device.icon.point": "Точечный свет",
"device.icon.ceiling": "Потолочный светильник",
"device.icon.desk_lamp": "Настольная лампа",
"device.icon.wall_light": "Настенный светильник",
"device.icon.flashlight": "Фонарик",
"device.icon.bulb_off": "Лампа выключена",
"device.icon.candle": "Свеча",
"device.icon.kitchen": "Кухня",
"device.icon.bath": "Ванная",
"device.icon.garage": "Гараж",
"device.icon.outdoor": "Улица",
"device.icon.projector": "Проектор",
"device.icon.camcorder": "Видеокамера",
"device.icon.disc": "Диск",
"device.icon.image": "Изображение",
"device.icon.audio_file": "Аудиофайл",
"device.icon.send": "Отправить",
"device.icon.rain": "Дождь",
"device.icon.snow": "Снег",
"device.icon.thunder": "Гроза",
"device.icon.fog": "Туман",
"device.icon.wind": "Ветер",
"device.icon.snowflake": "Снежинка",
"device.icon.umbrella": "Зонт",
"device.icon.sunrise": "Восход",
"device.icon.sunset": "Закат",
"device.icon.tree": "Дерево",
"device.icon.flower": "Цветок",
"device.icon.mountain": "Гора",
"device.icon.waves": "Волны",
"device.icon.sprout": "Росток",
"device.icon.water_drops": "Капли воды",
"device.icon.leaf": "Лист",
"device.icon.switch": "Переключатель",
"device.icon.slider": "Слайдер",
"device.icon.settings": "Настройки",
"device.icon.refresh": "Обновить",
"device.icon.undo": "Отменить",
"device.icon.trash": "Корзина",
"device.icon.link": "Ссылка",
"device.icon.search": "Поиск",
"device.icon.add": "Добавить",
"device.icon.show": "Показать",
"device.icon.lock": "Замок",
"device.icon.key": "Ключ",
"device.icon.tool": "Инструмент",
"device.icon.check": "Галочка",
"device.icon.ok": "ОК",
"device.icon.warning": "Внимание",
"device.icon.help": "Справка",
"device.icon.off": "Отключено",
"device.icon.shield": "Щит",
"device.icon.target": "Цель",
"device.icon.pulse": "Пульс",
"device.icon.trend": "Тренд",
"device.icon.battery": "Батарея",
"device.icon.calendar": "Календарь",
"device.icon.mail": "Почта",
"device.icon.coffee": "Кофе",
"device.icon.briefcase": "Портфель",
"device.icon.doc": "Документ",
"device.icon.checklist": "Список",
"device.icon.hashtag": "Хэштег",
"device.icon.clock": "Часы",
"device.icon.entity.device": "Устройство", "device.icon.entity.device": "Устройство",
"device.icon.entity.target": "LED-цель", "device.icon.entity.target": "LED-цель",
"device.icon.entity.ha_light_target": "HA-светильник", "device.icon.entity.ha_light_target": "HA-светильник",
+81
View File
@@ -600,6 +600,87 @@
"device.icon.cat.media": "媒体", "device.icon.cat.media": "媒体",
"device.icon.cat.signal": "信号", "device.icon.cat.signal": "信号",
"device.icon.cat.ambience": "氛围", "device.icon.cat.ambience": "氛围",
"device.icon.cat.weather": "天气",
"device.icon.cat.nature": "自然",
"device.icon.cat.controls": "控件",
"device.icon.cat.status": "状态",
"device.icon.cat.office": "办公",
"device.icon.phone": "手机",
"device.icon.package": "设备模块",
"device.icon.code": "代码",
"device.icon.laptop": "笔记本电脑",
"device.icon.server": "服务器",
"device.icon.router": "路由器",
"device.icon.webcam": "网络摄像头",
"device.icon.bot": "机器人",
"device.icon.watch": "智能手表",
"device.icon.mcu": "微控制器",
"device.icon.dim": "柔光",
"device.icon.ring": "环形灯",
"device.icon.point": "点光源",
"device.icon.ceiling": "吸顶灯",
"device.icon.desk_lamp": "台灯",
"device.icon.wall_light": "壁灯",
"device.icon.flashlight": "手电筒",
"device.icon.bulb_off": "灯泡关闭",
"device.icon.candle": "蜡烛",
"device.icon.kitchen": "厨房",
"device.icon.bath": "浴室",
"device.icon.garage": "车库",
"device.icon.outdoor": "户外",
"device.icon.projector": "投影仪",
"device.icon.camcorder": "摄像机",
"device.icon.disc": "光盘",
"device.icon.image": "图片",
"device.icon.audio_file": "音频文件",
"device.icon.send": "发送",
"device.icon.rain": "雨",
"device.icon.snow": "雪",
"device.icon.thunder": "雷电",
"device.icon.fog": "雾",
"device.icon.wind": "风",
"device.icon.snowflake": "雪花",
"device.icon.umbrella": "雨伞",
"device.icon.sunrise": "日出",
"device.icon.sunset": "日落",
"device.icon.tree": "树",
"device.icon.flower": "花",
"device.icon.mountain": "山",
"device.icon.waves": "波浪",
"device.icon.sprout": "嫩芽",
"device.icon.water_drops": "水滴",
"device.icon.leaf": "叶子",
"device.icon.switch": "开关",
"device.icon.slider": "滑块",
"device.icon.settings": "设置",
"device.icon.refresh": "刷新",
"device.icon.undo": "撤销",
"device.icon.trash": "回收站",
"device.icon.link": "链接",
"device.icon.search": "搜索",
"device.icon.add": "添加",
"device.icon.show": "显示",
"device.icon.lock": "锁定",
"device.icon.key": "钥匙",
"device.icon.tool": "工具",
"device.icon.check": "勾选",
"device.icon.ok": "正常",
"device.icon.warning": "警告",
"device.icon.help": "帮助",
"device.icon.off": "已禁用",
"device.icon.shield": "护盾",
"device.icon.target": "目标",
"device.icon.pulse": "脉冲",
"device.icon.trend": "趋势",
"device.icon.battery": "电池",
"device.icon.calendar": "日历",
"device.icon.mail": "邮件",
"device.icon.coffee": "咖啡",
"device.icon.briefcase": "公文包",
"device.icon.doc": "文档",
"device.icon.checklist": "清单",
"device.icon.hashtag": "话题",
"device.icon.clock": "时钟",
"device.icon.entity.device": "设备", "device.icon.entity.device": "设备",
"device.icon.entity.target": "LED 目标", "device.icon.entity.target": "LED 目标",
"device.icon.entity.ha_light_target": "HA 灯目标", "device.icon.entity.ha_light_target": "HA 灯目标",