Compare commits
1018 Commits
upgrade-we
...
quick-bar-
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3fccd63bd3 | ||
![]() |
611202c905 | ||
![]() |
e553f35a68 | ||
![]() |
673649a603 | ||
![]() |
c4ed743370 | ||
![]() |
682fa0d3eb | ||
![]() |
30f34eee22 | ||
![]() |
eab76bf85b | ||
![]() |
bcf405bf9d | ||
![]() |
3c4b0d4a74 | ||
![]() |
fb9bd0eb7d | ||
![]() |
7e2dc04123 | ||
![]() |
54ec37994c | ||
![]() |
4a5935ee36 | ||
![]() |
01b9a07320 | ||
![]() |
0fcf0dcd18 | ||
![]() |
80481f142a | ||
![]() |
2be08ce7ab | ||
![]() |
37eb5af3d4 | ||
![]() |
8c8151be92 | ||
![]() |
baf31d1c1e | ||
![]() |
af2250835a | ||
![]() |
6f2a759ba3 | ||
![]() |
5065901196 | ||
![]() |
41b59e6e11 | ||
![]() |
43afdaadc6 | ||
![]() |
83c5151792 | ||
![]() |
0880ab67c6 | ||
![]() |
c0b2143c7c | ||
![]() |
c1de162c99 | ||
![]() |
a7ef8aba68 | ||
![]() |
3ee4c11a99 | ||
![]() |
990ae10dc2 | ||
![]() |
52b2fd046b | ||
![]() |
9f41f80a91 | ||
![]() |
eec4a91ad8 | ||
![]() |
7c51001c3c | ||
![]() |
a4ea4b1f5f | ||
![]() |
19fc37539e | ||
![]() |
ce7acb0feb | ||
![]() |
105b7678b8 | ||
![]() |
b67575586e | ||
![]() |
3dc6898673 | ||
![]() |
a73754c1b5 | ||
![]() |
1ebf1c00d6 | ||
![]() |
7dac7d757e | ||
![]() |
b1f3192b95 | ||
![]() |
16984d18bb | ||
![]() |
e603893d77 | ||
![]() |
a7998b30c6 | ||
![]() |
3277a4e8c3 | ||
![]() |
7e769d0e14 | ||
![]() |
713e0579f8 | ||
![]() |
6e130cc020 | ||
![]() |
eb036a12d9 | ||
![]() |
534d1f5055 | ||
![]() |
cbef909657 | ||
![]() |
874f3b32b3 | ||
![]() |
2fd017cf73 | ||
![]() |
5740b018a7 | ||
![]() |
288bf6805a | ||
![]() |
02d37a369a | ||
![]() |
1d316c3258 | ||
![]() |
a56ce62f1a | ||
![]() |
c268f42851 | ||
![]() |
7251e802ab | ||
![]() |
5b1a2d10c2 | ||
![]() |
2dd7f292b1 | ||
![]() |
213c53e307 | ||
![]() |
ce07dfd8ac | ||
![]() |
c1dba462e8 | ||
![]() |
47f0d74812 | ||
![]() |
ce80285f8d | ||
![]() |
d2dd1a43dd | ||
![]() |
12d73fe90d | ||
![]() |
c2741638b2 | ||
![]() |
4a7fb3d509 | ||
![]() |
f6ff652ca4 | ||
![]() |
6165cb0f83 | ||
![]() |
1f361b7b10 | ||
![]() |
5269ff978b | ||
![]() |
55595493a9 | ||
![]() |
ad3ff0aba7 | ||
![]() |
ce48546cef | ||
![]() |
35b3bc995e | ||
![]() |
63f60019d1 | ||
![]() |
0d741b6275 | ||
![]() |
0df9080bbb | ||
![]() |
ddcf89e6a2 | ||
![]() |
5de225d5d4 | ||
![]() |
5cddb482f1 | ||
![]() |
c000d724de | ||
![]() |
504055f331 | ||
![]() |
7f6880f40e | ||
![]() |
02e4e3c892 | ||
![]() |
993d73c359 | ||
![]() |
97ca0b818e | ||
![]() |
44166f76d4 | ||
![]() |
557d6d37a1 | ||
![]() |
d3ad56a307 | ||
![]() |
0641022ec5 | ||
![]() |
80c7a8473a | ||
![]() |
d9a954ca91 | ||
![]() |
c219f64322 | ||
![]() |
f7a9ecff21 | ||
![]() |
2b3126ae04 | ||
![]() |
934c227545 | ||
![]() |
cc0515c217 | ||
![]() |
55ba75f2bc | ||
![]() |
c220228566 | ||
![]() |
26b476ab3c | ||
![]() |
b8a67d530f | ||
![]() |
b08c96d2db | ||
![]() |
4773c39a57 | ||
![]() |
892843b290 | ||
![]() |
733244531e | ||
![]() |
66633273e2 | ||
![]() |
0405adcd16 | ||
![]() |
426a7ac8dd | ||
![]() |
3bf6205ff7 | ||
![]() |
c7f4986e61 | ||
![]() |
0f0a3fdaf7 | ||
![]() |
7d6911b140 | ||
![]() |
b8777539d7 | ||
![]() |
b5b1849ab3 | ||
![]() |
0e10c81025 | ||
![]() |
5fc0eaef1a | ||
![]() |
113718c3c1 | ||
![]() |
701bea6cae | ||
![]() |
8d516ed12a | ||
![]() |
667c5744f2 | ||
![]() |
80b7c840e2 | ||
![]() |
919c86796f | ||
![]() |
c90c88ecbf | ||
![]() |
d9ba0e2c46 | ||
![]() |
45b2fc590b | ||
![]() |
17ffdb0247 | ||
![]() |
c2fba15fc6 | ||
![]() |
5937be695f | ||
![]() |
a076fcde84 | ||
![]() |
ede9931903 | ||
![]() |
722e01608c | ||
![]() |
af926370d6 | ||
![]() |
5971aee02e | ||
![]() |
cce7ad449a | ||
![]() |
d437dd5919 | ||
![]() |
f1980730d2 | ||
![]() |
47773e9cae | ||
![]() |
60969b0916 | ||
![]() |
ecc7925d03 | ||
![]() |
6d3010dcc7 | ||
![]() |
0164bafbf1 | ||
![]() |
3940606167 | ||
![]() |
da9faccada | ||
![]() |
7e708b3bf7 | ||
![]() |
05630c9896 | ||
![]() |
369c56db73 | ||
![]() |
9873459169 | ||
![]() |
7776b3766b | ||
![]() |
29c9004654 | ||
![]() |
601c909004 | ||
![]() |
72aa9a3b62 | ||
![]() |
2ecf7bca97 | ||
![]() |
cbdfaccdb2 | ||
![]() |
93d1b9a2d5 | ||
![]() |
bfb5ee794e | ||
![]() |
9ae8bd238b | ||
![]() |
98a64e3114 | ||
![]() |
0171f3aec7 | ||
![]() |
2c827bab9a | ||
![]() |
ec920093d4 | ||
![]() |
4289ff6652 | ||
![]() |
cd32ef60da | ||
![]() |
6ef3d091e1 | ||
![]() |
0f59496778 | ||
![]() |
795b670b3c | ||
![]() |
4ad65e3d69 | ||
![]() |
f48b1150cf | ||
![]() |
198db8bc68 | ||
![]() |
3ae447ca44 | ||
![]() |
a2ec878ef0 | ||
![]() |
d43b5d3337 | ||
![]() |
11e3503dc2 | ||
![]() |
accf44b769 | ||
![]() |
b612c0e0d6 | ||
![]() |
771c7518e6 | ||
![]() |
4f2bad034a | ||
![]() |
0456669aeb | ||
![]() |
2eb71321e7 | ||
![]() |
d2e9e22e4e | ||
![]() |
e2427c8dce | ||
![]() |
26162815c8 | ||
![]() |
d0c86ea2f7 | ||
![]() |
4f5b4d4472 | ||
![]() |
10d71587e7 | ||
![]() |
9ac777d687 | ||
![]() |
7d1f9f3981 | ||
![]() |
a214ab463e | ||
![]() |
2f21f6ef8a | ||
![]() |
590cd8500d | ||
![]() |
f48a28264f | ||
![]() |
51953bce09 | ||
![]() |
c445d4b839 | ||
![]() |
9dabce1dd7 | ||
![]() |
6b77f08d86 | ||
![]() |
50e03d41ab | ||
![]() |
4759c89628 | ||
![]() |
458ab9b1e0 | ||
![]() |
dfb2a7153b | ||
![]() |
e9141d82f3 | ||
![]() |
d9f42712e4 | ||
![]() |
da0658f3d9 | ||
![]() |
412a5a6d8e | ||
![]() |
9cf9e6edd8 | ||
![]() |
28050fc9fb | ||
![]() |
ea9f227fa8 | ||
![]() |
05164e90fb | ||
![]() |
97156ccf8a | ||
![]() |
003d55968e | ||
![]() |
98dd21b75c | ||
![]() |
a349e34bc2 | ||
![]() |
245c825cbf | ||
![]() |
4ba6698c4b | ||
![]() |
dac6edea90 | ||
![]() |
b2e2dbe0c2 | ||
![]() |
f822fa0d57 | ||
![]() |
bbee94edba | ||
![]() |
c39c408332 | ||
![]() |
dde4a40e69 | ||
![]() |
1afa4d2868 | ||
![]() |
d25f371d6c | ||
![]() |
948261d1d1 | ||
![]() |
04b7749f85 | ||
![]() |
8668f0ff5b | ||
![]() |
b7d8ff6c99 | ||
![]() |
0894a30f13 | ||
![]() |
bd511887a7 | ||
![]() |
0304c0eca0 | ||
![]() |
6d5c6e2fbc | ||
![]() |
e7e7912519 | ||
![]() |
b9c41d8f99 | ||
![]() |
25a2264ac3 | ||
![]() |
ad64657c74 | ||
![]() |
106f18a73a | ||
![]() |
0fb38140a6 | ||
![]() |
60133941ae | ||
![]() |
76db64c073 | ||
![]() |
24b390ba03 | ||
![]() |
b4d34d9085 | ||
![]() |
f80bea27a9 | ||
![]() |
4b846964be | ||
![]() |
e6357e2eef | ||
![]() |
d538b6145f | ||
![]() |
229ba3a75c | ||
![]() |
672b867847 | ||
![]() |
ca1dacd621 | ||
![]() |
26abb4301d | ||
![]() |
045dac59af | ||
![]() |
1ffa87ea23 | ||
![]() |
357df2bf68 | ||
![]() |
24f3db3e3f | ||
![]() |
4bb51b0120 | ||
![]() |
32b9c1eba1 | ||
![]() |
40bffc1d25 | ||
![]() |
ed2c4e2642 | ||
![]() |
b3353e220a | ||
![]() |
7dc917babf | ||
![]() |
00dbba04a2 | ||
![]() |
3efd1a0451 | ||
![]() |
b7d7ca4014 | ||
![]() |
854a54e9c6 | ||
![]() |
4f4edb109f | ||
![]() |
265bfeb889 | ||
![]() |
96110637d9 | ||
![]() |
ad34f98e6d | ||
![]() |
a8a1563586 | ||
![]() |
9b25a54a47 | ||
![]() |
4b8c96c769 | ||
![]() |
c62ff85e73 | ||
![]() |
7d5a27ec0f | ||
![]() |
d6aba040dd | ||
![]() |
ca4757db5b | ||
![]() |
c917b67cbd | ||
![]() |
9659c97978 | ||
![]() |
7d862d6f2a | ||
![]() |
9c80776d8c | ||
![]() |
d5cd288fe8 | ||
![]() |
239e817779 | ||
![]() |
1986215919 | ||
![]() |
239f5f1a2f | ||
![]() |
3bca32c6d5 | ||
![]() |
183eff745d | ||
![]() |
4392d78ff6 | ||
![]() |
858196ab53 | ||
![]() |
fb75d8c1f2 | ||
![]() |
7628569579 | ||
![]() |
8a9d5f7753 | ||
![]() |
cdcccf5089 | ||
![]() |
de95c92e2d | ||
![]() |
3030b8d476 | ||
![]() |
92ed14c0e4 | ||
![]() |
5b94a4de9a | ||
![]() |
709112c498 | ||
![]() |
e465ec8835 | ||
![]() |
f6eb31bf9d | ||
![]() |
426f939982 | ||
![]() |
fab6cebf0d | ||
![]() |
ff081dd0f1 | ||
![]() |
868399ed6f | ||
![]() |
1bc9b95289 | ||
![]() |
9af805ab5e | ||
![]() |
6b88081360 | ||
![]() |
667c828359 | ||
![]() |
50d37ce4f6 | ||
![]() |
af0246cd27 | ||
![]() |
857e4e49d8 | ||
![]() |
c1afed7f98 | ||
![]() |
5480e54185 | ||
![]() |
99d0a0a6fd | ||
![]() |
8a998369d6 | ||
![]() |
8b490c5047 | ||
![]() |
7e70ba6ab2 | ||
![]() |
90e09fc384 | ||
![]() |
266f2e763d | ||
![]() |
c979cfb912 | ||
![]() |
8ee29b1e43 | ||
![]() |
26fbc07cac | ||
![]() |
f01fe65be4 | ||
![]() |
3fdd6a80f9 | ||
![]() |
da1de8db1d | ||
![]() |
dd1bf7b49d | ||
![]() |
f18913b5a0 | ||
![]() |
a2cd227f1a | ||
![]() |
78e64e1f60 | ||
![]() |
23a9b79320 | ||
![]() |
76394ce341 | ||
![]() |
1935df1faa | ||
![]() |
5af4ce28ab | ||
![]() |
ce8ee569c4 | ||
![]() |
b0508f430e | ||
![]() |
2139a80a7a | ||
![]() |
aa4bc2ce03 | ||
![]() |
fa65f84e09 | ||
![]() |
c06357a351 | ||
![]() |
092a02a624 | ||
![]() |
b9699f745f | ||
![]() |
7fa9f10c30 | ||
![]() |
7bf0655dae | ||
![]() |
96c5fdcbeb | ||
![]() |
c2e6d40382 | ||
![]() |
810d2a1ceb | ||
![]() |
af74f21af9 | ||
![]() |
cdf7558a8e | ||
![]() |
41b86e6c10 | ||
![]() |
085c6f8bdd | ||
![]() |
3039c678a5 | ||
![]() |
498882d014 | ||
![]() |
6c2b8c2abb | ||
![]() |
e955cc4378 | ||
![]() |
eb96dd4803 | ||
![]() |
e0bdef98a6 | ||
![]() |
1130007d14 | ||
![]() |
d99d092784 | ||
![]() |
e3b18a33ca | ||
![]() |
1890aab1e6 | ||
![]() |
42bf350034 | ||
![]() |
5ff52ea113 | ||
![]() |
432e3ba636 | ||
![]() |
f7ab52fe9a | ||
![]() |
ad8430049d | ||
![]() |
2dffe7ba9e | ||
![]() |
5b8f97e0f6 | ||
![]() |
b3a763a48d | ||
![]() |
07569f10b5 | ||
![]() |
7c5a78a1cf | ||
![]() |
5cca5bfe86 | ||
![]() |
0e021e7d7d | ||
![]() |
b30ee884a7 | ||
![]() |
869b7c85ca | ||
![]() |
4d0d1ed2a1 | ||
![]() |
291983e4c3 | ||
![]() |
909cff2158 | ||
![]() |
4e676b1dba | ||
![]() |
9149bb9333 | ||
![]() |
4631994f20 | ||
![]() |
82e9178320 | ||
![]() |
67b4688168 | ||
![]() |
6e0e169b6e | ||
![]() |
100ba8edfa | ||
![]() |
d7448ecb95 | ||
![]() |
8b1801f378 | ||
![]() |
01a4d57566 | ||
![]() |
7edc9064d9 | ||
![]() |
30c47a65f4 | ||
![]() |
0889f42a00 | ||
![]() |
4999f1ad51 | ||
![]() |
f15fbe53cf | ||
![]() |
046f7b5153 | ||
![]() |
5339fe6e06 | ||
![]() |
de7ffb10cb | ||
![]() |
80224e6974 | ||
![]() |
0c7c536f73 | ||
![]() |
e5c386c39a | ||
![]() |
bb2462483e | ||
![]() |
d5bc498373 | ||
![]() |
979b7ae651 | ||
![]() |
c73330a466 | ||
![]() |
efe8eca4e3 | ||
![]() |
a37aad18b7 | ||
![]() |
cfa0c45213 | ||
![]() |
509481ef06 | ||
![]() |
9aa8175e23 | ||
![]() |
76f59d99a2 | ||
![]() |
bd66bd6cf0 | ||
![]() |
d69333dea4 | ||
![]() |
3fd7899b93 | ||
![]() |
8f8a2cea56 | ||
![]() |
879011c8e9 | ||
![]() |
d5794c3e2e | ||
![]() |
61dbae8b8b | ||
![]() |
fcc22ba560 | ||
![]() |
2adeb88fe6 | ||
![]() |
e63a78bcdb | ||
![]() |
b065f002a4 | ||
![]() |
349a5f52b1 | ||
![]() |
aa5e20df05 | ||
![]() |
793b9f238c | ||
![]() |
9c4fdaa4f3 | ||
![]() |
d1a9cb488a | ||
![]() |
faee2c3e1b | ||
![]() |
b7845c318e | ||
![]() |
426a0727c3 | ||
![]() |
584e509a9c | ||
![]() |
f3639c2663 | ||
![]() |
1431e75f8b | ||
![]() |
be8812e0af | ||
![]() |
fd6436d490 | ||
![]() |
fd1342f9d1 | ||
![]() |
5fa0012195 | ||
![]() |
9dbb67ef01 | ||
![]() |
d16e2f37d4 | ||
![]() |
d9e8b53ffe | ||
![]() |
1997e63b7c | ||
![]() |
6f673359ff | ||
![]() |
45dfbff10a | ||
![]() |
348ee96274 | ||
![]() |
8edee32e77 | ||
![]() |
6d8d263ca6 | ||
![]() |
35923709e2 | ||
![]() |
fdd4d53448 | ||
![]() |
06419f662e | ||
![]() |
57763ef032 | ||
![]() |
8e506f7749 | ||
![]() |
c7f8fe1468 | ||
![]() |
4156a4e36d | ||
![]() |
ba3cc7df0f | ||
![]() |
0c212d39eb | ||
![]() |
3bd2e8dbf5 | ||
![]() |
5292119e6e | ||
![]() |
994a397231 | ||
![]() |
353b71f803 | ||
![]() |
eb12afe8cc | ||
![]() |
4a176f1b43 | ||
![]() |
8e228baa82 | ||
![]() |
154b53b0d8 | ||
![]() |
a3f680d80c | ||
![]() |
0d75fe6b81 | ||
![]() |
4070380ded | ||
![]() |
41195dcef0 | ||
![]() |
78a1e45be2 | ||
![]() |
d8e88bc58d | ||
![]() |
448e9b71b8 | ||
![]() |
2e178164cc | ||
![]() |
9f2e3f05a1 | ||
![]() |
405bd29ebd | ||
![]() |
b39b54e0ac | ||
![]() |
119c5c9071 | ||
![]() |
7a4c9b128c | ||
![]() |
dc5b92030f | ||
![]() |
db0a010d7c | ||
![]() |
a117a19bdf | ||
![]() |
5f46fdb406 | ||
![]() |
f0201de4cc | ||
![]() |
6cd51a318b | ||
![]() |
c1a4b27bc7 | ||
![]() |
5113222050 | ||
![]() |
90f12eea5e | ||
![]() |
2403743701 | ||
![]() |
3e6a759309 | ||
![]() |
35a430e9f4 | ||
![]() |
b644f7d23d | ||
![]() |
7702a05464 | ||
![]() |
493af5fe82 | ||
![]() |
ac66a59cec | ||
![]() |
e10c8faa47 | ||
![]() |
9b7d17433c | ||
![]() |
a40eb1ff43 | ||
![]() |
04df6c3e9e | ||
![]() |
1b970e5a66 | ||
![]() |
75406c2d01 | ||
![]() |
64d3511fbc | ||
![]() |
c610f54977 | ||
![]() |
090ad34f78 | ||
![]() |
358c5205d2 | ||
![]() |
5503cd0589 | ||
![]() |
dae42b1bd9 | ||
![]() |
06a25284e8 | ||
![]() |
5989560f15 | ||
![]() |
63c995e5da | ||
![]() |
dc5607f554 | ||
![]() |
d49302c032 | ||
![]() |
63fef9bd4b | ||
![]() |
6599351d45 | ||
![]() |
47e9531972 | ||
![]() |
3ba31483f4 | ||
![]() |
f4ca94f2e1 | ||
![]() |
67f9be2b77 | ||
![]() |
e2fd155e1b | ||
![]() |
931068dede | ||
![]() |
bc4c9cc40d | ||
![]() |
294665fbe8 | ||
![]() |
e8f6a79c8f | ||
![]() |
5fd8b5c5b9 | ||
![]() |
226b2a73af | ||
![]() |
42d421a6fc | ||
![]() |
a90203f256 | ||
![]() |
c3ef79caa9 | ||
![]() |
1439afcd9c | ||
![]() |
d263b19910 | ||
![]() |
1e477226ea | ||
![]() |
026fc1d2e3 | ||
![]() |
2d4bd9857a | ||
![]() |
8f48f5b45c | ||
![]() |
22210b7400 | ||
![]() |
7d05855ee0 | ||
![]() |
b2460cbc3d | ||
![]() |
4561957e56 | ||
![]() |
3367fadc3a | ||
![]() |
d7e409b042 | ||
![]() |
a0b28e8ad1 | ||
![]() |
f928a8e58e | ||
![]() |
0bc4b3d0fa | ||
![]() |
e352768388 | ||
![]() |
6835b73e49 | ||
![]() |
f1503f871b | ||
![]() |
c4d8aba5c8 | ||
![]() |
39f24c41ad | ||
![]() |
21644ec889 | ||
![]() |
613470b44d | ||
![]() |
6c918e346b | ||
![]() |
bce8539572 | ||
![]() |
aab86e00ec | ||
![]() |
2a58726caf | ||
![]() |
4163b35b32 | ||
![]() |
9c6dac8180 | ||
![]() |
80fc37724b | ||
![]() |
77b25f5132 | ||
![]() |
684f098450 | ||
![]() |
d09f74d30f | ||
![]() |
3d973b112e | ||
![]() |
96986164a4 | ||
![]() |
78152c20a9 | ||
![]() |
2bb64e9e2f | ||
![]() |
746844dfc8 | ||
![]() |
41b613a2d7 | ||
![]() |
3b3aeea224 | ||
![]() |
71c592a0ce | ||
![]() |
15193fcf5f | ||
![]() |
a31f53395f | ||
![]() |
283b134d84 | ||
![]() |
271eb614cd | ||
![]() |
16167bef07 | ||
![]() |
1eac9fa1cd | ||
![]() |
7f819f0020 | ||
![]() |
dec1f99a5f | ||
![]() |
c705e74fc8 | ||
![]() |
01df10f93e | ||
![]() |
9877f08cf4 | ||
![]() |
3dc4b1d775 | ||
![]() |
02791c51ae | ||
![]() |
49683326e6 | ||
![]() |
947773a82e | ||
![]() |
2a229df624 | ||
![]() |
e605ad5e46 | ||
![]() |
0d4f43472b | ||
![]() |
b30e467685 | ||
![]() |
a56c0b52d5 | ||
![]() |
c17ebfd279 | ||
![]() |
5400b1da96 | ||
![]() |
69f4a618b2 | ||
![]() |
16b8b6698c | ||
![]() |
b29a700d40 | ||
![]() |
bbb1468439 | ||
![]() |
72f9d6a8d3 | ||
![]() |
3ec8da1f17 | ||
![]() |
dbea3848df | ||
![]() |
33871435e1 | ||
![]() |
f1f22b43dc | ||
![]() |
2fb9a56e0b | ||
![]() |
14e8f66ed7 | ||
![]() |
e6f5072462 | ||
![]() |
a64f50fa72 | ||
![]() |
bb5f6e88d0 | ||
![]() |
6991403203 | ||
![]() |
410bd22f8a | ||
![]() |
b81d823602 | ||
![]() |
bd5115f9aa | ||
![]() |
7bcbed80d7 | ||
![]() |
8fb62ebf5f | ||
![]() |
209dd9923f | ||
![]() |
c75207e391 | ||
![]() |
d957f36927 | ||
![]() |
9ac459b6d9 | ||
![]() |
e08b2817ba | ||
![]() |
4ca13c409b | ||
![]() |
0d515e2303 | ||
![]() |
a2153bc6aa | ||
![]() |
ca171afe6f | ||
![]() |
bf4e97bd48 | ||
![]() |
8c59a12a03 | ||
![]() |
89569355be | ||
![]() |
3a41b3bdcf | ||
![]() |
12bd7037b3 | ||
![]() |
ca4f573be0 | ||
![]() |
07fceeab5a | ||
![]() |
3aa376e912 | ||
![]() |
92d30a8896 | ||
![]() |
83876fb9da | ||
![]() |
29bdf7877c | ||
![]() |
29199e2782 | ||
![]() |
68e1378615 | ||
![]() |
cf7efb5bfc | ||
![]() |
8634ee536d | ||
![]() |
632d3cda24 | ||
![]() |
29b6a907d4 | ||
![]() |
7474d09e5d | ||
![]() |
fc7bcd7e00 | ||
![]() |
f6fb2e4b1d | ||
![]() |
8c8673a272 | ||
![]() |
4404a1173b | ||
![]() |
e08c10315e | ||
![]() |
16473c9177 | ||
![]() |
235fd5603f | ||
![]() |
d07d5832f5 | ||
![]() |
ef8be5d559 | ||
![]() |
ccafdc6e1f | ||
![]() |
11827aa4c0 | ||
![]() |
6b0589d343 | ||
![]() |
cec1eed99e | ||
![]() |
d7e1e9e284 | ||
![]() |
cae46453a7 | ||
![]() |
a6e948c808 | ||
![]() |
7638020bfc | ||
![]() |
10a62ca17c | ||
![]() |
0afc7c184f | ||
![]() |
168e26aeb4 | ||
![]() |
e6b9389b33 | ||
![]() |
377c37425e | ||
![]() |
4af26602bb | ||
![]() |
c6624e5cb6 | ||
![]() |
f7ae5b91bf | ||
![]() |
07e68496c0 | ||
![]() |
d5a947e2cc | ||
![]() |
3f920767f1 | ||
![]() |
3e14d27a1e | ||
![]() |
cfa4c14108 | ||
![]() |
209056dbe1 | ||
![]() |
10356a7496 | ||
![]() |
d4ae74de44 | ||
![]() |
88d5e7dd5e | ||
![]() |
06c7b0b82e | ||
![]() |
689febda60 | ||
![]() |
80bc6fda8b | ||
![]() |
346eb78c4e | ||
![]() |
2df02f1b09 | ||
![]() |
92915eddc2 | ||
![]() |
cddbf460f8 | ||
![]() |
3c63c23e5a | ||
![]() |
ba67b1291f | ||
![]() |
7bced28327 | ||
![]() |
db2b60700c | ||
![]() |
9034822c44 | ||
![]() |
e8254f9aae | ||
![]() |
a14179b81a | ||
![]() |
427c5db7f4 | ||
![]() |
fcb5865468 | ||
![]() |
41370be2b8 | ||
![]() |
d7d8dd8986 | ||
![]() |
a0f596e419 | ||
![]() |
0a8894feb7 | ||
![]() |
1db9eea0f8 | ||
![]() |
489783c398 | ||
![]() |
be62f327ee | ||
![]() |
32359adb6d | ||
![]() |
2e198af8c3 | ||
![]() |
d154fcbd71 | ||
![]() |
21e277b8a2 | ||
![]() |
f98cdd0749 | ||
![]() |
e60e306426 | ||
![]() |
ec36d396d9 | ||
![]() |
135232d880 | ||
![]() |
9c42ca0315 | ||
![]() |
9ad9c569a6 | ||
![]() |
a9071d7920 | ||
![]() |
1b4a10fac1 | ||
![]() |
d340f3b383 | ||
![]() |
f8c5eeab5d | ||
![]() |
9cd2d0df93 | ||
![]() |
78914091b1 | ||
![]() |
e12c324613 | ||
![]() |
7cf396b518 | ||
![]() |
8b3b40e627 | ||
![]() |
90e14762e3 | ||
![]() |
d1dd8231cd | ||
![]() |
e70a3e09bf | ||
![]() |
98656b0044 | ||
![]() |
a48aa3c778 | ||
![]() |
05d7b98ba0 | ||
![]() |
f291ea6647 | ||
![]() |
5d6e332044 | ||
![]() |
acb471fbe5 | ||
![]() |
894f4379e6 | ||
![]() |
1c73007ae6 | ||
![]() |
2f7d744228 | ||
![]() |
e2cba90f8d | ||
![]() |
352214ba0a | ||
![]() |
bd9b72fb22 | ||
![]() |
50c9a667b3 | ||
![]() |
3d32e6310d | ||
![]() |
3bc54aa9e0 | ||
![]() |
def1ec3518 | ||
![]() |
077802f972 | ||
![]() |
914b47f340 | ||
![]() |
b2a78fd063 | ||
![]() |
7d1835e59c | ||
![]() |
833ccf3637 | ||
![]() |
51be916f39 | ||
![]() |
e375408777 | ||
![]() |
5078dc1cbf | ||
![]() |
875148366e | ||
![]() |
c9ec4b4e24 | ||
![]() |
efa2b2db27 | ||
![]() |
8ce120b74d | ||
![]() |
26e678a97d | ||
![]() |
e71dd7409e | ||
![]() |
58ffc2c6ca | ||
![]() |
d3f29362b9 | ||
![]() |
b429fe8254 | ||
![]() |
e1cb549b28 | ||
![]() |
65a22257cc | ||
![]() |
e2f753eaa7 | ||
![]() |
c7127b65bf | ||
![]() |
0c58c3572a | ||
![]() |
26ae5fd728 | ||
![]() |
370d92213b | ||
![]() |
6e8321a22a | ||
![]() |
a8e8c1ce5d | ||
![]() |
a8a8cafd2b | ||
![]() |
b609890f28 | ||
![]() |
aac09ae092 | ||
![]() |
f1ff872944 | ||
![]() |
b195d2980a | ||
![]() |
d11736181f | ||
![]() |
3e84486dd5 | ||
![]() |
a674ce36e4 | ||
![]() |
f6569a2625 | ||
![]() |
da10da79b3 | ||
![]() |
f236b76d5c | ||
![]() |
a71c22bedd | ||
![]() |
cc528e41cf | ||
![]() |
351962475f | ||
![]() |
6c73392a57 | ||
![]() |
072ad87831 | ||
![]() |
370a1f0574 | ||
![]() |
9ca7aca4b7 | ||
![]() |
0f2e9f66b1 | ||
![]() |
d03c3ab713 | ||
![]() |
57c0b34ae9 | ||
![]() |
06a94f0f28 | ||
![]() |
750e7b1262 | ||
![]() |
19e32752bb | ||
![]() |
89c0729964 | ||
![]() |
fd07152aea | ||
![]() |
b656f189b6 | ||
![]() |
9ac8d70152 | ||
![]() |
8cc0b46335 | ||
![]() |
1f15094da7 | ||
![]() |
b881adb853 | ||
![]() |
4bfc3a5629 | ||
![]() |
ae6c0bfe40 | ||
![]() |
4ce9c71521 | ||
![]() |
ec48323a7d | ||
![]() |
7d9bae16cd | ||
![]() |
163ff3d4e4 | ||
![]() |
43fbf97e10 | ||
![]() |
71faaf2ab1 | ||
![]() |
7b0e743eca | ||
![]() |
31a0c53855 | ||
![]() |
e8996063dd | ||
![]() |
00842a3354 | ||
![]() |
d33f18ecb7 | ||
![]() |
fb7f620316 | ||
![]() |
712e0d3e3b | ||
![]() |
1870dc29c0 | ||
![]() |
da6fdc74d8 | ||
![]() |
515e39154a | ||
![]() |
ff7731d063 | ||
![]() |
e9a3666dd5 | ||
![]() |
55c56d53f4 | ||
![]() |
e4d55e6842 | ||
![]() |
d8661cf2db | ||
![]() |
8815b126b5 | ||
![]() |
2cd367f29f | ||
![]() |
7395d19489 | ||
![]() |
d55cb95479 | ||
![]() |
68ece7d363 | ||
![]() |
6e4a8ac6df | ||
![]() |
790629849f | ||
![]() |
f0443a43b2 | ||
![]() |
3041eb5ce0 | ||
![]() |
c69247f190 | ||
![]() |
27d6a62e67 | ||
![]() |
6e7fc914aa | ||
![]() |
65d587843b | ||
![]() |
c54792af22 | ||
![]() |
7b7e023103 | ||
![]() |
7637d36146 | ||
![]() |
6c62afb123 | ||
![]() |
44210ce6f2 | ||
![]() |
e21efc0a5c | ||
![]() |
09a965022f | ||
![]() |
7534ecd2f2 | ||
![]() |
46bf5cf830 | ||
![]() |
7ba7761a57 | ||
![]() |
5268afabdb | ||
![]() |
3ea7506003 | ||
![]() |
ee14d206c8 | ||
![]() |
b65f4b9af6 | ||
![]() |
6d000a3f9a | ||
![]() |
9ba0de67f5 | ||
![]() |
d22eaa1318 | ||
![]() |
3f4bfab7fe | ||
![]() |
9292f217c5 | ||
![]() |
3b779bf423 | ||
![]() |
ea410d3af1 | ||
![]() |
4e71c2c500 | ||
![]() |
454ddf366a | ||
![]() |
d0ba5696d1 | ||
![]() |
c53fd0d1e1 | ||
![]() |
7bbecfde2b | ||
![]() |
a06f378582 | ||
![]() |
b3b42b741d | ||
![]() |
020f115d7c | ||
![]() |
2cc9d70915 | ||
![]() |
b242c6651a | ||
![]() |
14a51799a6 | ||
![]() |
79a6dacd2f | ||
![]() |
6891f1df1c | ||
![]() |
497494620d | ||
![]() |
7a13242077 | ||
![]() |
b9d6973a79 | ||
![]() |
ed0e8c5e8d | ||
![]() |
d8f530f8ac | ||
![]() |
a46874b7ff | ||
![]() |
cf68f25a03 | ||
![]() |
a496563b5c | ||
![]() |
a763ad5bf1 | ||
![]() |
f0b0200932 | ||
![]() |
342f22e6a1 | ||
![]() |
372ecc6557 | ||
![]() |
16c604937e | ||
![]() |
5cbffb23fd | ||
![]() |
6de38d3b85 | ||
![]() |
b34ce577d9 | ||
![]() |
4b9fcd7de7 | ||
![]() |
cc71ccaafa | ||
![]() |
9ff2eece3a | ||
![]() |
2bc97cc9c8 | ||
![]() |
a87570cf5a | ||
![]() |
9ffd25e3a0 | ||
![]() |
61fdab294a | ||
![]() |
d4e137bb58 | ||
![]() |
c251e4f241 | ||
![]() |
a55d0f347b | ||
![]() |
f15cc0b424 | ||
![]() |
4e17875011 | ||
![]() |
256b64b6b3 | ||
![]() |
8c0c0592e2 | ||
![]() |
f53f81dbc4 | ||
![]() |
d6c85719c9 | ||
![]() |
c51c80bf47 | ||
![]() |
544832756d | ||
![]() |
ca8586789a | ||
![]() |
1afc2b3518 | ||
![]() |
17352ea5bd | ||
![]() |
6f5e3c2711 | ||
![]() |
bee21cd3fe | ||
![]() |
c4340e05d2 | ||
![]() |
6d6eef4e97 | ||
![]() |
71137032df | ||
![]() |
ffff4dc03d | ||
![]() |
4033131f2e | ||
![]() |
65b16c763e | ||
![]() |
33af3de4a3 | ||
![]() |
a822c1eb2f | ||
![]() |
4eb46bc275 | ||
![]() |
ccc9b73f9b | ||
![]() |
e9ffdeff19 | ||
![]() |
a0ab4dffc9 | ||
![]() |
f5f8ad0e02 | ||
![]() |
82957ff6ef | ||
![]() |
0864aeb9c6 | ||
![]() |
cda6310373 | ||
![]() |
26a87e9280 | ||
![]() |
0b16a4880a | ||
![]() |
db68c5852c | ||
![]() |
256aec5308 | ||
![]() |
20dd3ca21c | ||
![]() |
25cc76e022 | ||
![]() |
168cc607aa | ||
![]() |
edc4601f8e | ||
![]() |
8f86a7ad8c | ||
![]() |
4d7ad0dc51 | ||
![]() |
34ac80567e | ||
![]() |
23bdc03f29 | ||
![]() |
3099748a6d | ||
![]() |
e384f76ac1 | ||
![]() |
7050d19be7 | ||
![]() |
ca678330d3 | ||
![]() |
10a5b3f9c3 | ||
![]() |
0fcedc5046 | ||
![]() |
f558f7fb8c | ||
![]() |
06207defe7 | ||
![]() |
986f9d7633 | ||
![]() |
81277fd12e | ||
![]() |
30442b25c0 | ||
![]() |
67ac3b4ba3 | ||
![]() |
f819e2cf8d | ||
![]() |
a376f4525b | ||
![]() |
5c1553286a | ||
![]() |
2c5d3f7492 | ||
![]() |
58f01ba11a | ||
![]() |
3fdf9a2e28 | ||
![]() |
4cbd8e7673 | ||
![]() |
20ca642e51 | ||
![]() |
05ad7ea011 | ||
![]() |
faea8c9f4c | ||
![]() |
0d4c51f26e | ||
![]() |
2c1b25b00b | ||
![]() |
407f305d21 | ||
![]() |
5d5d6b247f | ||
![]() |
77bd7c37c1 | ||
![]() |
783ea0f5c8 | ||
![]() |
33f1b45f30 | ||
![]() |
e1df50ad3b | ||
![]() |
6a9a4cf65f | ||
![]() |
443634ecf0 | ||
![]() |
2a17870d6d | ||
![]() |
486ed7dcaa | ||
![]() |
19c13096dc | ||
![]() |
49b4271a47 | ||
![]() |
404d0b8d05 | ||
![]() |
fe63c12cd9 | ||
![]() |
44023c3db7 | ||
![]() |
6242997849 | ||
![]() |
ec5d7508c9 | ||
![]() |
7461d8f806 | ||
![]() |
362236d7df | ||
![]() |
ba384b9eee | ||
![]() |
d94df728e5 | ||
![]() |
d0a53d1760 | ||
![]() |
2e5ec1f0c1 | ||
![]() |
6c8aedfb8b | ||
![]() |
f354e1eb0f | ||
![]() |
49b1e5897e | ||
![]() |
1a58c17180 | ||
![]() |
7fb852893c | ||
![]() |
aa9a354746 | ||
![]() |
78f5429c92 | ||
![]() |
79de8e0f32 | ||
![]() |
70f59eeec6 | ||
![]() |
b75792a3bf | ||
![]() |
5cb7117656 | ||
![]() |
3a5bd7474b | ||
![]() |
fb929a089c | ||
![]() |
6076a0cdc4 | ||
![]() |
413f1c31bb | ||
![]() |
20baff380b | ||
![]() |
582d159884 | ||
![]() |
9c43c5806d | ||
![]() |
6cc9ce573b | ||
![]() |
23192226dd | ||
![]() |
736444201b | ||
![]() |
785f49b005 | ||
![]() |
55dd1f4aa1 | ||
![]() |
6d0490d7d9 | ||
![]() |
9c574995ac | ||
![]() |
3f35c603d2 | ||
![]() |
8e0688140e | ||
![]() |
0c57c05a22 | ||
![]() |
c6be3be45a | ||
![]() |
9689db9605 | ||
![]() |
4b8f7e1fe9 | ||
![]() |
e165a96689 | ||
![]() |
91a655a81e | ||
![]() |
612811e2c2 | ||
![]() |
11bd72915c | ||
![]() |
339221e793 | ||
![]() |
9be864b45e | ||
![]() |
fafad302ba | ||
![]() |
0a7f610ad3 | ||
![]() |
007f8b50b9 | ||
![]() |
259726f5be | ||
![]() |
6853db693a | ||
![]() |
51e7aaa805 | ||
![]() |
de1ffe67b1 | ||
![]() |
d19acf17c2 | ||
![]() |
ae6243b7bf |
@@ -1,4 +0,0 @@
|
||||
node_modules
|
||||
hass_frontend
|
||||
hass_frontend_es5
|
||||
.git
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"extends": [
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"airbnb-typescript/base",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:wc/recommended",
|
||||
"plugin:lit/recommended",
|
||||
"prettier",
|
||||
@@ -45,16 +45,16 @@
|
||||
"func-names": 0,
|
||||
"prefer-arrow-callback": 0,
|
||||
"no-underscore-dangle": 0,
|
||||
"no-var": 0,
|
||||
"strict": 0,
|
||||
"prefer-spread": 0,
|
||||
"no-plusplus": 0,
|
||||
"no-bitwise": 0,
|
||||
"no-bitwise": 2,
|
||||
"comma-dangle": 0,
|
||||
"vars-on-top": 0,
|
||||
"no-continue": 0,
|
||||
"no-param-reassign": 0,
|
||||
"no-multi-assign": 0,
|
||||
"no-console": 2,
|
||||
"radix": 0,
|
||||
"no-alert": 0,
|
||||
"no-return-await": 0,
|
||||
@@ -75,13 +75,16 @@
|
||||
"object-curly-newline": 0,
|
||||
"default-case": 0,
|
||||
"wc/no-self-class": 0,
|
||||
"no-shadow": 0,
|
||||
"@typescript-eslint/camelcase": 0,
|
||||
"@typescript-eslint/ban-ts-ignore": 0,
|
||||
"@typescript-eslint/ban-ts-comment": 0,
|
||||
"@typescript-eslint/no-use-before-define": 0,
|
||||
"@typescript-eslint/no-non-null-assertion": 0,
|
||||
"@typescript-eslint/no-explicit-any": 0,
|
||||
"@typescript-eslint/no-unused-vars": 0,
|
||||
"@typescript-eslint/explicit-function-return-type": 0
|
||||
"@typescript-eslint/explicit-function-return-type": 0,
|
||||
"@typescript-eslint/explicit-module-boundary-types": 0,
|
||||
"@typescript-eslint/no-shadow": ["error"]
|
||||
},
|
||||
"plugins": ["disable", "import", "lit", "prettier", "@typescript-eslint"],
|
||||
"processor": "disable/disable"
|
||||
|
2
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
@@ -51,7 +51,7 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
||||
<!--
|
||||
Provide details about the versions you are using, which helps us reproducing
|
||||
and finding the issue quicker. Version information is found in the
|
||||
Home Assistant frontend: Developer tools -> Info.
|
||||
Home Assistant frontend: Configuration -> Info.
|
||||
|
||||
Browser version and operating system is important! Please try to replicate
|
||||
your issue in a different browser and be sure to include your findings.
|
||||
|
26
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
@@ -1,26 +0,0 @@
|
||||
---
|
||||
name: Request a feature for the UI, Frontend or Lovelace
|
||||
about: Request an new feature for the Home Assistant frontend.
|
||||
labels: feature request
|
||||
---
|
||||
|
||||
<!--
|
||||
DO NOT DELETE ANY TEXT from this template!
|
||||
Otherwise, your request may be closed without comment.
|
||||
-->
|
||||
|
||||
## The request
|
||||
|
||||
<!--
|
||||
Describe to our maintainers, the feature you would like to be added.
|
||||
Please be clear and concise and, if possible, provide a screenshot or mockup.
|
||||
-->
|
||||
|
||||
## The alternatives
|
||||
|
||||
<!--
|
||||
Are you currently using, or have you considered alternatives?
|
||||
If so, could you please describe those?
|
||||
-->
|
||||
|
||||
## Additional information
|
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Request a feature for the UI, Frontend or Lovelace
|
||||
url: https://github.com/home-assistant/frontend/discussions/category_choices
|
||||
about: Request an new feature for the Home Assistant frontend.
|
||||
- name: Report a bug that is NOT related to the UI, Frontend or Lovelace
|
||||
url: https://github.com/home-assistant/core/issues
|
||||
about: This is the issue tracker for our frontend. Please report other issues with the backend repository.
|
||||
|
6
.github/workflows/ci.yaml
vendored
@@ -34,10 +34,8 @@ jobs:
|
||||
run: yarn install
|
||||
env:
|
||||
CI: true
|
||||
- name: Build icons
|
||||
run: ./node_modules/.bin/gulp gen-icons-json
|
||||
- name: Build translations
|
||||
run: ./node_modules/.bin/gulp build-translations
|
||||
- name: Build resources
|
||||
run: ./node_modules/.bin/gulp gen-icons-json build-translations gather-gallery-demos
|
||||
- name: Run eslint
|
||||
run: ./node_modules/.bin/eslint '{**/src,src}/**/*.{js,ts,html}' --ignore-path .gitignore
|
||||
- name: Run tsc
|
||||
|
60
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [dev, master]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [dev]
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Override automatic language detection by changing the below list
|
||||
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
|
||||
language: ['javascript']
|
||||
# Learn more...
|
||||
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
# We must fetch at least the immediate parents so that if this is
|
||||
# a pull request then we can checkout the head.
|
||||
fetch-depth: 2
|
||||
|
||||
# If this run was triggered by a pull request event, then checkout
|
||||
# the head of the pull request instead of the merge commit.
|
||||
- run: git checkout HEAD^2
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
2
.gitignore
vendored
@@ -24,7 +24,7 @@ dist
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
|
||||
# Cast dev settings
|
||||
# Cast dev settings
|
||||
src/cast/dev_const.ts
|
||||
|
||||
# Secrets
|
||||
|
31
Dockerfile
@@ -1,31 +0,0 @@
|
||||
FROM node:8.11.1-alpine
|
||||
|
||||
# install yarn
|
||||
ENV PATH /root/.yarn/bin:$PATH
|
||||
|
||||
## Install/force base tools
|
||||
RUN apk update \
|
||||
&& apk add make g++ curl bash binutils tar git python2 python3 \
|
||||
&& rm -rf /var/cache/apk/* \
|
||||
&& /bin/bash \
|
||||
&& touch ~/.bashrc
|
||||
|
||||
## Install yarn
|
||||
RUN curl -o- -L https://yarnpkg.com/install.sh | bash
|
||||
|
||||
## Setup the project
|
||||
RUN mkdir -p /frontend
|
||||
|
||||
WORKDIR /frontend
|
||||
|
||||
COPY package.json yarn.lock ./
|
||||
|
||||
RUN yarn install --frozen-lockfile
|
||||
|
||||
COPY . .
|
||||
|
||||
COPY script/docker_entrypoint.sh /usr/bin/docker_entrypoint.sh
|
||||
|
||||
RUN chmod +x /usr/bin/docker_entrypoint.sh
|
||||
|
||||
CMD [ "docker_entrypoint.sh" ]
|
11
README.md
@@ -22,17 +22,8 @@ This is the repository for the official [Home Assistant](https://home-assistant.
|
||||
|
||||
A complete guide can be found at the following [link](https://www.home-assistant.io/developers/frontend/). It describes a short guide for the build of project.
|
||||
|
||||
### Docker environment
|
||||
|
||||
It is possible to compile the project and/or run commands in the development environment having only the [Docker](https://www.docker.com) pre-installed in the system. On the root of project you can do:
|
||||
|
||||
- `sh ./script/docker_run.sh build` Build all the project with one command
|
||||
- `sh ./script/docker_run.sh bash` Open an interactive shell (the same environment generated by the _classic environment_) where you can run commands. This bash work on your project directory and any change on your file is automatically present within your build bash.
|
||||
|
||||
**Note**: if you have installed `npm` in addition to the `docker`, you can use the commands `npm run docker_build` and `npm run bash` to get a full build or bash as explained above
|
||||
|
||||
## License
|
||||
|
||||
Home Assistant is open-source and Apache 2 licensed. Feel free to browse the repository, learn and reuse parts in your own projects.
|
||||
|
||||
We use [BrowserStack](https://www.browserstack.com) to test Home Assistant on a large variation of devices.
|
||||
We use [BrowserStack](https://www.browserstack.com) to test Home Assistant on a large variety of devices.
|
||||
|
@@ -22,7 +22,10 @@ module.exports.emptyPackages = ({ latestBuild }) =>
|
||||
require.resolve("@vaadin/vaadin-material-styles/font-roboto.js"),
|
||||
// Compatibility not needed for latest builds
|
||||
latestBuild &&
|
||||
path.resolve(paths.polymer_dir, "src/entrypoints/compatibility.ts"),
|
||||
// wrapped in require.resolve so it blows up if file no longer exists
|
||||
require.resolve(
|
||||
path.resolve(paths.polymer_dir, "src/resources/compatibility.ts")
|
||||
),
|
||||
// This polyfill is loaded in workers to support ES5, filter it out.
|
||||
latestBuild && require.resolve("proxy-polyfill/src/index.js"),
|
||||
].filter(Boolean);
|
||||
@@ -49,17 +52,26 @@ module.exports.terserOptions = (latestBuild) => ({
|
||||
module.exports.babelOptions = ({ latestBuild }) => ({
|
||||
babelrc: false,
|
||||
presets: [
|
||||
!latestBuild && [require("@babel/preset-env").default, { modules: false }],
|
||||
!latestBuild && [
|
||||
require("@babel/preset-env").default,
|
||||
{
|
||||
modules: false,
|
||||
useBuiltIns: "entry",
|
||||
corejs: "3.6",
|
||||
},
|
||||
],
|
||||
require("@babel/preset-typescript").default,
|
||||
].filter(Boolean),
|
||||
plugins: [
|
||||
// Part of ES2018. Converts {...a, b: 2} to Object.assign({}, a, {b: 2})
|
||||
[
|
||||
!latestBuild && [
|
||||
"@babel/plugin-proposal-object-rest-spread",
|
||||
{ loose: true, useBuiltIns: true },
|
||||
],
|
||||
// Only support the syntax, Webpack will handle it.
|
||||
"@babel/syntax-dynamic-import",
|
||||
"@babel/plugin-syntax-import-meta",
|
||||
"@babel/plugin-syntax-dynamic-import",
|
||||
"@babel/plugin-syntax-top-level-await",
|
||||
"@babel/plugin-proposal-optional-chaining",
|
||||
"@babel/plugin-proposal-nullish-coalescing-operator",
|
||||
[
|
||||
@@ -70,7 +82,7 @@ module.exports.babelOptions = ({ latestBuild }) => ({
|
||||
require("@babel/plugin-proposal-class-properties").default,
|
||||
{ loose: true },
|
||||
],
|
||||
],
|
||||
].filter(Boolean),
|
||||
});
|
||||
|
||||
// Are already ES5, cause warnings when babelified.
|
||||
@@ -82,8 +94,8 @@ module.exports.babelExclude = () => [
|
||||
const outputPath = (outputRoot, latestBuild) =>
|
||||
path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5");
|
||||
|
||||
const publicPath = (latestBuild) =>
|
||||
latestBuild ? "/frontend_latest/" : "/frontend_es5/";
|
||||
const publicPath = (latestBuild, root = "") =>
|
||||
latestBuild ? `${root}/frontend_latest/` : `${root}/frontend_es5/`;
|
||||
|
||||
/*
|
||||
BundleConfig {
|
||||
@@ -167,18 +179,14 @@ module.exports.config = {
|
||||
},
|
||||
|
||||
hassio({ isProdBuild, latestBuild }) {
|
||||
if (latestBuild) {
|
||||
throw new Error("Hass.io does not support latest build!");
|
||||
}
|
||||
return {
|
||||
entry: {
|
||||
entrypoint: path.resolve(paths.hassio_dir, "src/entrypoint.ts"),
|
||||
},
|
||||
outputPath: paths.hassio_output_root,
|
||||
publicPath: paths.hassio_publicPath,
|
||||
outputPath: outputPath(paths.hassio_output_root, latestBuild),
|
||||
publicPath: publicPath(latestBuild, paths.hassio_publicPath),
|
||||
isProdBuild,
|
||||
latestBuild,
|
||||
dontHash: new Set(["entrypoint"]),
|
||||
};
|
||||
},
|
||||
|
||||
|
@@ -20,6 +20,7 @@ gulp.task(
|
||||
"translations-enable-merge-backend",
|
||||
gulp.parallel("gen-icons-json", "build-translations"),
|
||||
"copy-static-cast",
|
||||
"gen-index-cast-dev",
|
||||
env.useRollup() ? "rollup-dev-server-cast" : "webpack-dev-server-cast"
|
||||
)
|
||||
);
|
||||
|
@@ -1,39 +1,36 @@
|
||||
const del = require("del");
|
||||
const gulp = require("gulp");
|
||||
const config = require("../paths");
|
||||
const paths = require("../paths");
|
||||
require("./translations");
|
||||
|
||||
gulp.task(
|
||||
"clean",
|
||||
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
|
||||
return del([config.app_output_root, config.build_dir]);
|
||||
return del([paths.app_output_root, paths.build_dir]);
|
||||
})
|
||||
);
|
||||
|
||||
gulp.task(
|
||||
"clean-demo",
|
||||
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
|
||||
return del([config.demo_output_root, config.build_dir]);
|
||||
return del([paths.demo_output_root, paths.build_dir]);
|
||||
})
|
||||
);
|
||||
|
||||
gulp.task(
|
||||
"clean-cast",
|
||||
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
|
||||
return del([config.cast_output_root, config.build_dir]);
|
||||
return del([paths.cast_output_root, paths.build_dir]);
|
||||
})
|
||||
);
|
||||
|
||||
gulp.task(
|
||||
"clean-hassio",
|
||||
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
|
||||
return del([config.hassio_output_root, config.build_dir]);
|
||||
})
|
||||
);
|
||||
gulp.task("clean-hassio", function cleanOutputAndBuildDir() {
|
||||
return del([paths.hassio_output_root, paths.build_dir]);
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
"clean-gallery",
|
||||
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
|
||||
return del([config.gallery_output_root, config.build_dir]);
|
||||
return del([paths.gallery_output_root, paths.build_dir]);
|
||||
})
|
||||
);
|
||||
|
@@ -6,30 +6,32 @@ const merge = require("merge-stream");
|
||||
const path = require("path");
|
||||
const paths = require("../paths");
|
||||
|
||||
const zopfliOptions = { threshold: 150 };
|
||||
|
||||
gulp.task("compress-app", function compressApp() {
|
||||
const jsLatest = gulp
|
||||
.src(path.resolve(paths.app_output_latest, "**/*.js"))
|
||||
.pipe(zopfli({ threshold: 150 }))
|
||||
.pipe(zopfli(zopfliOptions))
|
||||
.pipe(gulp.dest(paths.app_output_latest));
|
||||
|
||||
const jsEs5 = gulp
|
||||
.src(path.resolve(paths.app_output_es5, "**/*.js"))
|
||||
.pipe(zopfli({ threshold: 150 }))
|
||||
.pipe(zopfli(zopfliOptions))
|
||||
.pipe(gulp.dest(paths.app_output_es5));
|
||||
|
||||
const polyfills = gulp
|
||||
.src(path.resolve(paths.app_output_static, "polyfills/*.js"))
|
||||
.pipe(zopfli({ threshold: 150 }))
|
||||
.pipe(zopfli(zopfliOptions))
|
||||
.pipe(gulp.dest(path.resolve(paths.app_output_static, "polyfills")));
|
||||
|
||||
const translations = gulp
|
||||
.src(path.resolve(paths.app_output_static, "translations/**/*.json"))
|
||||
.pipe(zopfli({ threshold: 150 }))
|
||||
.pipe(zopfli(zopfliOptions))
|
||||
.pipe(gulp.dest(path.resolve(paths.app_output_static, "translations")));
|
||||
|
||||
const icons = gulp
|
||||
.src(path.resolve(paths.app_output_static, "mdi/*.json"))
|
||||
.pipe(zopfli({ threshold: 150 }))
|
||||
.pipe(zopfli(zopfliOptions))
|
||||
.pipe(gulp.dest(path.resolve(paths.app_output_static, "mdi")));
|
||||
|
||||
return merge(jsLatest, jsEs5, polyfills, translations, icons);
|
||||
@@ -38,6 +40,6 @@ gulp.task("compress-app", function compressApp() {
|
||||
gulp.task("compress-hassio", function compressApp() {
|
||||
return gulp
|
||||
.src(path.resolve(paths.hassio_output_root, "**/*.js"))
|
||||
.pipe(zopfli())
|
||||
.pipe(zopfli(zopfliOptions))
|
||||
.pipe(gulp.dest(paths.hassio_output_root));
|
||||
});
|
||||
|
@@ -90,8 +90,6 @@ gulp.task("gen-pages-prod", (done) => {
|
||||
});
|
||||
|
||||
gulp.task("gen-index-app-dev", (done) => {
|
||||
// In dev mode we don't mangle names, so we hardcode urls. That way we can
|
||||
// run webpack as last in watch mode, which blocks output.
|
||||
const content = renderTemplate("index", {
|
||||
latestAppJS: "/frontend_latest/app.js",
|
||||
latestCoreJS: "/frontend_latest/core.js",
|
||||
@@ -201,8 +199,6 @@ gulp.task("gen-index-cast-prod", (done) => {
|
||||
});
|
||||
|
||||
gulp.task("gen-index-demo-dev", (done) => {
|
||||
// In dev mode we don't mangle names, so we hardcode urls. That way we can
|
||||
// run webpack as last in watch mode, which blocks output.
|
||||
const content = renderDemoTemplate("index", {
|
||||
latestDemoJS: "/frontend_latest/main.js",
|
||||
|
||||
@@ -240,8 +236,6 @@ gulp.task("gen-index-demo-prod", (done) => {
|
||||
});
|
||||
|
||||
gulp.task("gen-index-gallery-dev", (done) => {
|
||||
// In dev mode we don't mangle names, so we hardcode urls. That way we can
|
||||
// run webpack as last in watch mode, which blocks output.
|
||||
const content = renderGalleryTemplate("index", {
|
||||
latestGalleryJS: "./frontend_latest/entrypoint.js",
|
||||
});
|
||||
@@ -269,3 +263,42 @@ gulp.task("gen-index-gallery-prod", (done) => {
|
||||
);
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task("gen-index-hassio-dev", async () => {
|
||||
writeHassioEntrypoint(
|
||||
`${paths.hassio_publicPath}/frontend_latest/entrypoint.js`,
|
||||
`${paths.hassio_publicPath}/frontend_es5/entrypoint.js`
|
||||
);
|
||||
});
|
||||
|
||||
gulp.task("gen-index-hassio-prod", async () => {
|
||||
const latestManifest = require(path.resolve(
|
||||
paths.hassio_output_latest,
|
||||
"manifest.json"
|
||||
));
|
||||
const es5Manifest = require(path.resolve(
|
||||
paths.hassio_output_es5,
|
||||
"manifest.json"
|
||||
));
|
||||
writeHassioEntrypoint(
|
||||
latestManifest["entrypoint.js"],
|
||||
es5Manifest["entrypoint.js"]
|
||||
);
|
||||
});
|
||||
|
||||
function writeHassioEntrypoint(latestEntrypoint, es5Entrypoint) {
|
||||
fs.mkdirSync(paths.hassio_output_root, { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.resolve(paths.hassio_output_root, "entrypoint.js"),
|
||||
`
|
||||
try {
|
||||
new Function("import('${latestEntrypoint}')")();
|
||||
} catch (err) {
|
||||
var el = document.createElement('script');
|
||||
el.src = '${es5Entrypoint}';
|
||||
document.body.appendChild(el);
|
||||
}
|
||||
`,
|
||||
{ encoding: "utf-8" }
|
||||
);
|
||||
}
|
||||
|
@@ -1,7 +1,10 @@
|
||||
// Run demo develop mode
|
||||
const gulp = require("gulp");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const env = require("../env");
|
||||
const paths = require("../paths");
|
||||
|
||||
require("./clean.js");
|
||||
require("./translations.js");
|
||||
@@ -12,6 +15,31 @@ require("./service-worker.js");
|
||||
require("./entry-html.js");
|
||||
require("./rollup.js");
|
||||
|
||||
gulp.task("gather-gallery-demos", async function gatherDemos() {
|
||||
const files = await fs.promises.readdir(
|
||||
path.resolve(paths.gallery_dir, "src/demos")
|
||||
);
|
||||
|
||||
let content = "export const DEMOS = {\n";
|
||||
|
||||
for (const file of files) {
|
||||
const demoId = path.basename(file, ".ts");
|
||||
const demoPath = "../src/demos/" + demoId;
|
||||
content += ` "${demoId}": () => import("${demoPath}"),\n`;
|
||||
}
|
||||
|
||||
content += "};";
|
||||
|
||||
const galleryBuild = path.resolve(paths.gallery_dir, "build");
|
||||
|
||||
fs.mkdirSync(galleryBuild, { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.resolve(galleryBuild, "import-demos.ts"),
|
||||
content,
|
||||
"utf-8"
|
||||
);
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
"develop-gallery",
|
||||
gulp.series(
|
||||
@@ -20,7 +48,11 @@ gulp.task(
|
||||
},
|
||||
"clean-gallery",
|
||||
"translations-enable-merge-backend",
|
||||
gulp.parallel("gen-icons-json", "build-translations"),
|
||||
gulp.parallel(
|
||||
"gen-icons-json",
|
||||
"build-translations",
|
||||
"gather-gallery-demos"
|
||||
),
|
||||
"copy-static-gallery",
|
||||
"gen-index-gallery-dev",
|
||||
env.useRollup() ? "rollup-dev-server-gallery" : "webpack-dev-server-gallery"
|
||||
@@ -35,7 +67,11 @@ gulp.task(
|
||||
},
|
||||
"clean-gallery",
|
||||
"translations-enable-merge-backend",
|
||||
gulp.parallel("gen-icons-json", "build-translations"),
|
||||
gulp.parallel(
|
||||
"gen-icons-json",
|
||||
"build-translations",
|
||||
"gather-gallery-demos"
|
||||
),
|
||||
"copy-static-gallery",
|
||||
env.useRollup() ? "rollup-prod-gallery" : "webpack-prod-gallery",
|
||||
"gen-index-gallery-prod"
|
||||
|
@@ -36,11 +36,13 @@ function copyMdiIcons(staticDir) {
|
||||
function copyPolyfills(staticDir) {
|
||||
const staticPath = genStaticPath(staticDir);
|
||||
|
||||
// Web Component polyfills and adapters
|
||||
// For custom panels using ES5 builds that don't use Babel 7+
|
||||
copyFileDir(
|
||||
npmPath("@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"),
|
||||
staticPath("polyfills/")
|
||||
);
|
||||
|
||||
// Web Component polyfills and adapters
|
||||
copyFileDir(
|
||||
npmPath("@webcomponents/webcomponentsjs/webcomponents-bundle.js"),
|
||||
staticPath("polyfills/")
|
||||
|
@@ -11,6 +11,7 @@ const META_PATH = path.resolve(ICON_PACKAGE_PATH, "meta.json");
|
||||
const PACKAGE_PATH = path.resolve(ICON_PACKAGE_PATH, "package.json");
|
||||
const ICON_PATH = path.resolve(ICON_PACKAGE_PATH, "svg");
|
||||
const OUTPUT_DIR = path.resolve(__dirname, "../../build/mdi");
|
||||
const REMOVED_ICONS_PATH = path.resolve(__dirname, "../removedIcons.json");
|
||||
|
||||
const encoding = "utf8";
|
||||
|
||||
@@ -25,6 +26,13 @@ const getMeta = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const addRemovedMeta = (meta) => {
|
||||
const file = fs.readFileSync(REMOVED_ICONS_PATH, { encoding });
|
||||
const removed = JSON.parse(file);
|
||||
const combinedMeta = [...meta, ...removed];
|
||||
return combinedMeta.sort((a, b) => a.name.localeCompare(b.name));
|
||||
};
|
||||
|
||||
const splitBySize = (meta) => {
|
||||
const chunks = [];
|
||||
const CHUNK_SIZE = 50000;
|
||||
@@ -69,7 +77,7 @@ const findDifferentiator = (curString, prevString) => {
|
||||
};
|
||||
|
||||
gulp.task("gen-icons-json", (done) => {
|
||||
const meta = getMeta();
|
||||
const meta = addRemovedMeta(getMeta());
|
||||
const split = splitBySize(meta);
|
||||
|
||||
if (!fs.existsSync(OUTPUT_DIR)) {
|
||||
|
@@ -1,6 +1,9 @@
|
||||
const gulp = require("gulp");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const env = require("../env");
|
||||
const paths = require("../paths");
|
||||
|
||||
require("./clean.js");
|
||||
require("./gen-icons-json.js");
|
||||
@@ -16,6 +19,7 @@ gulp.task(
|
||||
},
|
||||
"clean-hassio",
|
||||
"gen-icons-json",
|
||||
"gen-index-hassio-dev",
|
||||
env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio"
|
||||
)
|
||||
);
|
||||
@@ -29,6 +33,7 @@ gulp.task(
|
||||
"clean-hassio",
|
||||
"gen-icons-json",
|
||||
env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio",
|
||||
"gen-index-hassio-prod",
|
||||
...// Don't compress running tests
|
||||
(env.isTest() ? [] : ["compress-hassio"])
|
||||
)
|
||||
|
@@ -133,12 +133,7 @@ gulp.task(
|
||||
);
|
||||
|
||||
gulp.task("rollup-prod-hassio", () =>
|
||||
buildRollup(
|
||||
rollupConfig.createHassioConfig({
|
||||
isProdBuild: true,
|
||||
latestBuild: false,
|
||||
})
|
||||
)
|
||||
bothBuilds(rollupConfig.createHassioConfig, { isProdBuild: true })
|
||||
);
|
||||
|
||||
gulp.task("rollup-prod-gallery", () =>
|
||||
|
@@ -129,7 +129,7 @@ gulp.task("webpack-watch-hassio", () => {
|
||||
webpack(
|
||||
createHassioConfig({
|
||||
isProdBuild: false,
|
||||
latestBuild: false,
|
||||
latestBuild: true,
|
||||
})
|
||||
).watch({}, handler());
|
||||
});
|
||||
@@ -139,9 +139,8 @@ gulp.task(
|
||||
() =>
|
||||
new Promise((resolve) =>
|
||||
webpack(
|
||||
createHassioConfig({
|
||||
bothBuilds(createHassioConfig, {
|
||||
isProdBuild: true,
|
||||
latestBuild: false,
|
||||
}),
|
||||
handler(resolve)
|
||||
)
|
||||
|
@@ -34,7 +34,12 @@ module.exports = {
|
||||
|
||||
hassio_dir: path.resolve(__dirname, "../hassio"),
|
||||
hassio_output_root: path.resolve(__dirname, "../hassio/build"),
|
||||
hassio_publicPath: "/api/hassio/app/",
|
||||
hassio_output_latest: path.resolve(
|
||||
__dirname,
|
||||
"../hassio/build/frontend_latest"
|
||||
),
|
||||
hassio_output_es5: path.resolve(__dirname, "../hassio/build/frontend_es5"),
|
||||
hassio_publicPath: "/api/hassio/app",
|
||||
|
||||
translations_src: path.resolve(__dirname, "../src/translations"),
|
||||
};
|
||||
|
1
build-scripts/removedIcons.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
@@ -2,7 +2,6 @@ const webpack = require("webpack");
|
||||
const path = require("path");
|
||||
const TerserPlugin = require("terser-webpack-plugin");
|
||||
const ManifestPlugin = require("webpack-manifest-plugin");
|
||||
const WorkerPlugin = require("worker-plugin");
|
||||
const paths = require("./paths.js");
|
||||
const bundle = require("./bundle");
|
||||
|
||||
@@ -30,7 +29,7 @@ const createWebpackConfig = ({
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.js$|\.ts$/,
|
||||
test: /\.m?js$|\.ts$/,
|
||||
exclude: bundle.babelExclude(),
|
||||
use: {
|
||||
loader: "babel-loader",
|
||||
@@ -54,8 +53,10 @@ const createWebpackConfig = ({
|
||||
}),
|
||||
],
|
||||
},
|
||||
experiments: {
|
||||
topLevelAwait: true,
|
||||
},
|
||||
plugins: [
|
||||
new WorkerPlugin(),
|
||||
new ManifestPlugin({
|
||||
// Only include the JS of entrypoints
|
||||
filter: (file) => file.isInitial && !file.name.endsWith(".map"),
|
||||
@@ -70,7 +71,9 @@ const createWebpackConfig = ({
|
||||
if (
|
||||
!context.includes("/node_modules/") ||
|
||||
// calling define.amd will call require("!!webpack amd options")
|
||||
resource.startsWith("!!webpack")
|
||||
resource.startsWith("!!webpack") ||
|
||||
// loaded by webpack dev server but doesn't exist.
|
||||
resource === "webpack/hot"
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
@@ -80,7 +83,11 @@ const createWebpackConfig = ({
|
||||
? path.resolve(context, resource)
|
||||
: require.resolve(resource);
|
||||
} catch (err) {
|
||||
console.error("Error in ignore plugin", resource, context);
|
||||
console.error(
|
||||
"Error in Home Assistant ignore plugin",
|
||||
resource,
|
||||
context
|
||||
);
|
||||
throw err;
|
||||
}
|
||||
|
||||
@@ -104,6 +111,22 @@ const createWebpackConfig = ({
|
||||
}
|
||||
return `${chunk.name}.${chunk.hash.substr(0, 8)}.js`;
|
||||
},
|
||||
environment: {
|
||||
// The environment supports arrow functions ('() => { ... }').
|
||||
arrowFunction: latestBuild,
|
||||
// The environment supports BigInt as literal (123n).
|
||||
bigIntLiteral: false,
|
||||
// The environment supports const and let for variable declarations.
|
||||
const: latestBuild,
|
||||
// The environment supports destructuring ('{ a, b } = obj').
|
||||
destructuring: latestBuild,
|
||||
// The environment supports an async import() function to import EcmaScript modules.
|
||||
dynamicImport: latestBuild,
|
||||
// The environment supports 'for of' iteration ('for (const x of array) { ... }').
|
||||
forOf: latestBuild,
|
||||
// The environment supports ECMAScript Module syntax to import ECMAScript modules (import ... from '...').
|
||||
module: latestBuild,
|
||||
},
|
||||
chunkFilename:
|
||||
isProdBuild && !isStatsBuild
|
||||
? "chunk.[chunkhash].js"
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
@@ -37,24 +37,21 @@
|
||||
<body>
|
||||
<%= renderTemplate('_js_base') %>
|
||||
|
||||
<script type="module" crossorigin="use-credentials">
|
||||
import "<%= latestLauncherJS %>";
|
||||
<script>
|
||||
import("<%= latestLauncherJS %>");
|
||||
window.latestJS = true;
|
||||
</script>
|
||||
|
||||
<script nomodule>
|
||||
(function() {
|
||||
// // Safari 10.1 supports type=module but ignores nomodule, so we add this check.
|
||||
if (!isS101) {
|
||||
_ls("/static/polyfills/custom-elements-es5-adapter.js");
|
||||
<% if (useRollup) { %>
|
||||
_ls("/static/js/s.min.js").onload = function() {
|
||||
System.import("<%= es5LauncherJS %>");
|
||||
};
|
||||
<% } else { %>
|
||||
_ls("<%= es5LauncherJS %>");
|
||||
<% } %>
|
||||
}
|
||||
})();
|
||||
<script>
|
||||
if (!window.latestJS) {
|
||||
<% if (useRollup) { %>
|
||||
_ls("/static/js/s.min.js").onload = function() {
|
||||
System.import("<%= es5LauncherJS %>");
|
||||
};
|
||||
<% } else { %>
|
||||
_ls("<%= es5LauncherJS %>");
|
||||
<% } %>
|
||||
}
|
||||
</script>
|
||||
|
||||
<hc-layout subtitle="FAQ">
|
||||
@@ -215,13 +212,8 @@
|
||||
Chromecast is a technology developed by Google, and is available on:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Google Chrome (all platforms except on iOS)</li>
|
||||
<li>
|
||||
Microsoft Edge (all platforms,
|
||||
<a href="https://www.microsoftedgeinsider.com" target="_blank"
|
||||
>dev and canary builds only</a
|
||||
>)
|
||||
</li>
|
||||
<li>Google Chrome (all platforms except iOS)</li>
|
||||
<li>Microsoft Edge (all platforms)</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -254,7 +246,7 @@ http:
|
||||
|
||||
<script>
|
||||
var _gaq = [["_setAccount", "UA-57927901-9"], ["_trackPageview"]];
|
||||
(function(d, t) {
|
||||
(function (d, t) {
|
||||
var g = d.createElement(t),
|
||||
s = d.getElementsByTagName(t)[0];
|
||||
g.src =
|
||||
|
@@ -28,24 +28,21 @@
|
||||
|
||||
<hc-connect></hc-connect>
|
||||
|
||||
<script type="module" crossorigin="use-credentials">
|
||||
import "<%= latestLauncherJS %>";
|
||||
<script>
|
||||
import("<%= latestLauncherJS %>");
|
||||
window.latestJS = true;
|
||||
</script>
|
||||
|
||||
<script nomodule>
|
||||
(function() {
|
||||
// // Safari 10.1 supports type=module but ignores nomodule, so we add this check.
|
||||
if (!isS101) {
|
||||
_ls("/static/polyfills/custom-elements-es5-adapter.js");
|
||||
<% if (useRollup) { %>
|
||||
_ls("/static/js/s.min.js").onload = function() {
|
||||
System.import("<%= es5LauncherJS %>");
|
||||
};
|
||||
<% } else { %>
|
||||
_ls("<%= es5LauncherJS %>");
|
||||
<% } %>
|
||||
}
|
||||
})();
|
||||
<script>
|
||||
if (!window.latestJS) {
|
||||
<% if (useRollup) { %>
|
||||
_ls("/static/js/s.min.js").onload = function() {
|
||||
System.import("<%= es5LauncherJS %>");
|
||||
};
|
||||
<% } else { %>
|
||||
_ls("<%= es5LauncherJS %>");
|
||||
<% } %>
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import "../../../src/resources/safari-14-attachshadow-patch";
|
||||
import "../../../src/resources/ha-style";
|
||||
import "../../../src/resources/roboto";
|
||||
import "./layout/hc-connect";
|
||||
|
@@ -8,6 +8,7 @@ import {
|
||||
html,
|
||||
LitElement,
|
||||
property,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { CastManager } from "../../../../src/cast/cast_manager";
|
||||
@@ -28,7 +29,7 @@ import {
|
||||
getLovelaceCollection,
|
||||
LovelaceConfig,
|
||||
} from "../../../../src/data/lovelace";
|
||||
import "../../../../src/layouts/loading-screen";
|
||||
import "../../../../src/layouts/hass-loading-screen";
|
||||
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
||||
import "./hc-layout";
|
||||
import "@material/mwc-button/mwc-button";
|
||||
@@ -41,13 +42,13 @@ class HcCast extends LitElement {
|
||||
|
||||
@property() public castManager!: CastManager;
|
||||
|
||||
@property() private askWrite = false;
|
||||
@internalProperty() private askWrite = false;
|
||||
|
||||
@property() private lovelaceConfig?: LovelaceConfig | null;
|
||||
@internalProperty() private lovelaceConfig?: LovelaceConfig | null;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (this.lovelaceConfig === undefined) {
|
||||
return html` <loading-screen></loading-screen>> `;
|
||||
return html` <hass-loading-screen no-toolbar></hass-loading-screen>> `;
|
||||
}
|
||||
|
||||
const error =
|
||||
|
@@ -17,8 +17,8 @@ import {
|
||||
customElement,
|
||||
html,
|
||||
LitElement,
|
||||
property,
|
||||
TemplateResult,
|
||||
internalProperty,
|
||||
} from "lit-element";
|
||||
import { CastManager, getCastManager } from "../../../../src/cast/cast_manager";
|
||||
import { castSendShowDemo } from "../../../../src/cast/receiver_messages";
|
||||
@@ -27,7 +27,7 @@ import {
|
||||
saveTokens,
|
||||
} from "../../../../src/common/auth/token_storage";
|
||||
import "../../../../src/components/ha-icon";
|
||||
import "../../../../src/layouts/loading-screen";
|
||||
import "../../../../src/layouts/hass-loading-screen";
|
||||
import { registerServiceWorker } from "../../../../src/util/register-service-worker";
|
||||
import "./hc-layout";
|
||||
|
||||
@@ -60,19 +60,19 @@ const INTRO = html`
|
||||
|
||||
@customElement("hc-connect")
|
||||
export class HcConnect extends LitElement {
|
||||
@property() private loading = false;
|
||||
@internalProperty() private loading = false;
|
||||
|
||||
// If we had stored credentials but we cannot connect,
|
||||
// show a screen asking retry or logout.
|
||||
@property() private cannotConnect = false;
|
||||
@internalProperty() private cannotConnect = false;
|
||||
|
||||
@property() private error?: string | TemplateResult;
|
||||
@internalProperty() private error?: string | TemplateResult;
|
||||
|
||||
@property() private auth?: Auth;
|
||||
@internalProperty() private auth?: Auth;
|
||||
|
||||
@property() private connection?: Connection;
|
||||
@internalProperty() private connection?: Connection;
|
||||
|
||||
@property() private castManager?: CastManager | null;
|
||||
@internalProperty() private castManager?: CastManager | null;
|
||||
|
||||
private openDemo = false;
|
||||
|
||||
@@ -98,7 +98,7 @@ export class HcConnect extends LitElement {
|
||||
}
|
||||
|
||||
if (this.castManager === undefined || this.loading) {
|
||||
return html` <loading-screen></loading-screen> `;
|
||||
return html` <hass-loading-screen no-toolbar></hass-loading-screen> `;
|
||||
}
|
||||
|
||||
if (this.castManager === null) {
|
||||
|
@@ -30,7 +30,7 @@ class HcLayout extends LitElement {
|
||||
<ha-card>
|
||||
<div class="layout">
|
||||
<img class="hero" src="/images/google-nest-hub.png" />
|
||||
<div class="card-header">
|
||||
<h1 class="card-header">
|
||||
Home Assistant Cast${this.subtitle ? ` – ${this.subtitle}` : ""}
|
||||
${this.auth
|
||||
? html`
|
||||
@@ -44,7 +44,7 @@ class HcLayout extends LitElement {
|
||||
</div>
|
||||
`
|
||||
: ""}
|
||||
</div>
|
||||
</h1>
|
||||
<slot></slot>
|
||||
</div>
|
||||
</ha-card>
|
||||
|
@@ -6,13 +6,60 @@ import { castContext } from "./cast_context";
|
||||
import { HcMain } from "./layout/hc-main";
|
||||
import { ReceivedMessage } from "./types";
|
||||
|
||||
const controller = new HcMain();
|
||||
document.body.append(controller);
|
||||
const lovelaceController = new HcMain();
|
||||
document.body.append(lovelaceController);
|
||||
|
||||
const mediaPlayer = document.createElement("cast-media-player");
|
||||
mediaPlayer.style.display = "none";
|
||||
document.body.append(mediaPlayer);
|
||||
const playerStylesAdded = false;
|
||||
|
||||
let controls: HTMLElement | null;
|
||||
|
||||
const setTouchControlsVisibility = (visible: boolean) => {
|
||||
if (!castContext.getDeviceCapabilities().touch_input_supported) {
|
||||
return;
|
||||
}
|
||||
controls =
|
||||
controls ||
|
||||
(document.body.querySelector("touch-controls") as HTMLElement | null);
|
||||
if (controls) {
|
||||
controls.style.display = visible ? "initial" : "none";
|
||||
}
|
||||
};
|
||||
|
||||
const showLovelaceController = () => {
|
||||
mediaPlayer.style.display = "none";
|
||||
lovelaceController.style.display = "initial";
|
||||
document.body.setAttribute("style", "overflow-y: auto !important");
|
||||
setTouchControlsVisibility(false);
|
||||
};
|
||||
|
||||
const showMediaPlayer = () => {
|
||||
lovelaceController.style.display = "none";
|
||||
mediaPlayer.style.display = "initial";
|
||||
document.body.removeAttribute("style");
|
||||
setTouchControlsVisibility(true);
|
||||
if (!playerStylesAdded) {
|
||||
const style = document.createElement("style");
|
||||
style.innerHTML = `
|
||||
body {
|
||||
--logo-image: url('https://www.home-assistant.io/images/home-assistant-logo.svg');
|
||||
--logo-repeat: no-repeat;
|
||||
--playback-logo-image: url('https://www.home-assistant.io/images/home-assistant-logo.svg');
|
||||
--theme-hue: 200;
|
||||
--progress-color: #03a9f4;
|
||||
--splash-image: url('https://home-assistant.io/images/cast/splash.png');
|
||||
--splash-size: cover;
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
}
|
||||
};
|
||||
|
||||
const options = new cast.framework.CastReceiverOptions();
|
||||
options.disableIdleTimeout = true;
|
||||
options.customNamespaces = {
|
||||
// @ts-ignore
|
||||
[CAST_NS]: cast.framework.system.MessageType.JSON,
|
||||
};
|
||||
|
||||
@@ -30,13 +77,61 @@ options.uiConfig = new cast.framework.ui.UiConfig();
|
||||
// @ts-ignore
|
||||
options.uiConfig.touchScreenOptimizedApp = true;
|
||||
|
||||
castContext.setInactivityTimeout(86400); // 1 day
|
||||
|
||||
castContext.addCustomMessageListener(
|
||||
CAST_NS,
|
||||
// @ts-ignore
|
||||
(ev: ReceivedMessage<HassMessage>) => {
|
||||
// We received a show Lovelace command, stop media from playing, hide media player and show Lovelace controller
|
||||
if (
|
||||
playerManager.getPlayerState() !==
|
||||
cast.framework.messages.PlayerState.IDLE
|
||||
) {
|
||||
playerManager.stop();
|
||||
} else {
|
||||
showLovelaceController();
|
||||
}
|
||||
const msg = ev.data;
|
||||
msg.senderId = ev.senderId;
|
||||
controller.processIncomingMessage(msg);
|
||||
lovelaceController.processIncomingMessage(msg);
|
||||
}
|
||||
);
|
||||
|
||||
const playerManager = castContext.getPlayerManager();
|
||||
|
||||
playerManager.setMessageInterceptor(
|
||||
cast.framework.messages.MessageType.LOAD,
|
||||
(loadRequestData) => {
|
||||
// We received a play media command, hide Lovelace and show media player
|
||||
showMediaPlayer();
|
||||
const media = loadRequestData.media;
|
||||
// Special handling if it came from Google Assistant
|
||||
if (media.entity) {
|
||||
media.contentId = media.entity;
|
||||
media.streamType = cast.framework.messages.StreamType.LIVE;
|
||||
media.contentType = "application/vnd.apple.mpegurl";
|
||||
// @ts-ignore
|
||||
media.hlsVideoSegmentFormat =
|
||||
cast.framework.messages.HlsVideoSegmentFormat.FMP4;
|
||||
}
|
||||
return loadRequestData;
|
||||
}
|
||||
);
|
||||
|
||||
playerManager.addEventListener(
|
||||
cast.framework.events.EventType.MEDIA_STATUS,
|
||||
(event) => {
|
||||
if (
|
||||
event.mediaStatus?.playerState ===
|
||||
cast.framework.messages.PlayerState.IDLE &&
|
||||
event.mediaStatus?.idleReason &&
|
||||
event.mediaStatus?.idleReason !==
|
||||
cast.framework.messages.IdleReason.INTERRUPTED
|
||||
) {
|
||||
// media finished or stopped, return to default Lovelace
|
||||
showLovelaceController();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
@@ -1,4 +1,10 @@
|
||||
import { customElement, html, property, TemplateResult } from "lit-element";
|
||||
import {
|
||||
customElement,
|
||||
html,
|
||||
property,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { mockHistory } from "../../../../demo/src/stubs/history";
|
||||
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
||||
import {
|
||||
@@ -13,9 +19,9 @@ import "./hc-lovelace";
|
||||
|
||||
@customElement("hc-demo")
|
||||
class HcDemo extends HassElement {
|
||||
@property() public lovelacePath!: string;
|
||||
@property({ attribute: false }) public lovelacePath!: string;
|
||||
|
||||
@property() private _lovelaceConfig?: LovelaceConfig;
|
||||
@internalProperty() private _lovelaceConfig?: LovelaceConfig;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (!this._lovelaceConfig) {
|
||||
|
@@ -11,7 +11,7 @@ import { HomeAssistant } from "../../../../src/types";
|
||||
|
||||
@customElement("hc-launch-screen")
|
||||
class HcLaunchScreen extends LitElement {
|
||||
@property() public hass?: HomeAssistant;
|
||||
@property({ attribute: false }) public hass?: HomeAssistant;
|
||||
|
||||
@property() public error?: string;
|
||||
|
||||
|
@@ -9,19 +9,20 @@ import {
|
||||
} from "lit-element";
|
||||
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
||||
import { Lovelace } from "../../../../src/panels/lovelace/types";
|
||||
import "../../../../src/panels/lovelace/views/hui-panel-view";
|
||||
import "../../../../src/panels/lovelace/views/hui-view";
|
||||
import { HomeAssistant } from "../../../../src/types";
|
||||
import "./hc-launch-screen";
|
||||
|
||||
@customElement("hc-lovelace")
|
||||
class HcLovelace extends LitElement {
|
||||
@property() public hass!: HomeAssistant;
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property() public lovelaceConfig!: LovelaceConfig;
|
||||
@property({ attribute: false }) public lovelaceConfig!: LovelaceConfig;
|
||||
|
||||
@property() public viewPath?: string | number;
|
||||
|
||||
public urlPath?: string | null;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
const index = this._viewIndex;
|
||||
if (index === undefined) {
|
||||
@@ -35,6 +36,7 @@ class HcLovelace extends LitElement {
|
||||
const lovelace: Lovelace = {
|
||||
config: this.lovelaceConfig,
|
||||
editMode: false,
|
||||
urlPath: this.urlPath!,
|
||||
enableFullEditMode: () => undefined,
|
||||
mode: "storage",
|
||||
language: "en",
|
||||
@@ -42,22 +44,13 @@ class HcLovelace extends LitElement {
|
||||
deleteConfig: async () => undefined,
|
||||
setEditMode: () => undefined,
|
||||
};
|
||||
return this.lovelaceConfig.views[index].panel
|
||||
? html`
|
||||
<hui-panel-view
|
||||
.hass=${this.hass}
|
||||
.lovelace=${lovelace}
|
||||
.config=${this.lovelaceConfig.views[index]}
|
||||
></hui-panel-view>
|
||||
`
|
||||
: html`
|
||||
<hui-view
|
||||
.hass=${this.hass}
|
||||
.lovelace=${lovelace}
|
||||
.index=${index}
|
||||
columns="2"
|
||||
></hui-view>
|
||||
`;
|
||||
return html`
|
||||
<hui-view
|
||||
.hass=${this.hass}
|
||||
.lovelace=${lovelace}
|
||||
.index=${index}
|
||||
></hui-view>
|
||||
`;
|
||||
}
|
||||
|
||||
protected updated(changedProps) {
|
||||
@@ -73,7 +66,7 @@ class HcLovelace extends LitElement {
|
||||
|
||||
if (configBackground) {
|
||||
(this.shadowRoot!.querySelector(
|
||||
"hui-view, hui-panel-view"
|
||||
"hui-view"
|
||||
) as HTMLElement)!.style.setProperty(
|
||||
"--lovelace-background",
|
||||
configBackground
|
||||
|
@@ -3,7 +3,12 @@ import {
|
||||
getAuth,
|
||||
UnsubscribeFunc,
|
||||
} from "home-assistant-js-websocket";
|
||||
import { customElement, html, property, TemplateResult } from "lit-element";
|
||||
import {
|
||||
customElement,
|
||||
html,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { CAST_NS } from "../../../../src/cast/const";
|
||||
import {
|
||||
ConnectMessage,
|
||||
@@ -31,13 +36,13 @@ let resourcesLoaded = false;
|
||||
|
||||
@customElement("hc-main")
|
||||
export class HcMain extends HassElement {
|
||||
@property() private _showDemo = false;
|
||||
@internalProperty() private _showDemo = false;
|
||||
|
||||
@property() private _lovelaceConfig?: LovelaceConfig;
|
||||
@internalProperty() private _lovelaceConfig?: LovelaceConfig;
|
||||
|
||||
@property() private _lovelacePath: string | number | null = null;
|
||||
@internalProperty() private _lovelacePath: string | number | null = null;
|
||||
|
||||
@property() private _error?: string;
|
||||
@internalProperty() private _error?: string;
|
||||
|
||||
private _unsubLovelace?: UnsubscribeFunc;
|
||||
|
||||
@@ -82,6 +87,8 @@ export class HcMain extends HassElement {
|
||||
.hass=${this.hass}
|
||||
.lovelaceConfig=${this._lovelaceConfig}
|
||||
.viewPath=${this._lovelacePath}
|
||||
.urlPath=${this._urlPath}
|
||||
@config-refresh=${this._generateLovelaceConfig}
|
||||
></hc-lovelace>
|
||||
`;
|
||||
}
|
||||
@@ -191,14 +198,11 @@ export class HcMain extends HassElement {
|
||||
this._handleNewLovelaceConfig(lovelaceConfig)
|
||||
);
|
||||
} catch (err) {
|
||||
// eslint-disable-next-line
|
||||
console.log("Error fetching Lovelace configuration", err, msg);
|
||||
// Generate a Lovelace config.
|
||||
this._unsubLovelace = () => undefined;
|
||||
const { generateLovelaceConfigFromHass } = await import(
|
||||
"../../../../src/panels/lovelace/common/generate-lovelace-config"
|
||||
);
|
||||
this._handleNewLovelaceConfig(
|
||||
await generateLovelaceConfigFromHass(this.hass!)
|
||||
);
|
||||
await this._generateLovelaceConfig();
|
||||
}
|
||||
}
|
||||
if (!resourcesLoaded) {
|
||||
@@ -212,12 +216,19 @@ export class HcMain extends HassElement {
|
||||
}
|
||||
this._showDemo = false;
|
||||
this._lovelacePath = msg.viewPath;
|
||||
if (castContext.getDeviceCapabilities().touch_input_supported) {
|
||||
this._breakFree();
|
||||
}
|
||||
|
||||
this._sendStatus();
|
||||
}
|
||||
|
||||
private async _generateLovelaceConfig() {
|
||||
const { generateLovelaceConfigFromHass } = await import(
|
||||
"../../../../src/panels/lovelace/common/generate-lovelace-config"
|
||||
);
|
||||
this._handleNewLovelaceConfig(
|
||||
await generateLovelaceConfigFromHass(this.hass!)
|
||||
);
|
||||
}
|
||||
|
||||
private _handleNewLovelaceConfig(lovelaceConfig: LovelaceConfig) {
|
||||
castContext.setApplicationState(lovelaceConfig.title!);
|
||||
this._lovelaceConfig = lovelaceConfig;
|
||||
@@ -228,9 +239,6 @@ export class HcMain extends HassElement {
|
||||
this._showDemo = true;
|
||||
this._lovelacePath = "overview";
|
||||
this._sendStatus();
|
||||
if (castContext.getDeviceCapabilities().touch_input_supported) {
|
||||
this._breakFree();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -251,14 +259,6 @@ export class HcMain extends HassElement {
|
||||
}
|
||||
}
|
||||
|
||||
private _breakFree() {
|
||||
const controls = document.body.querySelector("touch-controls");
|
||||
if (controls) {
|
||||
controls.remove();
|
||||
}
|
||||
document.body.setAttribute("style", "overflow-y: auto !important");
|
||||
}
|
||||
|
||||
private sendMessage(senderId: string, response: any) {
|
||||
castContext.sendCustomMessage(CAST_NS, senderId, response);
|
||||
}
|
||||
|
@@ -1,11 +1,8 @@
|
||||
const { createCastConfig } = require("../build-scripts/webpack.js");
|
||||
const { isProdBuild } = require("../build-scripts/env.js");
|
||||
|
||||
// File just used for stats builds
|
||||
|
||||
const latestBuild = true;
|
||||
const { isProdBuild, isStatsBuild } = require("../build-scripts/env.js");
|
||||
|
||||
module.exports = createCastConfig({
|
||||
isProdBuild: isProdBuild(),
|
||||
latestBuild,
|
||||
isStatsBuild: isStatsBuild(),
|
||||
latestBuild: true,
|
||||
});
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 767 B After Width: | Height: | Size: 532 B |
Before Width: | Height: | Size: 803 B After Width: | Height: | Size: 535 B |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 375 B After Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
@@ -26,9 +26,9 @@ export const demoThemeJimpower = () => ({
|
||||
"switch-checked-color": "var(--accent-color)",
|
||||
"paper-dialog-background-color": "#434954",
|
||||
"secondary-text-color": "#5294E2",
|
||||
"google-red-500": "#E45E65",
|
||||
"error-color": "#E45E65",
|
||||
"divider-color": "rgba(0, 0, 0, .12)",
|
||||
"google-green-500": "#39E949",
|
||||
"success-color": "#39E949",
|
||||
"switch-unchecked-button-color": "var(--disabled-text-color)",
|
||||
"label-badge-border-color": "green",
|
||||
"paper-listbox-color": "var(--primary-color)",
|
||||
|
@@ -27,9 +27,9 @@ export const demoThemeKernehed = () => ({
|
||||
"switch-checked-color": "var(--accent-color)",
|
||||
"paper-dialog-background-color": "#292929",
|
||||
"secondary-text-color": "#b58e31",
|
||||
"google-red-500": "#b58e31",
|
||||
"error-color": "#b58e31",
|
||||
"divider-color": "rgba(0, 0, 0, .12)",
|
||||
"google-green-500": "#2980b9",
|
||||
"success-color": "#2980b9",
|
||||
"switch-unchecked-button-color": "var(--disabled-text-color)",
|
||||
"label-badge-border-color": "green",
|
||||
"paper-listbox-color": "#777777",
|
||||
|
@@ -4,7 +4,7 @@ import {
|
||||
customElement,
|
||||
html,
|
||||
LitElement,
|
||||
property,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { CastManager } from "../../../src/cast/cast_manager";
|
||||
@@ -20,7 +20,7 @@ import { HomeAssistant } from "../../../src/types";
|
||||
class CastDemoRow extends LitElement implements LovelaceRow {
|
||||
public hass!: HomeAssistant;
|
||||
|
||||
@property() private _castManager?: CastManager | null;
|
||||
@internalProperty() private _castManager?: CastManager | null;
|
||||
|
||||
public setConfig(_config: CastConfig): void {
|
||||
// No config possible.
|
||||
@@ -52,7 +52,6 @@ class CastDemoRow extends LitElement implements LovelaceRow {
|
||||
});
|
||||
mgr.castContext.addEventListener(
|
||||
// eslint-disable-next-line no-undef
|
||||
// @ts-ignore
|
||||
cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
|
||||
(ev) => {
|
||||
// On Android, opening a new session always results in SESSION_RESUMED.
|
||||
|
@@ -1,15 +1,16 @@
|
||||
import "@material/mwc-button";
|
||||
import "@polymer/paper-spinner/paper-spinner-lite";
|
||||
import {
|
||||
css,
|
||||
CSSResult,
|
||||
html,
|
||||
LitElement,
|
||||
property,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { until } from "lit-html/directives/until";
|
||||
import "../../../src/components/ha-card";
|
||||
import "../../../src/components/ha-circular-progress";
|
||||
import { LovelaceCardConfig } from "../../../src/data/lovelace";
|
||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||
import { Lovelace, LovelaceCard } from "../../../src/panels/lovelace/types";
|
||||
@@ -21,11 +22,11 @@ import {
|
||||
} from "../configs/demo-configs";
|
||||
|
||||
export class HADemoCard extends LitElement implements LovelaceCard {
|
||||
@property() public lovelace?: Lovelace;
|
||||
@property({ attribute: false }) public lovelace?: Lovelace;
|
||||
|
||||
@property() public hass!: MockHomeAssistant;
|
||||
@property({ attribute: false }) public hass!: MockHomeAssistant;
|
||||
|
||||
@property() private _switching?: boolean;
|
||||
@internalProperty() private _switching?: boolean;
|
||||
|
||||
private _hidden = localStorage.hide_demo_card;
|
||||
|
||||
@@ -49,7 +50,7 @@ export class HADemoCard extends LitElement implements LovelaceCard {
|
||||
<div class="picker">
|
||||
<div class="label">
|
||||
${this._switching
|
||||
? html` <paper-spinner-lite active></paper-spinner-lite> `
|
||||
? html`<ha-circular-progress active></ha-circular-progress>`
|
||||
: until(
|
||||
selectedDemoConfig.then(
|
||||
(conf) => html`
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import "../../src/resources/safari-14-attachshadow-patch";
|
||||
import "@polymer/polymer/lib/elements/dom-if";
|
||||
import "@polymer/polymer/lib/elements/dom-repeat";
|
||||
import "../../src/resources/ha-style";
|
||||
|
@@ -5,18 +5,6 @@
|
||||
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />
|
||||
<link rel="icon" href="/static/icons/favicon.ico" />
|
||||
<link rel="mask-icon" href="/static/icons/mask-icon.svg" color="#03a9f4" />
|
||||
<link
|
||||
rel="preload"
|
||||
href="/static/fonts/roboto/Roboto-Regular.woff2"
|
||||
as="font"
|
||||
crossorigin
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
href="/static/fonts/roboto/Roboto-Medium.woff2"
|
||||
as="font"
|
||||
crossorigin
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
@@ -96,28 +84,28 @@
|
||||
<div id="ha-init-skeleton"></div>
|
||||
<ha-demo></ha-demo>
|
||||
<%= renderTemplate('_js_base') %>
|
||||
<%= renderTemplate('_preload_roboto') %>
|
||||
|
||||
<script type="module" src="<%= latestDemoJS %>"></script>
|
||||
<script>
|
||||
import("<%= latestDemoJS %>");
|
||||
window.latestJS = true;
|
||||
</script>
|
||||
|
||||
<script nomodule>
|
||||
(function() {
|
||||
// // Safari 10.1 supports type=module but ignores nomodule, so we add this check.
|
||||
if (!isS101) {
|
||||
_ls("/static/polyfills/custom-elements-es5-adapter.js");
|
||||
<% if (useRollup) { %>
|
||||
_ls("/static/js/s.min.js").onload = function() {
|
||||
System.import("<%= es5DemoJS %>");
|
||||
};
|
||||
<% } else { %>
|
||||
_ls("<%= es5DemoJS %>");
|
||||
<% } %>
|
||||
}
|
||||
})();
|
||||
<script>
|
||||
if (!window.latestJS) {
|
||||
<% if (useRollup) { %>
|
||||
_ls("/static/js/s.min.js").onload = function() {
|
||||
System.import("<%= es5DemoJS %>");
|
||||
};
|
||||
<% } else { %>
|
||||
_ls("<%= es5DemoJS %>");
|
||||
<% } %>
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
var _gaq = [["_setAccount", "UA-57927901-5"], ["_trackPageview"]];
|
||||
(function(d, t) {
|
||||
(function (d, t) {
|
||||
var g = d.createElement(t),
|
||||
s = d.getElementsByTagName(t)[0];
|
||||
g.src =
|
||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 110 KiB |