Compare commits

...

36 Commits

Author SHA1 Message Date
Bram Kragten
4f4edb109f Merge pull request #7028 from home-assistant/dev 2020-09-16 21:58:42 +02:00
Bram Kragten
265bfeb889 Bumped version to 20200916.0 2020-09-16 21:39:35 +02:00
Joakim Sørensen
96110637d9 Remove deprecated icons (#6818) 2020-09-16 21:38:40 +02:00
Bram Kragten
ad34f98e6d Add default actions to button row (#7026) 2020-09-16 21:38:08 +02:00
Bram Kragten
a8a1563586 Fix safari not rendering history graph (#7025) 2020-09-16 17:20:49 +02:00
Zack Barett
9b25a54a47 Fix sidebar from not displaying (#7022)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-16 11:09:25 +02:00
HomeAssistant Azure
4b8c96c769 [ci skip] Translation update 2020-09-16 00:33:16 +00:00
Tomasz
c62ff85e73 Fix package.json for windows (errors when runing yarn run lint and yarn run format) (#6762) 2020-09-15 21:15:05 +02:00
Bram Kragten
7d5a27ec0f Merge pull request #7019 from home-assistant/dev 2020-09-15 14:59:48 +02:00
Bram Kragten
d6aba040dd revert remove tap action from button stub (#7018) 2020-09-15 14:45:38 +02:00
Bram Kragten
ca4757db5b Bumped version to 20200915.0 2020-09-15 14:44:55 +02:00
Bram Kragten
c917b67cbd Adjust local media error messages (#7017) 2020-09-15 14:43:13 +02:00
Zack Barett
9659c97978 Update Error handling (#7007)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-15 14:32:02 +02:00
Joakim Sørensen
7d862d6f2a Use helper to generate documentation URL (#7012) 2020-09-15 13:20:43 +02:00
Joakim Sørensen
9c80776d8c Refresh snapshots on first update (#7014) 2020-09-15 13:20:17 +02:00
uvjustin
d5cd288fe8 Temporarily remove exoplayer (#7015) 2020-09-15 13:18:11 +02:00
Joakim Sørensen
239e817779 Rename upgrade -> update (#7013) 2020-09-15 11:15:58 +02:00
Joakim Sørensen
1986215919 Remove version check (#6984) 2020-09-15 11:15:22 +02:00
Franck Nijhof
239f5f1a2f Add snapshot support for new media folder (#6889) 2020-09-15 11:14:25 +02:00
Bram Kragten
3bca32c6d5 Disable cloud expose controls when yaml filter (#6990) 2020-09-15 08:42:09 +02:00
HomeAssistant Azure
183eff745d [ci skip] Translation update 2020-09-15 00:32:23 +00:00
uvjustin
4392d78ff6 Allow ExoPlayer only from more-info-camera (#6974)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-15 00:26:26 +02:00
Bram Kragten
858196ab53 Update en.json 2020-09-15 00:19:23 +02:00
Bram Kragten
fb75d8c1f2 Fix hex to rgb conversion (#6999) 2020-09-15 00:08:16 +02:00
Bram Kragten
7628569579 Cleanup more info styling (#7004) 2020-09-15 00:07:45 +02:00
Joakim Sørensen
8a9d5f7753 mwc-button -> mwc-icon-button (#6993) 2020-09-15 00:07:11 +02:00
Charles Garwood
cdcccf5089 Pass ozw instance to ozw panel call service buttons (#6992) 2020-09-14 23:50:03 +02:00
Bram Kragten
de95c92e2d Sidebar tweaks (#6994) 2020-09-14 23:46:40 +02:00
Joakim Sørensen
667c828359 Merge pull request #6963 from home-assistant/dev 2020-09-12 22:17:44 +02:00
Joakim Sørensen
085c6f8bdd Merge pull request #6900 from home-assistant/dev
20200909.0
2020-09-09 23:22:01 +02:00
Bram Kragten
5cca5bfe86 Merge pull request #6865 from home-assistant/dev 2020-09-08 21:33:22 +02:00
Bram Kragten
4999f1ad51 Merge pull request #6821 from home-assistant/dev 2020-09-07 20:53:40 +02:00
Bram Kragten
61dbae8b8b Merge pull request #6792 from home-assistant/dev 2020-09-04 23:26:27 +02:00
Bram Kragten
ba3cc7df0f Merge pull request #6765 from home-assistant/dev 2020-09-01 23:44:41 +02:00
Bram Kragten
090ad34f78 Merge pull request #6692 from home-assistant/dev 2020-08-24 20:48:44 +02:00
Bram Kragten
b2460cbc3d Merge pull request #6662 from home-assistant/dev 2020-08-20 16:10:18 +02:00
76 changed files with 963 additions and 912 deletions

View File

@@ -1,267 +1 @@
[
{
"path": "M17.5,15.61C17.33,15.37 9.53,5.4 9.27,5.08C9,4.75 9.08,4.65 9.13,4.59C9.22,4.5 9.36,4.5 9.93,4.5C10.26,4.5 13.59,4.5 13.94,4.47C14.66,4.47 14.78,4.53 14.85,4.56C14.93,4.58 15.13,4.75 15.26,4.92C15.33,5 22.32,13.36 22.39,13.45C22.46,13.54 22.59,13.69 22.67,13.84C22.76,14 22.77,14.18 22.64,14.25C22.56,14.3 18.7,15.89 18.59,15.93C18.5,16 18.27,16.06 18.11,16.04C18,16 17.77,15.92 17.5,15.61M21.47,15.42L21.75,15.47C21.75,15.47 22.68,15.65 22.77,15.67C22.87,15.69 22.96,15.76 22.95,15.79C22.94,15.87 22.9,15.91 22.83,15.95C22.77,16 18.58,18.58 18.5,18.62C18.43,18.66 18.33,18.72 18.11,18.75C17.7,18.83 16.91,18.61 16.66,18.56C16.41,18.5 6.15,16.23 6.06,16.2C5.97,16.17 5.91,16.16 5.9,16.08C5.89,15.94 6.11,15.88 6.28,15.81C6.46,15.75 11.28,14 11.45,13.93C11.62,13.86 11.84,13.84 11.95,13.83C12.06,13.82 12.73,13.93 13.03,13.97C13.34,14 14.2,14.15 14.2,14.15L16.16,16.7C16.5,17.09 16.72,17.25 17,17.28C17.15,17.29 17.31,17.25 17.42,17.2C17.5,17.16 21.47,15.42 21.47,15.42M10.25,9.18L11.96,11.37L12,11.45V11.5C11.96,11.54 8.93,14.32 8.91,14.35L5.72,15.5C5.72,15.5 5.63,15.55 5.58,15.58C5.53,15.61 5.47,15.67 5.5,15.82C5.5,15.87 5.5,16.59 5.5,16.79L1.56,18.04C1.37,18.1 1,18.23 0.95,18.19C0.88,18.14 0.97,18.03 1,17.97C1.06,17.91 9.08,10 9.39,9.7C9.84,9.24 10.25,9.18 10.25,9.18",
"name": "accusoft"
},
{
"path": "M4.94,11.12C5.23,11.12 5.5,11.16 5.76,11.23C5.77,9.09 7.5,7.35 9.65,7.35C11.27,7.35 12.67,8.35 13.24,9.77C13.83,9 14.74,8.53 15.76,8.53C17.5,8.53 18.94,9.95 18.94,11.71C18.94,11.95 18.91,12.2 18.86,12.43C19.1,12.34 19.37,12.29 19.65,12.29C20.95,12.29 22,13.35 22,14.65C22,15.95 20.95,17 19.65,17C18.35,17 6.36,17 4.94,17C3.32,17 2,15.68 2,14.06C2,12.43 3.32,11.12 4.94,11.12Z",
"name": "amazon-drive"
},
{
"path": "M8,11.5A1.25,1.25 0 0,0 6.75,12.75A1.25,1.25 0 0,0 8,14A1.25,1.25 0 0,0 9.25,12.75A1.25,1.25 0 0,0 8,11.5M16,11.5A1.25,1.25 0 0,0 14.75,12.75A1.25,1.25 0 0,0 16,14A1.25,1.25 0 0,0 17.25,12.75A1.25,1.25 0 0,0 16,11.5M12,7C13.5,7 14.9,7.33 16.18,7.91L18.34,5.75C18.73,5.36 19.36,5.36 19.75,5.75C20.14,6.14 20.14,6.77 19.75,7.16L17.95,8.96C20.41,10.79 22,13.71 22,17H2C2,13.71 3.59,10.79 6.05,8.96L4.25,7.16C3.86,6.77 3.86,6.14 4.25,5.75C4.64,5.36 5.27,5.36 5.66,5.75L7.82,7.91C9.1,7.33 10.5,7 12,7Z",
"name": "android-head"
},
{
"path": "M2,16.25C2,16.25 4,3.75 12,3.75C20,3.75 22,16.25 22,16.25C22,16.25 20,20.25 12,20.25C4,20.25 2,16.25 2,16.25M3.35,15.65C3.35,15.65 4.3,19 12,19C17,19 20,17.8 20.65,15.85C21.3,13.9 15.65,7.6 14.65,7.6C13.65,7.6 11.2,12 10.45,12C8.45,12 8.9,10 7.15,10C5.4,10 3.35,15.65 3.35,15.65Z",
"name": "basecamp"
},
{
"path": "M7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7C10.87,7 9.84,7.37 9,8V2.46C9.95,2.16 10.95,2 12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12C2,8.3 4,5.07 7,3.34V12M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z",
"name": "beats"
},
{
"path": "M19.58,12.27C19.54,11.65 19.33,11.18 18.96,10.86C18.59,10.54 18.13,10.38 17.58,10.38C17,10.38 16.5,10.55 16.19,10.89C15.86,11.23 15.65,11.69 15.57,12.27M21.92,12.04C22,12.45 22,13.04 22,13.81H15.5C15.55,14.71 15.85,15.33 16.44,15.69C16.79,15.92 17.22,16.03 17.73,16.03C18.26,16.03 18.69,15.89 19,15.62C19.2,15.47 19.36,15.27 19.5,15H21.88C21.82,15.54 21.53,16.07 21,16.62C20.22,17.5 19.1,17.92 17.66,17.92C16.47,17.92 15.43,17.55 14.5,16.82C13.62,16.09 13.16,14.9 13.16,13.25C13.16,11.7 13.57,10.5 14.39,9.7C15.21,8.87 16.27,8.46 17.58,8.46C18.35,8.46 19.05,8.6 19.67,8.88C20.29,9.16 20.81,9.59 21.21,10.2C21.58,10.73 21.81,11.34 21.92,12.04M9.58,14.07C9.58,13.42 9.31,12.97 8.79,12.73C8.5,12.6 8.08,12.53 7.54,12.5H4.87V15.84H7.5C8.04,15.84 8.46,15.77 8.76,15.62C9.31,15.35 9.58,14.83 9.58,14.07M4.87,10.46H7.5C8.04,10.46 8.5,10.36 8.82,10.15C9.16,9.95 9.32,9.58 9.32,9.06C9.32,8.5 9.1,8.1 8.66,7.91C8.27,7.78 7.78,7.72 7.19,7.72H4.87M11.72,12.42C12.04,12.92 12.2,13.53 12.2,14.24C12.2,15 12,15.64 11.65,16.23C11.41,16.62 11.12,16.94 10.77,17.21C10.37,17.5 9.9,17.72 9.36,17.83C8.82,17.94 8.24,18 7.61,18H2V5.55H8C9.53,5.58 10.6,6 11.23,6.88C11.61,7.41 11.8,8.04 11.8,8.78C11.8,9.54 11.61,10.15 11.23,10.61C11,10.87 10.7,11.11 10.28,11.32C10.91,11.55 11.39,11.92 11.72,12.42M20.06,7.32H15.05V6.07H20.06V7.32Z",
"name": "behance"
},
{
"path": "M5.45,10.28C6.4,10.28 7.5,11.05 7.5,12C7.5,12.95 6.4,13.72 5.45,13.72H2L2.69,10.28H5.45M6.14,4.76C7.09,4.76 8.21,5.53 8.21,6.5C8.21,7.43 7.09,8.21 6.14,8.21H2.69L3.38,4.76H6.14M13.03,4.76C14,4.76 15.1,5.53 15.1,6.5C15.1,7.43 14,8.21 13.03,8.21H9.41L10.1,4.76H13.03M12.34,10.28C13.3,10.28 14.41,11.05 14.41,12C14.41,12.95 13.3,13.72 12.34,13.72H8.72L9.41,10.28H12.34M10.97,15.79C11.92,15.79 13.03,16.57 13.03,17.5C13.03,18.47 11.92,19.24 10.97,19.24H7.5L8.21,15.79H10.97M18.55,13.72C19.5,13.72 20.62,14.5 20.62,15.45C20.62,16.4 19.5,17.17 18.55,17.17H15.1L15.79,13.72H18.55M19.93,8.21C20.88,8.21 22,9 22,9.93C22,10.88 20.88,11.66 19.93,11.66H16.5L17.17,8.21H19.93Z",
"name": "blackberry"
},
{
"path": "M12,3A9,9 0 0,1 21,12A9,9 0 0,1 12,21A9,9 0 0,1 3,12A9,9 0 0,1 12,3M5.94,8.5C4,11.85 5.15,16.13 8.5,18.06C11.85,20 18.85,7.87 15.5,5.94C12.15,4 7.87,5.15 5.94,8.5Z",
"name": "cisco-webex"
},
{
"path": "M11.9,14.5H10.8V9.5H11.9C13.5,9.5 14.6,10.4 14.6,12C14.6,13.6 13.5,14.5 11.9,14.5M11.9,7H8.1V17H11.8C15.3,17 17.4,14.9 17.4,12V12C17.4,9.1 15.4,7 11.9,7M12,20C10.1,20 8.3,19.3 6.9,18.1L6.2,17.5L4.5,17.7L5.2,16.1L4.9,15.3C4.4,14.2 4.2,13.1 4.2,11.9C4.2,7.5 7.8,3.9 12.1,3.9C16.4,3.9 19.9,7.6 19.9,12C19.9,16.4 16.3,20 12,20M12,2C6.5,2 2.1,6.5 2.1,12C2.1,13.5 2.4,14.9 3,16.2L1.4,20.3L5.7,19.7C7.4,21.2 9.7,22.1 12.1,22.1C17.6,22.1 22,17.6 22,12.1C22,6.6 17.5,2 12,2Z",
"name": "disqus-outline"
},
{
"path": "M16.42,18.42C16,16.5 15.5,14.73 15,13.17C15.5,13.1 16,13.06 16.58,13.06H16.6V13.06H16.6C17.53,13.06 18.55,13.18 19.66,13.43C19.28,15.5 18.08,17.27 16.42,18.42M12,19.8C10.26,19.8 8.66,19.23 7.36,18.26C7.64,17.81 8.23,16.94 9.18,16.04C10.14,15.11 11.5,14.15 13.23,13.58C13.82,15.25 14.36,17.15 14.77,19.29C13.91,19.62 13,19.8 12,19.8M4.2,12C4.2,11.96 4.2,11.93 4.2,11.89C4.42,11.9 4.71,11.9 5.05,11.9H5.06C6.62,11.89 9.36,11.76 12.14,10.89C12.29,11.22 12.44,11.56 12.59,11.92C10.73,12.54 9.27,13.53 8.19,14.5C7.16,15.46 6.45,16.39 6.04,17C4.9,15.66 4.2,13.91 4.2,12M8.55,5C9.1,5.65 10.18,7.06 11.34,9.25C9,9.96 6.61,10.12 5.18,10.12C5.14,10.12 5.1,10.12 5.06,10.12H5.05C4.81,10.12 4.6,10.12 4.43,10.11C5,7.87 6.5,6 8.55,5M12,4.2C13.84,4.2 15.53,4.84 16.86,5.91C15.84,7.14 14.5,8 13.03,8.65C12,6.67 11,5.25 10.34,4.38C10.88,4.27 11.43,4.2 12,4.2M18.13,7.18C19.1,8.42 19.71,9.96 19.79,11.63C18.66,11.39 17.6,11.28 16.6,11.28V11.28H16.59C15.79,11.28 15.04,11.35 14.33,11.47C14.16,11.05 14,10.65 13.81,10.26C15.39,9.57 16.9,8.58 18.13,7.18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",
"name": "dribbble"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M15.09,16.5C14.81,15.14 14.47,13.91 14.08,12.82L15.2,12.74H15.22V12.74C15.87,12.74 16.59,12.82 17.36,13C17.09,14.44 16.26,15.69 15.09,16.5M12,17.46C10.79,17.46 9.66,17.06 8.76,16.39C8.95,16.07 9.36,15.46 10,14.83C10.7,14.18 11.64,13.5 12.86,13.11C13.28,14.27 13.65,15.6 13.94,17.1C13.33,17.33 12.68,17.46 12,17.46M6.54,12V11.92L7.14,11.93V11.93C8.24,11.93 10.15,11.83 12.1,11.22L12.41,11.94C11.11,12.38 10.09,13.07 9.34,13.76C8.61,14.42 8.12,15.08 7.83,15.5C7.03,14.56 6.54,13.34 6.54,12M9.59,7.11C9.97,7.56 10.73,8.54 11.54,10.08C9.89,10.57 8.23,10.68 7.22,10.68H7.14V10.68H6.7C7.09,9.11 8.17,7.81 9.59,7.11M12,6.54C13.29,6.54 14.47,7 15.41,7.74C14.69,8.6 13.74,9.22 12.72,9.66C12,8.27 11.31,7.28 10.84,6.67C11.21,6.59 11.6,6.54 12,6.54M16.29,8.63C16.97,9.5 17.4,10.57 17.45,11.74C16.66,11.58 15.92,11.5 15.22,11.5V11.5C14.66,11.5 14.13,11.54 13.63,11.63L13.27,10.78C14.37,10.3 15.43,9.61 16.29,8.63M12,5A7,7 0 0,0 5,12A7,7 0 0,0 12,19A7,7 0 0,0 19,12A7,7 0 0,0 12,5Z",
"name": "dribbble-box"
},
{
"path": "M6.72,20.78C8.23,20.71 10.07,20.78 11.87,20.78C13.72,20.78 15.62,20.66 17.12,20.78C17.72,20.83 18.28,21.19 18.77,20.87C19.16,20.38 18.87,19.71 18.96,19.05C19.12,17.78 20.28,16.27 18.59,15.95C17.87,16.61 18.35,17.23 17.95,18.05C17.45,19.03 15.68,19.37 14,19.5C12.54,19.62 10,19.76 9.5,18.77C9.04,17.94 9.29,16.65 9.29,15.58C9.29,14.38 9.16,13.22 9.5,12.3C11.32,12.43 13.7,11.69 15,12.5C15.87,13 15.37,14.06 16.38,14.4C17.07,14.21 16.7,13.32 16.66,12.5C16.63,11.94 16.63,11.19 16.66,10.57C16.69,9.73 17,8.76 16.1,8.74C15.39,9.3 15.93,10.23 15.18,10.75C14.95,10.92 14.43,11 14.08,11C12.7,11.17 10.54,11.05 9.38,10.84C9.23,9.16 9.24,6.87 9.38,5.19C10,4.57 11.45,4.54 12.42,4.55C14.13,4.55 16.79,4.7 17.3,5.55C17.58,6 17.36,7 17.85,7.1C18.85,7.33 18.36,5.55 18.41,4.73C18.44,4.11 18.71,3.72 18.59,3.27C18.27,2.83 17.79,3.05 17.5,3.09C14.35,3.5 9.6,3.27 6.26,3.27C5.86,3.27 5.16,3.07 4.88,3.54C4.68,4.6 6.12,4.16 6.62,4.73C6.79,4.91 7.03,5.73 7.08,6.28C7.23,7.74 7.08,9.97 7.08,12.12C7.08,14.38 7.26,16.67 7.08,18.05C7,18.53 6.73,19.3 6.62,19.41C6,20.04 4.34,19.35 4.5,20.69C5.09,21.08 5.93,20.82 6.72,20.78Z",
"name": "etsy"
},
{
"path": "M12,17.5C10.15,17.5 8.42,16.56 7.41,15L17.41,12.75L22.08,11.75C22.05,10.32 21.71,8.92 21.08,7.64C18.66,2.61 12.62,0.5 7.58,2.92C2.55,5.34 0.44,11.38 2.86,16.41C5.29,21.44 11.33,23.56 16.36,21.14C18.5,20.09 20.25,18.31 21.22,16.11L16.61,15C15.6,16.57 13.86,17.5 12,17.5M12,6.5C13.76,6.5 15.41,7.34 16.44,8.77L6.57,11.19C6.96,8.5 9.28,6.5 12,6.5Z",
"name": "eventbrite"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M18,5H15.5A3.5,3.5 0 0,0 12,8.5V11H10V14H12V21H15V14H18V11H15V9A1,1 0 0,1 16,8H18V5Z",
"name": "facebook-box"
},
{
"path": "M21,12A9,9 0 0,1 12,21H4.5L9.74,15.76L11.16,17.17L9.33,19H12A7,7 0 0,0 19,12V7L21,5V12M3,12A9,9 0 0,1 12,3H19.5L14.26,8.24L12.84,6.83L14.67,5H12A7,7 0 0,0 5,12V17L3,19V12Z",
"name": "flattr"
},
{
"path": "M11,12C11,14.5 9,16.5 6.5,16.5C4,16.5 2,14.5 2,12C2,9.5 4,7.5 6.5,7.5C9,7.5 11,9.5 11,12M17.5,7.5C15,7.5 13,9.5 13,12C13,14.5 15,16.5 17.5,16.5C20,16.5 22,14.5 22,12C22,9.5 20,7.5 17.5,7.5Z",
"name": "flickr"
},
{
"path": "M17,5L16.57,7.5C16.5,7.73 16.2,8 15.91,8C15.61,8 12,8 12,8C11.53,8 10.95,8.32 10.95,8.79V9.2C10.95,9.67 11.53,10 12,10C12,10 14.95,10 15.28,10C15.61,10 15.93,10.36 15.86,10.71C15.79,11.07 14.94,13.28 14.9,13.5C14.86,13.67 14.64,14 14.25,14C13.92,14 11.37,14 11.37,14C10.85,14 10.69,14.07 10.34,14.5C10,14.94 7.27,18.1 7.27,18.1C7.24,18.13 7,18.04 7,18V5C7,4.7 7.61,4 8,4C8,4 16.17,4 16.5,4C16.82,4 17.08,4.61 17,5M17,14.45C17.11,13.97 18.78,6.72 19.22,4.55M17.58,2C17.58,2 8.38,2 6.91,2C5.43,2 5,3.11 5,3.8C5,4.5 5,20.76 5,20.76C5,21.54 5.42,21.84 5.66,21.93C5.9,22.03 6.55,22.11 6.94,21.66C6.94,21.66 11.65,16.22 11.74,16.13C11.87,16 11.87,16 12,16C12.26,16 14.2,16 15.26,16C16.63,16 16.85,15 17,14.45C17.11,13.97 18.78,6.72 19.22,4.55C19.56,2.89 19.14,2 17.58,2Z",
"name": "foursquare"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H14.56C14.24,20.93 14.23,20.32 14.23,20.11L14.24,17.64C14.24,16.8 13.95,16.25 13.63,15.97C15.64,15.75 17.74,15 17.74,11.53C17.74,10.55 17.39,9.74 16.82,9.11C16.91,8.89 17.22,7.97 16.73,6.73C16.73,6.73 15.97,6.5 14.25,7.66C13.53,7.46 12.77,7.36 12,7.35C11.24,7.36 10.46,7.46 9.75,7.66C8.03,6.5 7.27,6.73 7.27,6.73C6.78,7.97 7.09,8.89 7.18,9.11C6.61,9.74 6.26,10.55 6.26,11.53C6.26,15 8.36,15.75 10.36,16C10.1,16.2 9.87,16.6 9.79,17.18C9.27,17.41 7.97,17.81 7.17,16.43C7.17,16.43 6.69,15.57 5.79,15.5C5.79,15.5 4.91,15.5 5.73,16.05C5.73,16.05 6.32,16.33 6.73,17.37C6.73,17.37 7.25,19.12 9.76,18.58L9.77,20.11C9.77,20.32 9.75,20.93 9.43,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z",
"name": "github-box"
},
{
"path": "M20.38,8.53C20.54,8.13 21.06,6.54 20.21,4.39C20.21,4.39 18.9,4 15.91,6C14.66,5.67 13.33,5.62 12,5.62C10.68,5.62 9.34,5.67 8.09,6C5.1,3.97 3.79,4.39 3.79,4.39C2.94,6.54 3.46,8.13 3.63,8.53C2.61,9.62 2,11 2,12.72C2,19.16 6.16,20.61 12,20.61C17.79,20.61 22,19.16 22,12.72C22,11 21.39,9.62 20.38,8.53M12,19.38C7.88,19.38 4.53,19.19 4.53,15.19C4.53,14.24 5,13.34 5.8,12.61C7.14,11.38 9.43,12.03 12,12.03C14.59,12.03 16.85,11.38 18.2,12.61C19,13.34 19.5,14.23 19.5,15.19C19.5,19.18 16.13,19.38 12,19.38M8.86,13.12C8.04,13.12 7.36,14.12 7.36,15.34C7.36,16.57 8.04,17.58 8.86,17.58C9.69,17.58 10.36,16.58 10.36,15.34C10.36,14.11 9.69,13.12 8.86,13.12M15.14,13.12C14.31,13.12 13.64,14.11 13.64,15.34C13.64,16.58 14.31,17.58 15.14,17.58C15.96,17.58 16.64,16.58 16.64,15.34C16.64,14.11 16,13.12 15.14,13.12Z",
"name": "github-face"
},
{
"path": "M8,2A3,3 0 0,0 5,5V16.5H8V5H19A3,3 0 0,0 16,2H8M16,7.5V19H5A3,3 0 0,0 8,22H16A3,3 0 0,0 19,19V7.5H16Z",
"name": "glassdoor"
},
{
"path": "M2,22L8.5,2H15.4L9.2,20C9.2,20 8.6,22 7,22C5.9,22 2,22 2,22M16.4,5L13,15L15,20.7C15,20.7 15.4,22 17,22C18.3,22 22,22 22,22L16.4,5Z",
"name": "google-adwords"
},
{
"path": "M19,3H13V8L17,7L16,11H21V5C21,3.89 20.1,3 19,3M17,17L13,16V21H19A2,2 0 0,0 21,19V13H16M8,13H3V19A2,2 0 0,0 5,21H11V16L7,17M3,5V11H8L7,7L11,8V3H5C3.89,3 3,3.89 3,5Z",
"name": "google-pages"
},
{
"path": "M12,1.5A9,9 0 0,1 21,10.5C21,13.11 19.89,15.47 18.11,17.11L17.05,16.05C18.55,14.68 19.5,12.7 19.5,10.5A7.5,7.5 0 0,0 12,3A7.5,7.5 0 0,0 4.5,10.5C4.5,12.7 5.45,14.68 6.95,16.05L5.89,17.11C4.11,15.47 3,13.11 3,10.5A9,9 0 0,1 12,1.5M12,4.5A6,6 0 0,1 18,10.5C18,12.28 17.22,13.89 16,15L14.92,13.92C15.89,13.1 16.5,11.87 16.5,10.5C16.5,8 14.5,6 12,6C9.5,6 7.5,8 7.5,10.5C7.5,11.87 8.11,13.1 9.08,13.92L8,15C6.78,13.89 6,12.28 6,10.5A6,6 0 0,1 12,4.5M8.11,17.65L11.29,14.46C11.68,14.07 12.32,14.07 12.71,14.46L15.89,17.65C16.28,18.04 16.28,18.67 15.89,19.06L12.71,22.24C12.32,22.63 11.68,22.63 11.29,22.24L8.11,19.06C7.72,18.67 7.72,18.04 8.11,17.65Z",
"name": "google-physical-web"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M19.5,12H18V10.5H17V12H15.5V13H17V14.5H18V13H19.5V12M9.65,11.36V12.9H12.22C12.09,13.54 11.45,14.83 9.65,14.83C8.11,14.83 6.89,13.54 6.89,12C6.89,10.46 8.11,9.17 9.65,9.17C10.55,9.17 11.13,9.56 11.45,9.88L12.67,8.72C11.9,7.95 10.87,7.5 9.65,7.5C7.14,7.5 5.15,9.5 5.15,12C5.15,14.5 7.14,16.5 9.65,16.5C12.22,16.5 13.96,14.7 13.96,12.13C13.96,11.81 13.96,11.61 13.89,11.36H9.65Z",
"name": "google-plus-box"
},
{
"path": "M14,20.95H20V10.78L8,7.34V3.05H4V20.95H10V15.31H14V20.95Z",
"name": "houzz"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M13.5,18.71H18V11.09L9,8.5V5.29H6V18.71H10.5V14.5H13.5V18.71Z",
"name": "houzz-box"
},
{
"path": "M10,5A1,1 0 0,0 9,4H8V2H16V4H15A1,1 0 0,0 14,5V19A1,1 0 0,0 15,20H16V22H8V20H9A1,1 0 0,0 10,19V5Z",
"name": "instapaper"
},
{
"path": "M7.85,17.07C7.03,17.17 3.5,17.67 4.06,20.26C4.69,23.3 9.87,22.59 9.83,19C9.81,16.57 9.83,9.2 9.83,9.2C9.83,9.2 9.76,8.53 10.43,8.39L18.19,6.79C18.19,6.79 18.83,6.65 18.83,7.29C18.83,7.89 18.83,14.2 18.83,14.2C18.83,14.2 18.9,14.83 18.12,15C17.34,15.12 13.91,15.4 14.19,18C14.5,21.07 20,20.65 20,17.07V2.61C20,2.61 20.04,1.62 18.9,1.87L9.5,3.78C9.5,3.78 8.66,3.96 8.66,4.77C8.66,5.5 8.66,16.11 8.66,16.11C8.66,16.11 8.66,16.96 7.85,17.07Z",
"name": "itunes"
},
{
"path": "M2,5.69C8.92,1.07 11.1,7 11.28,10.27C11.46,13.53 8.29,17.64 4.31,14.92V20.3L2,18.77V5.69M4.22,7.4V12.78C7.84,14.95 9.08,13.17 9.08,10.09C9.08,5.74 6.57,5.59 4.22,7.4M15.08,4.15C15.08,4.15 14.9,7.64 15.08,11.07C15.44,14.5 19.69,11.84 19.69,11.84V4.92L22,5.2V14.44C22,20.6 15.85,20.3 15.85,20.3L15.08,18C20.46,18 19.78,14.43 19.78,14.43C13.27,16.97 12.77,12.61 12.77,12.61V5.69L15.08,4.15Z",
"name": "language-python-text"
},
{
"path": "M18,17.93C15.92,17.92 14.81,16.9 14.04,15.09L13.82,14.6L11.92,10.23C11.29,8.69 9.72,7.64 7.96,7.64C5.57,7.64 3.63,9.59 3.63,12C3.63,14.41 5.57,16.36 7.96,16.36C9.62,16.36 11.08,15.41 11.8,14L12.57,15.81C11.5,17.15 9.82,18 7.96,18C4.67,18 2,15.32 2,12C2,8.69 4.67,6 7.96,6C10.44,6 12.45,7.34 13.47,9.7C13.54,9.89 14.54,12.24 15.42,14.24C15.96,15.5 16.42,16.31 17.91,16.36C19.38,16.41 20.39,15.5 20.39,14.37C20.39,13.26 19.62,13 18.32,12.56C16,11.79 14.79,11 14.79,9.15C14.79,7.33 16,6.12 18,6.12C19.31,6.12 20.24,6.7 20.89,7.86L19.62,8.5C19.14,7.84 18.61,7.57 17.94,7.57C17,7.57 16.33,8.23 16.33,9.1C16.33,10.34 17.43,10.53 18.97,11.03C21.04,11.71 22,12.5 22,14.42C22,16.45 20.27,17.93 18,17.93Z",
"name": "lastfm"
},
{
"path": "M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3H19M18.5,18.5V13.2A3.26,3.26 0 0,0 15.24,9.94C14.39,9.94 13.4,10.46 12.92,11.24V10.13H10.13V18.5H12.92V13.57C12.92,12.8 13.54,12.17 14.31,12.17A1.4,1.4 0 0,1 15.71,13.57V18.5H18.5M6.88,8.56A1.68,1.68 0 0,0 8.56,6.88C8.56,5.95 7.81,5.19 6.88,5.19A1.69,1.69 0 0,0 5.19,6.88C5.19,7.81 5.95,8.56 6.88,8.56M8.27,18.5V10.13H5.5V18.5H8.27Z",
"name": "linkedin-box"
},
{
"path": "M9.56,12.5C9.56,12.6 9.5,12.72 9.4,12.79C9.2,12.97 8.89,12.94 8.71,12.74C8.63,12.65 8.59,12.53 8.59,12.41V8.5H5.66V13.39A2.44,2.44 0 0,0 8.1,15.83C8.68,15.83 9.24,15.62 9.68,15.24C9.64,15.6 9.43,15.93 9.11,16.11C8.75,16.31 8.35,16.42 7.94,16.41C7.46,16.41 7,16.3 6.56,16.09L6.39,16V18.6C7.04,18.86 7.74,19 8.44,19C9.47,19 10.46,18.66 11.25,18C12.08,17.25 12.54,16.18 12.5,15.06V8.5H9.56V12.5M4.93,13.39V5.59H2V12.9C1.84,14.35 2.88,15.65 4.33,15.81C4.41,15.82 4.5,15.83 4.56,15.83V15.83C4.93,15.83 5.29,15.74 5.63,15.59L5.75,15.5L5.65,15.41C5.17,14.85 4.91,14.13 4.93,13.39M22,11.39V8.5H21C20.59,6.38 18.53,5 16.41,5.41C16.17,5.45 15.94,5.5 15.71,5.61C14.28,6.24 13.33,7.62 13.26,9.18V15.83H13.39C14.95,15.76 16.19,14.47 16.19,12.9H17.41V10H16.15V9.17C16.15,8.86 16.32,8.57 16.59,8.41C17.06,8.13 17.68,8.28 17.96,8.76C18.05,8.91 18.09,9.07 18.1,9.24V11.93C18.07,14.05 19.75,15.79 21.87,15.83H22V12.9H22A1,1 0 0,1 21,11.9V11.41L22,11.39Z",
"name": "lyft"
},
{
"path": "M15.45,11.91C15.34,9.7 13.7,8.37 11.72,8.37H11.64C9.35,8.37 8.09,10.17 8.09,12.21C8.09,14.5 9.62,15.95 11.63,15.95C13.88,15.95 15.35,14.3 15.46,12.36M11.65,6.39C13.18,6.39 14.62,7.07 15.67,8.13V8.13C15.67,7.62 16,7.24 16.5,7.24H16.61C17.35,7.24 17.5,7.94 17.5,8.16V16.06C17.46,16.58 18.04,16.84 18.37,16.5C19.64,15.21 21.15,9.81 17.58,6.69C14.25,3.77 9.78,4.25 7.4,5.89C4.88,7.63 3.26,11.5 4.83,15.11C6.54,19.06 11.44,20.24 14.35,19.06C15.83,18.47 16.5,20.46 15,21.11C12.66,22.1 6.23,22 3.22,16.79C1.19,13.27 1.29,7.08 6.68,3.87C10.81,1.42 16.24,2.1 19.5,5.5C22.95,9.1 22.75,15.8 19.4,18.41C17.89,19.59 15.64,18.44 15.66,16.71L15.64,16.15C14.59,17.2 13.18,17.81 11.65,17.81C8.63,17.81 6,15.15 6,12.13C6,9.08 8.63,6.39 11.65,6.39Z",
"name": "mail-ru"
},
{
"path": "M20.93,14C20.66,15.4 18.5,16.95 15.97,17.25C14.66,17.4 13.38,17.55 12,17.5C9.76,17.38 8,16.95 8,16.95L8.03,17.57C8.32,19.78 10.22,19.92 12.03,20C13.85,20.04 15.47,19.53 15.47,19.53L15.55,21.17C15.55,21.17 14.27,21.86 12,22C10.75,22.05 9.2,21.95 7.39,21.47C3.47,20.43 2.79,16.25 2.69,12L2.68,8.57C2.68,4.23 5.5,2.96 5.5,2.96C6.95,2.3 9.41,2 11.97,2H12.03C14.59,2 17.05,2.3 18.5,2.96C18.5,2.96 21.33,4.23 21.33,8.57C21.33,8.57 21.36,11.77 20.93,14M8.33,10.32C8.33,9.54 7.7,8.91 6.93,8.91C6.15,8.91 5.5,9.54 5.5,10.32C5.5,11.09 6.15,11.72 6.93,11.72A1.4,1.4 0 0,0 8.33,10.32M13.41,10.32A1.41,1.41 0 0,0 12,8.91A1.41,1.41 0 0,0 10.59,10.32C10.59,11.09 11.22,11.72 12,11.72C12.78,11.72 13.41,11.09 13.41,10.32M18.5,10.32C18.5,9.54 17.85,8.91 17.07,8.91C16.3,8.91 15.67,9.54 15.67,10.32A1.4,1.4 0 0,0 17.07,11.72C17.85,11.72 18.5,11.09 18.5,10.32Z",
"name": "mastodon-variant"
},
{
"path": "M4.37,7.3C4.4,7.05 4.3,6.81 4.12,6.65L2.25,4.4V4.06H8.05L12.53,13.89L16.47,4.06H22V4.4L20.4,5.93C20.27,6.03 20.2,6.21 20.23,6.38V17.62C20.2,17.79 20.27,17.97 20.4,18.07L21.96,19.6V19.94H14.12V19.6L15.73,18.03C15.89,17.88 15.89,17.83 15.89,17.59V8.5L11.4,19.9H10.8L5.57,8.5V16.14C5.5,16.46 5.63,16.78 5.86,17L7.96,19.57V19.9H2V19.57L4.1,17C4.33,16.78 4.43,16.46 4.37,16.14V7.3Z",
"name": "medium"
},
{
"path": "M19.61,14.86C19.61,16.68 18.3,18.25 16.5,18.55C16.29,18.59 16.07,18.62 15.84,18.61C15.76,18.61 15.73,18.64 15.71,18.71C15.35,19.74 14.64,20.35 13.57,20.5C12.86,20.6 12.22,20.41 11.65,19.97C11.57,19.9 11.5,19.9 11.44,19.96C10.78,20.43 10.04,20.64 9.23,20.59C7.66,20.5 6.33,19.29 6.08,17.74C6.06,17.63 6.04,17.5 6.04,17.41C6.04,17.32 6,17.29 5.92,17.27C5.44,17.18 5,17 4.63,16.68C3.92,16.13 3.5,15.41 3.4,14.5C3.29,13.5 3.61,12.62 4.32,11.89C4.38,11.83 4.38,11.79 4.34,11.72C4.07,11.24 3.94,10.72 3.96,10.17C4,8.79 4.97,7.65 6.31,7.37C6.46,7.33 6.54,7.27 6.61,7.13C7.27,5.71 8.37,4.85 9.91,4.56C11,4.36 12,4.58 12.94,5.13C13,5.18 13.08,5.18 13.17,5.16C14.67,4.72 16,5.04 17.12,6.11C17.78,6.74 18.15,7.54 18.26,8.46C18.28,8.66 18.29,8.86 18.28,9.06C18.27,9.14 18.29,9.17 18.37,9.19C19.04,9.44 19.5,9.91 19.71,10.6C19.96,11.45 19.75,12.21 19.11,12.83C19.05,12.89 19.07,12.92 19.1,12.97C19.44,13.56 19.61,14.18 19.61,14.86M12.93,14.57C12.93,15.34 13.43,16 14.14,16.26C14.5,16.37 14.85,16.43 15.22,16.45C15.5,16.46 15.75,16.44 16,16.32C16.19,16.22 16.28,16.06 16.27,15.85C16.26,15.64 16.16,15.5 15.96,15.4C15.89,15.37 15.82,15.34 15.74,15.33C15.5,15.29 15.3,15.26 15.07,15.21C14.71,15.14 14.55,14.95 14.55,14.57C14.54,14.24 14.63,13.93 14.73,13.63C14.92,13.07 15.17,12.53 15.41,12C15.64,11.47 15.88,10.95 16.04,10.4C16.13,10.1 16.18,9.8 16.09,9.5C15.97,9 15.69,8.7 15.2,8.61C14.75,8.5 14.3,8.5 13.9,8.78C13.76,8.87 13.63,8.85 13.5,8.74C13.43,8.67 13.34,8.58 13.26,8.5C12.84,8.12 12.3,8.1 11.85,8.45C11.67,8.59 11.5,8.76 11.33,8.89C11.16,9 11,9.03 10.79,8.92C10.6,8.83 10.42,8.74 10.23,8.65C10.03,8.57 9.85,8.46 9.63,8.44C8.95,8.38 8.24,8.79 7.94,9.41C7.8,9.68 7.69,9.96 7.59,10.25C7.11,11.57 6.72,12.91 6.32,14.26C6.14,14.86 6.35,15.45 6.86,15.77C7.26,16 7.69,16.09 8.14,15.95C8.5,15.84 8.71,15.55 8.85,15.22C9.31,14.13 9.73,13 10.17,11.91C10.29,11.61 10.41,11.3 10.54,11C10.67,10.7 11.04,10.6 11.26,10.8C11.4,10.92 11.44,11.09 11.42,11.26C11.41,11.45 11.34,11.62 11.27,11.79C11,12.5 10.69,13.24 10.4,13.97C10.34,14.11 10.28,14.26 10.25,14.42C10.21,14.69 10.31,14.93 10.54,15C10.76,15.12 11,15.14 11.23,15.05C11.5,14.95 11.67,14.74 11.79,14.5C12.22,13.65 12.65,12.8 13.08,11.95C13.28,11.56 13.5,11.17 13.68,10.78C13.76,10.64 13.85,10.5 14,10.41C14.12,10.33 14.25,10.33 14.38,10.4C14.5,10.47 14.5,10.6 14.5,10.73C14.5,10.8 14.5,10.87 14.47,10.93C14.41,11.07 14.36,11.2 14.3,11.33C13.94,12.09 13.57,12.84 13.22,13.59C13.07,13.91 12.91,14.23 12.93,14.57M17.96,20.12C17.96,19.62 17.54,19.2 17.04,19.2C16.5,19.2 16.1,19.61 16.1,20.12A0.93,0.93 0 0,0 17.03,21.05A0.93,0.93 0 0,0 17.96,20.12M2.38,12.46C2.86,12.46 3.27,12.05 3.27,11.57C3.27,11.09 2.87,10.69 2.39,10.69C1.89,10.69 1.5,11.08 1.5,11.57C1.5,12.06 1.89,12.46 2.38,12.46M13.26,2.55C12.77,2.55 12.37,2.94 12.37,3.42C12.37,3.91 12.77,4.3 13.25,4.3C13.74,4.3 14.13,3.92 14.13,3.43C14.13,2.95 13.74,2.55 13.26,2.55M20.45,8.03C20.45,7.63 20.11,7.29 19.71,7.29C19.3,7.28 18.95,7.63 18.95,8.04C18.95,8.45 19.28,8.78 19.7,8.78C20.12,8.78 20.46,8.45 20.45,8.03M5.04,5.89C5.04,6.27 5.34,6.56 5.71,6.56C6.09,6.56 6.39,6.26 6.38,5.88C6.38,5.5 6.09,5.22 5.72,5.22C5.33,5.22 5.04,5.5 5.04,5.89M12.06,21.44C12.06,21.12 11.81,20.86 11.5,20.86C11.16,20.86 10.91,21.11 10.91,21.44C10.91,21.75 11.16,22 11.5,22C11.8,22 12.06,21.75 12.06,21.44M21,12.5C20.71,12.5 20.45,12.78 20.45,13.08A0.55,0.55 0 0,0 21,13.63C21.33,13.63 21.57,13.4 21.57,13.08C21.57,12.77 21.33,12.5 21,12.5M7.62,2C7.35,2 7.14,2.2 7.14,2.47C7.14,2.73 7.35,2.94 7.62,2.94A0.47,0.47 0 0,0 8.09,2.47C8.09,2.2 7.89,2 7.62,2M22.08,10C21.86,10 21.67,10.17 21.66,10.4C21.66,10.63 21.85,10.82 22.08,10.82C22.32,10.82 22.5,10.64 22.5,10.41C22.5,10.17 22.32,10 22.08,10M5.5,18.26C5.5,18.04 5.29,17.85 5.06,17.84C4.84,17.84 4.65,18.03 4.65,18.27C4.65,18.5 4.84,18.68 5.07,18.68C5.3,18.68 5.5,18.5 5.5,18.26Z",
"name": "meetup"
},
{
"path": "M21.11,18.5C20.97,18.5 20.83,18.44 20.71,18.36C20.37,18.13 20.28,17.68 20.5,17.34C21.18,16.34 21.54,15.16 21.54,13.93C21.54,12.71 21.18,11.53 20.5,10.5C20.28,10.18 20.37,9.73 20.71,9.5C21.04,9.28 21.5,9.37 21.72,9.7C22.56,10.95 23,12.41 23,13.93C23,15.45 22.56,16.91 21.72,18.16C21.58,18.37 21.35,18.5 21.11,18.5M19,17.29C18.88,17.29 18.74,17.25 18.61,17.17C18.28,16.94 18.19,16.5 18.42,16.15C18.86,15.5 19.1,14.73 19.1,13.93C19.1,13.14 18.86,12.37 18.42,11.71C18.19,11.37 18.28,10.92 18.61,10.69C18.95,10.47 19.4,10.55 19.63,10.89C20.24,11.79 20.56,12.84 20.56,13.93C20.56,15 20.24,16.07 19.63,16.97C19.5,17.18 19.25,17.29 19,17.29M14.9,15.73C15.89,15.73 16.7,14.92 16.7,13.93C16.7,13.17 16.22,12.5 15.55,12.25C15.5,12.55 15.43,12.85 15.34,13.14C15.23,13.44 14.95,13.64 14.64,13.64C14.57,13.64 14.5,13.62 14.41,13.6C14.03,13.47 13.82,13.06 13.95,12.67C14.09,12.24 14.17,11.78 14.17,11.32C14.17,8.93 12.22,7 9.82,7C8.1,7 6.56,8 5.87,9.5C6.54,9.7 7.16,10.04 7.66,10.54C7.95,10.83 7.95,11.29 7.66,11.58C7.38,11.86 6.91,11.86 6.63,11.58C6.17,11.12 5.56,10.86 4.9,10.86C3.56,10.86 2.46,11.96 2.46,13.3C2.46,14.64 3.56,15.73 4.9,15.73H14.9M15.6,10.75C17.06,11.07 18.17,12.37 18.17,13.93C18.17,15.73 16.7,17.19 14.9,17.19H4.9C2.75,17.19 1,15.45 1,13.3C1,11.34 2.45,9.73 4.33,9.45C5.12,7.12 7.33,5.5 9.82,5.5C12.83,5.5 15.31,7.82 15.6,10.75Z",
"name": "mixcloud"
},
{
"path": "M5.68,3.96L11.41,11.65C11.55,11.84 11.55,12.1 11.41,12.29L5.65,20L5.5,20.18C4.76,21 3.47,21.07 2.64,20.31C1.85,19.59 1.79,18.37 2.43,17.5L6.56,11.97L2.46,6.47C1.83,5.62 1.88,4.39 2.67,3.67L2.82,3.54C3.73,2.87 5,3.05 5.68,3.96M18.32,3.96C19,3.05 20.27,2.87 21.18,3.54L21.33,3.67C22.12,4.39 22.17,5.61 21.54,6.47L17.44,11.97L21.57,17.5C22.21,18.36 22.15,19.59 21.36,20.31C20.53,21.07 19.24,21 18.5,20.18L18.35,20L12.59,12.29C12.45,12.1 12.45,11.84 12.59,11.65L18.32,3.96Z",
"name": "mixer"
},
{
"path": "M3.25,4.03L19.95,20.73L18.7,22L14.86,18.13C14.77,18.12 14.68,18.09 14.59,18.05C14.26,17.89 14.14,17.62 14.11,17.38L12.18,15.45C12.14,15.53 12.09,15.6 12.05,15.66C11.62,16.26 11.19,16.26 10.86,16.04C10.54,15.83 5.5,12 5.23,11.87C4.95,11.76 4.85,12.03 5.12,13.5C5.39,15 4.95,15.39 4.57,15.45C4.2,15.5 3.06,15.18 3,12.14C2.95,9.11 3.76,8.62 4.14,8.62C4.6,8.62 7.08,10.69 8.84,12.12L2,5.28L3.25,4.03M18.38,16.56C18.75,15.4 19.12,13.8 19.1,12.03V12C19.14,8.5 17.66,5.58 17.66,5.58C17.66,5.58 17.42,4.72 18.12,4.39C18.83,4.06 19.3,4.61 19.3,4.61C21.12,8.22 21,11.64 21,12C21,12.27 21.09,14.96 19.88,18.05L18.38,16.56M15.14,13.31C15.19,12.92 15.22,12.5 15.24,12.03V12C15.14,8.5 14.13,7.21 14.13,7.21C14.13,7.21 13.89,6.34 14.59,6C15.3,5.69 15.77,6.23 15.77,6.23C17.26,8.94 17.16,11.64 17.14,12C17.15,12.2 17.2,13.38 16.82,15L15.14,13.31M10.2,8.38C10.23,7.77 10.59,7.64 10.59,7.64C10.59,7.64 11.19,7.37 11.57,7.8C11.91,8.19 12.72,9.57 12.89,11.07L10.2,8.38Z",
"name": "nfc-off"
},
{ "path": "M20,4H4V20H12V8H16V20H20V4", "name": "npm-variant" },
{
"path": "M3,3V21H21V3H3M6,6H18V18H15V9H12V18H6V6Z",
"name": "npm-variant-outline"
},
{
"path": "M8.32,21.97C8.21,21.92 8.08,21.76 8.06,21.65C8.03,21.5 8,21.76 8.66,17.56C9.26,13.76 9.25,13.82 9.33,13.71C9.46,13.54 9.44,13.54 10.94,13.53C12.26,13.5 12.54,13.5 13.13,13.41C16.38,12.96 18.39,11.05 19.09,7.75C19.13,7.53 19.17,7.34 19.18,7.34C19.18,7.33 19.25,7.38 19.33,7.44C20.36,8.22 20.71,9.66 20.32,11.58C19.86,13.87 18.64,15.39 16.74,16.04C15.93,16.32 15.25,16.43 14.05,16.46C13.25,16.5 13.23,16.5 13,16.65C12.83,16.82 12.84,16.79 12.45,19.2C12.18,20.9 12.08,21.45 12.04,21.55C11.97,21.71 11.83,21.85 11.67,21.93L11.56,22H10C8.71,22 8.38,22 8.32,21.97V21.97M3.82,19.74C3.63,19.64 3.5,19.47 3.5,19.27C3.5,19 6.11,2.68 6.18,2.5C6.27,2.32 6.5,2.13 6.68,2.06L6.83,2H10.36C14.27,2 14.12,2 15,2.2C17.62,2.75 18.82,4.5 18.37,7.13C17.87,10.06 16.39,11.8 13.87,12.43C13,12.64 12.39,12.7 10.73,12.7C9.42,12.7 9.32,12.71 9.06,12.85C8.8,13 8.59,13.27 8.5,13.6C8.46,13.67 8.23,15.07 7.97,16.7C7.71,18.33 7.5,19.69 7.5,19.72L7.47,19.78H5.69C4.11,19.78 3.89,19.78 3.82,19.74V19.74Z",
"name": "paypal"
},
{
"path": "M12,7A2,2 0 0,1 10,9A2,2 0 0,1 8,7C7.37,7.84 7,8.87 7,10A5,5 0 0,0 12,15A5,5 0 0,0 17,10A5,5 0 0,0 12,5C11.57,5 11.16,5.05 10.77,5.15C11.5,5.45 12,6.17 12,7M12,2A8,8 0 0,1 20,10C20,11.05 19.8,12.04 19.43,12.96C17.89,17.38 13.63,22 12,22C10.37,22 6.11,17.38 4.57,12.96C4.2,12.04 4,11.05 4,10A8,8 0 0,1 12,2Z",
"name": "periscope"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H9.29C9.69,20.33 10.19,19.38 10.39,18.64L11.05,16.34C11.36,16.95 12.28,17.45 13.22,17.45C16.17,17.45 18.22,14.78 18.22,11.45C18.22,8.28 15.64,5.89 12.3,5.89C8.14,5.89 5.97,8.67 5.97,11.72C5.97,13.14 6.69,14.89 7.91,15.45C8.08,15.56 8.19,15.5 8.19,15.34L8.47,14.28C8.5,14.14 8.5,14.06 8.41,14C7.97,13.45 7.69,12.61 7.69,11.78C7.69,9.64 9.3,7.61 12.03,7.61C14.42,7.61 16.08,9.19 16.08,11.5C16.08,14.11 14.75,15.95 13.03,15.95C12.05,15.95 11.39,15.11 11.55,14.17C11.83,13.03 12.39,11.83 12.39,11C12.39,10.22 12,9.61 11.16,9.61C10.22,9.61 9.39,10.61 9.39,11.95C9.39,12.83 9.66,13.39 9.66,13.39L8.55,18.17C8.39,19 8.47,20.25 8.55,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z",
"name": "pinterest-box"
},
{
"path": "M21.9,4.26C21.64,3.55 20.96,3.07 20.2,3.07H20.19L18.46,3.07H3.81C3.07,3.07 2.39,3.54 2.12,4.24C2.04,4.45 2,4.66 2,4.88V10.92L2.07,12.12C2.36,14.85 3.78,17.23 5.97,18.9C6,18.93 6.05,18.96 6.09,19H6.11C7.29,19.86 8.6,20.44 10,20.73C10.68,20.86 11.35,20.93 12,20.93C12.63,20.93 13.25,20.87 13.85,20.76C13.93,20.75 14,20.73 14.07,20.72C14.09,20.71 14.11,20.7 14.14,20.69C15.5,20.4 16.76,19.83 17.89,19H17.91C17.95,18.96 18,18.93 18.03,18.9C20.22,17.23 21.64,14.85 21.93,12.12L22,10.92V4.88C22,4.68 21.97,4.47 21.9,4.26M17.67,10.55L12.96,15.06C12.7,15.32 12.35,15.44 12,15.44C11.67,15.44 11.33,15.32 11.06,15.06L6.36,10.55C5.81,10.03 5.79,9.16 6.32,8.61C6.84,8.06 7.71,8.05 8.26,8.57L12,12.17L15.77,8.57C16.31,8.05 17.18,8.07 17.71,8.61C18.23,9.16 18.21,10.03 17.67,10.55Z",
"name": "pocket"
},
{
"path": "M12,3A9,9 0 0,1 21,12C21,13.76 20.5,15.4 19.62,16.79L21,18.17V20A1,1 0 0,1 20,21H18.18L16.79,19.62C15.41,20.5 13.76,21 12,21A9,9 0 0,1 3,12A9,9 0 0,1 12,3M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17C12.65,17 13.26,16.88 13.83,16.65L10.95,13.77C10.17,13 10.17,11.72 10.95,10.94C11.73,10.16 13,10.16 13.78,10.94L16.66,13.82C16.88,13.26 17,12.64 17,12A5,5 0 0,0 12,7Z",
"name": "quicktime"
},
{
"path": "M18.61,5.89C18.6,5.79 18.5,5.73 18.44,5.73C18.37,5.72 16.83,5.61 16.83,5.61C16.83,5.61 15.76,4.55 15.65,4.43C15.53,4.31 15.3,4.35 15.21,4.37C15.2,4.37 15,4.44 14.61,4.55C14.25,3.5 13.62,2.58 12.43,2.58C12.11,2.18 11.72,2 11.38,2C8.8,2 7.57,5.22 7.18,6.86C6.18,7.17 5.47,7.39 5.37,7.42C4.82,7.6 4.8,7.62 4.73,8.14C4.67,8.54 3.21,19.86 3.21,19.86L14.61,22L20.79,20.66C20.79,20.66 18.62,6 18.61,5.89M14,4.76C13.69,4.85 13.37,4.95 13,5.06C13,5 13,4.93 13,4.85C13,4.21 12.93,3.7 12.79,3.29C13.35,3.36 13.73,4 14,4.76M12.08,3.42C12.24,3.82 12.34,4.39 12.34,5.16C12.34,5.2 12.34,5.24 12.34,5.27C11.71,5.46 11.03,5.68 10.35,5.89C10.73,4.4 11.45,3.69 12.08,3.42M11.31,2.69C11.42,2.69 11.53,2.73 11.64,2.8C10.81,3.19 9.93,4.17 9.55,6.12C9,6.3 8.47,6.46 8,6.62C8.42,5.12 9.46,2.69 11.31,2.69M12.5,9.15L11.76,11.42C11.76,11.42 11.09,11.06 10.27,11.06C9.07,11.06 9,11.81 9,12C9,13.04 11.71,13.43 11.71,15.86C11.71,17.77 10.5,19 8.87,19C6.91,19 5.91,17.78 5.91,17.78L6.43,16.05C6.43,16.05 7.46,16.93 8.33,16.93C8.9,16.93 9.13,16.5 9.13,16.16C9.13,14.81 6.92,14.75 6.92,12.53C6.92,10.66 8.26,8.85 10.97,8.85C12,8.85 12.5,9.15 12.5,9.15M15.43,5.29L16.75,6.6L17.71,6.68C18.05,9 19.19,16.73 19.66,19.88L14.66,20.97L15.43,5.29Z",
"name": "shopify"
},
{
"path": "M7.47,17.19C7.37,17.95 7.08,18.21 6.19,18.21C5.27,18.21 4.87,17.79 4.81,16.87L4.61,13.65C4.61,12.91 4.87,12.55 5.86,12.55C7.21,12.55 7.04,13.54 7.64,14.5C8.33,15.62 10,16.35 12.31,16.35C15.17,16.35 17,15.14 17,13.57C17,12.23 15.89,11.39 13.85,11.16L11.5,10.89C7.21,10.42 5.1,9.19 5.1,6.62C5.1,4.07 8.06,2 12.21,2C13.5,2 14.81,2.29 16.29,2.76C16.29,2.26 16.58,2.1 17.3,2.1C18.46,2.1 18.55,2.39 18.62,3.08L18.85,5.88C18.85,6.5 18.39,6.83 17.63,6.83C16.35,6.83 16.55,5.88 15.86,5.07C15.17,4.26 13.79,3.73 12.08,3.73C9.44,3.73 7.7,4.89 7.7,6.5C7.7,7.8 8.92,8.56 11.38,8.82L13.95,9.08C17.7,9.5 19.61,10.92 19.61,13.33C19.61,16.17 16.71,18.08 12.21,18.08C10.56,18.08 9.08,17.77 7.47,17.19M1,16H2V21H23V22H1V16Z",
"name": "slackware"
},
{
"path": "M6,3H18A3,3 0 0,1 21,6V18A3,3 0 0,1 18,21H6A3,3 0 0,1 3,18V6A3,3 0 0,1 6,3M7,6A1,1 0 0,0 6,7V17A1,1 0 0,0 7,18H17A1,1 0 0,0 18,17V7A1,1 0 0,0 17,6H7M9.5,9H14.5A0.5,0.5 0 0,1 15,9.5V14.5A0.5,0.5 0 0,1 14.5,15H9.5A0.5,0.5 0 0,1 9,14.5V9.5A0.5,0.5 0 0,1 9.5,9Z",
"name": "square-inc"
},
{
"path": "M5.5,0H18.5A5.5,5.5 0 0,1 24,5.5V18.5A5.5,5.5 0 0,1 18.5,24H5.5A5.5,5.5 0 0,1 0,18.5V5.5A5.5,5.5 0 0,1 5.5,0M15.39,15.18C15.39,16.76 14.5,17.81 12.85,17.95V12.61C14.55,13.13 15.39,13.66 15.39,15.18M11.65,6V10.88C10.34,10.5 9.03,9.93 9.03,8.43C9.03,6.94 10.18,6.12 11.65,6M15.5,7.6L16.5,6.8C15.62,5.66 14.4,4.92 12.85,4.77V3.8H11.65V3.8L11.65,4.75C9.5,4.89 7.68,6.17 7.68,8.5C7.68,11 9.74,11.78 11.65,12.29V17.96C10.54,17.84 9.29,17.31 8.43,16.03L7.3,16.78C8.2,18.12 9.76,19 11.65,19.14V20.2H12.07L12.85,20.2V19.16C15.35,19 16.7,17.34 16.7,15.14C16.7,12.58 14.81,11.76 12.85,11.19V6.05C14,6.22 14.85,6.76 15.5,7.6Z",
"name": "square-inc-cash"
},
{
"path": "M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V15L6.19,16.31C6.45,17.6 7.6,18.58 8.97,18.58C10.53,18.58 11.8,17.31 11.8,15.75V15.62L15.2,13.19H15.28C17.36,13.19 19.05,11.5 19.05,9.42C19.05,7.34 17.36,5.65 15.28,5.65C13.2,5.65 11.5,7.34 11.5,9.42V9.47L9.13,12.93L8.97,12.92C8.38,12.92 7.83,13.1 7.38,13.41L3,11.6V5A2,2 0 0,1 5,3H19M8.28,17.17C9.08,17.5 10,17.13 10.33,16.33C10.66,15.53 10.28,14.62 9.5,14.29L8.22,13.76C8.71,13.58 9.26,13.57 9.78,13.79C10.31,14 10.72,14.41 10.93,14.94C11.15,15.46 11.15,16.04 10.93,16.56C10.5,17.64 9.23,18.16 8.15,17.71C7.65,17.5 7.27,17.12 7.06,16.67L8.28,17.17M17.8,9.42C17.8,10.81 16.67,11.94 15.28,11.94C13.9,11.94 12.77,10.81 12.77,9.42A2.51,2.51 0 0,1 15.28,6.91C16.67,6.91 17.8,8.04 17.8,9.42M13.4,9.42C13.4,10.46 14.24,11.31 15.29,11.31C16.33,11.31 17.17,10.46 17.17,9.42C17.17,8.38 16.33,7.53 15.29,7.53C14.24,7.53 13.4,8.38 13.4,9.42Z",
"name": "steam-box"
},
{
"path": "M14.92,17.16L16.75,13.53H19.45L14.94,22.5L10.37,13.53H13.07L14.92,17.16M10.63,8.66L8.18,13.55H4.55L10.61,1.5L16.74,13.55H13.11L10.63,8.66Z",
"name": "strava"
},
{
"path": "M12,14C11,14 9,15 9,16C9,18 12,18 12,18V17A1,1 0 0,1 11,16A1,1 0 0,1 12,15V14M12,19C12,19 8,18.5 8,16.5C8,13.5 11,12.75 12,12.75V11.5C11,11.5 7,13 7,16C7,20 12,20 12,20V19M10.07,7.03L11.26,7.56C11.69,5.12 12.84,3.5 12.84,3.5C12.41,4.53 12.13,5.38 11.95,6.05C13.16,3.55 15.61,2 15.61,2C14.43,3.18 13.56,4.46 12.97,5.53C14.55,3.85 16.74,2.75 16.74,2.75C14.05,4.47 12.84,7.2 12.54,7.96L13.09,8.04C13.09,8.56 13.09,9.04 13.34,9.42C14.1,11.31 18,11.47 18,16C18,20.53 13.97,22 11.83,22C9.69,22 5,21.03 5,16C5,10.97 9.95,10.93 10.83,8.92C10.95,8.54 10.07,7.03 10.07,7.03Z",
"name": "tor"
},
{
"path": "M17,11H13V15.5C13,16.44 13.28,17 14.5,17H17V21C17,21 15.54,21.05 14.17,21.05C10.8,21.05 9.5,19 9.5,16.75V11H7V7C10.07,6.74 10.27,4.5 10.5,3H13V7H17",
"name": "tumblr"
},
{
"path": "M16,11H13V14.9C13,15.63 13.14,16 14.1,16H16V19C16,19 14.97,19.1 13.9,19.1C11.25,19.1 10,17.5 10,15.7V11H8V8.2C10.41,8 10.62,6.16 10.8,5H13V8H16M20,2H4C2.89,2 2,2.89 2,4V20A2,2 0 0,0 4,22H20A2,2 0 0,0 22,20V4C22,2.89 21.1,2 20,2Z",
"name": "tumblr-box"
},
{
"path": "M3.75,17L8,12.75V16H18V11.5L20,9.5V16A2,2 0 0,1 18,18H8V21.25L3.75,17M20.25,7L16,11.25V8H6V12.5L4,14.5V8A2,2 0 0,1 6,6H16V2.75L20.25,7Z",
"name": "tumblr-reblog"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M17.71,9.33C18.19,8.93 18.75,8.45 19,7.92C18.59,8.13 18.1,8.26 17.56,8.33C18.06,7.97 18.47,7.5 18.68,6.86C18.16,7.14 17.63,7.38 16.97,7.5C15.42,5.63 11.71,7.15 12.37,9.95C9.76,9.79 8.17,8.61 6.85,7.16C6.1,8.38 6.75,10.23 7.64,10.74C7.18,10.71 6.83,10.57 6.5,10.41C6.54,11.95 7.39,12.69 8.58,13.09C8.22,13.16 7.82,13.18 7.44,13.12C7.81,14.19 8.58,14.86 9.9,15C9,15.76 7.34,16.29 6,16.08C7.15,16.81 8.46,17.39 10.28,17.31C14.69,17.11 17.64,13.95 17.71,9.33Z",
"name": "twitter-box"
},
{
"path": "M17.71,9.33C18.19,8.93 18.75,8.45 19,7.92C18.59,8.13 18.1,8.26 17.56,8.33C18.06,7.97 18.47,7.5 18.68,6.86C18.16,7.14 17.63,7.38 16.97,7.5C15.42,5.63 11.71,7.15 12.37,9.95C9.76,9.79 8.17,8.61 6.85,7.16C6.1,8.38 6.75,10.23 7.64,10.74C7.18,10.71 6.83,10.57 6.5,10.41C6.54,11.95 7.39,12.69 8.58,13.09C8.22,13.16 7.82,13.18 7.44,13.12C7.81,14.19 8.58,14.86 9.9,15C9,15.76 7.34,16.29 6,16.08C7.15,16.81 8.46,17.39 10.28,17.31C14.69,17.11 17.64,13.95 17.71,9.33M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2Z",
"name": "twitter-circle"
},
{
"path": "M6.38,13.24V13.24C6.38,11.84 6.38,10.44 6.38,9.04H7.4V15.84H6.39C6.39,15.63 6.39,15.42 6.39,15.21C5.93,15.68 5.29,15.96 4.58,15.96C3.12,15.96 2,14.9 2,13.3V9.04H3V13.24C3,14.33 3.74,15.04 4.7,15.04C5.64,15.04 6.38,14.31 6.38,13.24M9.14,9.04V11.5C9.37,11.29 9.65,11.1 9.95,10.97C10.25,10.85 10.58,10.78 10.91,10.78C12.37,10.78 13.5,11.94 13.5,13.37C13.5,14.8 12.37,15.96 10.91,15.96C10.58,15.96 10.25,15.89 9.95,15.77C9.64,15.64 9.37,15.45 9.13,15.22C9.13,15.43 9.13,15.63 9.13,15.84C8.81,15.84 8.5,15.84 8.16,15.84V9.04H9.14M12.55,13.37V13.37C12.55,12.41 11.77,11.65 10.84,11.65C9.89,11.65 9.13,12.41 9.13,13.37C9.13,14.32 9.88,15.09 10.84,15.09C11.77,15.09 12.55,14.32 12.55,13.37M16.46,10.79C17.9,10.79 18.95,11.89 18.95,13.36V13.69H14.91C15.04,14.5 15.71,15.09 16.55,15.09C17.13,15.09 17.61,14.86 18,14.36L18.7,14.89C18.2,15.55 17.46,15.95 16.55,15.95C15.06,15.95 13.91,14.84 13.91,13.36C13.91,11.97 15,10.79 16.46,10.79M14.92,12.91H17.95C17.79,12.15 17.18,11.65 16.44,11.65C15.71,11.65 15.1,12.15 14.92,12.91M20.5,13V15.84H19.5V10.89C19.82,10.89 20.14,10.89 20.47,10.89V11.5C20.71,11.1 21.11,10.85 21.66,10.85H22V11.76H21.59C20.95,11.76 20.5,12.26 20.5,13",
"name": "uber"
},
{
"path": "M19.5,3C20.14,4.08 20.44,5.19 20.44,6.6C20.44,11.08 16.61,16.91 13.5,21H6.41L3.56,4L9.77,3.39L11.28,15.5C12.69,13.21 14.42,9.61 14.42,7.16C14.42,5.81 14.19,4.9 13.83,4.15L19.5,3Z",
"name": "venmo"
},
{
"path": "M5,3A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3H5M5.5,8.5H7C7.36,8.5 7.5,8.66 7.64,9.07C8.36,11.17 9.57,13 10.07,13C10.26,13 10.35,12.92 10.35,12.45V10.28C10.29,9.28 9.76,9.19 9.76,8.84C9.76,8.67 9.9,8.5 10.14,8.5H12.45C12.77,8.5 12.87,8.67 12.87,9.04V11.96C12.87,12.27 13,12.38 13.1,12.38C13.29,12.38 13.45,12.27 13.79,11.93C14.85,10.74 15.6,8.92 15.6,8.92C15.7,8.7 15.87,8.5 16.24,8.5H17.71C18.16,8.5 18.26,8.73 18.16,9.04C17.97,9.9 16.18,12.43 16.18,12.43C16,12.68 15.96,12.8 16.18,13.09C16.33,13.3 16.85,13.74 17.19,14.15C17.83,14.86 18.3,15.46 18.44,15.87C18.56,16.29 18.35,16.5 17.93,16.5H16.45C15.89,16.5 15.73,16.05 14.73,15.05C13.85,14.21 13.5,14.1 13.26,14.1C12.96,14.1 12.87,14.18 12.87,14.61V15.93C12.87,16.29 12.76,16.5 11.82,16.5C10.26,16.5 8.54,15.55 7.33,13.8C5.5,11.24 5,9.31 5,8.92C5,8.7 5.08,8.5 5.5,8.5Z",
"name": "vk-box"
},
{
"path": "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M5.5,8.5H7C7.36,8.5 7.5,8.66 7.64,9.07C8.36,11.17 9.57,13 10.07,13C10.26,13 10.35,12.92 10.35,12.45V10.28C10.29,9.28 9.76,9.19 9.76,8.84C9.76,8.67 9.9,8.5 10.14,8.5H12.45C12.77,8.5 12.87,8.67 12.87,9.04V11.96C12.87,12.27 13,12.38 13.1,12.38C13.29,12.38 13.45,12.27 13.79,11.93C14.85,10.74 15.6,8.92 15.6,8.92C15.7,8.7 15.87,8.5 16.24,8.5H17.71C18.16,8.5 18.26,8.73 18.16,9.04C17.97,9.9 16.18,12.43 16.18,12.43C16,12.68 15.96,12.8 16.18,13.09C16.33,13.3 16.85,13.74 17.19,14.15C17.83,14.86 18.3,15.46 18.44,15.87C18.56,16.29 18.35,16.5 17.93,16.5H16.45C15.89,16.5 15.73,16.05 14.73,15.05C13.85,14.21 13.5,14.1 13.26,14.1C12.96,14.1 12.87,14.18 12.87,14.61V15.93C12.87,16.29 12.76,16.5 11.82,16.5C10.26,16.5 8.54,15.55 7.33,13.8C5.5,11.24 5,9.31 5,8.92C5,8.7 5.08,8.5 5.5,8.5Z",
"name": "vk-circle"
},
{
"path": "M17,17.5L12,15L7,17.5V5H5V19H19V5H17V17.5M12,12.42L14.25,13.77L13.65,11.22L15.64,9.5L13,9.27L12,6.86L11,9.27L8.36,9.5L10.35,11.22L9.75,13.77L12,12.42M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z",
"name": "wunderlist"
},
{
"path": "M0 16.7L3.2 12.9L0 9.1L1.5 7.8L4.5 11.3L7.5 7.8L9 9.1L5.8 12.9L9 16.7L7.5 18L4.5 14.4L1.5 18L0 16.7M24 16.9C24 17.4 23.6 17.9 23 17.9H20C18.9 17.9 18 17 18 15.9V13.9C18 12.8 18.9 11.9 20 11.9H22V9.9H18V8H23C23.5 8 24 8.4 24 9M22 14H20V16H22V14M16 16.9C16 17.4 15.6 17.9 15 17.9H12C10.9 17.9 10 17 10 15.9V9.9C10 8.8 10.9 7.9 12 7.9H14V5H16V16.9M14 15.9V9.9H12V15.9H14Z",
"name": "xda"
},
{
"path": "M4.8,3C3.8,3 3,3.8 3,4.8V19.2C3,20.2 3.8,21 4.8,21H19.2C20.2,21 21,20.2 21,19.2V4.8C21,3.8 20.2,3 19.2,3M16.07,5H18.11C18.23,5 18.33,5.04 18.37,5.13C18.43,5.22 18.43,5.33 18.37,5.44L13.9,13.36L16.75,18.56C16.81,18.67 16.81,18.78 16.75,18.87C16.7,18.95 16.61,19 16.5,19H14.47C14.16,19 14,18.79 13.91,18.61L11.04,13.35C11.18,13.1 15.53,5.39 15.53,5.39C15.64,5.19 15.77,5 16.07,5M7.09,7.76H9.1C9.41,7.76 9.57,7.96 9.67,8.15L11.06,10.57C10.97,10.71 8.88,14.42 8.88,14.42C8.77,14.61 8.63,14.81 8.32,14.81H6.3C6.18,14.81 6.09,14.76 6.04,14.67C6,14.59 6,14.47 6.04,14.36L8.18,10.57L6.82,8.2C6.77,8.09 6.75,8 6.81,7.89C6.86,7.81 6.96,7.76 7.09,7.76Z",
"name": "xing-box"
},
{
"path": "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M15.85,6H17.74C17.86,6 17.94,6.04 18,6.12C18.04,6.2 18.04,6.3 18,6.41L13.84,13.76L16.5,18.59C16.53,18.69 16.53,18.8 16.5,18.88C16.43,18.96 16.35,19 16.24,19H14.36C14.07,19 13.93,18.81 13.84,18.64L11.17,13.76C11.31,13.5 15.35,6.36 15.35,6.36C15.45,6.18 15.57,6 15.85,6M7.5,8.57H9.39C9.67,8.57 9.81,8.75 9.9,8.92L11.19,11.17C11.12,11.3 9.17,14.75 9.17,14.75C9.07,14.92 8.94,15.11 8.66,15.11H6.78C6.67,15.11 6.59,15.06 6.54,15C6.5,14.9 6.5,14.8 6.54,14.69L8.53,11.17L7.27,9C7.21,8.87 7.2,8.77 7.25,8.69C7.3,8.61 7.39,8.57 7.5,8.57Z",
"name": "xing-circle"
},
{
"path": "M10.59,2C11.23,2 11.5,2.27 11.58,2.97L11.79,6.14L12.03,10.29C12.05,10.64 12,11 11.86,11.32C11.64,11.77 11.14,11.89 10.73,11.58C10.5,11.39 10.31,11.14 10.15,10.87L6.42,4.55C6.06,3.94 6.17,3.54 6.77,3.16C7.5,2.68 9.73,2 10.59,2M14.83,14.85L15.09,14.91L18.95,16.31C19.61,16.55 19.79,16.92 19.5,17.57C19.06,18.7 18.34,19.66 17.42,20.45C16.96,20.85 16.5,20.78 16.21,20.28L13.94,16.32C13.55,15.61 14.03,14.8 14.83,14.85M4.5,14C4.5,13.26 4.5,12.55 4.75,11.87C4.97,11.2 5.33,11 6,11.27L9.63,12.81C10.09,13 10.35,13.32 10.33,13.84C10.3,14.36 9.97,14.58 9.53,14.73L5.85,15.94C5.15,16.17 4.79,15.96 4.64,15.25C4.55,14.83 4.47,14.4 4.5,14M11.97,21C11.95,21.81 11.6,22.12 10.81,22C9.77,21.8 8.81,21.4 7.96,20.76C7.54,20.44 7.45,19.95 7.76,19.53L10.47,15.97C10.7,15.67 11.03,15.6 11.39,15.74C11.77,15.88 11.97,16.18 11.97,16.59V21M14.45,13.32C13.73,13.33 13.23,12.5 13.64,11.91C14.47,10.67 15.35,9.46 16.23,8.26C16.5,7.85 16.94,7.82 17.31,8.16C18.24,9 18.91,10 19.29,11.22C19.43,11.67 19.25,12.08 18.83,12.2L15.09,13.17L14.45,13.32Z",
"name": "yelp"
}
]
[]

View File

@@ -1,16 +1,17 @@
import "@polymer/app-layout/app-header-layout/app-header-layout";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "../../src/components/ha-icon-button";
import "../../src/components/ha-icon";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-item/paper-item-body";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "../../src/components/ha-card";
import "../../src/components/ha-icon";
import "../../src/components/ha-icon-button";
import "../../src/managers/notification-manager";
import "../../src/styles/polymer-ha-style";
// eslint-disable-next-line import/extensions
import { DEMOS } from "../build/import-demos";
const fixPath = (path) => path.substr(2, path.length - 5);

View File

@@ -153,7 +153,7 @@ export class HassioUpdate extends LitElement {
item.progress = true;
const confirmed = await showConfirmationDialog(this, {
title: `Update ${item.name}`,
text: `Are you sure you want to upgrade ${item.name} to version ${item.version}?`,
text: `Are you sure you want to update ${item.name} to version ${item.version}?`,
confirmText: "update",
dismissText: "cancel",
});

View File

@@ -79,6 +79,7 @@ class HassioSnapshots extends LitElement {
},
{ slug: "ssl", name: "SSL", checked: true },
{ slug: "share", name: "Share", checked: true },
{ slug: "media", name: "Media", checked: true },
{ slug: "addons/local", name: "Local add-ons", checked: true },
];
@@ -241,7 +242,7 @@ class HassioSnapshots extends LitElement {
protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps);
this._updateSnapshots();
this.refreshData();
}
protected updated(changedProps: PropertyValues) {

View File

@@ -14,7 +14,6 @@ import {
TemplateResult,
} from "lit-element";
import memoizeOne from "memoize-one";
import { atLeastVersion } from "../../../src/common/config/version";
import "../../../src/components/buttons/ha-progress-button";
import "../../../src/components/ha-button-menu";
import "../../../src/components/ha-card";
@@ -85,8 +84,7 @@ class HassioHostInfo extends LitElement {
</mwc-button>
</ha-settings-row>`
: ""}
${this.hostInfo.features.includes("network") &&
atLeastVersion(this.hass.config.version, 0, 115)
${this.hostInfo.features.includes("network")
? html` <ha-settings-row>
<span slot="heading">
IP address

View File

@@ -213,7 +213,7 @@ class HassioSupervisorInfo extends LitElement {
const confirmed = await showConfirmationDialog(this, {
title: "Update supervisor",
text: `Are you sure you want to upgrade supervisor to version ${this.supervisorInfo.version_latest}?`,
text: `Are you sure you want to update supervisor to version ${this.supervisorInfo.version_latest}?`,
confirmText: "update",
dismissText: "cancel",
});

View File

@@ -8,12 +8,12 @@
"version": "1.0.0",
"scripts": {
"build": "script/build_frontend",
"lint:eslint": "eslint '**/src/**/*.{js,ts,html}' --ignore-path .gitignore",
"format:eslint": "eslint '**/src/**/*.{js,ts,html}' --fix --ignore-path .gitignore",
"lint:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --check",
"format:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --write",
"lint:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --ignore-path .gitignore",
"format:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --fix --ignore-path .gitignore",
"lint:prettier": "prettier \"**/src/**/*.{js,ts,json,css,md}\" --check",
"format:prettier": "prettier \"**/src/**/*.{js,ts,json,css,md}\" --write",
"lint:types": "tsc",
"lint:lit": "lit-analyzer '**/src/**/*.ts' --format markdown --outFile result.md",
"lint:lit": "lit-analyzer \"**/src/**/*.ts\" --format markdown --outFile result.md",
"lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types",
"format": "npm run format:eslint && npm run format:prettier",
"mocha": "node_modules/.bin/ts-mocha -p test-mocha/tsconfig.test.json --opts test-mocha/mocha.opts",

View File

@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
version="20200912.0",
version="20200916.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",

View File

@@ -1,14 +1,14 @@
import { derivedStyles, darkStyles } from "../../resources/styles";
import { darkStyles, derivedStyles } from "../../resources/styles";
import { HomeAssistant, Theme } from "../../types";
import {
hex2rgb,
lab2hex,
lab2rgb,
rgb2hex,
rgb2lab,
lab2rgb,
lab2hex,
} from "../color/convert-color";
import { labBrighten, labDarken } from "../color/lab";
import { rgbContrast } from "../color/rgb";
import { labDarken, labBrighten } from "../color/lab";
interface ProcessedTheme {
keys: { [key: string]: "" };
@@ -105,12 +105,12 @@ const processTheme = (
const keys = {};
for (const key of Object.keys(combinedTheme)) {
const prefixedKey = `--${key}`;
const value = String(combinedTheme[key]!);
const value = String(combinedTheme[key]);
styles[prefixedKey] = value;
keys[prefixedKey] = "";
// Try to create a rgb value for this key if it is not a var
if (value.startsWith("#")) {
if (!value.startsWith("#")) {
// Can't convert non hex value
continue;
}

View File

@@ -24,8 +24,7 @@ export const iconColorCSS = css`
ha-icon[data-domain="group"][data-state="home"],
ha-icon[data-domain="group"][data-state="open"],
ha-icon[data-domain="group"][data-state="locked"],
ha-icon[data-domain="group"][data-state="problem"]
{
ha-icon[data-domain="group"][data-state="problem"] {
color: var(--paper-item-icon-active-color, #fdd835);
}

View File

@@ -1,16 +1,16 @@
import type { HassEntity } from "home-assistant-js-websocket";
import { styleMap } from "lit-html/directives/style-map";
import {
css,
CSSResult,
html,
internalProperty,
LitElement,
property,
internalProperty,
PropertyValues,
TemplateResult,
} from "lit-element";
import { ifDefined } from "lit-html/directives/if-defined";
import { styleMap } from "lit-html/directives/style-map";
import { computeActiveState } from "../../common/entity/compute_active_state";
import { computeStateDomain } from "../../common/entity/compute_state_domain";
import { stateIcon } from "../../common/entity/state_icon";
@@ -73,10 +73,15 @@ export class StateBadge extends LitElement {
if (stateObj) {
// hide icon if we have entity picture
if (
((stateObj.attributes.entity_picture_local || stateObj.attributes.entity_picture) && !this.overrideIcon) ||
((stateObj.attributes.entity_picture_local ||
stateObj.attributes.entity_picture) &&
!this.overrideIcon) ||
this.overrideImage
) {
let imageUrl = this.overrideImage || stateObj.attributes.entity_picture_local || stateObj.attributes.entity_picture;
let imageUrl =
this.overrideImage ||
stateObj.attributes.entity_picture_local ||
stateObj.attributes.entity_picture;
if (this.hass) {
imageUrl = this.hass.hassUrl(imageUrl);
}

View File

@@ -1,17 +1,16 @@
import {
customElement,
html,
TemplateResult,
LitElement,
CSSResult,
css,
query,
property,
} from "lit-element";
import "@material/mwc-button";
import "@material/mwc-menu";
import type { Menu, Corner } from "@material/mwc-menu";
import type { Corner, Menu } from "@material/mwc-menu";
import {
css,
CSSResult,
customElement,
html,
LitElement,
property,
query,
TemplateResult,
} from "lit-element";
import "./ha-icon-button";
@customElement("ha-button-menu")
@@ -22,6 +21,8 @@ export class HaButtonMenu extends LitElement {
@property({ type: Boolean }) public activatable = false;
@property({ type: Boolean }) public disabled = false;
@query("mwc-menu") private _menu?: Menu;
public get items() {
@@ -48,6 +49,9 @@ export class HaButtonMenu extends LitElement {
}
private _handleClick(): void {
if (this.disabled) {
return;
}
this._menu!.anchor = this;
this._menu!.show();
}

View File

@@ -32,6 +32,9 @@ class HaCameraStream extends LitElement {
@property({ type: Boolean, attribute: "muted" })
public muted = false;
@property({ type: Boolean, attribute: "allow-exoplayer" })
public allowExoPlayer = false;
// We keep track if we should force MJPEG with a string
// that way it automatically resets if we change entity.
@internalProperty() private _forceMJPEG?: string;
@@ -61,6 +64,7 @@ class HaCameraStream extends LitElement {
<ha-hls-player
autoplay
playsinline
.allowExoPlayer=${this.allowExoPlayer}
.muted=${this.muted}
.controls=${this.controls}
.hass=${this.hass}

View File

@@ -12,7 +12,6 @@ import {
} from "lit-element";
import { fireEvent } from "../common/dom/fire_event";
import { nextRender } from "../common/util/render-status";
import { getExternalConfig } from "../external_app/external_config";
import type { HomeAssistant } from "../types";
type HLSModule = typeof import("hls.js");
@@ -35,6 +34,9 @@ class HaHLSPlayer extends LitElement {
@property({ type: Boolean, attribute: "playsinline" })
public playsInline = false;
@property({ type: Boolean, attribute: "allow-exoplayer" })
public allowExoPlayer = false;
@query("video") private _videoEl!: HTMLVideoElement;
@internalProperty() private _attached = false;
@@ -91,11 +93,7 @@ class HaHLSPlayer extends LitElement {
}
private async _getUseExoPlayer(): Promise<boolean> {
if (!this.hass!.auth.external) {
return false;
}
const externalConfig = await getExternalConfig(this.hass!.auth.external);
return externalConfig && externalConfig.hasExoPlayer;
return false;
}
private async _startHls(): Promise<void> {
@@ -137,7 +135,10 @@ class HaHLSPlayer extends LitElement {
this._videoEl.style.visibility = "hidden";
await this.hass!.auth.external!.sendMessage({
type: "exoplayer/play_hls",
payload: new URL(url, window.location.href).toString(),
payload: {
url: new URL(url, window.location.href).toString(),
muted: this.muted,
},
});
}

View File

@@ -24,207 +24,16 @@ import {
import { debounce } from "../common/util/debounce";
import { fireEvent } from "../common/dom/fire_event";
const mdiRenameMapping = {
"account-badge": "badge-account",
"account-badge-alert": "badge-account-alert",
"account-badge-alert-outline": "badge-account-alert-outline",
"account-badge-horizontal": "badge-account-horizontal",
"account-badge-horizontal-outline": "badge-account-horizontal-outline",
"account-badge-outline": "badge-account-outline",
"account-card-details": "card-account-details",
"account-card-details-outline": "card-account-details-outline",
airplay: "apple-airplay",
artist: "account-music",
"artist-outline": "account-music-outline",
audiobook: "book-music",
azure: "microsoft-azure",
"azure-devops": "microsoft-azure-devops",
bible: "book-cross",
bowl: "bowl-mix",
"calendar-repeat": "calendar-sync",
"calendar-repeat-outline": "calendar-sync-outline",
"camcorder-box": "video-box",
"camcorder-box-off": "video-box-off",
"cellphone-settings-variant": "cellphone-cog",
"chart-snakey": "chart-sankey",
"chart-snakey-variant": "chart-sankey-variant",
coin: "currency-usd-circle",
"coin-outline": "currency-usd-circle-outline",
"coins-outline": "circle-multiple-outline",
"contact-mail": "card-account-mail",
"contact-mail-outline": "card-account-mail-outline",
"contact-phone": "card-account-phone",
"contact-phone-outline": "card-account-phone-outline",
cowboy: "account-cowboy-hat",
"database-refresh": "database-sync",
dictionary: "book-alphabet",
edge: "microsoft-edge",
"edge-legacy": "microsoft-edge-legacy",
"file-document-box": "text-box",
"file-document-box-check-outline": "text-box-check-outline",
"file-document-box-minus": "text-box-minus",
"file-document-box-minus-outline": "text-box-minus-outline",
"file-document-box-multiple": "text-box-multiple",
"file-document-box-multiple-outline": "text-box-multiple-outline",
"file-document-box-outline": "text-box-outline",
"file-document-box-plus": "text-box-plus",
"file-document-box-plus-outline": "text-box-plus-outline",
"file-document-box-remove": "text-box-remove",
"file-document-box-remove-outline": "text-box-remove-outline",
"file-document-box-search": "text-box-search",
"file-document-box-search-outline": "text-box-search-outline",
"file-settings-variant": "file-cog",
"file-settings-variant-outline": "file-cog-outline",
"folder-settings-variant": "folder-cog",
"folder-settings-variant-outline": "folder-cog-outline",
"github-circle": "github",
"google-adwords": "google-ads",
hackernews: "y-combinator",
hotel: "bed",
"image-filter": "image-multiple-outline",
"internet-explorer": "microsoft-internet-explorer",
json: "code-json",
kotlin: "language-kotlin",
"library-books": "filmstrip-box",
"library-movie": "filmstrip-box-multiple",
"library-music": "music-box-multiple",
"library-music-outline": "music-box-multiple-outline",
"library-video": "play-box-multiple",
markdown: "language-markdown",
"markdown-outline": "language-markdown-outline",
"message-settings-variant": "message-cog",
"message-settings-variant-outline": "message-cog-outline",
"microsoft-dynamics": "microsoft-dynamics-365",
"network-router": "router-network",
office: "microsoft-office",
onedrive: "microsoft-onedrive",
onenote: "microsoft-onenote",
outlook: "microsoft-outlook",
playstation: "sony-playstation",
"periodic-table-co": "molecule-co",
"periodic-table-co2": "molecule-co2",
pot: "pot-steam",
ruby: "language-ruby",
sailing: "sail-boat",
scooter: "human-scooter",
settings: "cog",
"settings-box": "cog-box",
"settings-outline": "cog-outline",
"settings-transfer": "cog-transfer",
"settings-transfer-outline": "cog-transfer-outline",
"shield-refresh": "shield-sync",
"shield-refresh-outline": "shield-sync-outline",
"sort-alphabetical": "sort-alphabetical-variant",
"sort-alphabetical-ascending": "sort-alphabetical-ascending-variant",
"sort-alphabetical-descending": "sort-alphabetical-descending-variant",
"sort-numeric": "sort-numeric-variant",
"star-half": "star-half-full",
storefront: "storefront-outline",
timer: "timer-outline",
"timer-off": "timer-off-outline",
towing: "tow-truck",
voice: "account-voice",
"wall-sconce-variant": "wall-sconce-round-variant",
wii: "nintendo-wii",
wiiu: "nintendo-wiiu",
windows: "microsoft-windows",
"windows-classic": "microsoft-windows-classic",
worker: "account-hard-hat",
xbox: "microsoft-xbox",
"xbox-controller": "microsoft-xbox-controller",
"xbox-controller-battery-alert": "microsoft-xbox-controller-battery-alert",
"xbox-controller-battery-charging":
"microsoft-xbox-controller-battery-charging",
"xbox-controller-battery-empty": "microsoft-xbox-controller-battery-empty",
"xbox-controller-battery-full": "microsoft-xbox-controller-battery-full",
"xbox-controller-battery-low": "microsoft-xbox-controller-battery-low",
"xbox-controller-battery-medium": "microsoft-xbox-controller-battery-medium",
"xbox-controller-battery-unknown":
"microsoft-xbox-controller-battery-unknown",
"xbox-controller-menu": "microsoft-xbox-controller-menu",
"xbox-controller-off": "microsoft-xbox-controller-off",
"xbox-controller-view": "microsoft-xbox-controller-view",
yammer: "microsoft-yammer",
"youtube-creator-studio": "youtube-studio",
"selection-mutliple": "selection-multiple",
textarea: "form-textarea",
textbox: "form-textbox",
"textbox-lock": "form-textbox-lock",
"textbox-password": "form-textbox-password",
"syllabary-katakana-half-width": "syllabary-katakana-halfwidth",
"visual-studio-code": "microsoft-visual-studio-code",
"visual-studio": "microsoft-visual-studio",
};
interface DeprecatedIcon {
[key: string]: {
removeIn: string;
newName?: string;
};
}
const mdiRemovedIcons = new Set([
"accusoft",
"amazon-drive",
"android-head",
"basecamp",
"beats",
"behance",
"blackberry",
"cisco-webex",
"disqus-outline",
"dribbble",
"dribbble-box",
"etsy",
"eventbrite",
"facebook-box",
"flattr",
"flickr",
"foursquare",
"github-box",
"github-face",
"glassdoor",
"google-adwords",
"google-pages",
"google-physical-web",
"google-plus-box",
"houzz",
"houzz-box",
"instapaper",
"itunes",
"language-python-text",
"lastfm",
"linkedin-box",
"lyft",
"mail-ru",
"mastodon-variant",
"medium",
"meetup",
"mixcloud",
"mixer",
"nfc-off",
"npm-variant",
"npm-variant-outline",
"paypal",
"periscope",
"pinterest-box",
"pocket",
"quicktime",
"shopify",
"slackware",
"square-inc",
"square-inc-cash",
"steam-box",
"strava",
"tor",
"tumblr",
"tumblr-box",
"tumblr-reblog",
"twitter-box",
"twitter-circle",
"uber",
"venmo",
"vk-box",
"vk-circle",
"wunderlist",
"xda",
"xing-box",
"xing-circle",
"yelp",
]);
const mdiDeprecatedIcons: DeprecatedIcon = {
scooter: { removeIn: "117", newName: "human-scooter" },
};
const chunks: Chunks = {};
@@ -291,17 +100,16 @@ export class HaIcon extends LitElement {
this._legacy = false;
if (iconName in mdiRenameMapping) {
iconName = mdiRenameMapping[iconName];
const message = `Icon ${iconPrefix}:${origIconName} was renamed to ${iconPrefix}:${iconName}, please change your config, it will be removed in version 0.115.`;
// eslint-disable-next-line no-console
console.warn(message);
fireEvent(this, "write_log", {
level: "warning",
message,
});
} else if (mdiRemovedIcons.has(iconName)) {
const message = `Icon ${this.icon} was removed from MDI, please replace this icon with an other icon in your config, it will be removed in version 0.115.`;
if (iconName in mdiDeprecatedIcons) {
const deprecatedIcon = mdiDeprecatedIcons[iconName];
let message: string;
if (deprecatedIcon.newName) {
message = `Icon ${iconPrefix}:${iconName} was renamed to ${iconPrefix}:${deprecatedIcon.newName}, please change your config, it will be removed in version ${deprecatedIcon.removeIn}.`;
iconName = deprecatedIcon.newName!;
} else {
message = `Icon ${iconPrefix}:${iconName} was removed from MDI, please replace this icon with an other icon in your config, it will be removed in version ${deprecatedIcon.removeIn}.`;
}
// eslint-disable-next-line no-console
console.warn(message);
fireEvent(this, "write_log", {
@@ -334,6 +142,7 @@ export class HaIcon extends LitElement {
this._setPath(chunks[chunk], iconName);
return;
}
const iconPromise = fetch(`/static/mdi/${chunk}.json`).then((response) =>
response.json()
);

View File

@@ -159,8 +159,6 @@ const computePanels = memoizeOne(
let Sortable;
let sortStyles: CSSResult;
@customElement("ha-sidebar")
class HaSidebar extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@@ -171,12 +169,12 @@ class HaSidebar extends LitElement {
@property({ type: Boolean, reflect: true }) public expanded = false;
@property({ type: Boolean }) public editMode = false;
@internalProperty() private _externalConfig?: ExternalConfig;
@internalProperty() private _notifications?: PersistentNotification[];
@internalProperty() private _editMode = false;
// property used only in css
// @ts-ignore
@property({ type: Boolean, reflect: true }) public rtl = false;
@@ -227,19 +225,12 @@ class HaSidebar extends LitElement {
}
return html`
${this._editMode
? html`
<style>
${sortStyles?.cssText}
</style>
`
: ""}
<div
class="menu"
@action=${this._handleAction}
.actionHandler=${actionHandler({
hasHold: !this._editMode,
disabled: this._editMode,
hasHold: !this.editMode,
disabled: this.editMode,
})}
>
${!this.narrow
@@ -257,7 +248,7 @@ class HaSidebar extends LitElement {
`
: ""}
<div class="title">
${this._editMode
${this.editMode
? html`<mwc-button outlined @click=${this._closeEditMode}>
${hass.localize("ui.sidebar.done")}
</mwc-button>`
@@ -273,7 +264,7 @@ class HaSidebar extends LitElement {
@scroll=${this._listboxScroll}
@keydown=${this._listboxKeydown}
>
${this._editMode
${this.editMode
? html`<div id="sortable">
${guard([this._hiddenPanels, this._renderEmptySortable], () =>
this._renderEmptySortable
@@ -283,7 +274,7 @@ class HaSidebar extends LitElement {
</div>`
: this._renderPanels(beforeSpacer)}
<div class="spacer" disabled></div>
${this._editMode && this._hiddenPanels.length
${this.editMode && this._hiddenPanels.length
? html`
${this._hiddenPanels.map((url) => {
const panel = this.hass.panels[url];
@@ -307,7 +298,7 @@ class HaSidebar extends LitElement {
: hass.localize(`panel.${panel.title}`) ||
panel.title}</span
>
<mwc-icon-button class="hide-panel">
<mwc-icon-button class="show-panel">
<ha-svg-icon .path=${mdiPlus}></ha-svg-icon>
</mwc-icon-button>
</paper-icon-item>`;
@@ -412,10 +403,10 @@ class HaSidebar extends LitElement {
changedProps.has("alwaysExpand") ||
changedProps.has("_externalConfig") ||
changedProps.has("_notifications") ||
changedProps.has("_editMode") ||
changedProps.has("editMode") ||
changedProps.has("_renderEmptySortable") ||
changedProps.has("_hiddenPanels") ||
(changedProps.has("_panelOrder") && !this._editMode)
(changedProps.has("_panelOrder") && !this.editMode)
) {
return true;
}
@@ -449,9 +440,6 @@ class HaSidebar extends LitElement {
subscribeNotifications(this.hass.connection, (notifications) => {
this._notifications = notifications;
});
window.addEventListener("hass-edit-sidebar", () =>
this._activateEditMode()
);
}
protected updated(changedProps) {
@@ -459,6 +447,13 @@ class HaSidebar extends LitElement {
if (changedProps.has("alwaysExpand")) {
this.expanded = this.alwaysExpand;
}
if (changedProps.has("editMode")) {
if (this.editMode) {
this._activateEditMode();
} else {
this._deactivateEditMode();
}
}
if (!changedProps.has("hass")) {
return;
}
@@ -489,7 +484,7 @@ class HaSidebar extends LitElement {
return;
}
this._activateEditMode();
fireEvent(this, "hass-edit-sidebar", { editMode: true });
}
private async _activateEditMode() {
@@ -499,15 +494,14 @@ class HaSidebar extends LitElement {
import("../resources/ha-sortable-style"),
]);
sortStyles = sortStylesImport.sortableStyles;
const style = document.createElement("style");
style.innerHTML = sortStylesImport.sortableStyles.cssText;
this.shadowRoot!.appendChild(style);
Sortable = sortableImport.Sortable;
Sortable.mount(sortableImport.OnSpill);
Sortable.mount(sortableImport.AutoScroll());
}
this._editMode = true;
fireEvent(this, "hass-open-menu");
await this.updateComplete;
@@ -519,16 +513,20 @@ class HaSidebar extends LitElement {
animation: 150,
fallbackClass: "sortable-fallback",
dataIdAttr: "data-panel",
handle: "paper-icon-item",
onSort: async () => {
this._panelOrder = this._sortable.toArray();
},
});
}
private _closeEditMode() {
private _deactivateEditMode() {
this._sortable?.destroy();
this._sortable = undefined;
this._editMode = false;
}
private _closeEditMode() {
fireEvent(this, "hass-edit-sidebar", { editMode: false });
}
private async _hidePanel(ev: Event) {
@@ -692,16 +690,16 @@ class HaSidebar extends LitElement {
></ha-svg-icon>`
: html`<ha-icon slot="item-icon" .icon=${icon}></ha-icon>`}
<span class="item-text">${title}</span>
${this._editMode
? html`<mwc-icon-button
class="hide-panel"
.panel=${urlPath}
@click=${this._hidePanel}
>
<ha-svg-icon .path=${mdiClose}></ha-svg-icon>
</mwc-icon-button>`
: ""}
</paper-icon-item>
${this.editMode
? html`<mwc-icon-button
class="hide-panel"
.panel=${urlPath}
@click=${this._hidePanel}
>
<ha-svg-icon .path=${mdiClose}></ha-svg-icon>
</mwc-icon-button>`
: ""}
</a>
`;
}
@@ -777,6 +775,10 @@ class HaSidebar extends LitElement {
.title mwc-button {
width: 100%;
}
#sortable,
.hidden-panel {
display: none;
}
paper-listbox {
padding: 4px 0;

View File

@@ -25,7 +25,7 @@ import { debounce } from "../../common/util/debounce";
import {
browseLocalMediaPlayer,
browseMediaPlayer,
BROWSER_SOURCE,
BROWSER_PLAYER,
MediaClassBrowserSettings,
MediaPickedEvent,
MediaPlayerBrowseAction,
@@ -35,6 +35,7 @@ import { showAlertDialog } from "../../dialogs/generic/show-dialog-box";
import { installResizeObserver } from "../../panels/lovelace/common/install-resize-observer";
import { haStyle } from "../../resources/styles";
import type { HomeAssistant } from "../../types";
import { documentationUrl } from "../../util/documentation-url";
import "../entity/ha-entity-picker";
import "../ha-button-menu";
import "../ha-card";
@@ -108,9 +109,11 @@ export class HaMediaPlayerBrowse extends LitElement {
text: this._renderError(this._error),
});
} else {
return html`<div class="container">
${this._renderError(this._error)}
</div>`;
return html`
<div class="container">
${this._renderError(this._error)}
</div>
`;
}
}
@@ -235,7 +238,7 @@ export class HaMediaPlayerBrowse extends LitElement {
</div>
${this._error
? html`
<div class="container error">
<div class="container">
${this._renderError(this._error)}
</div>
`
@@ -354,7 +357,31 @@ export class HaMediaPlayerBrowse extends LitElement {
`
: html`
<div class="container">
${this.hass.localize("ui.components.media-browser.no_items")}
${this.hass.localize("ui.components.media-browser.no_items")}<br />
${currentItem.media_content_id.startsWith(
"media-source://media_source/local_source"
)
? html`${this.hass.localize(
"ui.components.media-browser.learn_adding_local_media",
"documentation",
html`<a
href="${documentationUrl(
this.hass,
"/more-info/local-media/add-media"
)}"
target="_blank"
rel="noreferrer"
>${this.hass.localize(
"ui.components.media-browser.documentation"
)}</a
>`
)}
<br />
${this.hass.localize(
"ui.components.media-browser.local_media_files"
)}.`
: ""}
</div>
`}
`;
@@ -456,7 +483,7 @@ export class HaMediaPlayerBrowse extends LitElement {
mediaContentType?: string
): Promise<MediaPlayerItem> {
const itemData =
this.entityId !== BROWSER_SOURCE
this.entityId !== BROWSER_PLAYER
? await browseMediaPlayer(
this.hass,
this.entityId,
@@ -498,29 +525,35 @@ export class HaMediaPlayerBrowse extends LitElement {
private _renderError(err: { message: string; code: string }) {
if (err.message === "Media directory does not exist.") {
return html`
<h2>No local media found.</h2>
<h2>
${this.hass.localize(
"ui.components.media-browser.no_local_media_found"
)}
</h2>
<p>
It looks like you have not yet created a media directory.
<br />Create a directory with the name <b>"media"</b> in the
configuration directory of Home Assistant
(${this.hass.config.config_dir}). <br />Place your video, audio and
image files in this directory to be able to browse and play them in
the browser or on supported media players.
</p>
<p>
Check the
<a
href="https://www.home-assistant.io/integrations/media_source/#local-media"
target="_blank"
rel="noreferrer"
>documentation</a
>
for more info
${this.hass.localize("ui.components.media-browser.no_media_folder")}
<br />
${this.hass.localize(
"ui.components.media-browser.setup_local_help",
"documentation",
html`<a
href="${documentationUrl(
this.hass,
"/more-info/local-media/setup-media"
)}"
target="_blank"
rel="noreferrer"
>${this.hass.localize(
"ui.components.media-browser.documentation"
)}</a
>`
)}
<br />
${this.hass.localize("ui.components.media-browser.local_media_files")}
</p>
`;
}
return html`<span class="error">err.message</span>`;
return html`<span class="error">${err.message}</span>`;
}
static get styles(): CSSResultArray {

View File

@@ -62,12 +62,22 @@ class StateHistoryChartLine extends LocalizeMixin(PolymerElement) {
this.drawChart();
}
ready() {
super.ready();
// safari doesn't always render the canvas when we animate it, so we remove overflow hidden when the animation is complete
this.addEventListener("transitionend", () => {
this.style.overflow = "auto";
});
}
dataChanged() {
this.drawChart();
}
_onRenderedChanged(rendered) {
if (rendered) this.animateHeight();
if (rendered) {
this.animateHeight();
}
}
animateHeight() {
@@ -79,15 +89,15 @@ class StateHistoryChartLine extends LocalizeMixin(PolymerElement) {
}
drawChart() {
if (!this._isAttached) {
return;
}
const unit = this.unit;
const deviceStates = this.data;
const datasets = [];
let endTime;
if (!this._isAttached) {
return;
}
if (deviceStates.length === 0) {
return;
}

View File

@@ -1,23 +1,23 @@
import {
mdiAccountMusic,
mdiAccountMusicOutline,
mdiAlbum,
mdiApplication,
mdiDramaMasks,
mdiFileMusic,
mdiFolder,
mdiGamepadVariant,
mdiImage,
mdiMovie,
mdiMusic,
mdiPlaylistMusic,
mdiPodcast,
mdiTelevisionClassic,
mdiVideo,
mdiWeb,
} from "@mdi/js";
import type { HassEntity } from "home-assistant-js-websocket";
import type { HomeAssistant } from "../types";
import {
mdiFolder,
mdiPlaylistMusic,
mdiFileMusic,
mdiAlbum,
mdiMusic,
mdiTelevisionClassic,
mdiMovie,
mdiVideo,
mdiImage,
mdiWeb,
mdiGamepadVariant,
mdiAccountMusic,
mdiPodcast,
mdiApplication,
mdiAccountMusicOutline,
mdiDramaMasks,
} from "@mdi/js";
export const SUPPORT_PAUSE = 1;
export const SUPPORT_SEEK = 2;
@@ -38,7 +38,7 @@ export const CONTRAST_RATIO = 4.5;
export type MediaPlayerBrowseAction = "pick" | "play";
export const BROWSER_SOURCE = "browser";
export const BROWSER_PLAYER = "browser";
export type MediaClassBrowserSetting = {
icon: string;

View File

@@ -20,6 +20,7 @@ import { LocalizeFunc } from "../../common/translations/localize";
import "../../components/ha-icon-next";
import { domainToName } from "../../data/integration";
import { HomeAssistant } from "../../types";
import { documentationUrl } from "../../util/documentation-url";
import { FlowConfig } from "./show-dialog-data-entry-flow";
import { configFlowContentStyles } from "./styles";
@@ -122,7 +123,7 @@ class StepFlowPickHandler extends LitElement {
${this.hass.localize(
"ui.panel.config.integrations.note_about_website_reference"
)}<a
href="https://www.home-assistant.io/integrations/"
href="${documentationUrl(this.hass, "/integrations/")}"
target="_blank"
rel="noreferrer"
>${this.hass.localize(

View File

@@ -48,6 +48,7 @@ class MoreInfoCamera extends LitElement {
<ha-camera-stream
.hass=${this.hass}
.stateObj=${this.stateObj}
allow-exoplayer
controls
></ha-camera-stream>
${this._cameraPrefs

View File

@@ -32,7 +32,7 @@ class MoreInfoPerson extends LitElement {
return html`
<ha-attributes
.stateObj=${this.stateObj}
extraFilters="id,user_id,editable"
extra-filters="id,user_id,editable"
></ha-attributes>
${this.stateObj.attributes.latitude && this.stateObj.attributes.longitude
? html`
@@ -78,6 +78,9 @@ class MoreInfoPerson extends LitElement {
margin: 36px 0 8px 0;
text-align: right;
}
ha-map {
margin-top: 16px;
}
`;
}
}

View File

@@ -26,10 +26,8 @@ import { navigate } from "../../common/navigate";
import "../../components/ha-dialog";
import "../../components/ha-header-bar";
import "../../components/ha-svg-icon";
import "../../components/state-history-charts";
import { removeEntityRegistryEntry } from "../../data/entity_registry";
import { showEntityEditorDialog } from "../../panels/config/entities/show-dialog-entity-editor";
import "../../panels/logbook/ha-logbook";
import { haStyleDialog } from "../../resources/styles";
import "../../state-summary/state-card-content";
import { HomeAssistant } from "../../types";
@@ -394,7 +392,9 @@ export class MoreInfoDialog extends LitElement {
--dialog-content-padding: 0;
}
state-card-content {
state-card-content,
ha-more-info-history,
ha-more-info-logbook:not(:last-child) {
display: block;
margin-bottom: 16px;
}

View File

@@ -1,5 +1,4 @@
import {
css,
customElement,
html,
internalProperty,
@@ -13,7 +12,6 @@ import { throttle } from "../../common/util/throttle";
import "../../components/state-history-charts";
import { getRecentWithCache } from "../../data/cached-history";
import { HistoryResult } from "../../data/history";
import { haStyle } from "../../resources/styles";
import { HomeAssistant } from "../../types";
@customElement("ha-more-info-history")
@@ -88,18 +86,6 @@ export class MoreInfoHistory extends LitElement {
this.hass!.language
);
}
static get styles() {
return [
haStyle,
css`
state-history-charts {
display: block;
margin-bottom: 16px;
}
`,
];
}
}
declare global {

View File

@@ -152,8 +152,6 @@ export class MoreInfoLogbook extends LitElement {
ha-logbook {
max-height: 250px;
overflow: auto;
display: block;
margin-top: 16px;
}
ha-circular-progress {
display: flex;

View File

@@ -7,12 +7,13 @@ import {
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
PropertyValues,
TemplateResult,
} from "lit-element";
import { fireEvent } from "../common/dom/fire_event";
import { fireEvent, HASSDomEvent } from "../common/dom/fire_event";
import { listenMediaQuery } from "../common/dom/media_query";
import { toggleAttribute } from "../common/dom/toggle_attribute";
import { showNotificationDrawer } from "../dialogs/notifications/show-notification-drawer";
@@ -24,10 +25,17 @@ const NON_SWIPABLE_PANELS = ["map"];
declare global {
// for fire event
interface HASSDomEvents {
"hass-open-menu": undefined;
"hass-toggle-menu": undefined;
"hass-edit-sidebar": EditSideBarEvent;
"hass-show-notifications": undefined;
}
interface HTMLElementEventMap {
"hass-edit-sidebar": HASSDomEvent<EditSideBarEvent>;
}
}
interface EditSideBarEvent {
editMode: boolean;
}
@customElement("home-assistant-main")
@@ -36,7 +44,9 @@ class HomeAssistantMain extends LitElement {
@property() public route?: Route;
@property({ type: Boolean }) private narrow?: boolean;
@property({ type: Boolean }) public narrow?: boolean;
@internalProperty() private _sidebarEditMode = false;
protected render(): TemplateResult {
const hass = this.hass;
@@ -48,7 +58,9 @@ class HomeAssistantMain extends LitElement {
const sidebarNarrow = this._sidebarNarrow;
const disableSwipe =
!sidebarNarrow || NON_SWIPABLE_PANELS.indexOf(hass.panelUrl) !== -1;
this._sidebarEditMode ||
!sidebarNarrow ||
NON_SWIPABLE_PANELS.indexOf(hass.panelUrl) !== -1;
// Style block in render because of the mixin that is not supported
return html`
@@ -76,6 +88,7 @@ class HomeAssistantMain extends LitElement {
<ha-sidebar
.hass=${hass}
.narrow=${sidebarNarrow}
.editMode=${this._sidebarEditMode}
.alwaysExpand=${sidebarNarrow ||
this.hass.dockedSidebar === "docked"}
></ha-sidebar>
@@ -93,18 +106,28 @@ class HomeAssistantMain extends LitElement {
protected firstUpdated() {
import(/* webpackChunkName: "ha-sidebar" */ "../components/ha-sidebar");
this.addEventListener("hass-open-menu", () => {
if (this._sidebarNarrow) {
this.drawer.open();
} else {
fireEvent(this, "hass-dock-sidebar", {
dock: "docked",
});
setTimeout(() => this.appLayout.resetLayout());
this.addEventListener(
"hass-edit-sidebar",
(ev: HASSDomEvent<EditSideBarEvent>) => {
this._sidebarEditMode = ev.detail.editMode;
if (this._sidebarEditMode) {
if (this._sidebarNarrow) {
this.drawer.open();
} else {
fireEvent(this, "hass-dock-sidebar", {
dock: "docked",
});
setTimeout(() => this.appLayout.resetLayout());
}
}
}
});
);
this.addEventListener("hass-toggle-menu", () => {
if (this._sidebarEditMode) {
return;
}
if (this._sidebarNarrow) {
if (this.drawer.opened) {
this.drawer.close();

View File

@@ -39,6 +39,7 @@ import "../../../layouts/ha-app-layout";
import "../../../layouts/hass-tabs-subpage";
import { haStyle } from "../../../resources/styles";
import { HomeAssistant, Route } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
import "../ha-config-section";
import { configSections } from "../ha-panel-config";
import "./action/ha-automation-action";
@@ -159,7 +160,10 @@ export class HaAutomationEditor extends LitElement {
"ui.panel.config.automation.editor.modes.description",
"documentation_link",
html`<a
href="https://www.home-assistant.io/integrations/automation/#automation-modes"
href="${documentationUrl(
this.hass,
"/integrations/automation/#automation-modes"
)}"
target="_blank"
rel="noreferrer"
>${this.hass.localize(
@@ -247,7 +251,10 @@ export class HaAutomationEditor extends LitElement {
)}
</p>
<a
href="https://home-assistant.io/docs/automation/trigger/"
href="${documentationUrl(
this.hass,
"/docs/automation/trigger/"
)}"
target="_blank"
rel="noreferrer"
>
@@ -276,7 +283,10 @@ export class HaAutomationEditor extends LitElement {
)}
</p>
<a
href="https://home-assistant.io/docs/scripts/conditions/"
href="${documentationUrl(
this.hass,
"/docs/scripts/conditions/"
)}"
target="_blank"
rel="noreferrer"
>
@@ -305,7 +315,10 @@ export class HaAutomationEditor extends LitElement {
)}
</p>
<a
href="https://home-assistant.io/docs/automation/action/"
href="${documentationUrl(
this.hass,
"/docs/automation/action/"
)}"
target="_blank"
rel="noreferrer"
>

View File

@@ -124,6 +124,26 @@ class CloudAlexa extends LitElement {
? exposedCards
: notExposedCards;
const iconButton = html`<mwc-icon-button
slot="trigger"
class=${classMap({
exposed: isExposed!,
"not-exposed": !isExposed,
})}
.disabled=${!emptyFilter}
.title=${this.hass!.localize("ui.panel.config.cloud.google.expose")}
>
<ha-svg-icon
.path=${config.should_expose !== null
? isExposed
? mdiCheckboxMarked
: mdiCloseBox
: isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-icon-button>`;
target.push(html`
<ha-card>
<div class="card-content">
@@ -139,67 +159,50 @@ class CloudAlexa extends LitElement {
.map((ifc) => ifc.replace(/(Alexa.|Controller)/g, ""))
.join(", ")}
</state-info>
<ha-button-menu
corner="BOTTOM_START"
.entityId=${stateObj.entity_id}
@action=${this._exposeChanged}
>
<mwc-icon-button
slot="trigger"
class=${classMap({
exposed: isExposed!,
"not-exposed": !isExposed,
})}
.title=${this.hass!.localize(
"ui.panel.config.cloud.alexa.expose"
)}
>
<ha-svg-icon
.path=${config.should_expose !== null
? isExposed
? mdiCheckboxMarked
: mdiCloseBox
: isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-icon-button>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.alexa.expose_entity"
)}
<ha-svg-icon
class="exposed"
slot="meta"
.path=${mdiCheckboxMarked}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.alexa.dont_expose_entity"
)}
<ha-svg-icon
class="not-exposed"
slot="meta"
.path=${mdiCloseBox}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.alexa.follow_domain"
)}
<ha-svg-icon
class=${classMap({
exposed: isDomainExposed,
"not-exposed": !isDomainExposed,
})}
slot="meta"
.path=${isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-list-item>
</ha-button-menu>
${!emptyFilter
? html`${iconButton}`
: html`<ha-button-menu
corner="BOTTOM_START"
.entityId=${stateObj.entity_id}
@action=${this._exposeChanged}
>
${iconButton}
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.expose_entity"
)}
<ha-svg-icon
class="exposed"
slot="meta"
.path=${mdiCheckboxMarked}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.dont_expose_entity"
)}
<ha-svg-icon
class="not-exposed"
slot="meta"
.path=${mdiCloseBox}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.follow_domain"
)}
<ha-svg-icon
class=${classMap({
exposed: isDomainExposed,
"not-exposed": !isDomainExposed,
})}
slot="meta"
.path=${isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-list-item>
</ha-button-menu>`}
</div>
</div>
</ha-card>

View File

@@ -14,6 +14,7 @@ import type { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialo
import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box";
import { haStyle } from "../../../../resources/styles";
import { HomeAssistant } from "../../../../types";
import { documentationUrl } from "../../../../util/documentation-url";
import { WebhookDialogParams } from "./show-dialog-manage-cloudhook";
const inputLabel = "Public URL Click to copy to clipboard";
@@ -37,8 +38,11 @@ export class DialogManageCloudhook extends LitElement {
const { webhook, cloudhook } = this._params;
const docsUrl =
webhook.domain === "automation"
? "https://www.home-assistant.io/docs/automation/trigger/#webhook-trigger"
: `https://www.home-assistant.io/integrations/${webhook.domain}/`;
? documentationUrl(
this.hass!,
"/docs/automation/trigger/#webhook-trigger"
)
: documentationUrl(this.hass!, `/integrations/${webhook.domain}/`);
return html`
<ha-paper-dialog with-backdrop>
<h2>

View File

@@ -130,6 +130,26 @@ class CloudGoogleAssistant extends LitElement {
? exposedCards
: notExposedCards;
const iconButton = html`<mwc-icon-button
slot="trigger"
class=${classMap({
exposed: isExposed!,
"not-exposed": !isExposed,
})}
.disabled=${!emptyFilter}
.title=${this.hass!.localize("ui.panel.config.cloud.google.expose")}
>
<ha-svg-icon
.path=${config.should_expose !== null
? isExposed
? mdiCheckboxMarked
: mdiCloseBox
: isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-icon-button>`;
target.push(html`
<ha-card>
<div class="card-content">
@@ -144,67 +164,50 @@ class CloudGoogleAssistant extends LitElement {
.map((trait) => trait.substr(trait.lastIndexOf(".") + 1))
.join(", ")}
</state-info>
<ha-button-menu
corner="BOTTOM_START"
.entityId=${stateObj.entity_id}
@action=${this._exposeChanged}
>
<mwc-icon-button
slot="trigger"
class=${classMap({
exposed: isExposed!,
"not-exposed": !isExposed,
})}
.title=${this.hass!.localize(
"ui.panel.config.cloud.google.expose"
)}
>
<ha-svg-icon
.path=${config.should_expose !== null
? isExposed
? mdiCheckboxMarked
: mdiCloseBox
: isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-icon-button>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.expose_entity"
)}
<ha-svg-icon
class="exposed"
slot="meta"
.path=${mdiCheckboxMarked}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.dont_expose_entity"
)}
<ha-svg-icon
class="not-exposed"
slot="meta"
.path=${mdiCloseBox}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.follow_domain"
)}
<ha-svg-icon
class=${classMap({
exposed: isDomainExposed,
"not-exposed": !isDomainExposed,
})}
slot="meta"
.path=${isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-list-item>
</ha-button-menu>
${!emptyFilter
? html`${iconButton}`
: html`<ha-button-menu
corner="BOTTOM_START"
.entityId=${stateObj.entity_id}
@action=${this._exposeChanged}
>
${iconButton}
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.expose_entity"
)}
<ha-svg-icon
class="exposed"
slot="meta"
.path=${mdiCheckboxMarked}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.dont_expose_entity"
)}
<ha-svg-icon
class="not-exposed"
slot="meta"
.path=${mdiCloseBox}
></ha-svg-icon>
</mwc-list-item>
<mwc-list-item hasMeta>
${this.hass!.localize(
"ui.panel.config.cloud.google.follow_domain"
)}
<ha-svg-icon
class=${classMap({
exposed: isDomainExposed,
"not-exposed": !isDomainExposed,
})}
slot="meta"
.path=${isDomainExposed
? mdiCheckboxMultipleMarked
: mdiCloseBoxMultiple}
></ha-svg-icon>
</mwc-list-item>
</ha-button-menu>`}
</div>
${entity.might_2fa
? html`

View File

@@ -8,6 +8,7 @@ import "../../../../layouts/hass-subpage";
import { EventsMixin } from "../../../../mixins/events-mixin";
import LocalizeMixin from "../../../../mixins/localize-mixin";
import "../../../../styles/polymer-ha-style";
import { documentationUrl } from "../../../../util/documentation-url";
import "../../ha-config-section";
/*
@@ -70,8 +71,8 @@ class CloudRegister extends LocalizeMixin(EventsMixin(PolymerElement)) {
<p>
[[localize('ui.panel.config.cloud.register.information4')]]
</p><ul>
<li><a href="https://home-assistant.io/tos/" target="_blank" rel="noreferrer">[[localize('ui.panel.config.cloud.register.link_terms_conditions')]]</a></li>
<li><a href="https://home-assistant.io/privacy/" target="_blank" rel="noreferrer">[[localize('ui.panel.config.cloud.register.link_privacy_policy')]]</a></li>
<li><a href="[[_computeDocumentationUrlTos(hass)]]" target="_blank" rel="noreferrer">[[localize('ui.panel.config.cloud.register.link_terms_conditions')]]</a></li>
<li><a href="[[_computeDocumentationUrlPrivacy(hass)]]" target="_blank" rel="noreferrer">[[localize('ui.panel.config.cloud.register.link_privacy_policy')]]</a></li>
</ul>
</p>
</div>
@@ -137,6 +138,14 @@ class CloudRegister extends LocalizeMixin(EventsMixin(PolymerElement)) {
}
}
_computeDocumentationUrlTos(hass) {
return documentationUrl(hass, "/tos/");
}
_computeDocumentationUrlPrivacy(hass) {
return documentationUrl(hass, "/privacy/");
}
_handleRegister() {
let invalid = false;

View File

@@ -6,10 +6,11 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import { computeStateDomain } from "../../../common/entity/compute_state_domain";
import LocalizeMixin from "../../../mixins/localize-mixin";
import hassAttributeUtil from "../../../util/hass-attributes-util";
import "./ha-form-customize-attributes";
import "../ha-form-style";
import "../../../styles/polymer-ha-style";
import { documentationUrl } from "../../../util/documentation-url";
import hassAttributeUtil from "../../../util/hass-attributes-util";
import "../ha-form-style";
import "./ha-form-customize-attributes";
class HaFormCustomize extends LocalizeMixin(PolymerElement) {
static get template() {
@@ -30,7 +31,7 @@ class HaFormCustomize extends LocalizeMixin(PolymerElement) {
<div class="warning">
[[localize('ui.panel.config.customize.warning.include_sentence')]]
<a
href="https://www.home-assistant.io/docs/configuration/customizing-devices/#customization-using-the-ui"
href="[[_computeDocumentationUrl(hass)]]"
target="_blank"
rel="noreferrer"
>[[localize('ui.panel.config.customize.warning.include_link')]]</a
@@ -210,6 +211,13 @@ class HaFormCustomize extends LocalizeMixin(PolymerElement) {
);
}
_computeDocumentationUrl(hass) {
return documentationUrl(
hass,
"/docs/configuration/customizing-devices/#customization-using-the-ui"
);
}
computeLocalAttributes(localConfig) {
if (!localConfig) return [];
const localKeys = Object.keys(localConfig);

View File

@@ -12,6 +12,7 @@ import "./integrations-card";
import "./system-health-card";
import { configSections } from "../ha-panel-config";
import "../../../layouts/hass-tabs-subpage";
import { documentationUrl } from "../../../util/documentation-url";
const JS_TYPE = __BUILD__;
const JS_VERSION = __VERSION__;
@@ -42,7 +43,7 @@ class HaConfigInfo extends LitElement {
>
<div class="about">
<a
href="https://www.home-assistant.io"
href="${documentationUrl(this.hass, "")}"
target="_blank"
rel="noreferrer"
><img
@@ -63,7 +64,7 @@ class HaConfigInfo extends LitElement {
</p>
<p class="develop">
<a
href="https://www.home-assistant.io/developers/credits/"
href="${documentationUrl(this.hass, "/developers/credits/")}"
target="_blank"
rel="noreferrer"
>

View File

@@ -159,11 +159,13 @@ class OZWNetworkDashboard extends LitElement {
}
private _generateServiceButton(service: string) {
const serviceData = { instance_id: this.ozwInstance };
return html`
<ha-call-service-button
.hass=${this.hass}
domain="ozw"
.service=${service}
.serviceData=${serviceData}
>
${this.hass!.localize(`ui.panel.config.ozw.services.${service}`)}
</ha-call-service-button>

View File

@@ -1,20 +1,20 @@
import "../../../../../components/ha-icon-button";
import "../../../../../components/ha-circular-progress";
import { UnsubscribeFunc } from "home-assistant-js-websocket";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import "../../../../../components/buttons/ha-call-api-button";
import "../../../../../components/buttons/ha-call-service-button";
import "../../../../../components/ha-card";
import "../../../../../components/ha-circular-progress";
import "../../../../../components/ha-icon";
import "../../../../../components/ha-icon-button";
import "../../../../../components/ha-service-description";
import {
fetchNetworkStatus,
@@ -26,6 +26,7 @@ import {
} from "../../../../../data/zwave";
import { haStyle } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { documentationUrl } from "../../../../../util/documentation-url";
import "../../../ha-config-section";
@customElement("zwave-network")
@@ -71,7 +72,10 @@ export class ZwaveNetwork extends LitElement {
)}
<p>
<a
href="https://www.home-assistant.io/docs/z-wave/control-panel/"
href="${documentationUrl(
this.hass,
"/docs/z-wave/control-panel/"
)}"
target="_blank"
rel="noreferrer"
>

View File

@@ -4,23 +4,24 @@ import {
css,
CSSResult,
html,
internalProperty,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import memoizeOne from "memoize-one";
import "../../../components/ha-picture-upload";
import type { HaPictureUpload } from "../../../components/ha-picture-upload";
import "../../../components/entity/ha-entities-picker";
import { createCloseHeading } from "../../../components/ha-dialog";
import "../../../components/ha-picture-upload";
import type { HaPictureUpload } from "../../../components/ha-picture-upload";
import "../../../components/user/ha-user-picker";
import { PersonMutableParams } from "../../../data/person";
import { CropOptions } from "../../../dialogs/image-cropper-dialog/show-image-cropper-dialog";
import { PolymerChangedEvent } from "../../../polymer-types";
import { haStyleDialog } from "../../../resources/styles";
import { HomeAssistant } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
import { PersonDetailDialogParams } from "./show-dialog-person-detail";
import { CropOptions } from "../../../dialogs/image-cropper-dialog/show-image-cropper-dialog";
const includeDomains = ["device_tracker"];
@@ -153,7 +154,10 @@ class DialogPersonDetail extends LitElement {
<ul>
<li>
<a
href="https://www.home-assistant.io/integrations/#presence-detection"
href="${documentationUrl(
this.hass,
"/integrations/#presence-detection"
)}"
target="_blank"
rel="noreferrer"
>${this.hass!.localize(

View File

@@ -25,6 +25,7 @@ import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box";
import "../../../layouts/hass-tabs-subpage-data-table";
import { haStyle } from "../../../resources/styles";
import { HomeAssistant, Route } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
import { showToast } from "../../../util/toast";
import { configSections } from "../ha-panel-config";
@@ -191,7 +192,7 @@ class HaSceneDashboard extends LitElement {
${this.hass.localize("ui.panel.config.scene.picker.introduction")}
<p>
<a
href="https://home-assistant.io/docs/scene/editor/"
href="${documentationUrl(this.hass, "/docs/scene/editor/")}"
target="_blank"
rel="noreferrer"
>

View File

@@ -1,46 +1,47 @@
import "@material/mwc-fab";
import { mdiContentSave } from "@mdi/js";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "../../../components/ha-icon-button";
import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light";
import { PaperListboxElement } from "@polymer/paper-listbox";
import {
css,
CSSResult,
html,
internalProperty,
LitElement,
property,
internalProperty,
PropertyValues,
TemplateResult,
} from "lit-element";
import { classMap } from "lit-html/directives/class-map";
import { computeObjectId } from "../../../common/entity/compute_object_id";
import { navigate } from "../../../common/navigate";
import { slugify } from "../../../common/string/slugify";
import { computeRTL } from "../../../common/util/compute_rtl";
import "../../../components/ha-card";
import "../../../components/ha-icon-button";
import "../../../components/ha-icon-input";
import { showToast } from "../../../util/toast";
import "@material/mwc-fab";
import "../../../components/ha-svg-icon";
import {
Action,
deleteScript,
getScriptEditorInitData,
ScriptConfig,
triggerScript,
MODES,
MODES_MAX,
ScriptConfig,
triggerScript,
} from "../../../data/script";
import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box";
import "../../../layouts/ha-app-layout";
import { haStyle } from "../../../resources/styles";
import { HomeAssistant, Route } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
import { showToast } from "../../../util/toast";
import "../automation/action/ha-automation-action";
import { HaDeviceAction } from "../automation/action/types/ha-automation-action-device_id";
import "../ha-config-section";
import { configSections } from "../ha-panel-config";
import "../../../components/ha-svg-icon";
import { mdiContentSave } from "@mdi/js";
import { PaperListboxElement } from "@polymer/paper-listbox";
import { slugify } from "../../../common/string/slugify";
export class HaScriptEditor extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@@ -148,7 +149,10 @@ export class HaScriptEditor extends LitElement {
"ui.panel.config.script.editor.modes.description",
"documentation_link",
html`<a
href="https://www.home-assistant.io/integrations/script/#script-modes"
href="${documentationUrl(
this.hass,
"/integrations/script/#script-modes"
)}"
target="_blank"
rel="noreferrer"
>${this.hass.localize(
@@ -197,18 +201,20 @@ export class HaScriptEditor extends LitElement {
</div>
${this.scriptEntityId
? html`
<div class="card-actions layout horizontal justified center">
<span></span>
<mwc-button
@click=${this._runScript}
title="${this.hass.localize(
"ui.panel.config.script.picker.activate_script"
)}"
?disabled=${this._dirty}
<div
class="card-actions layout horizontal justified center"
>
${this.hass.localize("ui.card.script.execute")}
</mwc-button>
</div>
<span></span>
<mwc-button
@click=${this._runScript}
title="${this.hass.localize(
"ui.panel.config.script.picker.activate_script"
)}"
?disabled=${this._dirty}
>
${this.hass.localize("ui.card.script.execute")}
</mwc-button>
</div>
`
: ``}
</ha-card>
@@ -227,7 +233,7 @@ export class HaScriptEditor extends LitElement {
)}
</p>
<a
href="https://home-assistant.io/docs/scripts/"
href="${documentationUrl(this.hass, "/docs/scripts/")}"
target="_blank"
rel="noreferrer"
>

View File

@@ -25,6 +25,7 @@ import { configSections } from "../ha-panel-config";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
import { stateIcon } from "../../../common/entity/state_icon";
import { documentationUrl } from "../../../util/documentation-url";
@customElement("ha-script-picker")
class HaScriptPicker extends LitElement {
@@ -187,7 +188,7 @@ class HaScriptPicker extends LitElement {
${this.hass.localize("ui.panel.config.script.picker.introduction")}
<p>
<a
href="https://home-assistant.io/docs/scripts/editor/"
href="${documentationUrl(this.hass, "/docs/scripts/editor/")}"
target="_blank"
rel="noreferrer"
>

View File

@@ -9,6 +9,7 @@ import "../../../components/ha-code-editor";
import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box";
import { EventsMixin } from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin";
import { documentationUrl } from "../../../util/documentation-url";
import "../../../styles/polymer-ha-style";
import "./event-subscribe-card";
import "./events-list";
@@ -61,7 +62,7 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) {
<p>
[[localize( 'ui.panel.developer-tools.tabs.events.description' )]]
<a
href="https://www.home-assistant.io/docs/configuration/events/"
href="[[_computeDocumentationUrl(hass)]]"
target="_blank"
rel="noreferrer"
>
@@ -149,6 +150,10 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) {
}
}
_computeDocumentationUrl(hass) {
return documentationUrl(hass, "/docs/configuration/events/");
}
_computeValidJSON(parsedJSON) {
return parsedJSON !== ERROR_SENTINEL;
}

View File

@@ -19,6 +19,7 @@ import {
} from "../../../data/ws-templates";
import { haStyle } from "../../../resources/styles";
import { HomeAssistant } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
const DEMO_TEMPLATE = `{## Imitate available variables: ##}
{% set my_test_json = {
@@ -107,7 +108,10 @@ class HaPanelDevTemplate extends LitElement {
</li>
<li>
<a
href="https://home-assistant.io/docs/configuration/templating/"
href="${documentationUrl(
this.hass,
"/docs/configuration/templating/"
)}"
target="_blank"
rel="noreferrer"
>

View File

@@ -285,7 +285,7 @@ class HaLogbook extends LitElement {
.narrow .entry {
flex-direction: column;
line-height: 1.5;
padding: 8px;
padding: 8px 0;
}
.narrow .icon-message ha-icon {

View File

@@ -5,9 +5,9 @@ import {
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
PropertyValues,
query,
TemplateResult,
@@ -191,7 +191,7 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard {
: html`
<paper-input
id="alarmCode"
.label=${this.hass.localize('ui.card.alarm_control_panel.code')}
.label=${this.hass.localize("ui.card.alarm_control_panel.code")}
type="password"
></paper-input>
`}

View File

@@ -63,6 +63,9 @@ export class HuiButtonCard extends LitElement implements LovelaceCard {
return {
type: "button",
tap_action: {
action: "toggle",
},
entity: foundEntities[0] || "",
};
}

View File

@@ -115,7 +115,10 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
const oldConfig = changedProps.get("_cardConfig") as LovelaceCardConfig;
if (oldConfig?.type !== this._cardConfig!.type) {
this._documentationURL = getCardDocumentationURL(this._cardConfig!.type);
this._documentationURL = getCardDocumentationURL(
this.hass,
this._cardConfig!.type
);
}
}

View File

@@ -1,14 +1,17 @@
import {
getCustomCardEntry,
CUSTOM_TYPE_PREFIX,
getCustomCardEntry,
} from "../../../data/lovelace_custom_cards";
import { HomeAssistant } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
const coreDocumentationURLBase = "https://www.home-assistant.io/lovelace/";
export const getCardDocumentationURL = (type: string): string | undefined => {
export const getCardDocumentationURL = (
hass: HomeAssistant,
type: string
): string | undefined => {
if (type.startsWith(CUSTOM_TYPE_PREFIX)) {
return getCustomCardEntry(type)?.documentationURL;
}
return `${coreDocumentationURLBase}${type}`;
return `${documentationUrl(hass, "/lovelace/")}${type}`;
};

View File

@@ -1,33 +1,32 @@
import "@material/mwc-button";
import "@material/mwc-icon-button/mwc-icon-button";
import { mdiHelpCircle } from "@mdi/js";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import { mdiHelpCircle } from "@mdi/js";
import { fireEvent } from "../../../common/dom/fire_event";
import { computeRTLDirection } from "../../../common/util/compute_rtl";
import "../../../components/ha-circular-progress";
import "../../../components/ha-dialog";
import "../../../components/ha-formfield";
import "../../../components/ha-svg-icon";
import "../../../components/ha-switch";
import "../../../components/ha-yaml-editor";
import type { HassDialog } from "../../../dialogs/make-dialog-manager";
import { haStyleDialog } from "../../../resources/styles";
import type { HomeAssistant } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
import type { SaveDialogParams } from "./show-save-config-dialog";
import { computeRTLDirection } from "../../../common/util/compute_rtl";
import type { HassDialog } from "../../../dialogs/make-dialog-manager";
import "../../../components/ha-switch";
import "../../../components/ha-formfield";
import "../../../components/ha-yaml-editor";
import "../../../components/ha-svg-icon";
import "../../../components/ha-dialog";
import "../../../components/ha-circular-progress";
const EMPTY_CONFIG = { views: [] };
const coreDocumentationURLBase = "https://www.home-assistant.io/lovelace/";
@customElement("hui-dialog-save-config")
export class HuiSaveConfig extends LitElement implements HassDialog {
@property({ attribute: false }) public hass?: HomeAssistant;
@@ -68,7 +67,7 @@ export class HuiSaveConfig extends LitElement implements HassDialog {
"ui.panel.lovelace.editor.save_config.header"
)}<a
class="header_button"
href=${coreDocumentationURLBase}
href=${documentationUrl(this.hass!, "/lovelace/")}
title=${this.hass!.localize("ui.panel.lovelace.menu.help")}
target="_blank"
rel="noreferrer"

View File

@@ -53,6 +53,7 @@ import { showVoiceCommandDialog } from "../../dialogs/voice-command-dialog/show-
import "../../layouts/ha-app-layout";
import { haStyle } from "../../resources/styles";
import type { HomeAssistant } from "../../types";
import { documentationUrl } from "../../util/documentation-url";
import { swapView } from "./editor/config-util";
import { showEditLovelaceDialog } from "./editor/lovelace-editor/show-edit-lovelace-dialog";
import { showEditViewDialog } from "./editor/view-editor/show-edit-view-dialog";
@@ -136,7 +137,7 @@ class HUIRoot extends LitElement {
</mwc-icon-button>
</div>
<a
href="https://www.home-assistant.io/lovelace/"
href="${documentationUrl(this.hass, "/lovelace/")}"
rel="noreferrer"
class="menu-link"
target="_blank"
@@ -266,7 +267,7 @@ class HUIRoot extends LitElement {
`
: ""}
<a
href="https://www.home-assistant.io/lovelace/"
href="${documentationUrl(this.hass, "/lovelace/")}"
rel="noreferrer"
class="menu-link"
target="_blank"

View File

@@ -4,10 +4,12 @@ import {
CSSResult,
customElement,
html,
LitElement,
internalProperty,
LitElement,
TemplateResult,
} from "lit-element";
import { DOMAINS_TOGGLE } from "../../../common/const";
import { computeDomain } from "../../../common/entity/compute_domain";
import "../../../components/ha-icon";
import { ActionHandlerEvent } from "../../../data/lovelace";
import { HomeAssistant } from "../../../types";
@@ -31,11 +33,16 @@ export class HuiButtonRow extends LitElement implements LovelaceRow {
throw new Error("Error in card configuration. No name specified.");
}
if (!config.tap_action) {
throw new Error("Error in card configuration. No action specified.");
}
this._config = config;
this._config = {
tap_action: {
action:
config.entity && DOMAINS_TOGGLE.has(computeDomain(config.entity))
? "toggle"
: "more-info",
},
hold_action: { action: "more-info" },
...config,
};
}
protected render(): TemplateResult {

View File

@@ -17,7 +17,7 @@ import { supportsFeature } from "../../common/entity/supports-feature";
import "../../components/ha-menu-button";
import "../../components/media-player/ha-media-player-browse";
import {
BROWSER_SOURCE,
BROWSER_PLAYER,
MediaPickedEvent,
SUPPORT_BROWSE_MEDIA,
} from "../../data/media-player";
@@ -36,7 +36,7 @@ class PanelMediaBrowser extends LitElement {
// @ts-ignore
@LocalStorage("mediaBrowseEntityId", true)
private _entityId = BROWSER_SOURCE;
private _entityId = BROWSER_PLAYER;
protected render(): TemplateResult {
const stateObj = this._entityId
@@ -44,7 +44,7 @@ class PanelMediaBrowser extends LitElement {
: undefined;
const title =
this._entityId === BROWSER_SOURCE
this._entityId === BROWSER_PLAYER
? `${this.hass.localize("ui.components.media-browser.web-browser")}`
: stateObj?.attributes.friendly_name
? `${stateObj?.attributes.friendly_name}`
@@ -95,7 +95,7 @@ class PanelMediaBrowser extends LitElement {
ev: HASSDomEvent<MediaPickedEvent>
): Promise<void> {
const item = ev.detail.item;
if (this._entityId === BROWSER_SOURCE) {
if (this._entityId === BROWSER_PLAYER) {
const resolvedUrl: any = await this.hass.callWS({
type: "media_source/resolve_media",
media_content_id: item.media_content_id,

View File

@@ -1,3 +1,5 @@
import "@material/mwc-list/mwc-list";
import "@material/mwc-list/mwc-list-item";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import {
@@ -13,7 +15,8 @@ import { fireEvent } from "../../common/dom/fire_event";
import { computeStateName } from "../../common/entity/compute_state_name";
import { compare } from "../../common/string/compare";
import { createCloseHeading } from "../../components/ha-dialog";
import { BROWSER_SOURCE } from "../../data/media-player";
import { UNAVAILABLE_STATES } from "../../data/entity";
import { BROWSER_PLAYER } from "../../data/media-player";
import { haStyleDialog } from "../../resources/styles";
import type { HomeAssistant } from "../../types";
import type { SelectMediaPlayerDialogParams } from "./show-select-media-source-dialog";
@@ -49,30 +52,31 @@ export class HuiDialogSelectMediaPlayer extends LitElement {
)}
@closed=${this.closeDialog}
>
<paper-listbox
attr-for-selected="itemName"
@iron-select=${this._selectSource}
><paper-item .itemName=${BROWSER_SOURCE}
<mwc-list>
<mwc-list-item .player=${BROWSER_PLAYER} @click=${this._selectPlayer}
>${this.hass.localize(
"ui.components.media-browser.web-browser"
)}</paper-item
)}</mwc-list-item
>
${this._params.mediaSources
.sort((a, b) => compare(computeStateName(a), computeStateName(b)))
.map(
(source) => html`
<paper-item .itemName=${source.entity_id}
>${computeStateName(source)}</paper-item
<mwc-list-item
.disabled=${UNAVAILABLE_STATES.includes(source.state)}
.player=${source.entity_id}
@click=${this._selectPlayer}
>${computeStateName(source)}</mwc-list-item
>
`
)}
</paper-listbox>
</mwc-list>
</ha-dialog>
`;
}
private _selectSource(ev: CustomEvent): void {
const entityId = ev.detail.item.itemName;
private _selectPlayer(ev: CustomEvent): void {
const entityId = (ev.currentTarget as any).player;
this._params!.sourceSelectedCallback(entityId);
this.closeDialog();
}
@@ -84,8 +88,8 @@ export class HuiDialogSelectMediaPlayer extends LitElement {
ha-dialog {
--dialog-content-padding: 0 24px 20px;
}
paper-item {
cursor: pointer;
mwc-list-item[disabled] {
--mdc-theme-text-primary-on-background: var(--disabled-text-color);
}
`,
];

View File

@@ -1,4 +1,5 @@
import "@material/mwc-button/mwc-button";
import "@material/mwc-icon-button/mwc-icon-button";
import { mdiDelete } from "@mdi/js";
import {
css,
@@ -80,14 +81,14 @@ class HaLongLivedTokens extends LitElement {
)
)}
</div>
<mwc-button
<mwc-icon-button
.token=${token}
.disabled=${token.is_current}
.title=${this.hass.localize(`ui.common.delete`)}
@click=${this._deleteToken}
>
<ha-svg-icon .path=${mdiDelete}></ha-svg-icon>
</mwc-button>
</mwc-icon-button>
</ha-settings-row>`
)}
</div>
@@ -185,6 +186,9 @@ class HaLongLivedTokens extends LitElement {
mwc-button {
--mdc-theme-primary: var(--primary-color);
}
mwc-icon-button {
color: var(--primary-text-color);
}
`,
];
}

View File

@@ -201,7 +201,7 @@ class HaPanelProfile extends LitElement {
}
private _customizeSidebar() {
fireEvent(this, "hass-edit-sidebar");
fireEvent(this, "hass-edit-sidebar", { editMode: true });
}
private async _refreshRefreshTokens() {

View File

@@ -1,24 +1,25 @@
import "@material/mwc-button/mwc-button";
import "@polymer/paper-input/paper-input";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import "../../components/ha-paper-dropdown-menu";
import { TemplateResult, html } from "lit-html";
import {
property,
css,
CSSResult,
customElement,
internalProperty,
LitElement,
customElement,
property,
PropertyValues,
CSSResult,
css,
} from "lit-element";
import { HomeAssistant } from "../../types";
import "../../components/ha-settings-row";
import { html, TemplateResult } from "lit-html";
import { fireEvent } from "../../common/dom/fire_event";
import "../../components/ha-formfield";
import "../../components/ha-paper-dropdown-menu";
import "../../components/ha-radio";
import "@polymer/paper-input/paper-input";
import type { HaRadio } from "../../components/ha-radio";
import "@material/mwc-button/mwc-button";
import "../../components/ha-settings-row";
import { HomeAssistant } from "../../types";
import { documentationUrl } from "../../util/documentation-url";
@customElement("ha-pick-theme-row")
export class HaPickThemeRow extends LitElement {
@@ -45,7 +46,10 @@ export class HaPickThemeRow extends LitElement {
? this.hass.localize("ui.panel.profile.themes.error_no_theme")
: ""}
<a
href="https://www.home-assistant.io/integrations/frontend/#defining-themes"
href="${documentationUrl(
this.hass!,
"/integrations/frontend/#defining-themes"
)}"
target="_blank"
rel="noreferrer"
>

View File

@@ -7,6 +7,7 @@ import { isComponentLoaded } from "../../common/config/is_component_loaded";
import { pushSupported } from "../../components/ha-push-notifications-toggle";
import LocalizeMixin from "../../mixins/localize-mixin";
import "../../components/ha-settings-row";
import { documentationUrl } from "../../util/documentation-url";
/*
* @appliesMixin LocalizeMixin
@@ -26,7 +27,7 @@ class HaPushNotificationsRow extends LocalizeMixin(PolymerElement) {
<span slot="description">
[[_description(_platformLoaded, _pushSupported)]]
<a
href="https://www.home-assistant.io/integrations/html5"
href="[[_computeDocumentationUrl(hass)]]"
target="_blank"
rel="noreferrer"
>[[localize('ui.panel.profile.push_notifications.link_promo')]]</a
@@ -59,6 +60,10 @@ class HaPushNotificationsRow extends LocalizeMixin(PolymerElement) {
};
}
_computeDocumentationUrl(hass) {
return documentationUrl(hass, "/integrations/html5");
}
_compPlatformLoaded(hass) {
return isComponentLoaded(hass, "notify.html5");
}

View File

@@ -1,4 +1,4 @@
import "@material/mwc-button/mwc-button";
import "@material/mwc-icon-button/mwc-icon-button";
import { mdiDelete } from "@mdi/js";
import "@polymer/paper-tooltip/paper-tooltip";
import {
@@ -83,14 +83,14 @@ class HaRefreshTokens extends LitElement {
)}
</paper-tooltip>`
: ""}
<mwc-button
<mwc-icon-button
.token=${token}
.disabled=${token.is_current}
.title=${this.hass.localize(`ui.common.delete`)}
@click=${this._deleteToken}
>
<ha-svg-icon .path=${mdiDelete}></ha-svg-icon>
</mwc-button>
</mwc-icon-button>
</div>
</ha-settings-row>`
)
@@ -135,8 +135,8 @@ class HaRefreshTokens extends LitElement {
ha-settings-row {
padding: 0;
}
mwc-button {
--mdc-theme-primary: var(--primary-color);
mwc-icon-button {
color: var(--primary-text-color);
}
`,
];

View File

@@ -18,8 +18,22 @@ export const sortableStyles = css`
animation-duration: 0.33s;
}
#sortable a {
height: 48px;
display: flex;
}
#sortable {
outline: none;
display: block !important;
}
.hidden-panel {
display: flex !important;
}
.sortable-fallback {
display: none;
}
.sortable-ghost {
@@ -54,13 +68,25 @@ export const sortableStyles = css`
}
}
.show-panel,
.hide-panel {
display: none;
position: absolute;
top: 0;
right: 0;
--mdc-icon-button-size: 40px;
}
.hide-panel {
top: 4px;
right: 8px;
}
:host([expanded]) .hide-panel {
display: block;
}
:host([expanded]) .show-panel {
display: inline-flex;
}

View File

@@ -16,13 +16,11 @@ declare global {
interface HASSDomEvents {
"hass-dock-sidebar": DockSidebarParams;
"hass-default-panel": DefaultPanelParams;
"hass-edit-sidebar": undefined;
}
// for add event listener
interface HTMLElementEventMap {
"hass-dock-sidebar": HASSDomEvent<DockSidebarParams>;
"hass-default-panel": HASSDomEvent<DefaultPanelParams>;
"hass-edit-sidebar": undefined;
}
}

View File

@@ -374,6 +374,12 @@
"video_not_supported": "Your browser does not support the video element.",
"media_not_supported": "The Browser Media Player does not support this type of media",
"media_browsing_error": "Media Browsing Error",
"learn_adding_local_media": "Learn more about adding media in the {documentation}.",
"local_media_files": "Place your video, audio and image files in the media directory to be able to browse and play them in the browser or on supported media players.",
"documentation": "documentation",
"no_local_media_found": "No local media found",
"no_media_folder": "It looks like you have not yet created a media directory.",
"setup_local_help": "Check the {documentation} on how to setup local media.",
"class": {
"album": "Album",
"app": "App",
@@ -2150,7 +2156,7 @@
"save": "Save",
"unsaved_changes": "Unsaved changes",
"saved": "Saved",
"confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration? We will automatically generate your Lovelace UI views with your areas and devices.",
"confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration?",
"confirm_remove_config_text": "We will automatically generate your Lovelace UI views with your areas and devices if you remove your Lovelace UI configuration.",
"confirm_unsaved_changes": "You have unsaved changes, are you sure you want to exit?",
"confirm_unsaved_comments": "Your configuration contains comment(s), these will not be saved. Do you want to continue?",

View File

@@ -0,0 +1,11 @@
import { HomeAssistant } from "../types";
export const documentationUrl = (hass: HomeAssistant, path: string) => {
return `https://${
hass.config.version.includes("b")
? "rc"
: hass.config.version.includes("dev")
? "next"
: "www"
}.home-assistant.io${path}`;
};

View File

@@ -0,0 +1,19 @@
import * as assert from "assert";
import { documentationUrl } from "../../src/util/documentation-url";
describe("Generate documentation URL", function () {
it("Generate documentation url for stable", function () {
assert.strictEqual(
// @ts-ignore
documentationUrl({ config: { version: "1.0.0" } }, "/blog"),
"https://www.home-assistant.io/blog"
);
});
it("Generate documentation url for rc", function () {
assert.strictEqual(
// @ts-ignore
documentationUrl({ config: { version: "1.0.0b0" } }, "/blog"),
"https://rc.home-assistant.io/blog"
);
});
});

View File

@@ -440,6 +440,7 @@
"common": {
"cancel": "Kanselleer",
"close": "Sluit",
"copied": "Copiato",
"loading": "Laai tans",
"save": "Stoor"
},
@@ -470,6 +471,25 @@
"loading_history": "Laai tans toestandsgeskiedenis ...",
"no_history_found": "Geen toestandsgeskiedenis gevind nie."
},
"media-browser": {
"class": {
"composer": "Compositore",
"directory": "Libreria",
"episode": "Episodio",
"game": "Gioco",
"genre": "Genere",
"image": "Immagine",
"movie": "Film",
"music": "Musica",
"playlist": "Playlist",
"podcast": "Podcast",
"season": "Stagione",
"track": "Traccia",
"tv_show": "Programma televisivo",
"url": "Url",
"video": "Video"
}
},
"related-items": {
"area": "Area",
"automation": "Deel van die volgende outomatisering",

View File

@@ -507,6 +507,7 @@
"cancel": "Cancel·la",
"close": "Tanca",
"continue": "Continua",
"copied": "Copiat",
"delete": "Elimina",
"error_required": "Obligatori",
"loading": "Carregant",

View File

@@ -507,6 +507,7 @@
"cancel": "Zrušit",
"close": "Zavřít",
"continue": "Pokračovat",
"copied": "Zkopírováno",
"delete": "Smazat",
"error_required": "Povinné",
"loading": "Načítání",
@@ -2691,7 +2692,7 @@
},
"raw_editor": {
"confirm_remove_config_text": "Pokud odeberete konfiguraci uživatelského rozhraní Lovelace, automaticky vygenerujeme pohledy Lovelace s vašimi oblastmi a zařízeními.",
"confirm_remove_config_title": "Opravdu chcete odstranit nastavení Lovelace? Automaticky vygenerujeme vaše zobrazení Lovelace s vašimi oblastmi a zařízeními.",
"confirm_remove_config_title": "Opravdu chcete odstranit nastavení uživatelského rozhraní Lovelace?",
"confirm_unsaved_changes": "Máte neuložené změny. Opravdu chcete odejít?",
"confirm_unsaved_comments": "Vaše konfigurace obsahuje komentáře, které se neuloží. Chcete pokračovat?",
"error_invalid_config": "Vaše konfigurace není platná: {error}",

View File

@@ -419,6 +419,7 @@
"unlock": "Entriegeln"
},
"media_player": {
"media_next_track": "Weiter",
"media_play": "Abspielen",
"sound_mode": "Sound-Modus",
"source": "Quelle",
@@ -501,6 +502,8 @@
"back": "Zurück",
"cancel": "Abbrechen",
"close": "Schließen",
"continue": "Weiter",
"copied": "Kopiert",
"delete": "Löschen",
"error_required": "Benötigt",
"loading": "Laden",
@@ -557,8 +560,26 @@
"loading_history": "Lade Zustandsverlauf...",
"no_history_found": "Kein Zustandsverlauf gefunden."
},
"logbook": {
"entries_not_found": "Keine Logbucheinträge gefunden."
},
"media-browser": {
"audio_not_supported": "Ihr Browser unterstützt das Audioelement nicht.",
"choose-source": "Quelle wählen",
"class": {
"album": "Album",
"app": "App",
"directory": "Bibliothek",
"episode": "Episode",
"game": "Spiel",
"movie": "Film",
"music": "Musik",
"playlist": "Wiedergabeliste",
"podcast": "Podcast",
"season": "Episode",
"url": "URL",
"video": "Video"
},
"content-type": {
"album": "Album",
"artist": "Künstler",
@@ -566,7 +587,13 @@
"playlist": "Playlist",
"server": "Server"
},
"play": "Abspielen"
"no_items": "Keine Einträge",
"play": "Abspielen",
"video_not_supported": "Ihr Browser unterstützt das Videoelement nicht."
},
"picture-upload": {
"label": "Bild",
"unsupported_format": "Nicht unterstütztes Format, bitte wähle ein JPEG-, PNG- oder GIF-Bild."
},
"related-items": {
"area": "Bereich",
@@ -672,8 +699,10 @@
"yaml_not_editable": "Die Einstellungen dieser Entität können nicht über die Benutzeroberfläche bearbeitet werden. Nur über die Benutzeroberfläche eingerichtete Entitäten können über die Benutzeroberfläche konfiguriert werden."
},
"more_info_control": {
"details": "Details",
"dismiss": "Dialog ausblenden",
"edit": "Entität bearbeiten",
"history": "Verlauf",
"person": {
"create_zone": "Zone vom aktuellen Standort erstellen"
},
@@ -849,7 +878,13 @@
"type_select": "Aktionstyp",
"type": {
"choose": {
"label": "Auswählen"
"add_option": "Option hinzufügen",
"conditions": "Bedingungen",
"default": "Standard-Aktionen",
"label": "Auswählen",
"option": "Option {number}",
"remove_option": "Option entfernen",
"sequence": "Aktionen"
},
"condition": {
"label": "Bedingung"
@@ -872,6 +907,7 @@
},
"repeat": {
"label": "Wiederholen",
"sequence": "Aktionen",
"type_select": "Wiederholungstyp",
"type": {
"count": {
@@ -1044,6 +1080,7 @@
"value_template": "Wert-Template (optional)"
},
"state": {
"attribute": "Attribut (Optional)",
"for": "Für",
"from": "Von",
"label": "Zustand",
@@ -1068,7 +1105,8 @@
},
"time": {
"at": "Um",
"label": "Zeit"
"label": "Zeit",
"type_value": "Feste Zeit"
},
"webhook": {
"label": "Webhook",
@@ -1091,6 +1129,8 @@
"add_automation": "Automatisierung hinzufügen",
"delete_automation": "Automatisierung löschen",
"delete_confirm": "Bist du sicher, dass du diese Automatisierung löschen möchtest?",
"duplicate": "Duplizieren",
"duplicate_automation": "Automatisierung kopieren",
"edit_automation": "Automatisierung bearbeiten",
"header": "Automatisierungseditor",
"headers": {
@@ -1314,6 +1354,7 @@
}
},
"devices": {
"add_prompt": "Mit diesem Gerät wurden noch keine {name} hinzugefügt. Du kannst eins hinzufügen, indem du auf den + Knopf drückst.",
"automation": {
"actions": {
"caption": "Wenn etwas ausgelöst wird ..."
@@ -1477,6 +1518,7 @@
},
"integrations": {
"add_integration": "Integration hinzufügen",
"attention": "Aufmerksamkeit erforderlich",
"caption": "Integrationen",
"config_entry": {
"area": "In {area}",
@@ -1495,6 +1537,8 @@
"no_device": "Entitäten ohne Geräte",
"no_devices": "Diese Integration hat keine Geräte.",
"options": "Optionen",
"reload": "Neu laden",
"reload_confirm": "Die Integration wurde neu geladen",
"rename": "Umbenennen",
"restart_confirm": "Starte Home Assistant neu, um das Entfernen dieser Integration abzuschließen",
"settings_button": "Einstellungen für {integration} bearbeiten",
@@ -1543,6 +1587,7 @@
"none_found_detail": "Passe deine Suchkriterien an.",
"note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.",
"note_about_website_reference": "Weitere Informationen findest du auf der ",
"reconfigure": "Neu konfigurieren",
"rename_dialog": "Bearbeite den Namen dieses Konfigurationseintrags",
"rename_input_label": "Eintragsname",
"search": "Such-Integrationen"
@@ -1653,8 +1698,11 @@
"topic": "Topic"
},
"ozw": {
"button": "Konfigurieren",
"common": {
"instance": "Instanz"
"instance": "Instanz",
"network": "Netzwerk",
"zwave": "Z-Wave"
},
"device_info": {
"zwave_info": "Z-Wave Infos"
@@ -1664,12 +1712,27 @@
"select_instance": "Instanz auswählen"
},
"network_status": {
"details": {
"driverremoved": "Der Treiber wurde entfernt",
"driverreset": "Der Treiber wurde zurückgesetzt",
"ready": "Bereit zum Verbinden",
"started": "Verbindung mit MQTT hergestellt",
"starting": "Verbinde zu MQTT"
},
"offline": "Offline",
"online": "Online",
"starting": "Startet",
"unknown": "Unbekannt"
},
"network": {
"header": "Netzwerkverwaltung"
},
"nodes_table": {
"failed": "Fehlgeschlagen",
"manufacturer": "Hersteller"
},
"refresh_node": {
"start_refresh_button": "Aktualisierung starten"
}
},
"person": {
@@ -1798,6 +1861,7 @@
"core": "Ort & Anpassungen neu laden",
"group": "Gruppen neu laden",
"heading": "Neuladen der YAML-Konfiguration",
"homekit": "HomeKit neu laden",
"input_boolean": "Eingabe-Booleans neu laden",
"input_datetime": "Eingabe-Datums- und Zeitfelder neu laden",
"input_number": "Eingabenummern neu laden",
@@ -1807,6 +1871,7 @@
"person": "Personen neu laden",
"scene": "Szenen neu laden",
"script": "Skripte neu laden",
"telegram": "Telegram-Benachrichtigungsdienste neu laden",
"zone": "Zonen neu laden"
},
"server_management": {
@@ -1828,12 +1893,18 @@
},
"tags": {
"detail": {
"name": "Name"
"delete": "Löschen",
"description": "Beschreibung",
"name": "Name",
"update": "Aktualisieren"
},
"edit": "Bearbeiten",
"headers": {
"last_scanned": "Zuletzt gescannt",
"name": "Name"
},
"never_scanned": "Nie gescannt"
"never_scanned": "Nie gescannt",
"write": "Schreiben"
},
"users": {
"add_user": {
@@ -1841,6 +1912,7 @@
"create": "Benutzerkonto anlegen",
"name": "Name",
"password": "Passwort",
"password_confirm": "Passwort bestätigen",
"username": "Benutzername"
},
"caption": "Benutzer",
@@ -1857,7 +1929,9 @@
"group": "Gruppe",
"id": "ID",
"name": "Name",
"new_password": "Neues Passwort",
"owner": "Besitzer",
"password_changed": "Das Passwort wurde geändert!",
"system_generated": "System generiert",
"system_generated_users_not_editable": "Systemgenerierte Benutzer können nicht aktualisiert werden.",
"system_generated_users_not_removable": "Vom System generierte Benutzer können nicht entfernt werden.",
@@ -2728,6 +2802,9 @@
"submit": "Absenden"
},
"current_user": "Sie sind derzeit als {fullName} angemeldet.",
"customize_sidebar": {
"button": "Bearbeiten"
},
"dashboard": {
"description": "Wähle ein Standard-Dashboard für dieses Gerät.",
"dropdown_label": "Dashboard",
@@ -2750,6 +2827,7 @@
"confirm_delete": "Möchten Sie den Zugriffs-Token für {name} wirklich löschen?",
"create": "Token erstellen",
"create_failed": "Das Zugriffs-Token konnte nicht erstellt werden.",
"created": "Erstellt am {date}",
"created_at": "Erstellt am {date}",
"delete_failed": "Fehler beim Löschen des Zugriffs-Tokens.",
"description": "Erstelle langlebige Zugriffstoken, damit deine Skripte mit deiner Home Assistant-Instanz interagieren können. Jedes Token ist ab der Erstellung für 10 Jahre gültig. Die folgenden langlebigen Zugriffstoken sind derzeit aktiv.",
@@ -2757,6 +2835,7 @@
"header": "Langlebige Zugangs-Token",
"last_used": "Zuletzt verwendet am {date} in {location}",
"learn_auth_requests": "Erfahre, wie du authentifizierte Anfragen stellen kannst.",
"name": "Name",
"not_used": "Wurde noch nie benutzt",
"prompt_copy_token": "Kopiere deinen Zugangs-Token. Er wird nicht wieder angezeigt werden.",
"prompt_name": "Name?"
@@ -2808,7 +2887,8 @@
"error_no_theme": "Keine Themen verfügbar.",
"header": "Thema",
"link_promo": "Erfahre mehr über Themen",
"primary_color": "Primärfarbe"
"primary_color": "Primärfarbe",
"reset": "zurücksetzen"
},
"vibrate": {
"description": "Aktiviere oder deaktiviere die Vibration an diesem Gerät, wenn du Geräte steuerst.",
@@ -2822,6 +2902,7 @@
}
},
"sidebar": {
"done": "fertig",
"external_app_configuration": "App-Konfiguration",
"sidebar_toggle": "Seitenleiste umschalten"
}

View File

@@ -604,15 +604,21 @@
"playlist": "Playlist",
"server": "Server"
},
"documentation": "documentation",
"learn_adding_local_media": "Learn more about adding media in the {documentation}.",
"local_media_files": "Place your video, audio and image files in the media directory to be able to browse and play them in the browser or on supported media players.",
"media_browsing_error": "Media Browsing Error",
"media_not_supported": "The Browser Media Player does not support this type of media",
"media_player": "Media Player",
"media-player-browser": "Media Player Browser",
"no_items": "No items",
"no_local_media_found": "No local media found",
"no_media_folder": "It looks like you have not yet created a media directory.",
"pick": "Pick",
"pick-media": "Pick Media",
"play": "Play",
"play-media": "Play Media",
"setup_local_help": "Check the {documentation} on how to setup local media.",
"video_not_supported": "Your browser does not support the video element.",
"web-browser": "Web Browser"
},
@@ -2692,7 +2698,7 @@
},
"raw_editor": {
"confirm_remove_config_text": "We will automatically generate your Lovelace UI views with your areas and devices if you remove your Lovelace UI configuration.",
"confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration? We will automatically generate your Lovelace UI views with your areas and devices.",
"confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration?",
"confirm_unsaved_changes": "You have unsaved changes, are you sure you want to exit?",
"confirm_unsaved_comments": "Your configuration contains comment(s), these will not be saved. Do you want to continue?",
"error_invalid_config": "Your configuration is not valid: {error}",

View File

@@ -507,6 +507,7 @@
"cancel": "Cancelar",
"close": "Cerrar",
"continue": "Continuar",
"copied": "Copiado",
"delete": "Eliminar",
"error_required": "Obligatorio",
"loading": "Cargando",
@@ -567,11 +568,27 @@
"loading_history": "Cargando historial de estado...",
"no_history_found": "No se encontró historial de estado."
},
"logbook": {
"entries_not_found": "No se han encontrado entradas en el registro."
},
"media-browser": {
"audio_not_supported": "Tu navegador no es compatible con el elemento de audio.",
"choose_player": "Elige reproductor",
"choose-source": "Elige la fuente",
"class": {
"album": "Álbum",
"app": "Aplicación",
"artist": "Artista",
"channel": "Canal",
"composer": "Compositor",
"contributing_artist": "Artista colaborador",
"directory": "Biblioteca",
"episode": "Episodio",
"game": "Juego",
"genre": "Género",
"image": "Imagen",
"movie": "Película",
"music": "Música",
"playlist": "Lista de reproducción",
"podcast": "Podcast",
"season": "Temporada",
@@ -712,6 +729,7 @@
},
"more_info_control": {
"controls": "Controles",
"details": "Detalles",
"dismiss": "Descartar diálogo",
"edit": "Editar entidad",
"history": "Historial",
@@ -2357,9 +2375,14 @@
"title": "Estados"
},
"templates": {
"all_listeners": "Esta plantilla escucha todos los eventos de cambio de estado.",
"description": "Las plantillas se muestran utilizando el motor de plantillas Jinja2 con algunas extensiones específicas de Home Assistant.",
"domain": "Dominio",
"editor": "Editor de plantillas",
"entity": "Entidad",
"jinja_documentation": "Documentación de plantilla Jinja2",
"listeners": "Esta plantilla escucha los siguientes eventos de cambio de estado:",
"no_listeners": "Esta plantilla no escucha ningún evento de cambio de estado y no se actualizará automáticamente.",
"reset": "Reiniciar a la plantilla de demostración",
"template_extensions": "Extensiones de plantilla de Home Assistant",
"title": "Plantillas",
@@ -2946,6 +2969,11 @@
"submit": "Enviar"
},
"current_user": "Has iniciado sesión como {fullName}.",
"customize_sidebar": {
"button": "Editar",
"description": "También puedes mantener pulsada la cabecera de la barra lateral para activar el modo de edición.",
"header": "Cambiar el orden y ocultar elementos de la barra lateral"
},
"dashboard": {
"description": "Selecciona un panel de control predeterminado para este dispositivo.",
"dropdown_label": "Panel de control",
@@ -2968,6 +2996,7 @@
"confirm_delete": "¿Estás seguro de que quieres eliminar el token de acceso para {name}?",
"create": "Crear Token",
"create_failed": "No se ha podido crear el token de acceso.",
"created": "Creado en {date}",
"created_at": "Creado el {date}",
"delete_failed": "Error al eliminar el token de acceso.",
"description": "Crea tokens de acceso de larga duración para permitir que tus scripts interactúen con tu instancia de Home Assistant. Cada token será válido por 10 años desde la creación. Los siguientes tokens de acceso de larga duración están actualmente activos.",
@@ -2975,9 +3004,10 @@
"header": "Tokens de acceso de larga duración",
"last_used": "Último uso el {date} desde {location}",
"learn_auth_requests": "Aprende cómo realizar solicitudes autenticadas.",
"name": "Nombre",
"not_used": "Nunca ha sido usado",
"prompt_copy_token": "Copia tu token de acceso. No se mostrará de nuevo.",
"prompt_name": "¿Nombre?"
"prompt_name": "Dale un nombre al token"
},
"mfa_setup": {
"close": "Cerrar",
@@ -3041,6 +3071,7 @@
}
},
"sidebar": {
"done": "Hecho",
"external_app_configuration": "Configuración de la aplicación",
"sidebar_toggle": "Alternar barra lateral"
}

View File

@@ -507,6 +507,7 @@
"cancel": "Annuler",
"close": "Fermer",
"continue": "Continuer",
"copied": "Copié",
"delete": "Supprimer",
"error_required": "Obligatoire",
"loading": "Chargement",
@@ -567,10 +568,35 @@
"loading_history": "Chargement de l'historique des valeurs ...",
"no_history_found": "Aucun historique des valeurs trouvé."
},
"logbook": {
"entries_not_found": "Aucune entrée trouvée dans le journal."
},
"media-browser": {
"audio_not_supported": "Votre navigateur ne prend pas en charge l'élément audio.",
"choose_player": "Choisissez le lecteur",
"choose-source": "Choisissez la source",
"class": {
"album": "Album",
"app": "App",
"artist": "Artiste",
"channel": "Canal",
"composer": "Compositeur",
"contributing_artist": "Artiste collaborateur",
"directory": "Bibliothèque",
"episode": "Épisode",
"game": "Jeu",
"genre": "Genre",
"image": "Image",
"movie": "Film",
"music": "Musique",
"playlist": "Liste de lecture",
"podcast": "Podcast",
"season": "Saison",
"track": "Piste",
"tv_show": "Émission de télévision",
"url": "Url",
"video": "Vidéo"
},
"content-type": {
"album": "Album",
"artist": "Artiste",
@@ -703,6 +729,7 @@
},
"more_info_control": {
"controls": "Contrôles",
"details": "Détails",
"dismiss": "Fermer la fenêtre de dialogue",
"edit": "Modifier l'entité",
"history": "Historique",
@@ -934,9 +961,12 @@
"service_data": "Données du service"
},
"wait_for_trigger": {
"label": "Attendre le déclencheur"
"continue_timeout": "Continuer à l'expiration du délai",
"label": "Attendre le déclencheur",
"timeout": "Délai d'expiration (optionnel)"
},
"wait_template": {
"continue_timeout": "Continuer à l'expiration du délai",
"label": "Attendre",
"timeout": "Délai d'expiration (optionnel)",
"wait_template": "Template d'attente"
@@ -1000,7 +1030,9 @@
"time": {
"after": "Après",
"before": "Avant",
"label": "Heure"
"label": "Heure",
"type_input": "Valeur d'une aide de date/heure",
"type_value": "Temps fixe"
},
"zone": {
"entity": "Entité avec localisation",
@@ -1567,6 +1599,7 @@
"reload_restart_confirm": "Redémarrer Home Assistant pour finaliser le rechargement de cette intégration",
"rename": "Renommer",
"restart_confirm": "Redémarrer Home Assistant pour terminer la suppression de cette intégration",
"services": "{count} {count, plural,\n one {service}\n other {services}\n}",
"settings_button": "Modifier les paramètres pour {integration}",
"system_options": "Options système",
"system_options_button": "Options système pour {integration}",
@@ -2342,9 +2375,14 @@
"title": "États"
},
"templates": {
"all_listeners": "Ce modèle écoute tous les événements de changement d'état.",
"description": "Les modèles sont rendus à l'aide du moteur de modèles Jinja2 avec certaines extensions spécifiques de Home Assistant.",
"domain": "Domaine",
"editor": "Éditeur de modèles",
"entity": "Entité",
"jinja_documentation": "Documentation de modèle Jinja2",
"listeners": "Ce modèle écoute les événements de changement d'état suivants:",
"no_listeners": "Ce modèle n'écoute aucun événement de changement d'état et ne sera pas mis à jour automatiquement.",
"reset": "Réinitialiser au modèle de démonstration",
"template_extensions": "Extensions de modèles de Home Assistant",
"title": "Modèle",
@@ -2931,6 +2969,11 @@
"submit": "Envoyer"
},
"current_user": "Vous êtes actuellement connecté en tant que {fullName}.",
"customize_sidebar": {
"button": "Modifier",
"description": "Vous pouvez également appuyer et maintenir l'en-tête de la barre latérale pour activer le mode d'édition.",
"header": "Modifier l'ordre et masquer les éléments de la barre latérale"
},
"dashboard": {
"description": "Choisissez un tableau de bord par défaut pour cet appareil.",
"dropdown_label": "Tableau de bord",
@@ -2953,6 +2996,7 @@
"confirm_delete": "Êtes-vous sûr de vouloir supprimer le jeton d'accès de {name} ?",
"create": "Créer un jeton",
"create_failed": "Impossible de créer le jeton d'accès.",
"created": "Créé le {date}",
"created_at": "Créé le {date}",
"delete_failed": "Impossible de supprimer le jeton d'accès.",
"description": "Créez des jetons d'accès de longue durée pour permettre à vos scripts d'interagir avec votre instance de Home Assistant. Chaque jeton sera valable 10 ans à compter de sa création. Les jetons d'accès longue durée suivants sont actuellement actifs.",
@@ -2960,6 +3004,7 @@
"header": "Jetons d'accès de longue durée",
"last_used": "Dernière utilisation le {date} à partir de {location}",
"learn_auth_requests": "Apprenez comment faire des demandes authentifiées.",
"name": "Nom",
"not_used": "N'a jamais été utilisé",
"prompt_copy_token": "Copiez votre jeton d'accès. Il ne sera plus affiché à nouveau.",
"prompt_name": "Nom ?"
@@ -3026,6 +3071,7 @@
}
},
"sidebar": {
"done": "Terminé",
"external_app_configuration": "Configuration de l'application",
"sidebar_toggle": "Activer la barre latérale"
}

View File

@@ -507,6 +507,7 @@
"cancel": "Annulla",
"close": "Chiudi",
"continue": "Continua",
"copied": "Copiato",
"delete": "Elimina",
"error_required": "Necessario",
"loading": "Caricamento",
@@ -574,6 +575,12 @@
"audio_not_supported": "Il tuo browser non supporta l'elemento audio.",
"choose_player": "Scegli il lettore",
"choose-source": "Scegli origine",
"class": {
"movie": "Film",
"music": "Musica",
"season": "Stagione",
"track": "Traccia dispositivo"
},
"content-type": {
"album": "Album",
"artist": "Artista",

View File

@@ -507,6 +507,7 @@
"cancel": "Avbryt",
"close": "Lukk",
"continue": "Fortsette",
"copied": "Kopiert",
"delete": "Slett",
"error_required": "Nødvendig",
"loading": "Laster",
@@ -910,7 +911,7 @@
"add_option": "Legg til alternativ",
"conditions": "Betingelser",
"default": "Standard handlinger",
"label": "Velge",
"label": "Velg",
"option": "Alternativ {number}",
"remove_option": "Fjern alternativ",
"sequence": "Handlinger"
@@ -943,11 +944,11 @@
"label": "Antall"
},
"until": {
"conditions": "Inntil forholdene",
"label": "Før"
"conditions": "Inntil betingelser",
"label": "Til"
},
"while": {
"conditions": "Mens forholdene",
"conditions": "Mens betingelser",
"label": "Mens"
}
}
@@ -2043,7 +2044,7 @@
"tag_id_placeholder": "Automatisk generert når den er tom",
"update": "Oppdater"
},
"edit": "Redigere",
"edit": "Rediger",
"headers": {
"last_scanned": "Sist skannet",
"name": "Navn"
@@ -2374,11 +2375,14 @@
"title": "Tilstander"
},
"templates": {
"all_listeners": "Denne malen lytter etter alle tilstand endret hendelser.",
"description": "Maler blir rendret ved hjelp av Jinja2-malmotoren med noen spesifikke utvidelser for Home Assistant.",
"domain": "Domene",
"editor": "Maleditor",
"entity": "Entitet",
"jinja_documentation": "Jinja2 mal dokumentasjon",
"listeners": "Denne malen lytter etter følgende tilstand endret hendelser:",
"no_listeners": "Denne malen lytter ikke etter noen tilstand endret hendelser og oppdateres ikke automatisk.",
"reset": "Tilbakestill til demomal",
"template_extensions": "Mal utvidelser for Home Assistant",
"title": "Mal",
@@ -2626,7 +2630,7 @@
}
},
"cardpicker": {
"by_card": "Med kort",
"by_card": "Etter kort",
"by_entity": "Etter entitet",
"custom_card": "Tilpasset",
"domain": "Domene",
@@ -2688,7 +2692,7 @@
},
"raw_editor": {
"confirm_remove_config_text": "Vi vil automatisk opprette Lovelace-visningene dine med områdene og enhetene dine hvis du fjerner Lovelace-konfigurasjonen.",
"confirm_remove_config_title": "Er du sikker på at du vil fjerne Lovelace-konfigurasjonen? Vi vil automatisk opprette Lovelace-visningene dine med områdene og enhetene dine.",
"confirm_remove_config_title": "Er du sikker på at du vil fjerne Lovelace UI-konfigurasjonen?",
"confirm_unsaved_changes": "Du har ulagrede endringer, er du sikker på at du vil avslutte?",
"confirm_unsaved_comments": "Konfigurasjonen din inneholder kommentarer, disse vil ikke bli lagret. Vil du fortsette?",
"error_invalid_config": "Konfigurasjonen din er ikke gyldig: {error}",
@@ -2966,6 +2970,8 @@
},
"current_user": "Du er logget inn som {fullName}.",
"customize_sidebar": {
"button": "Rediger",
"description": "Du kan også trykke på og holde nede overskriften på sidepanelet for å aktivere redigeringsmodus.",
"header": "Endre rekkefølgen og skjul elementer fra sidepanelet"
},
"dashboard": {
@@ -3001,7 +3007,7 @@
"name": "Navn",
"not_used": "Har aldri blitt brukt",
"prompt_copy_token": "Kopier tilgangstoken. Det blir ikke vist igjen.",
"prompt_name": "Navn?"
"prompt_name": "Gi tokenet et navn"
},
"mfa_setup": {
"close": "Lukk",

View File

@@ -507,6 +507,7 @@
"cancel": "Annuleren",
"close": "Sluiten",
"continue": "Ga verder",
"copied": "Gekopieerd",
"delete": "Verwijderen",
"error_required": "Verplicht",
"loading": "Bezig met laden",
@@ -2374,11 +2375,14 @@
"title": "Toestanden"
},
"templates": {
"all_listeners": "Deze template luistert naar alle gebeurtenissen met gewijzigde status.",
"description": "Sjablonen worden weergegeven met de Jinja2-sjabloonediter samen met enkele extensies van Home Assistant.",
"domain": "Domein",
"editor": "Sjabloonediter",
"entity": "Entiteit",
"jinja_documentation": "Jinja2-sjabloondocumentatie",
"listeners": "Deze template luistert naar de volgende gebeurtenissen met gewijzigde status:",
"no_listeners": "Deze template luistert niet naar gebeurtenissen met statuswijziging en wordt niet automatisch bijgewerkt.",
"reset": "Resetten naar demosjabloon",
"template_extensions": "Home Assistant sjabloon extensiesHome Assistant",
"title": "Sjablonen",
@@ -2688,7 +2692,7 @@
},
"raw_editor": {
"confirm_remove_config_text": "We zullen je Lovelace gebruikersinterface automatisch genereren met je gebieden en apparaten als je de huidige Lovelace gebruikersinterface verwijdert.",
"confirm_remove_config_title": "Weet je zeker dat je de huidige Lovelace gebruikersinterface wilt verwijderen? We zullen automatisch een nieuwe Lovelace gebruikersinterface genereren op basis van je gebieden en apparaten.",
"confirm_remove_config_title": "Weet u zeker dat u uw Lovelace UI-configuratie wilt verwijderen?",
"confirm_unsaved_changes": "Er zijn nog niet-opgeslagen wijzigingen, weet je zeker dat je wilt afsluiten?",
"confirm_unsaved_comments": "Uw configuratie bevat opmerkingen, deze worden niet opgeslagen. Wil je doorgaan?",
"error_invalid_config": "Uw configuratie is niet geldig: {error}",
@@ -3003,7 +3007,7 @@
"name": "Naam",
"not_used": "Is nog nooit gebruikt",
"prompt_copy_token": "Kopieer je toegangstoken. Het wordt niet meer getoond.",
"prompt_name": "Naam?"
"prompt_name": "Geef het token een naam"
},
"mfa_setup": {
"close": "Sluiten",

View File

@@ -507,6 +507,7 @@
"cancel": "Anuluj",
"close": "Zamknij",
"continue": "Kontynuuj",
"copied": "Skopiowano",
"delete": "Usuń",
"error_required": "To pole jest wymagane",
"loading": "Ładowanie",

View File

@@ -489,6 +489,7 @@
"back": "Înapoi",
"cancel": "Revocare",
"close": "Închide",
"copied": "Copiat",
"delete": "Șterge",
"error_required": "Necesar",
"loading": "Se încarcă",
@@ -544,6 +545,32 @@
"loading_history": "Încărcarea istoricului de stare ...",
"no_history_found": "Nici un istoric de stare nu a fost găsit."
},
"logbook": {
"entries_not_found": "Nu s-au găsit intrări în jurnal."
},
"media-browser": {
"class": {
"album": "Album",
"app": "Aplicație",
"artist": "Artist",
"channel": "Canal",
"composer": "Compozitor",
"contributing_artist": "Artist contribuitor",
"directory": "Bibliotecă",
"episode": "Episod",
"game": "Joc",
"genre": "Gen",
"image": "Imagine",
"movie": "Film",
"music": "Muzică",
"playlist": "Playlist",
"podcast": "Podcast",
"season": "Sezon",
"tv_show": "Emisiune TV",
"url": "Url",
"video": "Video"
}
},
"related-items": {
"area": "Zonă",
"automation": "Parte din următoarele automatizări",
@@ -647,6 +674,7 @@
"yaml_not_editable": "Setările acestei entități nu se pot edita din interfața grafica. Numai entitățile configurate in interfața grafica sunt configurabile din interfața grafica."
},
"more_info_control": {
"details": "Detalii",
"dismiss": "Se respinge dialogul",
"edit": "Editează entitatea",
"person": {
@@ -850,7 +878,13 @@
"label": "Cheama serviciu",
"service_data": "Date serviciu"
},
"wait_for_trigger": {
"continue_timeout": "Continua la timeout",
"label": "Așteptați declanșatorul",
"timeout": "Timeout (optional)"
},
"wait_template": {
"continue_timeout": "Continuați la expirare",
"label": "Asteptare",
"timeout": "Timeout (opțional)",
"wait_template": "Sablon Asteptare"
@@ -1260,6 +1294,7 @@
},
"integrations": {
"add_integration": "Adăugați integrare",
"attention": "Atenție necesară",
"caption": "Integrări",
"config_entry": {
"delete": "Șterge",
@@ -1317,6 +1352,7 @@
"none": "Nimic nu a fost configurat încă",
"none_found": "Nu s-au găsit integrări",
"none_found_detail": "Ajustați criteriile de căutare.",
"reconfigure": "Reconfigurați",
"rename_dialog": "Editați numele acestei intrări de configurare",
"rename_input_label": "Introdu nume",
"search": "Căutare integrari"
@@ -1848,9 +1884,14 @@
"title": "Status"
},
"templates": {
"all_listeners": "Acest șablon ascultă următoarele evenimente modificate de stare:",
"description": "Șabloanele sunt redate utilizând motorul de șablon Jinja2 cu unele extensii specifice Home Assistant.",
"domain": "Domeniu",
"editor": "Editor șabloane",
"entity": "Entitate",
"jinja_documentation": "Șablon documentație Jinja2",
"listeners": "Acest șablon ascultă următoarele evenimente modificate de stare:",
"no_listeners": "Acest șablon ascultă următoarele evenimente modificate de stare:",
"template_extensions": "Șabloane de extensie pentru Home Assistant",
"title": "Sabloane",
"unknown_error_template": "Sa produs o eroare de randare necunoscută."
@@ -2353,6 +2394,11 @@
"submit": "Trimite"
},
"current_user": "În prezent sunteți conectat ca {fullName}.",
"customize_sidebar": {
"button": "Editeaza",
"description": "De asemenea, puteți apăsa și ține apăsat antetul barei laterale pentru a activa modul de editare.",
"header": "Schimbați ordinea și ascundeți elementele din bara laterală"
},
"dashboard": {
"description": "Alegeți un tablou de bord implicit pentru acest dispozitiv.",
"dropdown_label": "Tablou de bord",
@@ -2375,6 +2421,7 @@
"confirm_delete": "Sigur doriti sa stergeti tokenul de acces pentru {name}?",
"create": "Creaza un Token",
"create_failed": "Crearea tokenului de acces eşuată",
"created": "Creat in {data}",
"created_at": "Creat in {date}",
"delete_failed": "Ştergerea tokenului de acces eşuată",
"description": "Creați tokenuri de acces cu durată lungă de viață pentru a permite script-urilor dvs. să interacționeze cu instanța dvs. Home Assistant. Fiecare token va fi valabil timp de 10 ani de la creatie. Următoarele tokenuri de acces de lungă durată sunt active la ora actuala.",
@@ -2382,6 +2429,7 @@
"header": "Tokenuri de acces de lunga durata",
"last_used": "Ultima utilizare la {date} din {location}",
"learn_auth_requests": "Aflați cum să faceți cereri autentificate.",
"name": "Nume",
"not_used": "Nu a fost utilizat niciodata",
"prompt_copy_token": "Copia token-ul de acces. Acesta nu va fi afișat din nou.",
"prompt_name": "Nume?"
@@ -2443,6 +2491,7 @@
}
},
"sidebar": {
"done": "Terminat",
"external_app_configuration": "Configurație aplicație",
"sidebar_toggle": "Schimbati bara laterală"
}

View File

@@ -507,6 +507,7 @@
"cancel": "Отменить",
"close": "Закрыть",
"continue": "Продолжить",
"copied": "Скопировано",
"delete": "Удалить",
"error_required": "Обязательное поле",
"loading": "Загрузка",
@@ -580,6 +581,7 @@
"artist": "Исполнитель",
"channel": "Канал",
"composer": "Композитор",
"contributing_artist": "Соисполнитель",
"directory": "Библиотека",
"episode": "Эпизод",
"game": "Игра",
@@ -2373,11 +2375,14 @@
"title": "Состояния"
},
"templates": {
"all_listeners": "Этот шаблон отслеживает все события изменения состояния.",
"description": "Здесь Вы можете протестировать поведение шаблонов. В Home Assistant используется шаблонизатор Jinja2 с некоторыми специальными расширениями.",
"domain": "Домен",
"editor": "Редактор шаблонов",
"entity": "Объект",
"jinja_documentation": "Узнайте больше о шаблонизаторе Jinja2",
"listeners": "Этот шаблон отслеживает следующие события изменения состояния:",
"no_listeners": "Этот шаблон не отслеживает события изменения состояния и не обновляется автоматически.",
"reset": "Вернуться к демонстрационному шаблону",
"template_extensions": "Узнайте больше о шаблонах Home Assistant",
"title": "Шаблоны",
@@ -2687,7 +2692,7 @@
},
"raw_editor": {
"confirm_remove_config_text": "Если Вы очистите конфигурацию этой панели Lovelace, карточки с Вашими устройствами и помещениями будут создаваться автоматически.",
"confirm_remove_config_title": "Очистить конфигурацию?",
"confirm_remove_config_title": "Вы уверены, что хотите очистить конфигурацию пользовательского интерфейса Lovelace?",
"confirm_unsaved_changes": "У вас есть несохраненные изменения. Вы уверены, что хотите выйти?",
"confirm_unsaved_comments": "Ваша конфигурация содержит комментарии, они не будут сохранены. Вы хотите продолжить?",
"error_invalid_config": "Конфигурация недействительна: {error}",

View File

@@ -505,6 +505,7 @@
"back": "Tillbaka",
"cancel": "Avbryt",
"close": "Stäng",
"continue": "Fortsätt",
"delete": "Radera",
"error_required": "Krävs",
"loading": "Läser in",
@@ -688,8 +689,11 @@
"crop": "Beskär"
},
"more_info_control": {
"controls": "Kontroller",
"details": "Detaljer",
"dismiss": "Avfärda",
"edit": "Redigera entitet",
"history": "Historik",
"person": {
"create_zone": "Skapa zon från aktuell plats"
},
@@ -1574,6 +1578,7 @@
"none_found_detail": "Justera dina sökkriterier.",
"note_about_integrations": "Inte alla integrationer kan konfigureras via användargränssnittet ännu.",
"note_about_website_reference": "Fler finns på ",
"reconfigure": "Konfigurera om",
"rename_dialog": "Redigera namnet på den här konfigurationsposten",
"rename_input_label": "Ange namn",
"search": "Sök integrationer"
@@ -1724,6 +1729,9 @@
"session": "Hämtar värden som sällan ändras från noden",
"static": "Hämtar statiska värden från enheten"
},
"nodes_table": {
"id": "ID"
},
"refresh_node": {
"complete": "Uppdatering av noden klar",
"node_status": "Nodstatus",
@@ -1875,6 +1883,7 @@
"input_text": "Ladda om inmatningstext",
"introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"ladda om\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.",
"person": "Ladda om personer",
"rpi_gpio": "Ladda om Raspberry Pi GPIO-entiteter",
"scene": "Ladda om scenarier",
"script": "Ladda om skript",
"template": "Ladda om mallar för entiteter",
@@ -1923,6 +1932,8 @@
"create": "Skapa",
"name": "Namn",
"password": "Lösenord",
"password_confirm": "Bekräfta lösenord",
"password_not_match": "Lösenorden överensstämmer inte",
"username": "Användarnamn"
},
"caption": "Användare",
@@ -1939,7 +1950,9 @@
"group": "Grupp",
"id": "ID",
"name": "Namn",
"new_password": "Nytt lösenord",
"owner": "Ägare",
"password_changed": "Lösenordet har ändrats!",
"system_generated": "Skapad av systemet",
"system_generated_users_not_editable": "Det gick inte att uppdatera systemgenererade användare.",
"system_generated_users_not_removable": "Det går inte att ta bort användare som skapats av systemet.",
@@ -2485,6 +2498,8 @@
},
"cardpicker": {
"custom_card": "Anpassad",
"domain": "Domän",
"entity": "Entitet",
"no_description": "Ingen beskrivning finns tillgänglig."
},
"edit_card": {
@@ -2818,6 +2833,9 @@
"submit": "Skicka"
},
"current_user": "Du är inloggad som {fullName}.",
"customize_sidebar": {
"button": "Redigera"
},
"dashboard": {
"description": "Välj en standardpanel för den här enheten.",
"dropdown_label": "Instrumentpanel",

View File

@@ -507,6 +507,7 @@
"cancel": "取消",
"close": "關閉",
"continue": "繼續",
"copied": "已複製",
"delete": "刪除",
"error_required": "必填",
"loading": "讀取中",
@@ -2691,7 +2692,7 @@
},
"raw_editor": {
"confirm_remove_config_text": "假如移除 Lovelace UI 設定的話,將自動以區域與設備產生 Lovelace UI 視圖。",
"confirm_remove_config_title": "確定要移除 Lovelace UI 設定?將依據區域與設備自動產生 Lovelace UI 視圖。",
"confirm_remove_config_title": "確定要移除 Lovelace UI 設定?",
"confirm_unsaved_changes": "變更尚未儲存,確定要退出?",
"confirm_unsaved_comments": "設定包含命令、將不會被儲存。是否要繼續?",
"error_invalid_config": "設定無效:{error}",