Compare commits
1031 Commits
release-10
...
release-10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc66fadb0e | ||
|
|
298d8d7929 | ||
|
|
bdf8553728 | ||
|
|
8ac155fb7a | ||
|
|
54dee197fd | ||
|
|
7a3eb3ffad | ||
|
|
15b987e0de | ||
|
|
54b05ab27d | ||
|
|
e1308f01b6 | ||
|
|
c596c19bfd | ||
|
|
087d06debf | ||
|
|
0b4402b642 | ||
|
|
b36369b562 | ||
|
|
78a2ba73e7 | ||
|
|
1be5e20363 | ||
|
|
9a130f5869 | ||
|
|
d6cec24d9e | ||
|
|
2044efc0c3 | ||
|
|
e12a8bc39d | ||
|
|
a885964e46 | ||
|
|
efdc07e032 | ||
|
|
40b8a0d881 | ||
|
|
264f07a604 | ||
|
|
e0711335aa | ||
|
|
1fd13b16b3 | ||
|
|
8a01f41e4c | ||
|
|
87661308a5 | ||
|
|
ad8741f9e7 | ||
|
|
05327879d6 | ||
|
|
bda4d9e00e | ||
|
|
a92aae3a43 | ||
|
|
5619295646 | ||
|
|
591a1d3baa | ||
|
|
97cdd43019 | ||
|
|
f7d1c9fb1b | ||
|
|
c34ecdc9a7 | ||
|
|
8bb9e26526 | ||
|
|
8d112f3eec | ||
|
|
24d4b80b43 | ||
|
|
51cea78c98 | ||
|
|
28380365b4 | ||
|
|
01f09eaa77 | ||
|
|
c407350d7a | ||
|
|
d3cdf32b32 | ||
|
|
e7e1fd279b | ||
|
|
4b6ea2d087 | ||
|
|
c36a916e20 | ||
|
|
0e752f0e45 | ||
|
|
b4da29b815 | ||
|
|
60f560f65b | ||
|
|
dc09a3dd9d | ||
|
|
b5e36e6f73 | ||
|
|
0fb8ef23b0 | ||
|
|
cb6920c51f | ||
|
|
2572de460b | ||
|
|
716ac36031 | ||
|
|
dc6f7dcb8f | ||
|
|
ac4c7c7b71 | ||
|
|
e7610b0e4a | ||
|
|
9bb5fe0f0b | ||
|
|
bbc5a5f491 | ||
|
|
1a85c16e89 | ||
|
|
7e19600a2b | ||
|
|
1d5f6effa9 | ||
|
|
832c1d8308 | ||
|
|
3bf97ce66e | ||
|
|
0a6e8feb40 | ||
|
|
166d0df0b4 | ||
|
|
8c446624d7 | ||
|
|
6c22fab547 | ||
|
|
1a3b954882 | ||
|
|
65dbd1991f | ||
|
|
59686f28b3 | ||
|
|
6c566847db | ||
|
|
5d6e6c5db9 | ||
|
|
350463a1e7 | ||
|
|
7d0f971fe7 | ||
|
|
d975b1743f | ||
|
|
62803bac5d | ||
|
|
cc468aeac3 | ||
|
|
c5f7f6d5c0 | ||
|
|
6facb1b646 | ||
|
|
c679336b87 | ||
|
|
0286cc60d5 | ||
|
|
bcb13acccd | ||
|
|
c77803af89 | ||
|
|
714773fe83 | ||
|
|
0e2163b396 | ||
|
|
4c3af5b9dd | ||
|
|
76ec5e088b | ||
|
|
3f1fd61e9c | ||
|
|
0e9d890409 | ||
|
|
bc30e5a626 | ||
|
|
0a26243e9a | ||
|
|
3317c09e1c | ||
|
|
306004a2db | ||
|
|
74abce4354 | ||
|
|
5974c511f9 | ||
|
|
4ab84e369b | ||
|
|
61639af3f7 | ||
|
|
ff9a0ba4e7 | ||
|
|
b95f894a7a | ||
|
|
545efb1b57 | ||
|
|
20c23dc728 | ||
|
|
c22da5a4ab | ||
|
|
865e196b40 | ||
|
|
86984972e8 | ||
|
|
a272a6fcd5 | ||
|
|
cac028eb6a | ||
|
|
3b3f230eff | ||
|
|
2c9fe360a6 | ||
|
|
5cb4c195d7 | ||
|
|
0c337e11a6 | ||
|
|
ff68a0d550 | ||
|
|
98e83600dc | ||
|
|
110b148c55 | ||
|
|
e4f7e95f46 | ||
|
|
13f65932d4 | ||
|
|
e6f55c4eca | ||
|
|
d2984b7abd | ||
|
|
df82636845 | ||
|
|
b06e9b5842 | ||
|
|
a2bde879aa | ||
|
|
a12954f4f9 | ||
|
|
75195a4846 | ||
|
|
c5e008a73a | ||
|
|
e62b7f2e3d | ||
|
|
09e38ca931 | ||
|
|
81e98409d0 | ||
|
|
2d917f3807 | ||
|
|
db8410602a | ||
|
|
4bb18b02e5 | ||
|
|
aca14802e0 | ||
|
|
6bef3fc63e | ||
|
|
97a5f84ced | ||
|
|
51bbe65262 | ||
|
|
b2a2b03b37 | ||
|
|
f8c018b77e | ||
|
|
4196e279ea | ||
|
|
e2cc98c7a4 | ||
|
|
5104aabead | ||
|
|
1f0f1dc1b3 | ||
|
|
ed956f8eba | ||
|
|
ba0d637f91 | ||
|
|
9ab6756e39 | ||
|
|
0aca394e1e | ||
|
|
26644c06c4 | ||
|
|
5a802c35b8 | ||
|
|
81bc57678b | ||
|
|
d555840384 | ||
|
|
100ca5ba45 | ||
|
|
7f6d97d0d5 | ||
|
|
c2a0de8202 | ||
|
|
54ca2e9381 | ||
|
|
52136b57a2 | ||
|
|
e9e9b4bca9 | ||
|
|
4f084bad1c | ||
|
|
f2123d03cc | ||
|
|
fdbdaa1982 | ||
|
|
f7d5d4480d | ||
|
|
8ee530c0ec | ||
|
|
f8d894b269 | ||
|
|
ebbd3f11ab | ||
|
|
1a9432b642 | ||
|
|
2240edce26 | ||
|
|
ffe4087f0a | ||
|
|
f1ba5c63c0 | ||
|
|
a640781d4e | ||
|
|
76ddb4d55f | ||
|
|
27f39e39c4 | ||
|
|
9956084443 | ||
|
|
2690381144 | ||
|
|
a1c66f31fc | ||
|
|
ed34530b1e | ||
|
|
120b3106aa | ||
|
|
3226ad47a5 | ||
|
|
e46ddedf0c | ||
|
|
db7e016aa7 | ||
|
|
266aac4364 | ||
|
|
0c22b76035 | ||
|
|
476eaff384 | ||
|
|
a28270bdd3 | ||
|
|
9e0d13ebaf | ||
|
|
96584b5786 | ||
|
|
2f0683f826 | ||
|
|
57d87caaeb | ||
|
|
1379477723 | ||
|
|
342267cf92 | ||
|
|
644d4ac062 | ||
|
|
85f9e79e4b | ||
|
|
2e44bc4ef8 | ||
|
|
8c2f56394f | ||
|
|
ea86b3f9e7 | ||
|
|
5f9a499c98 | ||
|
|
e9d2c73c5e | ||
|
|
a61ef5bf30 | ||
|
|
742354baee | ||
|
|
e4e315b1e0 | ||
|
|
7a904bb363 | ||
|
|
3b0a2f4caa | ||
|
|
e8ae9b3605 | ||
|
|
f862838458 | ||
|
|
1be3a7f205 | ||
|
|
86df74ad52 | ||
|
|
cfb82dd161 | ||
|
|
20923d5ab8 | ||
|
|
b4a5794573 | ||
|
|
baa87d2dfb | ||
|
|
a4dabc1644 | ||
|
|
295d6e32a3 | ||
|
|
df2ae88a72 | ||
|
|
0d17fcdfeb | ||
|
|
6d3c617c28 | ||
|
|
babb4f1028 | ||
|
|
d53a095728 | ||
|
|
a7dfb236d0 | ||
|
|
1dec316dc2 | ||
|
|
ebd8ab08d5 | ||
|
|
505cda6f76 | ||
|
|
867a5e664c | ||
|
|
6d345343df | ||
|
|
c184bc6833 | ||
|
|
8a0c268973 | ||
|
|
a8f904dc42 | ||
|
|
63cc1e0860 | ||
|
|
2ffbc14cd7 | ||
|
|
101d0b1139 | ||
|
|
42c8ef6262 | ||
|
|
af49586b1b | ||
|
|
75729ed7d2 | ||
|
|
b58473b366 | ||
|
|
046deb4a50 | ||
|
|
92a847dfc1 | ||
|
|
7ad0958d83 | ||
|
|
c8f392bdd4 | ||
|
|
7d585fde1b | ||
|
|
0ea9faee08 | ||
|
|
437729d3f3 | ||
|
|
f72d26b9da | ||
|
|
099b028978 | ||
|
|
c2cfc1d1d3 | ||
|
|
5bb480eace | ||
|
|
a653ba5308 | ||
|
|
93ee8b4afa | ||
|
|
1c5b428e56 | ||
|
|
2c579b4942 | ||
|
|
bd0bfc1c48 | ||
|
|
54093fd90a | ||
|
|
ae0d2107cd | ||
|
|
5d2c0402f1 | ||
|
|
a6db774318 | ||
|
|
b326b4be31 | ||
|
|
61f5a649ff | ||
|
|
76923c3dc9 | ||
|
|
8f956658d4 | ||
|
|
ee46631d00 | ||
|
|
6b32af12da | ||
|
|
569d6456b1 | ||
|
|
cb1d56defb | ||
|
|
5fda5a8738 | ||
|
|
c46f577f08 | ||
|
|
9177456f64 | ||
|
|
20573a8086 | ||
|
|
cdacc0175e | ||
|
|
017bc94506 | ||
|
|
6978a9d9df | ||
|
|
8bec0ad63d | ||
|
|
cfb67bb5d1 | ||
|
|
a9982263b0 | ||
|
|
40cc2fbd0c | ||
|
|
29c077d2cb | ||
|
|
e20f7e02ea | ||
|
|
0b6369fdcb | ||
|
|
cf352b6af2 | ||
|
|
5a0da2f815 | ||
|
|
5ce7310a8e | ||
|
|
1fa5a2158d | ||
|
|
8101dac3d4 | ||
|
|
fe40316927 | ||
|
|
30da850d22 | ||
|
|
a2f38df470 | ||
|
|
4f73d55d81 | ||
|
|
36d59348b1 | ||
|
|
9f35086e2f | ||
|
|
339b35cfb6 | ||
|
|
a5c4e5c54d | ||
|
|
4b5aec42f7 | ||
|
|
520a9853c7 | ||
|
|
61c49a1604 | ||
|
|
d66e2358ab | ||
|
|
658eabbc20 | ||
|
|
d48df625f3 | ||
|
|
d5fb30166c | ||
|
|
7ea2142c73 | ||
|
|
8db44000de | ||
|
|
86a6a15b9f | ||
|
|
86ae2840fc | ||
|
|
1323bfc735 | ||
|
|
1131327ede | ||
|
|
c7363267cf | ||
|
|
74104bb5ad | ||
|
|
fea5621432 | ||
|
|
752212413c | ||
|
|
f3707153a0 | ||
|
|
2587ac94b3 | ||
|
|
e715abde0b | ||
|
|
a3cc4a8ba9 | ||
|
|
c04e001986 | ||
|
|
7119ee3df5 | ||
|
|
168201f0d7 | ||
|
|
1d0fd79eb1 | ||
|
|
cafef103f4 | ||
|
|
5c96a86f90 | ||
|
|
fd540c579a | ||
|
|
2a06f96d07 | ||
|
|
9c579b6c93 | ||
|
|
221f4edc8b | ||
|
|
01a1cd0700 | ||
|
|
33fa67af54 | ||
|
|
fee99120d5 | ||
|
|
4a31e857f5 | ||
|
|
9cc0491e3a | ||
|
|
6d52868166 | ||
|
|
bcb66ac150 | ||
|
|
f936c04d15 | ||
|
|
d11167eae5 | ||
|
|
bf5f3b3fde | ||
|
|
d2213841dc | ||
|
|
f12af9f40c | ||
|
|
963b6e075c | ||
|
|
accaac3405 | ||
|
|
81be6592d6 | ||
|
|
8147f7847d | ||
|
|
9f86f68d2f | ||
|
|
9107a28cc5 | ||
|
|
bae555928f | ||
|
|
a678037eec | ||
|
|
5f80642193 | ||
|
|
3788b7b323 | ||
|
|
75521c8414 | ||
|
|
e358f84bec | ||
|
|
9c9d4ba58c | ||
|
|
63b4249c34 | ||
|
|
5135fd37b3 | ||
|
|
73b14386ef | ||
|
|
976ec25e3b | ||
|
|
b5b4bb7c7a | ||
|
|
b592abbeff | ||
|
|
3ea6bb5094 | ||
|
|
52a4a5bfa9 | ||
|
|
66fe51ee7c | ||
|
|
45ab20a031 | ||
|
|
2609bda89d | ||
|
|
22d46667df | ||
|
|
69c43d9e30 | ||
|
|
93003ec6d4 | ||
|
|
24250cb4b0 | ||
|
|
43c50d1722 | ||
|
|
51a8569c15 | ||
|
|
e0efe1c2d4 | ||
|
|
391851a200 | ||
|
|
3eb4c8ffbb | ||
|
|
df4537b1bc | ||
|
|
fde71bbbf5 | ||
|
|
b19c1b0282 | ||
|
|
816b30e657 | ||
|
|
aafb7c0be7 | ||
|
|
c9e70d9564 | ||
|
|
f7376f5d90 | ||
|
|
d7180c21ca | ||
|
|
38bed87e92 | ||
|
|
abd0b0130f | ||
|
|
bffd8f9bd9 | ||
|
|
f6ccabc886 | ||
|
|
e8d566803d | ||
|
|
a56ee7f528 | ||
|
|
4a3bf18d73 | ||
|
|
6a0672a996 | ||
|
|
1c34f6202e | ||
|
|
43ec4ff0e7 | ||
|
|
ebbfec1927 | ||
|
|
1122b5b5d9 | ||
|
|
dbfa1e4f8f | ||
|
|
dcd4a7631d | ||
|
|
6188ff74bc | ||
|
|
fa6883d341 | ||
|
|
9d9003f78e | ||
|
|
10270b8488 | ||
|
|
d33c87a99c | ||
|
|
8b09235e46 | ||
|
|
de0b26fd61 | ||
|
|
e6b60f99c4 | ||
|
|
4166aed39d | ||
|
|
e21763dfcd | ||
|
|
166c95ea3a | ||
|
|
36d1cf3a59 | ||
|
|
ad0d4c2d40 | ||
|
|
76d5f8474c | ||
|
|
cec8640443 | ||
|
|
2a3532f530 | ||
|
|
9b313d3378 | ||
|
|
6d5cf2d975 | ||
|
|
5e6350a121 | ||
|
|
9139a962d4 | ||
|
|
061ef4e458 | ||
|
|
314dc2bd97 | ||
|
|
6f569bfdff | ||
|
|
33c40b366d | ||
|
|
aafddb38d2 | ||
|
|
b61a5b53e5 | ||
|
|
b32cc719c8 | ||
|
|
f3667305f2 | ||
|
|
6c6a02598b | ||
|
|
3d07b51f41 | ||
|
|
37636dae5c | ||
|
|
e220ea603d | ||
|
|
d5d21b4bc6 | ||
|
|
a579fa7d61 | ||
|
|
8e69ce75b5 | ||
|
|
d976734d61 | ||
|
|
1d07d513ea | ||
|
|
73a6a23353 | ||
|
|
7e07e391cc | ||
|
|
2b01b560ba | ||
|
|
6890403a68 | ||
|
|
f0e97bbfbf | ||
|
|
aa27dfd5ea | ||
|
|
1d9306fd90 | ||
|
|
4804afdb04 | ||
|
|
dcb02a6707 | ||
|
|
e1b7304118 | ||
|
|
ef4915c656 | ||
|
|
62c3f8edda | ||
|
|
036c73c44b | ||
|
|
116e719a97 | ||
|
|
2d68b13ef5 | ||
|
|
30ffa4b13e | ||
|
|
82aacf1c48 | ||
|
|
42af630e7b | ||
|
|
8bff927997 | ||
|
|
faa6040516 | ||
|
|
d316556817 | ||
|
|
92a5bf6d80 | ||
|
|
f2b4f9e602 | ||
|
|
2901a4a5d6 | ||
|
|
f6a0e2ebae | ||
|
|
8eda13c092 | ||
|
|
c14c603feb | ||
|
|
8b638635c5 | ||
|
|
64862269a1 | ||
|
|
2141f56273 | ||
|
|
e67f637d0e | ||
|
|
5734d5d07d | ||
|
|
e3ebf34d44 | ||
|
|
09c5f07ad7 | ||
|
|
3f448fd12c | ||
|
|
3f4994af9c | ||
|
|
c72b090823 | ||
|
|
d410067df3 | ||
|
|
a3e1c452df | ||
|
|
b2270db44b | ||
|
|
ff74aeb302 | ||
|
|
450680888d | ||
|
|
d232e06b40 | ||
|
|
54fa486a58 | ||
|
|
773fcc1263 | ||
|
|
4ad7d984fd | ||
|
|
1e1ac1a843 | ||
|
|
069ff009a8 | ||
|
|
bc06fc23ee | ||
|
|
549d982e77 | ||
|
|
53f403d156 | ||
|
|
edbe4c4345 | ||
|
|
da16b3eaf0 | ||
|
|
e07b83c844 | ||
|
|
61de82e7fe | ||
|
|
fd6d3079c2 | ||
|
|
fa50f3521c | ||
|
|
ba9382e1bd | ||
|
|
ac98d7100f | ||
|
|
2779037bbf | ||
|
|
6b81388bab | ||
|
|
8adcdf5828 | ||
|
|
6f2609a65a | ||
|
|
18cd87799d | ||
|
|
036ce21849 | ||
|
|
0f67caab69 | ||
|
|
8f30b70bfb | ||
|
|
43dacfae90 | ||
|
|
840a9f2b50 | ||
|
|
4d32ae9396 | ||
|
|
6a227be842 | ||
|
|
13b4fba8bd | ||
|
|
7cbf9cf686 | ||
|
|
669c87d3fb | ||
|
|
6726a20762 | ||
|
|
5f7cb3c14e | ||
|
|
7157cbbe92 | ||
|
|
3f6721ddb9 | ||
|
|
b3c48466f8 | ||
|
|
e8f11b9e72 | ||
|
|
674a1fd55c | ||
|
|
c417464586 | ||
|
|
4a4dd5ddc3 | ||
|
|
7792889c5a | ||
|
|
db57c85f0a | ||
|
|
a0de3e0f2d | ||
|
|
48c7c8bd9f | ||
|
|
9d150f0002 | ||
|
|
1e2cc14f29 | ||
|
|
2ac4a210e7 | ||
|
|
0fbb374478 | ||
|
|
6a772d25db | ||
|
|
d9c5856ff7 | ||
|
|
8538356d27 | ||
|
|
673ee5c5df | ||
|
|
087dde45fc | ||
|
|
184b6efe8d | ||
|
|
97d7395148 | ||
|
|
3245e5c0d8 | ||
|
|
7e0100ef3f | ||
|
|
dd2cd4ab8a | ||
|
|
31fe3a9f61 | ||
|
|
b0f7a9b67c | ||
|
|
90b88898b2 | ||
|
|
8c1446266c | ||
|
|
f2ef23c9a8 | ||
|
|
3c8361d87c | ||
|
|
17fbb3a312 | ||
|
|
da4d3a755e | ||
|
|
93be06bdd4 | ||
|
|
71d59feb76 | ||
|
|
c8e695f9c6 | ||
|
|
0f075fe6c4 | ||
|
|
2a527e5e20 | ||
|
|
79e5fde63b | ||
|
|
c4ef42ea77 | ||
|
|
dad4225d03 | ||
|
|
e21f7f10ed | ||
|
|
1341a53543 | ||
|
|
aac1c52a2f | ||
|
|
aa14b34035 | ||
|
|
a5bad54c51 | ||
|
|
b41ae5f483 | ||
|
|
e833225ab3 | ||
|
|
fa27a839f3 | ||
|
|
5fc92c915f | ||
|
|
d4ea091ab5 | ||
|
|
ce06f79502 | ||
|
|
ac0bb40e1d | ||
|
|
a14b2b337c | ||
|
|
073f82f7de | ||
|
|
8bd840bedc | ||
|
|
f34ec139e3 | ||
|
|
8840c15484 | ||
|
|
d641543ff6 | ||
|
|
243f6f898e | ||
|
|
4818a7782d | ||
|
|
0d00b6cfd7 | ||
|
|
7bd0db6b2f | ||
|
|
3167c7dbb9 | ||
|
|
747201a6c7 | ||
|
|
55fd49bbca | ||
|
|
58dfadccbe | ||
|
|
ec387c5246 | ||
|
|
0785e6b36c | ||
|
|
3377042ad3 | ||
|
|
1da48cd363 | ||
|
|
ce51c8012d | ||
|
|
6502446f88 | ||
|
|
ede8b3397d | ||
|
|
315cbb1fc6 | ||
|
|
5662841c2c | ||
|
|
12f8cf10d5 | ||
|
|
b293f6e0f9 | ||
|
|
efa3ff1730 | ||
|
|
19530c4ade | ||
|
|
536eb398f9 | ||
|
|
b62f6edbc4 | ||
|
|
8a1ea0ae5f | ||
|
|
658aedf96a | ||
|
|
9cb1f3f306 | ||
|
|
8b703187d0 | ||
|
|
6216aaf937 | ||
|
|
a80067859d | ||
|
|
8f2c33eaa5 | ||
|
|
12589460cf | ||
|
|
53cfcfd976 | ||
|
|
d7a0a9b5bc | ||
|
|
4d8ec5b466 | ||
|
|
1ba58b06b3 | ||
|
|
4ed02a44ac | ||
|
|
6f3b28d7b0 | ||
|
|
78a780f5c4 | ||
|
|
914b270d5e | ||
|
|
d84fec2c02 | ||
|
|
d50f57abb1 | ||
|
|
c56584d236 | ||
|
|
96d4f50b74 | ||
|
|
d5200f78b6 | ||
|
|
575cf4ff28 | ||
|
|
d8bcd9c32d | ||
|
|
d33d0ea3e3 | ||
|
|
c491731322 | ||
|
|
a6f942a99f | ||
|
|
30e97eaaaa | ||
|
|
8039d656af | ||
|
|
f071e420bd | ||
|
|
bca2b35d49 | ||
|
|
099fe24f8a | ||
|
|
5dcbf946f6 | ||
|
|
6ee9772eca | ||
|
|
588c8c8fc7 | ||
|
|
02ad6c51af | ||
|
|
d9210a7aa1 | ||
|
|
2cac48cf2b | ||
|
|
304ce9ef77 | ||
|
|
8b5004dda4 | ||
|
|
f86be307ae | ||
|
|
6c7d64b4de | ||
|
|
05a1beebaf | ||
|
|
9c4517957a | ||
|
|
ed80f5109c | ||
|
|
0c2a5f0c5e | ||
|
|
e5885dfd02 | ||
|
|
e098fffea8 | ||
|
|
5f90bee90e | ||
|
|
117614362f | ||
|
|
0a5f08ecb0 | ||
|
|
3ac33728ec | ||
|
|
145c4462f7 | ||
|
|
99a79b62e1 | ||
|
|
c3b0f2fea6 | ||
|
|
9ee281bfba | ||
|
|
df51418753 | ||
|
|
97f6808e12 | ||
|
|
9c85bcd2d0 | ||
|
|
5493667a6c | ||
|
|
bdbc5682db | ||
|
|
b5db89661a | ||
|
|
df3d3bc7d3 | ||
|
|
874b51234e | ||
|
|
b3e0c1e6d1 | ||
|
|
701d867f1b | ||
|
|
7c38c08592 | ||
|
|
ec8d0de8f1 | ||
|
|
a8a7b7fd64 | ||
|
|
0cee5c3d05 | ||
|
|
0e19f96c0b | ||
|
|
01ca8f9529 | ||
|
|
235d340b10 | ||
|
|
473d88fdb7 | ||
|
|
0d6df6a308 | ||
|
|
df673feda2 | ||
|
|
7e2cb7c77e | ||
|
|
0cf3e0ba34 | ||
|
|
eecaff583a | ||
|
|
62a79c103a | ||
|
|
6cc6ad8495 | ||
|
|
1822fe87f7 | ||
|
|
ca4760f340 | ||
|
|
f685931d76 | ||
|
|
12be040ee8 | ||
|
|
b0f23efa90 | ||
|
|
73fa3e79b8 | ||
|
|
641c5dd51a | ||
|
|
22626873e3 | ||
|
|
353cf8fa99 | ||
|
|
94717cbe59 | ||
|
|
28fcffb5c5 | ||
|
|
a18160ae4b | ||
|
|
01ee2fca0e | ||
|
|
5bd9d56190 | ||
|
|
d90684689a | ||
|
|
f9f9a21e71 | ||
|
|
932d2d93b2 | ||
|
|
2ca5c4c10c | ||
|
|
cbd518836b | ||
|
|
076657bf96 | ||
|
|
88d26451a9 | ||
|
|
70a6287e09 | ||
|
|
e52c879215 | ||
|
|
2ef711daf4 | ||
|
|
bc64f4b99e | ||
|
|
c8ca46fdbe | ||
|
|
4e6820ca0d | ||
|
|
0a59b836c0 | ||
|
|
75009450e7 | ||
|
|
58dd96bdea | ||
|
|
fa998abfbc | ||
|
|
dbca80b0b3 | ||
|
|
35ef6a4fd5 | ||
|
|
266ba6ea99 | ||
|
|
e07edea5bf | ||
|
|
495534c6d0 | ||
|
|
85cffe7063 | ||
|
|
00dab1b88c | ||
|
|
da96b1120c | ||
|
|
415ec9e91b | ||
|
|
275fd078e2 | ||
|
|
38e3861e85 | ||
|
|
f83bd20fa9 | ||
|
|
ff48e97262 | ||
|
|
8e3d5ccd17 | ||
|
|
4301bb64c6 | ||
|
|
7f4895465d | ||
|
|
28a5552d96 | ||
|
|
ac5b545ce4 | ||
|
|
6ca5ad6441 | ||
|
|
3f4b750288 | ||
|
|
3eec1cf2f7 | ||
|
|
c0ae6b75e4 | ||
|
|
eb469bd1da | ||
|
|
e4590b4898 | ||
|
|
3b0b5228fe | ||
|
|
27c4a005de | ||
|
|
bdc7623216 | ||
|
|
e0d40e29a3 | ||
|
|
a90b5d8324 | ||
|
|
36f6500aa3 | ||
|
|
18c61a8193 | ||
|
|
59ca1caf7d | ||
|
|
8f84b023aa | ||
|
|
79c30b7eee | ||
|
|
4baad878ac | ||
|
|
f6f51d79cc | ||
|
|
ac0a640fe0 | ||
|
|
1d55d34bba | ||
|
|
ea81fceb40 | ||
|
|
274ef0e532 | ||
|
|
82d7b0eefb | ||
|
|
37f63f6963 | ||
|
|
e28b42d40d | ||
|
|
49fd86d707 | ||
|
|
35e63bd9e7 | ||
|
|
732d8b5e26 | ||
|
|
e705fb7598 | ||
|
|
b3716dc20b | ||
|
|
91241ceea1 | ||
|
|
e071c2fdcd | ||
|
|
450a72792f | ||
|
|
66d12b6d2d | ||
|
|
ba1219f78b | ||
|
|
658d77c15f | ||
|
|
16faeb05fe | ||
|
|
b1eae70cae | ||
|
|
25cf88d0f8 | ||
|
|
9677981344 | ||
|
|
3cc379d0bf | ||
|
|
37cc900a8e | ||
|
|
c508fb9ff0 | ||
|
|
5ff34f5eb4 | ||
|
|
67f04532be | ||
|
|
ac13bcb43e | ||
|
|
7a5d66c792 | ||
|
|
02c5fd688f | ||
|
|
b3e6d6a835 | ||
|
|
4013ac8c8f | ||
|
|
b8cdb3d94e | ||
|
|
ad813701c5 | ||
|
|
c42ac7e650 | ||
|
|
f783509e33 | ||
|
|
2b9559b4a9 | ||
|
|
258cea0b81 | ||
|
|
d751ff2c19 | ||
|
|
7253406177 | ||
|
|
f56a82b800 | ||
|
|
52af8d487e | ||
|
|
d57629d90f | ||
|
|
ba89941fce | ||
|
|
578a1670f4 | ||
|
|
a03502646c | ||
|
|
4a5fc817fb | ||
|
|
1ba0c7501e | ||
|
|
00c875b893 | ||
|
|
86c19ee4a3 | ||
|
|
e0ac97c109 | ||
|
|
ecf316d671 | ||
|
|
c2555d071d | ||
|
|
afde8bebe7 | ||
|
|
93c5157b1e | ||
|
|
dcbdd9957e | ||
|
|
18af617c74 | ||
|
|
6c3814f014 | ||
|
|
535f3dbbad | ||
|
|
e01feca025 | ||
|
|
2b6865b0bd | ||
|
|
521f09f79f | ||
|
|
82e0a2f7da | ||
|
|
24ed198960 | ||
|
|
78ca7e48d1 | ||
|
|
deeb7f9475 | ||
|
|
518ed623e2 | ||
|
|
2996cd7d28 | ||
|
|
0fe1d350e6 | ||
|
|
6b1908227f | ||
|
|
ef3166143a | ||
|
|
4144d929e7 | ||
|
|
92555c36ce | ||
|
|
9a6f0a12c8 | ||
|
|
3b576be5f0 | ||
|
|
ed812281bc | ||
|
|
4df59cc345 | ||
|
|
c1649d6e65 | ||
|
|
161892a54e | ||
|
|
fe71fc31c4 | ||
|
|
9aa027dcfb | ||
|
|
4a4a9fb1de | ||
|
|
b4257bfda8 | ||
|
|
cc0e19c6bd | ||
|
|
a5278f3b78 | ||
|
|
c3c035a7d7 | ||
|
|
0b71b0b493 | ||
|
|
5b26405c06 | ||
|
|
183528cf72 | ||
|
|
c7ea132f07 | ||
|
|
468b9e881b | ||
|
|
f54a751a9d | ||
|
|
32d9a1549d | ||
|
|
9ad29733bf | ||
|
|
be505da8ac | ||
|
|
9c758a8d85 | ||
|
|
d49fee2a29 | ||
|
|
7ab37b21a5 | ||
|
|
dba9b60800 | ||
|
|
ae828f76a3 | ||
|
|
304691c197 | ||
|
|
85a7b34d92 | ||
|
|
ad5d9be566 | ||
|
|
e82bd8b744 | ||
|
|
23d4d30d33 | ||
|
|
381ee59b9e | ||
|
|
4cbe81e971 | ||
|
|
5864c0f5fd | ||
|
|
37cb47aea5 | ||
|
|
ab6ed3037e | ||
|
|
bf95e6016f | ||
|
|
22649b66a6 | ||
|
|
65fafe9c58 | ||
|
|
886dec1174 | ||
|
|
ae7b8d59f2 | ||
|
|
e8e098f9b1 | ||
|
|
1ae37fea1b | ||
|
|
e5e9f5ebbc | ||
|
|
657e88d07e | ||
|
|
19cb905d5a | ||
|
|
c4ada25fe7 | ||
|
|
8315f4a2d4 | ||
|
|
9967edcb35 | ||
|
|
91ef01cbc0 | ||
|
|
447ec2c3ab | ||
|
|
e29b0be9fd | ||
|
|
dab41fe6e1 | ||
|
|
c14dab4c8d | ||
|
|
01d82010ed | ||
|
|
e4c7282b92 | ||
|
|
7fc4165b53 | ||
|
|
01d38d04ba | ||
|
|
071963ec5a | ||
|
|
856d87a9b2 | ||
|
|
8b6b9974c7 | ||
|
|
164bba2faf | ||
|
|
a77058de61 | ||
|
|
e39d364874 | ||
|
|
42beea23b6 | ||
|
|
e13796e4f3 | ||
|
|
5cc1821e12 | ||
|
|
d8d3b0b4c7 | ||
|
|
c22ad0f204 | ||
|
|
3de82f210a | ||
|
|
bd17f06708 | ||
|
|
60c0e58c64 | ||
|
|
04480fc8eb | ||
|
|
4be8a788b0 | ||
|
|
c391eaf545 | ||
|
|
c2d35ee599 | ||
|
|
9e38eeeb16 | ||
|
|
82f171e99a | ||
|
|
e6e38adebe | ||
|
|
c5bbc81cab | ||
|
|
e38a34384a | ||
|
|
570161efbd | ||
|
|
64feb7fdf7 | ||
|
|
8d3027d100 | ||
|
|
32290a7cd0 | ||
|
|
9dde221c07 | ||
|
|
f95018e809 | ||
|
|
ca9e5d83bf | ||
|
|
770a3a1626 | ||
|
|
f53f11b4da | ||
|
|
f698ba1f39 | ||
|
|
70d66f6455 | ||
|
|
8234f189a0 | ||
|
|
03ef8f310d | ||
|
|
ceafa313cd | ||
|
|
44fe392912 | ||
|
|
6cbd26531c | ||
|
|
1cb487b9a3 | ||
|
|
093a9b1ebd | ||
|
|
65aec76e06 | ||
|
|
4fefa4f9b6 | ||
|
|
e08d7256a7 | ||
|
|
1fa4307b62 | ||
|
|
5d9973371b | ||
|
|
9d462263b9 | ||
|
|
96e4296256 | ||
|
|
487ba61a42 | ||
|
|
023a1ed72f | ||
|
|
a0e9e59e0f | ||
|
|
5ce13990b6 | ||
|
|
9ba1961a0c | ||
|
|
531d3b0502 | ||
|
|
5223f7263c | ||
|
|
7cf59abb9e | ||
|
|
0a11946006 | ||
|
|
425853a3f9 | ||
|
|
2bdae52228 | ||
|
|
b2a50b7f05 | ||
|
|
46594040e9 | ||
|
|
c203b7c3fb | ||
|
|
a672a5c0f9 | ||
|
|
3aea684f0a | ||
|
|
c6706d436a | ||
|
|
76fa3e86f9 | ||
|
|
586ab88d02 | ||
|
|
8df353f8ac | ||
|
|
8626692ed7 | ||
|
|
3592641bf7 | ||
|
|
8d6d258928 | ||
|
|
f8933cf445 | ||
|
|
fc84426c49 | ||
|
|
90512ee28e | ||
|
|
54267a4d6f | ||
|
|
20ae688f05 | ||
|
|
a8b9b9426a | ||
|
|
42b7625715 | ||
|
|
75a8ed2318 | ||
|
|
5acb2ac11e | ||
|
|
443cbba7be | ||
|
|
78a7632583 | ||
|
|
84f2315e27 | ||
|
|
7bd77a5ce1 | ||
|
|
cd13be84fc | ||
|
|
a0e45f7809 | ||
|
|
326d9f9adf | ||
|
|
c7a8076438 | ||
|
|
90290d30db | ||
|
|
6565ec4009 | ||
|
|
36a0df3c7d | ||
|
|
b9d21084f0 | ||
|
|
06d2154434 | ||
|
|
62bb9f8721 | ||
|
|
14005d6c63 | ||
|
|
f3e07e1531 | ||
|
|
74eabd2af9 | ||
|
|
579fbe90c8 | ||
|
|
07673d0ae6 | ||
|
|
c1e09008d6 | ||
|
|
8be5c9e987 | ||
|
|
44e16c77a8 | ||
|
|
6046ad3dac | ||
|
|
ec18360958 | ||
|
|
6ffd74b9dd | ||
|
|
f1b34bdb57 | ||
|
|
467808a6a7 | ||
|
|
141ff8887f | ||
|
|
44ba7a5cc4 | ||
|
|
3def2a935d | ||
|
|
cb1309bb09 | ||
|
|
7e22a64238 | ||
|
|
64c3c15af4 | ||
|
|
8d7fa1557f | ||
|
|
ff07a77133 | ||
|
|
6a15acb310 | ||
|
|
1dd3096f37 | ||
|
|
e60da6b545 | ||
|
|
b50647f101 | ||
|
|
0fe01a85c4 | ||
|
|
5a258d6522 | ||
|
|
24ae3a9c49 | ||
|
|
9878cfc012 | ||
|
|
36ab9764ac | ||
|
|
3ece0d5ba0 | ||
|
|
809b047025 | ||
|
|
34e24a7f81 | ||
|
|
0933726e90 | ||
|
|
86d362725d | ||
|
|
d70a69c4f7 | ||
|
|
96b00e7942 | ||
|
|
72e13be935 | ||
|
|
6d7c55382b | ||
|
|
7b9aa42a52 | ||
|
|
3e12354bba | ||
|
|
15512b5073 | ||
|
|
ec2f8f31ec | ||
|
|
d1a4d145c0 | ||
|
|
037059f59d | ||
|
|
ba2c777772 | ||
|
|
0b099806a7 | ||
|
|
bf408ae9aa | ||
|
|
8f03439b7e | ||
|
|
bb118a5ae8 | ||
|
|
32a8e89420 | ||
|
|
3f7ca1d915 | ||
|
|
2dd44178fa | ||
|
|
fa8eb4f34d | ||
|
|
335f64cc22 | ||
|
|
c9fed0c609 | ||
|
|
e45e8d3f00 | ||
|
|
3dba261ae7 | ||
|
|
2665923bb0 | ||
|
|
8e1c56adf5 | ||
|
|
6ddc62857d | ||
|
|
e91cbf8438 | ||
|
|
e272b12755 | ||
|
|
427c9d2036 | ||
|
|
e9240a0114 | ||
|
|
802bb3a757 | ||
|
|
f5c2a331b0 | ||
|
|
7f407f9691 | ||
|
|
4dd77a24ab | ||
|
|
ec5a3b6e5e | ||
|
|
5415d48a53 | ||
|
|
907a4ec516 | ||
|
|
d2fe0e4bef | ||
|
|
8c662380a4 | ||
|
|
b2c18d5e20 | ||
|
|
2567d0977d | ||
|
|
4832b845a0 | ||
|
|
e93af55c41 | ||
|
|
072f4a3cf9 |
64
.ci/azure-pipelines.yml
Normal file
64
.ci/azure-pipelines.yml
Normal file
@@ -0,0 +1,64 @@
|
||||
trigger:
|
||||
batch: true
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- release-*
|
||||
tags:
|
||||
include:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
- job: main_build
|
||||
displayName: 'Main Build'
|
||||
|
||||
dependsOn: lint
|
||||
condition: succeeded()
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
|
||||
steps:
|
||||
- task: NodeTool@0
|
||||
displayName: 'Install Node.js'
|
||||
inputs:
|
||||
versionSpec: '10.x'
|
||||
|
||||
- script: |
|
||||
yarn install
|
||||
displayName: 'Install dependencies'
|
||||
|
||||
- script: |
|
||||
test -d dist
|
||||
displayName: 'Check dist directory'
|
||||
|
||||
- script: |
|
||||
yarn pack --filename jellyfin-web.tgz
|
||||
displayName: 'Build package'
|
||||
|
||||
- task: PublishPipelineArtifact@1
|
||||
displayName: 'Publish package'
|
||||
condition: succeeded()
|
||||
inputs:
|
||||
targetPath: '$(Build.SourcesDirectory)/jellyfin-web.tgz'
|
||||
artifactName: 'jellyfin-web'
|
||||
|
||||
- job: lint
|
||||
displayName: 'Lint'
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
|
||||
steps:
|
||||
- task: NodeTool@0
|
||||
displayName: 'Install Node.js'
|
||||
inputs:
|
||||
versionSpec: '10.x'
|
||||
|
||||
- script: |
|
||||
yarn install
|
||||
displayName: 'Install dependencies'
|
||||
|
||||
- script: |
|
||||
yarn run lint
|
||||
displayName: 'Run ESLint'
|
||||
9
.editorconfig
Normal file
9
.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
end_of_line = lf
|
||||
4
.eslintrc.yml
Normal file
4
.eslintrc.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
env:
|
||||
es6: true
|
||||
browser: true
|
||||
amd: true
|
||||
35
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
35
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a bug report
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
**To Reproduce**
|
||||
<!-- Steps to reproduce the behavior: -->
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
**Logs**
|
||||
<!-- Please paste any log errors. -->
|
||||
|
||||
**Screenshots**
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
**System (please complete the following information):**
|
||||
- OS: [e.g. Docker, Debian, Windows]
|
||||
- Browser: [e.g. Firefox, Chrome, Safari]
|
||||
- Jellyfin Version: [e.g. 10.0.1]
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context about the problem here. -->
|
||||
11
.github/pull_request_template.md
vendored
Normal file
11
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<!--
|
||||
Ensure your title is short, descriptive, and in the imperative mood (Fix X, Change Y, instead of Fixed X, Changed Y).
|
||||
For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our https://docs.jellyfin.org/general/contributing/issues.html page.
|
||||
-->
|
||||
|
||||
**Changes**
|
||||
<!-- Describe your changes here in 1-5 sentences. -->
|
||||
|
||||
**Issues**
|
||||
<!-- Tag any issues that this PR solves here.
|
||||
ex. Fixes # -->
|
||||
19
.github/stale.yml
vendored
Normal file
19
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 90
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 14
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- regression
|
||||
- future
|
||||
- feature
|
||||
- enhancement
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
Issues go stale after 90d of inactivity. Mark the issue as fresh by adding a comment or commit. Stale issues close after an additional 14d of inactivity.
|
||||
If this issue is safe to close now please do so.
|
||||
If you have any questions you can reach us on [Matrix or Social Media](https://docs.jellyfin.org/general/getting-help.html).
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -570,3 +570,6 @@ ASALocalRun/
|
||||
healthchecksdb
|
||||
|
||||
# End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode
|
||||
|
||||
# dist for webpack output
|
||||
dist
|
||||
9
.npmignore
Normal file
9
.npmignore
Normal file
@@ -0,0 +1,9 @@
|
||||
.editorconfig
|
||||
.ci
|
||||
.gitattributes
|
||||
.github
|
||||
.eslintrc.yml
|
||||
run-eslint.sh
|
||||
webpack.config.js
|
||||
yarn.lock
|
||||
src
|
||||
@@ -19,7 +19,19 @@
|
||||
- [nkmerrill](https://github.com/nkmerrill)
|
||||
- [TtheCreator](https://github.com/Tthecreator)
|
||||
- [RazeLighter777](https://github.com/RazeLighter777)
|
||||
- [anthonylavado](https://github.com/anthonylavado)
|
||||
- [LogicalPhallacy](https://github.com/LogicalPhallacy)
|
||||
- [thornbill](https://github.com/thornbill)
|
||||
- [redSpoutnik](https://github.com/redSpoutnik)
|
||||
- [DrPandemic](https://github.com/drpandemic)
|
||||
- [Oddstr13](https://github.com/oddstr13)
|
||||
- [petermcneil](https://github.com/petermcneil)
|
||||
- [lewazo](https://github.com/lewazo)
|
||||
- [Raghu Saxena](https://github.com/ckcr4lyf)
|
||||
- [Nickbert7](https://github.com/Nickbert7)
|
||||
- [ferferga](https://github.com/ferferga)
|
||||
- [bilde2910](https://github.com/bilde2910)
|
||||
- [Daniel Hartung](https://github.com/dhartung)
|
||||
- [Ryan Hartzell](https://github.com/ryan-hartzell)
|
||||
|
||||
# Emby Contributors
|
||||
|
||||
|
||||
12
README.md
12
README.md
@@ -1,7 +1,15 @@
|
||||
<h1 align="center">Jellyfin Web UI</h1>
|
||||
<h1 align="center">Jellyfin Web</h1>
|
||||
<h3 align="center">The Free Software Media System</h3>
|
||||
|
||||
---
|
||||
|
||||
<p align="center">
|
||||
Jellyfin is a free software media system that puts you in control of managing and streaming your media.
|
||||
<img alt="Logo Banner" src="https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG/banner-logo-solid.svg?sanitize=true"/>
|
||||
<br/><br/>
|
||||
<a href="https://github.com/jellyfin/jellyfin-web"><img alt="GPL 2.0 License" src="https://img.shields.io/github/license/jellyfin/jellyfin-web.svg"/></a>
|
||||
<a href="https://github.com/jellyfin/jellyfin-web/releases"><img alt="Current Release" src="https://img.shields.io/github/release/jellyfin/jellyfin-web.svg"/></a>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
Jellyfin is a free software media system that puts you in control of managing and streaming your media.
|
||||
|
||||
35
package.json
Normal file
35
package.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "jellyfin-web",
|
||||
"version": "0.0.0",
|
||||
"description": "Web interface for Jellyfin",
|
||||
"repository": "https://github.com/jellyfin/jellyfin-web",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"devDependencies": {
|
||||
"copy-webpack-plugin": "^5.0.3",
|
||||
"css-loader": "^2.1.0",
|
||||
"eslint": "^5.16.0",
|
||||
"file-loader": "^3.0.1",
|
||||
"style-loader": "^0.23.1",
|
||||
"webpack": "^4.41.0",
|
||||
"webpack-cli": "^3.3.9",
|
||||
"webpack-dev-server": "^3.8.1",
|
||||
"webpack-merge": "^4.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"flv.js": "^1.5.0",
|
||||
"hls.js": "^0.12.4",
|
||||
"howler": "^2.1.2",
|
||||
"jquery": "^3.4.1",
|
||||
"jstree": "^3.3.7",
|
||||
"libjass": "^0.11.0",
|
||||
"shaka-player": "^2.5.5",
|
||||
"sortablejs": "^1.9.0",
|
||||
"swiper": "^3.4.2"
|
||||
},
|
||||
"scripts": {
|
||||
"serve": "webpack-dev-server --config webpack.dev.js --open",
|
||||
"build": "webpack --config webpack.prod.js",
|
||||
"lint": "eslint \"src\"",
|
||||
"prepare": "webpack --config webpack.prod.js"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
<div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true" data-require="emby-select,emby-collapse,emby-linkbutton">
|
||||
<div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true">
|
||||
|
||||
<div>
|
||||
<div class="content-primary">
|
||||
@@ -8,7 +8,7 @@
|
||||
<div class="verticalSection">
|
||||
<div class="sectionTitleContainer flex align-items-center">
|
||||
<h1 class="sectionTitle pluginName"></h1>
|
||||
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Plugins">${Help}</a>
|
||||
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/plugins/index.html">${Help}</a>
|
||||
</div>
|
||||
|
||||
<p id="tagline" style="font-style: italic;"></p>
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
<div data-role="page" class="page standalonePage">
|
||||
<div class="padded-left padded-right padded-bottom-page">
|
||||
<form class="manualServerForm" style="margin: 0 auto;">
|
||||
<h1 style="text-align: left;">${HeaderConnectToServer}</h1>
|
||||
<form class="addServerForm" style="margin: 0 auto;">
|
||||
<h1>${HeaderConnectToServer}</h1>
|
||||
<div class="inputContainer">
|
||||
<input is="emby-input" type="text" id="txtServerHost" required="required" label="${LabelServerHost}" />
|
||||
<div class="fieldDescription" style="text-align: left;">${LabelServerHostHelp}</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="inputContainer">
|
||||
<input is="emby-input" type="number" id="txtServerPort" step="1" min="0" value="8096" label="${LabelServerPort}" />
|
||||
<input is="emby-input" type="text" id="txtServerHost" required="required" label="${LabelServerHost}" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off" />
|
||||
<div class="fieldDescription">${LabelServerHostHelp}</div>
|
||||
</div>
|
||||
<br />
|
||||
<button is="emby-button" type="submit" class="raised button-submit block">
|
||||
<span>${ButtonConnect}</span>
|
||||
</button>
|
||||
<button is="emby-button" type="button" class="raised button-cancel block btnCancelManualServer">
|
||||
<button is="emby-button" type="button" class="raised button-cancel block btnCancel">
|
||||
<span>${ButtonCancel}</span>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<div id="serverSecurityPage" data-role="page" class="page type-interior advancedConfigurationPage withTabs fullWidthContent" data-require="scripts/serversecurity,detailtablecss,emby-button">
|
||||
<div id="apiKeysPage" data-role="page" class="page type-interior advancedConfigurationPage fullWidthContent">
|
||||
<div>
|
||||
<div class="content-primary">
|
||||
<div class="detailSectionHeader">
|
||||
@@ -1,21 +0,0 @@
|
||||
<div id="appServicesPage" data-role="page" class="page type-interior appServicesPage withTabs fullWidthContent" data-require="scripts/appservices">
|
||||
|
||||
<div>
|
||||
<div class="content-primary">
|
||||
|
||||
<div class="verticalSection">
|
||||
|
||||
<div class="sectionTitleContainer sectionTitleContainer-cards flex align-items-center">
|
||||
<h2 class="sectionTitle sectionTitle-cards">${HeaderInstalledServices}</h2>
|
||||
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Plugins">${Help}</a>
|
||||
</div>
|
||||
|
||||
<div class="installedPlugins"></div>
|
||||
</div>
|
||||
<div class="verticalSection">
|
||||
<h2 class="sectionTitle sectionTitle-cards">${HeaderAvailableServices}</h2>
|
||||
<div class="catalog"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
8
src/availableplugins.html
Normal file
8
src/availableplugins.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<div id="pluginCatalogPage" data-role="page" class="page type-interior pluginConfigurationPage withTabs fullWidthContent">
|
||||
<div>
|
||||
<div class="content-primary">
|
||||
<div id="noPlugins" class="hide">${MessageNoAvailablePlugins}</div>
|
||||
<div id="pluginTiles" style="text-align:left;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
139
src/bower_components/Sortable/Sortable.html
vendored
139
src/bower_components/Sortable/Sortable.html
vendored
@@ -1,139 +0,0 @@
|
||||
<link rel="import" href="../polymer/polymer.html">
|
||||
<script src="./Sortable.js"></script>
|
||||
|
||||
<dom-module id="sortable-js">
|
||||
<template>
|
||||
<content></content>
|
||||
</template>
|
||||
</dom-module>
|
||||
<script>
|
||||
Polymer({
|
||||
is: "sortable-js",
|
||||
|
||||
properties: {
|
||||
group : { type: String, value: () => Math.random(), observer: "groupChanged" },
|
||||
sort : { type: Boolean, value: true, observer: "sortChanged" },
|
||||
disabled : { type: Boolean, value: false, observer: "disabledChanged" },
|
||||
store : { type: Object, value: null, observer: "storeChanged" },
|
||||
handle : { type: String, value: null, observer: "handleChanged" },
|
||||
scrollSensitivity : { type: Number, value: 30, observer: "scrollSensitivityChanged" },
|
||||
scrollSpeed : { type: Number, value: 10, observer: "scrollSpeedChanged" },
|
||||
ghostClass : { type: String, value: "sortable-ghost", observer: "ghostClassChanged" },
|
||||
chosenClass : { type: String, value: "sortable-chosen", observer: "chosenClassChanged" },
|
||||
ignore : { type: String, value: "a, img", observer: "ignoreChanged" },
|
||||
filter : { type: Object, value: null, observer: "filterChanged" },
|
||||
animation : { type: Number, value: 0, observer: "animationChanged" },
|
||||
dropBubble : { type: Boolean, value: false, observer: "dropBubbleChanged" },
|
||||
dragoverBubble : { type: Boolean, value: false, observer: "dragoverBubbleChanged" },
|
||||
dataIdAttr : { type: String, value: "data-id", observer: "dataIdAttrChanged" },
|
||||
delay : { type: Number, value: 0, observer: "delayChanged" },
|
||||
forceFallback : { type: Boolean, value: false, observer: "forceFallbackChanged" },
|
||||
fallbackClass : { type: String, value: "sortable-fallback", observer: "fallbackClassChanged" },
|
||||
fallbackOnBody : { type: Boolean, value: false, observer: "fallbackOnBodyChanged" },
|
||||
draggable : {},
|
||||
scroll : {}
|
||||
},
|
||||
|
||||
created() {
|
||||
// override default DOM property behavior
|
||||
Object.defineProperties(this, {
|
||||
draggable: { get() { return this._draggable || this.getAttribute("draggable") || ">*"}, set(value) { this._draggable = value; this.draggableChanged(value)} },
|
||||
scroll: { get() { return this._scroll || JSON.parse(this.getAttribute("scroll") || "true") }, set(value) { this._scroll = value; this.scrollChanged(value)} }
|
||||
})
|
||||
},
|
||||
|
||||
attached: function() {
|
||||
// Given
|
||||
// <sortable-js>
|
||||
// <template is="dom-repeat" items={{data}}>
|
||||
// <div>
|
||||
// <template is="dom-if" if="true">
|
||||
// <span>hello</span></template></div>
|
||||
// After render, it becomes
|
||||
// <sortable-js>
|
||||
// <div>
|
||||
// <span>hello</span>
|
||||
// <template is="dom-if">
|
||||
// <tempalte is="dom-repeat">
|
||||
var templates = this.querySelectorAll("template[is='dom-repeat']")
|
||||
var template = templates[templates.length-1]
|
||||
|
||||
var options = {}
|
||||
Object.keys(this.properties).forEach(key => {
|
||||
options[key] = this[key]
|
||||
})
|
||||
|
||||
this.sortable = Sortable.create(this, Object.assign(options, {
|
||||
onUpdate: e => {
|
||||
if (template) {
|
||||
template.splice("items", e.newIndex, 0, template.splice("items", e.oldIndex, 1)[0])
|
||||
}
|
||||
this.fire("update", e)
|
||||
},
|
||||
|
||||
onAdd: e => {
|
||||
if (template) {
|
||||
var froms = e.from.querySelectorAll("template[is='dom-repeat']")
|
||||
var from = froms[froms.length-1]
|
||||
var item = from.items[e.oldIndex]
|
||||
template.splice("items", e.newIndex, 0, item)
|
||||
}
|
||||
this.fire("add", e)
|
||||
},
|
||||
|
||||
onRemove: e => {
|
||||
if (template) {
|
||||
template.splice("items", e.oldIndex, 1)[0]
|
||||
}
|
||||
this.fire("remove", e)
|
||||
},
|
||||
|
||||
onStart: e => {
|
||||
this.fire("start", e)
|
||||
},
|
||||
|
||||
onEnd: e => {
|
||||
this.fire("end", e)
|
||||
},
|
||||
|
||||
onSort: e => {
|
||||
this.fire("sort", e)
|
||||
},
|
||||
|
||||
onFilter: e => {
|
||||
this.fire("filter", e)
|
||||
},
|
||||
|
||||
onMove: e => {
|
||||
this.fire("move", e)
|
||||
}
|
||||
}))
|
||||
},
|
||||
|
||||
detached: function() {
|
||||
this.sortable.destroy()
|
||||
},
|
||||
|
||||
groupChanged : function(value) { this.sortable && this.sortable.option("group", value) },
|
||||
sortChanged : function(value) { this.sortable && this.sortable.option("sort", value) },
|
||||
disabledChanged : function(value) { this.sortable && this.sortable.option("disabled", value) },
|
||||
storeChanged : function(value) { this.sortable && this.sortable.option("store", value) },
|
||||
handleChanged : function(value) { this.sortable && this.sortable.option("handle", value) },
|
||||
scrollChanged : function(value) { this.sortable && this.sortable.option("scroll", value) },
|
||||
scrollSensitivityChanged : function(value) { this.sortable && this.sortable.option("scrollSensitivity", value) },
|
||||
scrollSpeedChanged : function(value) { this.sortable && this.sortable.option("scrollSpeed", value) },
|
||||
draggableChanged : function(value) { this.sortable && this.sortable.option("draggable", value) },
|
||||
ghostClassChanged : function(value) { this.sortable && this.sortable.option("ghostClass", value) },
|
||||
chosenClassChanged : function(value) { this.sortable && this.sortable.option("chosenClass", value) },
|
||||
ignoreChanged : function(value) { this.sortable && this.sortable.option("ignore", value) },
|
||||
filterChanged : function(value) { this.sortable && this.sortable.option("filter", value) },
|
||||
animationChanged : function(value) { this.sortable && this.sortable.option("animation", value) },
|
||||
dropBubbleChanged : function(value) { this.sortable && this.sortable.option("dropBubble", value) },
|
||||
dragoverBubbleChanged : function(value) { this.sortable && this.sortable.option("dragoverBubble", value) },
|
||||
dataIdAttrChanged : function(value) { this.sortable && this.sortable.option("dataIdAttr", value) },
|
||||
delayChanged : function(value) { this.sortable && this.sortable.option("delay", value) },
|
||||
forceFallbackChanged : function(value) { this.sortable && this.sortable.option("forceFallback", value) },
|
||||
fallbackClassChanged : function(value) { this.sortable && this.sortable.option("fallbackClass", value) },
|
||||
fallbackOnBodyChanged : function(value) { this.sortable && this.sortable.option("fallbackOnBody", value) }
|
||||
})
|
||||
</script>
|
||||
393
src/bower_components/Sortable/Sortable.min.js
vendored
393
src/bower_components/Sortable/Sortable.min.js
vendored
@@ -1,393 +0,0 @@
|
||||
/*! Sortable 1.4.2 - MIT | git://github.com/rubaxa/Sortable.git */ ! function(a) {
|
||||
"use strict";
|
||||
"function" == typeof define && define.amd ? define(a) : "undefined" != typeof module && "undefined" != typeof module.exports ? module.exports = a() : "undefined" != typeof Package ? Sortable = a() : window.Sortable = a()
|
||||
}(function() {
|
||||
"use strict";
|
||||
|
||||
function a(a, b) {
|
||||
if (!a || !a.nodeType || 1 !== a.nodeType) throw "Sortable: `el` must be HTMLElement, and not " + {}.toString.call(a);
|
||||
this.el = a, this.options = b = r({}, b), a[L] = this;
|
||||
var c = {
|
||||
group: Math.random(),
|
||||
sort: !0,
|
||||
disabled: !1,
|
||||
store: null,
|
||||
handle: null,
|
||||
scroll: !0,
|
||||
scrollSensitivity: 30,
|
||||
scrollSpeed: 10,
|
||||
draggable: /[uo]l/i.test(a.nodeName) ? "li" : ">*",
|
||||
ghostClass: "sortable-ghost",
|
||||
chosenClass: "sortable-chosen",
|
||||
ignore: "a, img",
|
||||
filter: null,
|
||||
animation: 0,
|
||||
setData: function(a, b) {
|
||||
a.setData("Text", b.textContent)
|
||||
},
|
||||
dropBubble: !1,
|
||||
dragoverBubble: !1,
|
||||
dataIdAttr: "data-id",
|
||||
delay: 0,
|
||||
forceFallback: !1,
|
||||
fallbackClass: "sortable-fallback",
|
||||
fallbackOnBody: !1
|
||||
};
|
||||
for (var d in c) !(d in b) && (b[d] = c[d]);
|
||||
V(b);
|
||||
for (var f in this) "_" === f.charAt(0) && (this[f] = this[f].bind(this));
|
||||
this.nativeDraggable = b.forceFallback ? !1 : P, e(a, "mousedown", this._onTapStart), e(a, "touchstart", this._onTapStart), this.nativeDraggable && (e(a, "dragover", this), e(a, "dragenter", this)), T.push(this._onDragOver), b.store && this.sort(b.store.get(this))
|
||||
}
|
||||
|
||||
function b(a) {
|
||||
v && v.state !== a && (h(v, "display", a ? "none" : ""), !a && v.state && w.insertBefore(v, s), v.state = a)
|
||||
}
|
||||
|
||||
function c(a, b, c) {
|
||||
if (a) {
|
||||
c = c || N, b = b.split(".");
|
||||
var d = b.shift().toUpperCase(),
|
||||
e = new RegExp("\\s(" + b.join("|") + ")(?=\\s)", "g");
|
||||
do
|
||||
if (">*" === d && a.parentNode === c || ("" === d || a.nodeName.toUpperCase() == d) && (!b.length || ((" " + a.className + " ").match(e) || []).length == b.length)) return a; while (a !== c && (a = a.parentNode))
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function d(a) {
|
||||
a.dataTransfer && (a.dataTransfer.dropEffect = "move"), a.preventDefault()
|
||||
}
|
||||
|
||||
function e(a, b, c) {
|
||||
a.addEventListener(b, c, !1)
|
||||
}
|
||||
|
||||
function f(a, b, c) {
|
||||
a.removeEventListener(b, c, !1)
|
||||
}
|
||||
|
||||
function g(a, b, c) {
|
||||
if (a)
|
||||
if (a.classList) a.classList[c ? "add" : "remove"](b);
|
||||
else {
|
||||
var d = (" " + a.className + " ").replace(K, " ").replace(" " + b + " ", " ");
|
||||
a.className = (d + (c ? " " + b : "")).replace(K, " ")
|
||||
}
|
||||
}
|
||||
|
||||
function h(a, b, c) {
|
||||
var d = a && a.style;
|
||||
if (d) {
|
||||
if (void 0 === c) return N.defaultView && N.defaultView.getComputedStyle ? c = N.defaultView.getComputedStyle(a, "") : a.currentStyle && (c = a.currentStyle), void 0 === b ? c : c[b];
|
||||
b in d || (b = "-webkit-" + b), d[b] = c + ("string" == typeof c ? "" : "px")
|
||||
}
|
||||
}
|
||||
|
||||
function i(a, b, c) {
|
||||
if (a) {
|
||||
var d = a.getElementsByTagName(b),
|
||||
e = 0,
|
||||
f = d.length;
|
||||
if (c)
|
||||
for (; f > e; e++) c(d[e], e);
|
||||
return d
|
||||
}
|
||||
return []
|
||||
}
|
||||
|
||||
function j(a, b, c, d, e, f, g) {
|
||||
var h = N.createEvent("Event"),
|
||||
i = (a || b[L]).options,
|
||||
j = "on" + c.charAt(0).toUpperCase() + c.substr(1);
|
||||
h.initEvent(c, !0, !0), h.to = b, h.from = e || b, h.item = d || b, h.clone = v, h.oldIndex = f, h.newIndex = g, b.dispatchEvent(h), i[j] && i[j].call(a, h)
|
||||
}
|
||||
|
||||
function k(a, b, c, d, e, f) {
|
||||
var g, h, i = a[L],
|
||||
j = i.options.onMove;
|
||||
return g = N.createEvent("Event"), g.initEvent("move", !0, !0), g.to = b, g.from = a, g.dragged = c, g.draggedRect = d, g.related = e || b, g.relatedRect = f || b.getBoundingClientRect(), a.dispatchEvent(g), j && (h = j.call(i, g)), h
|
||||
}
|
||||
|
||||
function l(a) {
|
||||
a.draggable = !1
|
||||
}
|
||||
|
||||
function m() {
|
||||
R = !1
|
||||
}
|
||||
|
||||
function n(a, b) {
|
||||
var c = a.lastElementChild,
|
||||
d = c.getBoundingClientRect();
|
||||
return (b.clientY - (d.top + d.height) > 5 || b.clientX - (d.right + d.width) > 5) && c
|
||||
}
|
||||
|
||||
function o(a) {
|
||||
for (var b = a.tagName + a.className + a.src + a.href + a.textContent, c = b.length, d = 0; c--;) d += b.charCodeAt(c);
|
||||
return d.toString(36)
|
||||
}
|
||||
|
||||
function p(a) {
|
||||
var b = 0;
|
||||
if (!a || !a.parentNode) return -1;
|
||||
for (; a && (a = a.previousElementSibling);) "TEMPLATE" !== a.nodeName.toUpperCase() && b++;
|
||||
return b
|
||||
}
|
||||
|
||||
function q(a, b) {
|
||||
var c, d;
|
||||
return function() {
|
||||
void 0 === c && (c = arguments, d = this, setTimeout(function() {
|
||||
1 === c.length ? a.call(d, c[0]) : a.apply(d, c), c = void 0
|
||||
}, b))
|
||||
}
|
||||
}
|
||||
|
||||
function r(a, b) {
|
||||
if (a && b)
|
||||
for (var c in b) b.hasOwnProperty(c) && (a[c] = b[c]);
|
||||
return a
|
||||
}
|
||||
var s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J = {},
|
||||
K = /\s+/g,
|
||||
L = "Sortable" + (new Date).getTime(),
|
||||
M = window,
|
||||
N = M.document,
|
||||
O = M.parseInt,
|
||||
P = !!("draggable" in N.createElement("div")),
|
||||
Q = function(a) {
|
||||
return a = N.createElement("x"), a.style.cssText = "pointer-events:auto", "auto" === a.style.pointerEvents
|
||||
}(),
|
||||
R = !1,
|
||||
S = Math.abs,
|
||||
T = ([].slice, []),
|
||||
U = q(function(a, b, c) {
|
||||
if (c && b.scroll) {
|
||||
var d, e, f, g, h = b.scrollSensitivity,
|
||||
i = b.scrollSpeed,
|
||||
j = a.clientX,
|
||||
k = a.clientY,
|
||||
l = window.innerWidth,
|
||||
m = window.innerHeight;
|
||||
if (z !== c && (y = b.scroll, z = c, y === !0)) {
|
||||
y = c;
|
||||
do
|
||||
if (y.offsetWidth < y.scrollWidth || y.offsetHeight < y.scrollHeight) break; while (y = y.parentNode)
|
||||
}
|
||||
y && (d = y, e = y.getBoundingClientRect(), f = (S(e.right - j) <= h) - (S(e.left - j) <= h), g = (S(e.bottom - k) <= h) - (S(e.top - k) <= h)), f || g || (f = (h >= l - j) - (h >= j), g = (h >= m - k) - (h >= k), (f || g) && (d = M)), (J.vx !== f || J.vy !== g || J.el !== d) && (J.el = d, J.vx = f, J.vy = g, clearInterval(J.pid), d && (J.pid = setInterval(function() {
|
||||
d === M ? M.scrollTo(M.pageXOffset + f * i, M.pageYOffset + g * i) : (g && (d.scrollTop += g * i), f && (d.scrollLeft += f * i))
|
||||
}, 24)))
|
||||
}
|
||||
}, 30),
|
||||
V = function(a) {
|
||||
var b = a.group;
|
||||
b && "object" == typeof b || (b = a.group = {
|
||||
name: b
|
||||
}), ["pull", "put"].forEach(function(a) {
|
||||
a in b || (b[a] = !0)
|
||||
}), a.groups = " " + b.name + (b.put.join ? " " + b.put.join(" ") : "") + " "
|
||||
};
|
||||
return a.prototype = {
|
||||
constructor: a,
|
||||
_onTapStart: function(a) {
|
||||
var b = this,
|
||||
d = this.el,
|
||||
e = this.options,
|
||||
f = a.type,
|
||||
g = a.touches && a.touches[0],
|
||||
h = (g || a).target,
|
||||
i = h,
|
||||
k = e.filter;
|
||||
if (!("mousedown" === f && 0 !== a.button || e.disabled) && (h = c(h, e.draggable, d))) {
|
||||
if (D = p(h), "function" == typeof k) {
|
||||
if (k.call(this, a, h, this)) return j(b, i, "filter", h, d, D), void a.preventDefault()
|
||||
} else if (k && (k = k.split(",").some(function(a) {
|
||||
return a = c(i, a.trim(), d), a ? (j(b, a, "filter", h, d, D), !0) : void 0
|
||||
}))) return void a.preventDefault();
|
||||
(!e.handle || c(i, e.handle, d)) && this._prepareDragStart(a, g, h)
|
||||
}
|
||||
},
|
||||
_prepareDragStart: function(a, b, c) {
|
||||
var d, f = this,
|
||||
h = f.el,
|
||||
j = f.options,
|
||||
k = h.ownerDocument;
|
||||
c && !s && c.parentNode === h && (G = a, w = h, s = c, t = s.parentNode, x = s.nextSibling, F = j.group, d = function() {
|
||||
f._disableDelayedDrag(), s.draggable = !0, g(s, f.options.chosenClass, !0), f._triggerDragStart(b)
|
||||
}, j.ignore.split(",").forEach(function(a) {
|
||||
i(s, a.trim(), l)
|
||||
}), e(k, "mouseup", f._onDrop), e(k, "touchend", f._onDrop), e(k, "touchcancel", f._onDrop), j.delay ? (e(k, "mouseup", f._disableDelayedDrag), e(k, "touchend", f._disableDelayedDrag), e(k, "touchcancel", f._disableDelayedDrag), e(k, "mousemove", f._disableDelayedDrag), e(k, "touchmove", f._disableDelayedDrag), f._dragStartTimer = setTimeout(d, j.delay)) : d())
|
||||
},
|
||||
_disableDelayedDrag: function() {
|
||||
var a = this.el.ownerDocument;
|
||||
clearTimeout(this._dragStartTimer), f(a, "mouseup", this._disableDelayedDrag), f(a, "touchend", this._disableDelayedDrag), f(a, "touchcancel", this._disableDelayedDrag), f(a, "mousemove", this._disableDelayedDrag), f(a, "touchmove", this._disableDelayedDrag)
|
||||
},
|
||||
_triggerDragStart: function(a) {
|
||||
a ? (G = {
|
||||
target: s,
|
||||
clientX: a.clientX,
|
||||
clientY: a.clientY
|
||||
}, this._onDragStart(G, "touch")) : this.nativeDraggable ? (e(s, "dragend", this), e(w, "dragstart", this._onDragStart)) : this._onDragStart(G, !0);
|
||||
try {
|
||||
N.selection ? N.selection.empty() : window.getSelection().removeAllRanges()
|
||||
} catch (b) {}
|
||||
},
|
||||
_dragStarted: function() {
|
||||
w && s && (g(s, this.options.ghostClass, !0), a.active = this, j(this, w, "start", s, w, D))
|
||||
},
|
||||
_emulateDragOver: function() {
|
||||
if (H) {
|
||||
if (this._lastX === H.clientX && this._lastY === H.clientY) return;
|
||||
this._lastX = H.clientX, this._lastY = H.clientY, Q || h(u, "display", "none");
|
||||
var a = N.elementFromPoint(H.clientX, H.clientY),
|
||||
b = a,
|
||||
c = " " + this.options.group.name,
|
||||
d = T.length;
|
||||
if (b)
|
||||
do {
|
||||
if (b[L] && b[L].options.groups.indexOf(c) > -1) {
|
||||
for (; d--;) T[d]({
|
||||
clientX: H.clientX,
|
||||
clientY: H.clientY,
|
||||
target: a,
|
||||
rootEl: b
|
||||
});
|
||||
break
|
||||
}
|
||||
a = b
|
||||
} while (b = b.parentNode);
|
||||
Q || h(u, "display", "")
|
||||
}
|
||||
},
|
||||
_onTouchMove: function(b) {
|
||||
if (G) {
|
||||
a.active || this._dragStarted(), this._appendGhost();
|
||||
var c = b.touches ? b.touches[0] : b,
|
||||
d = c.clientX - G.clientX,
|
||||
e = c.clientY - G.clientY,
|
||||
f = b.touches ? "translate3d(" + d + "px," + e + "px,0)" : "translate(" + d + "px," + e + "px)";
|
||||
I = !0, H = c, h(u, "webkitTransform", f), h(u, "mozTransform", f), h(u, "msTransform", f), h(u, "transform", f), b.preventDefault()
|
||||
}
|
||||
},
|
||||
_appendGhost: function() {
|
||||
if (!u) {
|
||||
var a, b = s.getBoundingClientRect(),
|
||||
c = h(s),
|
||||
d = this.options;
|
||||
u = s.cloneNode(!0), g(u, d.ghostClass, !1), g(u, d.fallbackClass, !0), h(u, "top", b.top - O(c.marginTop, 10)), h(u, "left", b.left - O(c.marginLeft, 10)), h(u, "width", b.width), h(u, "height", b.height), h(u, "opacity", "0.8"), h(u, "position", "fixed"), h(u, "zIndex", "100000"), h(u, "pointerEvents", "none"), d.fallbackOnBody && N.body.appendChild(u) || w.appendChild(u), a = u.getBoundingClientRect(), h(u, "width", 2 * b.width - a.width), h(u, "height", 2 * b.height - a.height)
|
||||
}
|
||||
},
|
||||
_onDragStart: function(a, b) {
|
||||
var c = a.dataTransfer,
|
||||
d = this.options;
|
||||
this._offUpEvents(), "clone" == F.pull && (v = s.cloneNode(!0), h(v, "display", "none"), w.insertBefore(v, s)), b ? ("touch" === b ? (e(N, "touchmove", this._onTouchMove), e(N, "touchend", this._onDrop), e(N, "touchcancel", this._onDrop)) : (e(N, "mousemove", this._onTouchMove), e(N, "mouseup", this._onDrop)), this._loopId = setInterval(this._emulateDragOver, 50)) : (c && (c.effectAllowed = "move", d.setData && d.setData.call(this, c, s)), e(N, "drop", this), setTimeout(this._dragStarted, 0))
|
||||
},
|
||||
_onDragOver: function(a) {
|
||||
var d, e, f, g = this.el,
|
||||
i = this.options,
|
||||
j = i.group,
|
||||
l = j.put,
|
||||
o = F === j,
|
||||
p = i.sort;
|
||||
if (void 0 !== a.preventDefault && (a.preventDefault(), !i.dragoverBubble && a.stopPropagation()), I = !0, F && !i.disabled && (o ? p || (f = !w.contains(s)) : F.pull && l && (F.name === j.name || l.indexOf && ~l.indexOf(F.name))) && (void 0 === a.rootEl || a.rootEl === this.el)) {
|
||||
if (U(a, i, this.el), R) return;
|
||||
if (d = c(a.target, i.draggable, g), e = s.getBoundingClientRect(), f) return b(!0), void(v || x ? w.insertBefore(s, v || x) : p || w.appendChild(s));
|
||||
if (0 === g.children.length || g.children[0] === u || g === a.target && (d = n(g, a))) {
|
||||
if (d) {
|
||||
if (d.animated) return;
|
||||
r = d.getBoundingClientRect()
|
||||
}
|
||||
b(o), k(w, g, s, e, d, r) !== !1 && (s.contains(g) || (g.appendChild(s), t = g), this._animate(e, s), d && this._animate(r, d))
|
||||
} else if (d && !d.animated && d !== s && void 0 !== d.parentNode[L]) {
|
||||
A !== d && (A = d, B = h(d), C = h(d.parentNode));
|
||||
var q, r = d.getBoundingClientRect(),
|
||||
y = r.right - r.left,
|
||||
z = r.bottom - r.top,
|
||||
D = /left|right|inline/.test(B.cssFloat + B.display) || "flex" == C.display && 0 === C["flex-direction"].indexOf("row"),
|
||||
E = d.offsetWidth > s.offsetWidth,
|
||||
G = d.offsetHeight > s.offsetHeight,
|
||||
H = (D ? (a.clientX - r.left) / y : (a.clientY - r.top) / z) > .5,
|
||||
J = d.nextElementSibling,
|
||||
K = k(w, g, s, e, d, r);
|
||||
if (K !== !1) {
|
||||
if (R = !0, setTimeout(m, 30), b(o), 1 === K || -1 === K) q = 1 === K;
|
||||
else if (D) {
|
||||
var M = s.offsetTop,
|
||||
N = d.offsetTop;
|
||||
q = M === N ? d.previousElementSibling === s && !E || H && E : N > M
|
||||
} else q = J !== s && !G || H && G;
|
||||
s.contains(g) || (q && !J ? g.appendChild(s) : d.parentNode.insertBefore(s, q ? J : d)), t = s.parentNode, this._animate(e, s), this._animate(r, d)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
_animate: function(a, b) {
|
||||
var c = this.options.animation;
|
||||
if (c) {
|
||||
var d = b.getBoundingClientRect();
|
||||
h(b, "transition", "none"), h(b, "transform", "translate3d(" + (a.left - d.left) + "px," + (a.top - d.top) + "px,0)"), b.offsetWidth, h(b, "transition", "all " + c + "ms"), h(b, "transform", "translate3d(0,0,0)"), clearTimeout(b.animated), b.animated = setTimeout(function() {
|
||||
h(b, "transition", ""), h(b, "transform", ""), b.animated = !1
|
||||
}, c)
|
||||
}
|
||||
},
|
||||
_offUpEvents: function() {
|
||||
var a = this.el.ownerDocument;
|
||||
f(N, "touchmove", this._onTouchMove), f(a, "mouseup", this._onDrop), f(a, "touchend", this._onDrop), f(a, "touchcancel", this._onDrop)
|
||||
},
|
||||
_onDrop: function(b) {
|
||||
var c = this.el,
|
||||
d = this.options;
|
||||
clearInterval(this._loopId), clearInterval(J.pid), clearTimeout(this._dragStartTimer), f(N, "mousemove", this._onTouchMove), this.nativeDraggable && (f(N, "drop", this), f(c, "dragstart", this._onDragStart)), this._offUpEvents(), b && (I && (b.preventDefault(), !d.dropBubble && b.stopPropagation()), u && u.parentNode.removeChild(u), s && (this.nativeDraggable && f(s, "dragend", this), l(s), g(s, this.options.ghostClass, !1), g(s, this.options.chosenClass, !1), w !== t ? (E = p(s), E >= 0 && (j(null, t, "sort", s, w, D, E), j(this, w, "sort", s, w, D, E), j(null, t, "add", s, w, D, E), j(this, w, "remove", s, w, D, E))) : (v && v.parentNode.removeChild(v), s.nextSibling !== x && (E = p(s), E >= 0 && (j(this, w, "update", s, w, D, E), j(this, w, "sort", s, w, D, E)))), a.active && ((null === E || -1 === E) && (E = D), j(this, w, "end", s, w, D, E), this.save())), w = s = t = u = x = v = y = z = G = H = I = E = A = B = F = a.active = null)
|
||||
},
|
||||
handleEvent: function(a) {
|
||||
var b = a.type;
|
||||
"dragover" === b || "dragenter" === b ? s && (this._onDragOver(a), d(a)) : ("drop" === b || "dragend" === b) && this._onDrop(a)
|
||||
},
|
||||
toArray: function() {
|
||||
for (var a, b = [], d = this.el.children, e = 0, f = d.length, g = this.options; f > e; e++) a = d[e], c(a, g.draggable, this.el) && b.push(a.getAttribute(g.dataIdAttr) || o(a));
|
||||
return b
|
||||
},
|
||||
sort: function(a) {
|
||||
var b = {},
|
||||
d = this.el;
|
||||
this.toArray().forEach(function(a, e) {
|
||||
var f = d.children[e];
|
||||
c(f, this.options.draggable, d) && (b[a] = f)
|
||||
}, this), a.forEach(function(a) {
|
||||
b[a] && (d.removeChild(b[a]), d.appendChild(b[a]))
|
||||
})
|
||||
},
|
||||
save: function() {
|
||||
var a = this.options.store;
|
||||
a && a.set(this)
|
||||
},
|
||||
closest: function(a, b) {
|
||||
return c(a, b || this.options.draggable, this.el)
|
||||
},
|
||||
option: function(a, b) {
|
||||
var c = this.options;
|
||||
return void 0 === b ? c[a] : (c[a] = b, void("group" === a && V(c)))
|
||||
},
|
||||
destroy: function() {
|
||||
var a = this.el;
|
||||
a[L] = null, f(a, "mousedown", this._onTapStart), f(a, "touchstart", this._onTapStart), this.nativeDraggable && (f(a, "dragover", this), f(a, "dragenter", this)), Array.prototype.forEach.call(a.querySelectorAll("[draggable]"), function(a) {
|
||||
a.removeAttribute("draggable")
|
||||
}), T.splice(T.indexOf(this._onDragOver), 1), this._onDrop(), this.el = a = null
|
||||
}
|
||||
}, a.utils = {
|
||||
on: e,
|
||||
off: f,
|
||||
css: h,
|
||||
find: i,
|
||||
is: function(a, b) {
|
||||
return !!c(a, b, a)
|
||||
},
|
||||
extend: r,
|
||||
throttle: q,
|
||||
closest: c,
|
||||
toggleClass: g,
|
||||
index: p
|
||||
}, a.create = function(b, c) {
|
||||
return new a(b, c)
|
||||
}, a.version = "1.4.2", a
|
||||
});
|
||||
344
src/bower_components/Sortable/index.html
vendored
344
src/bower_components/Sortable/index.html
vendored
@@ -1,344 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||
<meta property="og:image" content="/st/og-image.png"/>
|
||||
|
||||
<title>Sortable. No jQuery.</title>
|
||||
|
||||
<meta name="keywords" content="sortable, reorder, list, javascript, html5, drag and drop, dnd, animation, groups, angular, ng-sortable, react, mixin, effects, rubaxa"/>
|
||||
<meta name="description" content="Sortable - is a minimalist JavaScript library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery. Supports Meteor, AngularJS, React and any CSS library, e.g. Bootstrap."/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.5"/>
|
||||
|
||||
<link href="//rubaxa.github.io/Ply/ply.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="//fonts.googleapis.com/css?family=Roboto:300" rel="stylesheet" type="text/css"/>
|
||||
|
||||
<link href="st/app.css" rel="stylesheet" type="text/css"/>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a href="https://github.com/RubaXa/Sortable"><img style="position: fixed; top: 0; right: 0; border: 0; z-index: 10000;" src="//s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png" alt="Fork me on GitHub"></a>
|
||||
|
||||
<div class="container">
|
||||
<div style="padding: 80px 150px 0; height: 160px;">
|
||||
<a class="logo" href="https://github.com/RubaXa/Sortable"><img src="st/logo.png"/></a>
|
||||
<h1 data-force="40" data-force-y="2.5">The JavaScript library for modern browsers and touch devices. No jQuery.</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Connected lists -->
|
||||
<div class="container" style="height: 520px">
|
||||
<div data-force="30" class="layer block" style="left: 14.5%; top: 0; width: 37%">
|
||||
<div class="layer title">List A</div>
|
||||
<ul id="foo" class="block__list block__list_words">
|
||||
<li>бегемот</li>
|
||||
<li>корм</li>
|
||||
<li>антон</li>
|
||||
<li>сало</li>
|
||||
<li>железосталь</li>
|
||||
<li>валик</li>
|
||||
<li>кровать</li>
|
||||
<li>краб</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div data-force="18" class="layer block" style="left: 58%; top: 143px; width: 40%;">
|
||||
<div class="layer title">List B</div>
|
||||
<ul id="bar" class="block__list block__list_tags">
|
||||
<li>казнить</li>
|
||||
<li>,</li>
|
||||
<li>нельзя</li>
|
||||
<li>помиловать</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Multi connected lists -->
|
||||
<a name="m"></a>
|
||||
<div class="container">
|
||||
<div id="multi" style="margin-left: 30px">
|
||||
<div><div data-force="5" class="layer title title_xl">Multi</div></div>
|
||||
|
||||
<div class="layer tile" data-force="30">
|
||||
<div class="tile__name">Group A</div>
|
||||
<div class="tile__list">
|
||||
<img src="st/face-01.jpg"/><!--
|
||||
--><img src="st/face-02.jpg"/><!--
|
||||
--><img src="st/face-03.jpg"/><!--
|
||||
--><img src="st/face-04.jpg"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layer tile" data-force="25">
|
||||
<div class="tile__name">Group B</div>
|
||||
<div class="tile__list">
|
||||
<img src="st/face-05.jpg"/><!--
|
||||
--><img src="st/face-06.jpg"/><!--
|
||||
--><img src="st/face-07.jpg"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layer tile" data-force="20">
|
||||
<div class="tile__name">Group C</div>
|
||||
<div class="tile__list">
|
||||
<img src="st/face-08.jpg"/><!--
|
||||
--><img src="st/face-09.jpg"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Editable list -->
|
||||
<a name="e"></a>
|
||||
<div class="container" style="margin-top: 100px">
|
||||
<div id="filter" style="margin-left: 30px">
|
||||
<div><div data-force="5" class="layer title title_xl">Editable list</div></div>
|
||||
|
||||
<div style="margin-top: -8px; margin-left: 10px" class="block__list block__list_words">
|
||||
<ul id="editable">
|
||||
<li>Оля<i class="js-remove">✖</i></li>
|
||||
<li>Владимир<i class="js-remove">✖</i></li>
|
||||
<li>Алина<i class="js-remove">✖</i></li>
|
||||
</ul>
|
||||
|
||||
<button id="addUser">Add</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Advanced connected lists -->
|
||||
<a name="ag"></a>
|
||||
<div class="container" style="margin-top: 100px;">
|
||||
<div id="advanced" style="margin-left: 30px;">
|
||||
<div><div data-force="5" class="layer title title_xl">Advanced groups</div></div>
|
||||
|
||||
<div style="width: 25%; float: left; margin-top: 15px; margin-left: 10px" class="block__list block__list_words">
|
||||
<div class="block__list-title">pull & put</div>
|
||||
<ul id="advanced-1">
|
||||
<li>Meat</li>
|
||||
<li>Potato</li>
|
||||
<li>Tea</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="width: 25%; float: left; margin-top: 15px; margin-left: 10px" class="block__list block__list_words">
|
||||
<div class="block__list-title">only pull (clone) no reordering</div>
|
||||
<ul id="advanced-2">
|
||||
<li>Sex</li>
|
||||
<li>Drugs</li>
|
||||
<li>Rock'n'roll</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="width: 25%; float: left; margin-top: 15px; margin-left: 10px" class="block__list block__list_words">
|
||||
<div class="block__list-title">only put</div>
|
||||
<ul id="advanced-3">
|
||||
<li>Money</li>
|
||||
<li>Force</li>
|
||||
<li>Agility</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 'handle' option -->
|
||||
<a name="h"></a>
|
||||
<div class="container" style="margin-top: 100px;">
|
||||
<div id="handle" style="margin-left: 30px;">
|
||||
<div><div data-force="5" class="layer title title_xl">Drag handle and selectable text</div></div>
|
||||
|
||||
<div style="width: 30%; margin-left: 10px" class="block__list_words">
|
||||
<ul id="handle-1">
|
||||
<li><span class="drag-handle">☰</span>Select text freely</li>
|
||||
<li><span class="drag-handle">☰</span>Drag my handle</li>
|
||||
<li><span class="drag-handle">☰</span>Best of both worlds</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Angular -->
|
||||
<a name="ng"></a>
|
||||
<div id="todos" ng-app="todoApp" class="container" style="margin-top: 100px">
|
||||
<div style="margin-left: 30px">
|
||||
<div><div data-force="5" class="layer title title_xl">AngularJS / ng-sortable</div></div>
|
||||
|
||||
<div style="width: 30%; margin-top: -8px; margin-left: 10px; float: left;" class="block__list block__list_words">
|
||||
<div ng-controller="TodoController">
|
||||
<span style="padding-left: 20px">{{remaining()}} of {{todos.length}} remaining</span>
|
||||
[ <a href="" ng-click="archive()">archive</a> ]
|
||||
<ul ng-sortable="{ group: 'todo', animation: 150 }" class="unstyled">
|
||||
<li ng-repeat="todo in todos">
|
||||
<input type="checkbox" ng-model="todo.done">
|
||||
<span class="done-{{todo.done}}">{{todo.text}}</span>
|
||||
</li>
|
||||
</ul>
|
||||
<form ng-submit="addTodo()" style="padding-left: 20px">
|
||||
<input type="text" ng-model="todoText" size="30"
|
||||
placeholder="add new todo here">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style="width: 30%; margin-top: -8px; margin-left: 10px; float: left;" class="block__list block__list_words">
|
||||
<div ng-controller="TodoControllerNext">
|
||||
<span style="padding-left: 20px">{{remaining()}} of {{todos.length}} remaining</span>
|
||||
<ul ng-sortable="sortableConfig" class="unstyled">
|
||||
<li ng-repeat="todo in todos">
|
||||
<input type="checkbox" ng-model="todo.done">
|
||||
<span class="done-{{todo.done}}">{{todo.text}}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Code example -->
|
||||
<a name="c"></a>
|
||||
<div class="container" style="margin-top: 100px">
|
||||
<div style="margin-left: 30px">
|
||||
<div><div class="layer title title_xl">Code example</div></div>
|
||||
<pre data-force="100" class="layer javascript" style="margin-top: -8px; margin-left: 10px; width: 90%"><code>// Simple list
|
||||
var list = document.getElementById("my-ui-list");
|
||||
Sortable.create(list); // That's all.
|
||||
|
||||
|
||||
// Grouping
|
||||
var foo = document.getElementById("foo");
|
||||
Sortable.create(foo, { group: "omega" });
|
||||
|
||||
var bar = document.getElementById("bar");
|
||||
Sortable.create(bar, { group: "omega" });
|
||||
|
||||
|
||||
// Or
|
||||
var container = document.getElementById("multi");
|
||||
var sort = Sortable.create(container, {
|
||||
animation: 150, // ms, animation speed moving items when sorting, `0` — without animation
|
||||
handle: ".tile__title", // Restricts sort start click/touch to the specified element
|
||||
draggable: ".tile", // Specifies which items inside the element should be sortable
|
||||
onUpdate: function (evt/**Event*/){
|
||||
var item = evt.item; // the current dragged HTMLElement
|
||||
}
|
||||
});
|
||||
|
||||
// ..
|
||||
sort.destroy();
|
||||
|
||||
|
||||
// Editable list
|
||||
var editableList = Sortable.create(editable, {
|
||||
filter: '.js-remove',
|
||||
onFilter: function (evt) {
|
||||
var el = editableList.closest(evt.item); // get dragged item
|
||||
el && el.parentNode.removeChild(el);
|
||||
}
|
||||
});
|
||||
</code></pre>
|
||||
</div>
|
||||
|
||||
<div class="container" style="margin: 100px 0;">
|
||||
<div style="margin-left: 30px">
|
||||
<div><div class="layer title title_xl">See also</div></div>
|
||||
<div id="rubaxa-repos" data-force="100" class="layer" style="margin-top: -8px; margin-left: 10px; width: 90%; background-color: #fff;">Loading…</div>
|
||||
<script src="//rubaxa.github.io/repos.js"></script>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script src="Sortable.js"></script>
|
||||
<script src="//rubaxa.github.io/Ply/Ply.min.js"></script>
|
||||
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
|
||||
<script src="ng-sortable.js"></script>
|
||||
|
||||
<script src="st/app.js"></script>
|
||||
|
||||
|
||||
|
||||
<!-- highlight.js -->
|
||||
<style>
|
||||
/* Tomorrow Theme */
|
||||
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
|
||||
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
|
||||
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
|
||||
.tomorrow-comment, pre .comment, pre .title {
|
||||
color: #8e908c;
|
||||
}
|
||||
|
||||
.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
|
||||
color: #c82829;
|
||||
}
|
||||
|
||||
.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant {
|
||||
color: #f5871f;
|
||||
}
|
||||
|
||||
.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute {
|
||||
color: #eab700;
|
||||
}
|
||||
|
||||
.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
|
||||
color: #718c00;
|
||||
}
|
||||
|
||||
.tomorrow-aqua, pre .css .hexcolor {
|
||||
color: #3e999f;
|
||||
}
|
||||
|
||||
.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
|
||||
color: #4271ae;
|
||||
}
|
||||
|
||||
.tomorrow-purple, pre .keyword, pre .javascript .function {
|
||||
color: #8959a8;
|
||||
}
|
||||
|
||||
pre {
|
||||
border: 0;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
pre code {
|
||||
display: block;
|
||||
color: #4d4d4c;
|
||||
font-size: 15px;
|
||||
font-family: Menlo, Monaco, Consolas, monospace;
|
||||
line-height: 1.5;
|
||||
padding: 30px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="//yandex.st/highlightjs/7.5/highlight.min.js"></script>
|
||||
<script>hljs.initHighlightingOnLoad();</script>
|
||||
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', 'UA-16483888-3', 'rubaxa.github.io');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
17
src/bower_components/Sortable/jquery.binding.js
vendored
17
src/bower_components/Sortable/jquery.binding.js
vendored
@@ -1,17 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
"function" == typeof define && define.amd ? define(["jquery"], factory) : factory(jQuery)
|
||||
}(function($) {
|
||||
"use strict";
|
||||
$.fn.sortable = function(options) {
|
||||
var retVal, args = arguments;
|
||||
return this.each(function() {
|
||||
var $el = $(this),
|
||||
sortable = $el.data("sortable");
|
||||
if (sortable || !(options instanceof Object) && options || (sortable = new Sortable(this, options), $el.data("sortable", sortable)), sortable) {
|
||||
if ("widget" === options) return sortable;
|
||||
"destroy" === options ? (sortable.destroy(), $el.removeData("sortable")) : "function" == typeof sortable[options] ? retVal = sortable[options].apply(sortable, [].slice.call(args, 1)) : options in sortable.options && (retVal = sortable.option.apply(sortable, args))
|
||||
}
|
||||
}), void 0 === retVal ? this : retVal
|
||||
}
|
||||
});
|
||||
@@ -1,97 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
if ("function" == typeof define && define.amd) define(["knockout"], factory);
|
||||
else if ("function" == typeof require && "object" == typeof exports && "object" == typeof module) {
|
||||
var ko = require("knockout");
|
||||
factory(ko)
|
||||
} else factory(window.ko)
|
||||
}(function(ko) {
|
||||
"use strict";
|
||||
var init = function(element, valueAccessor, allBindings, viewModel, bindingContext, sortableOptions) {
|
||||
var options = buildOptions(valueAccessor, sortableOptions);
|
||||
["onStart", "onEnd", "onRemove", "onAdd", "onUpdate", "onSort", "onFilter"].forEach(function(e) {
|
||||
(options[e] || eventHandlers[e]) && (options[e] = function(eventType, parentVM, parentBindings, handler, e) {
|
||||
var itemVM = ko.dataFor(e.item),
|
||||
bindings = ko.utils.peekObservable(parentBindings()),
|
||||
bindingHandlerBinding = bindings.sortable || bindings.draggable,
|
||||
collection = bindingHandlerBinding.collection || bindingHandlerBinding.foreach;
|
||||
handler && handler(e, itemVM, parentVM, collection, bindings), eventHandlers[eventType] && eventHandlers[eventType](e, itemVM, parentVM, collection, bindings)
|
||||
}.bind(void 0, e, viewModel, allBindings, options[e]))
|
||||
});
|
||||
var sortableElement = Sortable.create(element, options);
|
||||
return ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
|
||||
sortableElement.destroy()
|
||||
}), ko.bindingHandlers.template.init(element, valueAccessor)
|
||||
},
|
||||
update = function(element, valueAccessor, allBindings, viewModel, bindingContext, sortableOptions) {
|
||||
return ko.bindingHandlers.template.update(element, valueAccessor, allBindings, viewModel, bindingContext)
|
||||
},
|
||||
eventHandlers = function(handlers) {
|
||||
var moveOperations = [],
|
||||
tryMoveOperation = function(e, itemVM, parentVM, collection, parentBindings) {
|
||||
var currentOperation = {
|
||||
event: e,
|
||||
itemVM: itemVM,
|
||||
parentVM: parentVM,
|
||||
collection: collection,
|
||||
parentBindings: parentBindings
|
||||
},
|
||||
existingOperation = moveOperations.filter(function(op) {
|
||||
return op.itemVM === currentOperation.itemVM
|
||||
})[0];
|
||||
if (existingOperation) {
|
||||
moveOperations.splice(moveOperations.indexOf(existingOperation), 1);
|
||||
var removeOperation = "remove" === currentOperation.event.type ? currentOperation : existingOperation,
|
||||
addOperation = "add" === currentOperation.event.type ? currentOperation : existingOperation;
|
||||
moveItem(itemVM, removeOperation.collection, addOperation.collection, addOperation.event.clone, addOperation.event)
|
||||
} else moveOperations.push(currentOperation)
|
||||
},
|
||||
moveItem = function(itemVM, from, to, clone, e) {
|
||||
var fromArray = from(),
|
||||
originalIndex = fromArray.indexOf(itemVM),
|
||||
newIndex = e.newIndex;
|
||||
e.item.previousElementSibling && (newIndex = fromArray.indexOf(ko.dataFor(e.item.previousElementSibling)), originalIndex > newIndex && (newIndex += 1)), e.item.parentNode.removeChild(e.item), fromArray.splice(originalIndex, 1), from.valueHasMutated(), clone && from !== to && (fromArray.splice(originalIndex, 0, itemVM), from.valueHasMutated()), to().splice(newIndex, 0, itemVM), to.valueHasMutated()
|
||||
};
|
||||
return handlers.onRemove = tryMoveOperation, handlers.onAdd = tryMoveOperation, handlers.onUpdate = function(e, itemVM, parentVM, collection, parentBindings) {
|
||||
moveItem(itemVM, collection, collection, !1, e)
|
||||
}, handlers
|
||||
}({}),
|
||||
buildOptions = function(bindingOptions, options) {
|
||||
var merge = function(into, from) {
|
||||
for (var prop in from) "[object Object]" === Object.prototype.toString.call(from[prop]) ? ("[object Object]" !== Object.prototype.toString.call(into[prop]) && (into[prop] = {}), into[prop] = merge(into[prop], from[prop])) : into[prop] = from[prop];
|
||||
return into
|
||||
},
|
||||
unwrappedOptions = ko.utils.peekObservable(bindingOptions()).options || {};
|
||||
return options = merge({}, options), unwrappedOptions.group && "[object Object]" !== Object.prototype.toString.call(unwrappedOptions.group) && (unwrappedOptions.group = {
|
||||
name: unwrappedOptions.group
|
||||
}), merge(options, unwrappedOptions)
|
||||
};
|
||||
ko.bindingHandlers.draggable = {
|
||||
sortableOptions: {
|
||||
group: {
|
||||
pull: "clone",
|
||||
put: !1
|
||||
},
|
||||
sort: !1
|
||||
},
|
||||
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return init(element, valueAccessor, allBindings, viewModel, 0, ko.bindingHandlers.draggable.sortableOptions)
|
||||
},
|
||||
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return update(element, valueAccessor, allBindings, viewModel, bindingContext, ko.bindingHandlers.draggable.sortableOptions)
|
||||
}
|
||||
}, ko.bindingHandlers.sortable = {
|
||||
sortableOptions: {
|
||||
group: {
|
||||
pull: !0,
|
||||
put: !0
|
||||
}
|
||||
},
|
||||
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return init(element, valueAccessor, allBindings, viewModel, 0, ko.bindingHandlers.sortable.sortableOptions)
|
||||
},
|
||||
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return update(element, valueAccessor, allBindings, viewModel, bindingContext, ko.bindingHandlers.sortable.sortableOptions)
|
||||
}
|
||||
}
|
||||
});
|
||||
87
src/bower_components/Sortable/ng-sortable.js
vendored
87
src/bower_components/Sortable/ng-sortable.js
vendored
@@ -1,87 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
"function" == typeof define && define.amd ? define(["angular", "./Sortable"], factory) : "function" == typeof require && "object" == typeof exports && "object" == typeof module ? (require("angular"), factory(angular, require("./Sortable")), module.exports = "ng-sortable") : window.angular && window.Sortable && factory(angular, Sortable)
|
||||
}(function(angular, Sortable) {
|
||||
"use strict";
|
||||
var expando = "Sortable:ng-sortable";
|
||||
angular.module("ng-sortable", []).constant("ngSortableVersion", "0.4.0").constant("ngSortableConfig", {}).directive("ngSortable", ["$parse", "ngSortableConfig", function($parse, ngSortableConfig) {
|
||||
var removed, nextSibling, getSourceFactory = function(el, scope) {
|
||||
var ngRepeat = [].filter.call(el.childNodes, function(node) {
|
||||
return 8 === node.nodeType && -1 !== node.nodeValue.indexOf("ngRepeat:")
|
||||
})[0];
|
||||
if (!ngRepeat) return function() {
|
||||
return null
|
||||
};
|
||||
ngRepeat = ngRepeat.nodeValue.match(/ngRepeat:\s*(?:\(.*?,\s*)?([^\s)]+)[\s)]+in\s+([^\s|]+)/);
|
||||
var itemsExpr = $parse(ngRepeat[2]);
|
||||
return function() {
|
||||
return itemsExpr(scope.$parent) || []
|
||||
}
|
||||
};
|
||||
return {
|
||||
restrict: "AC",
|
||||
scope: {
|
||||
ngSortable: "=?"
|
||||
},
|
||||
link: function(scope, $el) {
|
||||
function _emitEvent(evt, item) {
|
||||
var name = "on" + evt.type.charAt(0).toUpperCase() + evt.type.substr(1),
|
||||
source = getSource();
|
||||
options[name] && options[name]({
|
||||
model: item || source[evt.newIndex],
|
||||
models: source,
|
||||
oldIndex: evt.oldIndex,
|
||||
newIndex: evt.newIndex
|
||||
})
|
||||
}
|
||||
|
||||
function _sync(evt) {
|
||||
var items = getSource();
|
||||
if (items) {
|
||||
var oldIndex = evt.oldIndex,
|
||||
newIndex = evt.newIndex;
|
||||
if (el !== evt.from) {
|
||||
var prevItems = evt.from[expando]();
|
||||
removed = prevItems[oldIndex], evt.clone ? (removed = angular.copy(removed), prevItems.splice(Sortable.utils.index(evt.clone), 0, prevItems.splice(oldIndex, 1)[0]), evt.from.removeChild(evt.clone)) : prevItems.splice(oldIndex, 1), items.splice(newIndex, 0, removed), evt.from.insertBefore(evt.item, nextSibling)
|
||||
} else items.splice(newIndex, 0, items.splice(oldIndex, 1)[0]);
|
||||
scope.$apply()
|
||||
}
|
||||
}
|
||||
var sortable, el = $el[0],
|
||||
options = angular.extend(scope.ngSortable || {}, ngSortableConfig),
|
||||
watchers = [],
|
||||
getSource = getSourceFactory(el, scope);
|
||||
el[expando] = getSource, sortable = Sortable.create(el, Object.keys(options).reduce(function(opts, name) {
|
||||
return opts[name] = opts[name] || options[name], opts
|
||||
}, {
|
||||
onStart: function(evt) {
|
||||
nextSibling = evt.item.nextSibling, _emitEvent(evt), scope.$apply()
|
||||
},
|
||||
onEnd: function(evt) {
|
||||
_emitEvent(evt, removed), scope.$apply()
|
||||
},
|
||||
onAdd: function(evt) {
|
||||
_sync(evt), _emitEvent(evt, removed), scope.$apply()
|
||||
},
|
||||
onUpdate: function(evt) {
|
||||
_sync(evt), _emitEvent(evt)
|
||||
},
|
||||
onRemove: function(evt) {
|
||||
_emitEvent(evt, removed)
|
||||
},
|
||||
onSort: function(evt) {
|
||||
_emitEvent(evt)
|
||||
}
|
||||
})), $el.on("$destroy", function() {
|
||||
angular.forEach(watchers, function(unwatch) {
|
||||
unwatch()
|
||||
}), sortable.destroy(), el[expando] = null, el = null, watchers = null, sortable = null, nextSibling = null
|
||||
}), angular.forEach(["sort", "disabled", "draggable", "handle", "animation", "group", "ghostClass", "filter", "onStart", "onEnd", "onAdd", "onUpdate", "onRemove", "onSort"], function(name) {
|
||||
watchers.push(scope.$watch("ngSortable." + name, function(value) {
|
||||
void 0 !== value && (options[name] = value, /^on[A-Z]/.test(name) || sortable.option(name, value))
|
||||
}))
|
||||
})
|
||||
}
|
||||
}
|
||||
}])
|
||||
});
|
||||
@@ -1,71 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
"undefined" != typeof module && void 0 !== module.exports ? module.exports = factory(require("./Sortable")) : "function" == typeof define && define.amd ? define(["./Sortable"], factory) : window.SortableMixin = factory(Sortable)
|
||||
}(function(Sortable) {
|
||||
"use strict";
|
||||
|
||||
function _getModelName(component) {
|
||||
return component.sortableOptions && component.sortableOptions.model || _defaultOptions.model
|
||||
}
|
||||
|
||||
function _getModelItems(component) {
|
||||
var name = _getModelName(component);
|
||||
return (component.state && component.state[name] || component.props[name]).slice()
|
||||
}
|
||||
|
||||
function _extend(dst, src) {
|
||||
for (var key in src) src.hasOwnProperty(key) && (dst[key] = src[key]);
|
||||
return dst
|
||||
}
|
||||
var _nextSibling, _activeComponent, _defaultOptions = {
|
||||
ref: "list",
|
||||
model: "items",
|
||||
animation: 100,
|
||||
onStart: "handleStart",
|
||||
onEnd: "handleEnd",
|
||||
onAdd: "handleAdd",
|
||||
onUpdate: "handleUpdate",
|
||||
onRemove: "handleRemove",
|
||||
onSort: "handleSort",
|
||||
onFilter: "handleFilter",
|
||||
onMove: "handleMove"
|
||||
};
|
||||
return {
|
||||
sortableMixinVersion: "0.1.1",
|
||||
_sortableInstance: null,
|
||||
componentDidMount: function() {
|
||||
var DOMNode, options = _extend(_extend({}, _defaultOptions), this.sortableOptions || {}),
|
||||
copyOptions = _extend({}, options),
|
||||
emitEvent = function(type, evt) {
|
||||
var method = this[options[type]];
|
||||
method && method.call(this, evt, this._sortableInstance)
|
||||
}.bind(this);
|
||||
"onStart onEnd onAdd onSort onUpdate onRemove onFilter onMove".split(" ").forEach(function(name) {
|
||||
copyOptions[name] = function(evt) {
|
||||
if ("onStart" === name) _nextSibling = evt.item.nextElementSibling, _activeComponent = this;
|
||||
else if ("onAdd" === name || "onUpdate" === name) {
|
||||
evt.from.insertBefore(evt.item, _nextSibling);
|
||||
var remoteItems, item, newState = {},
|
||||
remoteState = {},
|
||||
oldIndex = evt.oldIndex,
|
||||
newIndex = evt.newIndex,
|
||||
items = _getModelItems(this);
|
||||
"onAdd" === name ? (remoteItems = _getModelItems(_activeComponent), item = remoteItems.splice(oldIndex, 1)[0], items.splice(newIndex, 0, item), remoteState[_getModelName(_activeComponent)] = remoteItems) : items.splice(newIndex, 0, items.splice(oldIndex, 1)[0]), newState[_getModelName(this)] = items, copyOptions.stateHandler ? this[copyOptions.stateHandler](newState) : this.setState(newState), this !== _activeComponent && _activeComponent.setState(remoteState)
|
||||
}
|
||||
setTimeout(function() {
|
||||
emitEvent(name, evt)
|
||||
}, 0)
|
||||
}.bind(this)
|
||||
}, this), DOMNode = this.getDOMNode() ? (this.refs[options.ref] || this).getDOMNode() : this.refs[options.ref] || this, this._sortableInstance = Sortable.create(DOMNode, copyOptions)
|
||||
},
|
||||
componentWillReceiveProps: function(nextProps) {
|
||||
var newState = {},
|
||||
modelName = _getModelName(this),
|
||||
items = nextProps[modelName];
|
||||
items && (newState[modelName] = items, this.setState(newState))
|
||||
},
|
||||
componentWillUnmount: function() {
|
||||
this._sortableInstance.destroy(), this._sortableInstance = null
|
||||
}
|
||||
}
|
||||
});
|
||||
582
src/bower_components/Swiper/dist/css/swiper.min.css
vendored
582
src/bower_components/Swiper/dist/css/swiper.min.css
vendored
@@ -1,582 +0,0 @@
|
||||
/**
|
||||
* Swiper 3.3.1
|
||||
* Most modern mobile touch slider and framework with hardware accelerated transitions
|
||||
*
|
||||
* http://www.idangero.us/swiper/
|
||||
*
|
||||
* Copyright 2016, Vladimir Kharlampidi
|
||||
* The iDangero.us
|
||||
* http://www.idangero.us/
|
||||
*
|
||||
* Licensed under MIT
|
||||
*
|
||||
* Released on: February 7, 2016
|
||||
*/
|
||||
.swiper-container {
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 1
|
||||
}
|
||||
|
||||
.swiper-container-no-flexbox .swiper-slide {
|
||||
float: left
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-wrapper {
|
||||
-webkit-box-orient: vertical;
|
||||
-moz-box-orient: vertical;
|
||||
-ms-flex-direction: column;
|
||||
-webkit-flex-direction: column;
|
||||
flex-direction: column
|
||||
}
|
||||
|
||||
.swiper-wrapper {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 1;
|
||||
display: -webkit-box;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-transition-property: -webkit-transform;
|
||||
-moz-transition-property: -moz-transform;
|
||||
-o-transition-property: -o-transform;
|
||||
-ms-transition-property: -ms-transform;
|
||||
transition-property: transform;
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box
|
||||
}
|
||||
|
||||
.swiper-container-android .swiper-slide,
|
||||
.swiper-wrapper {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
-moz-transform: translate3d(0, 0, 0);
|
||||
-o-transform: translate(0, 0);
|
||||
-ms-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0)
|
||||
}
|
||||
|
||||
.swiper-container-multirow>.swiper-wrapper {
|
||||
-webkit-box-lines: multiple;
|
||||
-moz-box-lines: multiple;
|
||||
-ms-flex-wrap: wrap;
|
||||
-webkit-flex-wrap: wrap;
|
||||
flex-wrap: wrap
|
||||
}
|
||||
|
||||
.swiper-container-free-mode>.swiper-wrapper {
|
||||
-webkit-transition-timing-function: ease-out;
|
||||
-moz-transition-timing-function: ease-out;
|
||||
-ms-transition-timing-function: ease-out;
|
||||
-o-transition-timing-function: ease-out;
|
||||
transition-timing-function: ease-out;
|
||||
margin: 0 auto
|
||||
}
|
||||
|
||||
.swiper-slide {
|
||||
-webkit-flex-shrink: 0;
|
||||
-ms-flex: 0 0 auto;
|
||||
flex-shrink: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative
|
||||
}
|
||||
|
||||
.swiper-container-autoheight,
|
||||
.swiper-container-autoheight .swiper-slide {
|
||||
height: auto
|
||||
}
|
||||
|
||||
.swiper-container-autoheight .swiper-wrapper {
|
||||
-webkit-box-align: start;
|
||||
-ms-flex-align: start;
|
||||
-webkit-align-items: flex-start;
|
||||
align-items: flex-start;
|
||||
-webkit-transition-property: -webkit-transform, height;
|
||||
-moz-transition-property: -moz-transform;
|
||||
-o-transition-property: -o-transform;
|
||||
-ms-transition-property: -ms-transform;
|
||||
transition-property: transform, height
|
||||
}
|
||||
|
||||
.swiper-container .swiper-notification {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
z-index: -1000
|
||||
}
|
||||
|
||||
.swiper-wp8-horizontal {
|
||||
-ms-touch-action: pan-y;
|
||||
touch-action: pan-y
|
||||
}
|
||||
|
||||
.swiper-wp8-vertical {
|
||||
-ms-touch-action: pan-x;
|
||||
touch-action: pan-x
|
||||
}
|
||||
|
||||
.swiper-button-next,
|
||||
.swiper-button-prev {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: 27px;
|
||||
height: 44px;
|
||||
margin-top: -22px;
|
||||
z-index: 10;
|
||||
cursor: pointer;
|
||||
-moz-background-size: 27px 44px;
|
||||
-webkit-background-size: 27px 44px;
|
||||
background-size: 27px 44px;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat
|
||||
}
|
||||
|
||||
.swiper-button-next.swiper-button-disabled,
|
||||
.swiper-button-prev.swiper-button-disabled {
|
||||
opacity: .35;
|
||||
cursor: auto;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.swiper-button-prev,
|
||||
.swiper-container-rtl .swiper-button-next {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
|
||||
left: 10px;
|
||||
right: auto
|
||||
}
|
||||
|
||||
.swiper-button-prev.swiper-button-black,
|
||||
.swiper-container-rtl .swiper-button-next.swiper-button-black {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-button-prev.swiper-button-white,
|
||||
.swiper-container-rtl .swiper-button-next.swiper-button-white {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-button-next,
|
||||
.swiper-container-rtl .swiper-button-prev {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
|
||||
right: 10px;
|
||||
left: auto
|
||||
}
|
||||
|
||||
.swiper-button-next.swiper-button-black,
|
||||
.swiper-container-rtl .swiper-button-prev.swiper-button-black {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-button-next.swiper-button-white,
|
||||
.swiper-container-rtl .swiper-button-prev.swiper-button-white {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-pagination {
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
-webkit-transition: .3s;
|
||||
-moz-transition: .3s;
|
||||
-o-transition: .3s;
|
||||
transition: .3s;
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
-ms-transform: translate3d(0, 0, 0);
|
||||
-o-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
z-index: 10
|
||||
}
|
||||
|
||||
.swiper-pagination.swiper-pagination-hidden {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-pagination-bullets,
|
||||
.swiper-pagination-custom,
|
||||
.swiper-pagination-fraction {
|
||||
bottom: 10px;
|
||||
left: 0;
|
||||
width: 100%
|
||||
}
|
||||
|
||||
.swiper-pagination-bullet {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
display: inline-block;
|
||||
border-radius: 100%;
|
||||
background: #000;
|
||||
opacity: .2
|
||||
}
|
||||
|
||||
button.swiper-pagination-bullet {
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-shadow: none;
|
||||
-moz-appearance: none;
|
||||
-ms-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
appearance: none
|
||||
}
|
||||
|
||||
.swiper-pagination-clickable .swiper-pagination-bullet {
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
.swiper-pagination-white .swiper-pagination-bullet {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.swiper-pagination-bullet-active {
|
||||
opacity: 1;
|
||||
background: #007aff
|
||||
}
|
||||
|
||||
.swiper-pagination-white .swiper-pagination-bullet-active {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.swiper-pagination-black .swiper-pagination-bullet-active {
|
||||
background: #000
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-pagination-bullets {
|
||||
right: 10px;
|
||||
top: 50%;
|
||||
-webkit-transform: translate3d(0, -50%, 0);
|
||||
-moz-transform: translate3d(0, -50%, 0);
|
||||
-o-transform: translate(0, -50%);
|
||||
-ms-transform: translate3d(0, -50%, 0);
|
||||
transform: translate3d(0, -50%, 0)
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet {
|
||||
margin: 5px 0;
|
||||
display: block
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet {
|
||||
margin: 0 5px
|
||||
}
|
||||
|
||||
.swiper-pagination-progress {
|
||||
background: rgba(0, 0, 0, .25);
|
||||
position: absolute
|
||||
}
|
||||
|
||||
.swiper-pagination-progress .swiper-pagination-progressbar {
|
||||
background: #007aff;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
-o-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-transform-origin: left top;
|
||||
-moz-transform-origin: left top;
|
||||
-ms-transform-origin: left top;
|
||||
-o-transform-origin: left top;
|
||||
transform-origin: left top
|
||||
}
|
||||
|
||||
.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar {
|
||||
-webkit-transform-origin: right top;
|
||||
-moz-transform-origin: right top;
|
||||
-ms-transform-origin: right top;
|
||||
-o-transform-origin: right top;
|
||||
transform-origin: right top
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-pagination-progress {
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
left: 0;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-pagination-progress {
|
||||
width: 4px;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.swiper-pagination-progress.swiper-pagination-white {
|
||||
background: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar {
|
||||
background: #000
|
||||
}
|
||||
|
||||
.swiper-container-3d {
|
||||
-webkit-perspective: 1200px;
|
||||
-moz-perspective: 1200px;
|
||||
-o-perspective: 1200px;
|
||||
perspective: 1200px
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-cube-shadow,
|
||||
.swiper-container-3d .swiper-slide,
|
||||
.swiper-container-3d .swiper-slide-shadow-bottom,
|
||||
.swiper-container-3d .swiper-slide-shadow-left,
|
||||
.swiper-container-3d .swiper-slide-shadow-right,
|
||||
.swiper-container-3d .swiper-slide-shadow-top,
|
||||
.swiper-container-3d .swiper-wrapper {
|
||||
-webkit-transform-style: preserve-3d;
|
||||
-moz-transform-style: preserve-3d;
|
||||
-ms-transform-style: preserve-3d;
|
||||
transform-style: preserve-3d
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-bottom,
|
||||
.swiper-container-3d .swiper-slide-shadow-left,
|
||||
.swiper-container-3d .swiper-slide-shadow-right,
|
||||
.swiper-container-3d .swiper-slide-shadow-top {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
pointer-events: none;
|
||||
z-index: 10
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-left {
|
||||
background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-right {
|
||||
background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-top {
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-bottom {
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-coverflow .swiper-wrapper,
|
||||
.swiper-container-flip .swiper-wrapper {
|
||||
-ms-perspective: 1200px
|
||||
}
|
||||
|
||||
.swiper-container-cube,
|
||||
.swiper-container-flip {
|
||||
overflow: visible
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide,
|
||||
.swiper-container-flip .swiper-slide {
|
||||
pointer-events: none;
|
||||
-webkit-backface-visibility: hidden;
|
||||
-moz-backface-visibility: hidden;
|
||||
-ms-backface-visibility: hidden;
|
||||
backface-visibility: hidden;
|
||||
z-index: 1
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide .swiper-slide,
|
||||
.swiper-container-flip .swiper-slide .swiper-slide {
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide-active,
|
||||
.swiper-container-cube .swiper-slide-active .swiper-slide-active,
|
||||
.swiper-container-flip .swiper-slide-active,
|
||||
.swiper-container-flip .swiper-slide-active .swiper-slide-active {
|
||||
pointer-events: auto
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide-shadow-bottom,
|
||||
.swiper-container-cube .swiper-slide-shadow-left,
|
||||
.swiper-container-cube .swiper-slide-shadow-right,
|
||||
.swiper-container-cube .swiper-slide-shadow-top,
|
||||
.swiper-container-flip .swiper-slide-shadow-bottom,
|
||||
.swiper-container-flip .swiper-slide-shadow-left,
|
||||
.swiper-container-flip .swiper-slide-shadow-right,
|
||||
.swiper-container-flip .swiper-slide-shadow-top {
|
||||
z-index: 0;
|
||||
-webkit-backface-visibility: hidden;
|
||||
-moz-backface-visibility: hidden;
|
||||
-ms-backface-visibility: hidden;
|
||||
backface-visibility: hidden
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide {
|
||||
visibility: hidden;
|
||||
-webkit-transform-origin: 0 0;
|
||||
-moz-transform-origin: 0 0;
|
||||
-ms-transform-origin: 0 0;
|
||||
transform-origin: 0 0;
|
||||
width: 100%;
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.swiper-container-cube.swiper-container-rtl .swiper-slide {
|
||||
-webkit-transform-origin: 100% 0;
|
||||
-moz-transform-origin: 100% 0;
|
||||
-ms-transform-origin: 100% 0;
|
||||
transform-origin: 100% 0
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide-active,
|
||||
.swiper-container-cube .swiper-slide-next,
|
||||
.swiper-container-cube .swiper-slide-next+.swiper-slide,
|
||||
.swiper-container-cube .swiper-slide-prev {
|
||||
pointer-events: auto;
|
||||
visibility: visible
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-cube-shadow {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #000;
|
||||
opacity: .6;
|
||||
-webkit-filter: blur(50px);
|
||||
filter: blur(50px);
|
||||
z-index: 0
|
||||
}
|
||||
|
||||
.swiper-container-fade.swiper-container-free-mode .swiper-slide {
|
||||
-webkit-transition-timing-function: ease-out;
|
||||
-moz-transition-timing-function: ease-out;
|
||||
-ms-transition-timing-function: ease-out;
|
||||
-o-transition-timing-function: ease-out;
|
||||
transition-timing-function: ease-out
|
||||
}
|
||||
|
||||
.swiper-container-fade .swiper-slide {
|
||||
pointer-events: none;
|
||||
-webkit-transition-property: opacity;
|
||||
-moz-transition-property: opacity;
|
||||
-o-transition-property: opacity;
|
||||
transition-property: opacity
|
||||
}
|
||||
|
||||
.swiper-container-fade .swiper-slide .swiper-slide {
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.swiper-container-fade .swiper-slide-active,
|
||||
.swiper-container-fade .swiper-slide-active .swiper-slide-active {
|
||||
pointer-events: auto
|
||||
}
|
||||
|
||||
.swiper-scrollbar {
|
||||
border-radius: 10px;
|
||||
position: relative;
|
||||
-ms-touch-action: none;
|
||||
background: rgba(0, 0, 0, .1)
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-scrollbar {
|
||||
position: absolute;
|
||||
left: 1%;
|
||||
bottom: 3px;
|
||||
z-index: 50;
|
||||
height: 5px;
|
||||
width: 98%
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-scrollbar {
|
||||
position: absolute;
|
||||
right: 3px;
|
||||
top: 1%;
|
||||
z-index: 50;
|
||||
width: 5px;
|
||||
height: 98%
|
||||
}
|
||||
|
||||
.swiper-scrollbar-drag {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
background: rgba(0, 0, 0, .5);
|
||||
border-radius: 10px;
|
||||
left: 0;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.swiper-scrollbar-cursor-drag {
|
||||
cursor: move
|
||||
}
|
||||
|
||||
.swiper-lazy-preloader {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
margin-left: -21px;
|
||||
margin-top: -21px;
|
||||
z-index: 10;
|
||||
-webkit-transform-origin: 50%;
|
||||
-moz-transform-origin: 50%;
|
||||
transform-origin: 50%;
|
||||
-webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;
|
||||
-moz-animation: swiper-preloader-spin 1s steps(12, end) infinite;
|
||||
animation: swiper-preloader-spin 1s steps(12, end) infinite
|
||||
}
|
||||
|
||||
.swiper-lazy-preloader:after {
|
||||
display: block;
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
|
||||
background-position: 50%;
|
||||
-webkit-background-size: 100%;
|
||||
background-size: 100%;
|
||||
background-repeat: no-repeat
|
||||
}
|
||||
|
||||
.swiper-lazy-preloader-white:after {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
@-webkit-keyframes swiper-preloader-spin {
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg)
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes swiper-preloader-spin {
|
||||
100% {
|
||||
transform: rotate(360deg)
|
||||
}
|
||||
}
|
||||
1606
src/bower_components/Swiper/dist/js/swiper.min.js
vendored
1606
src/bower_components/Swiper/dist/js/swiper.min.js
vendored
File diff suppressed because it is too large
Load Diff
9
src/bower_components/Swiper/package.js
vendored
9
src/bower_components/Swiper/package.js
vendored
@@ -1,9 +0,0 @@
|
||||
var version = "3.3.1";
|
||||
Package.describe({
|
||||
name: "nolimits4web:swiper",
|
||||
summary: "iDangero.us Swiper - mobile touch slider with hardware accelerated transitions and native behavior",
|
||||
version: version,
|
||||
git: "https://github.com/nolimits4web/Swiper"
|
||||
}), Package.onUse(function(api) {
|
||||
api.versionsFrom("1.1.0.2"), api.addFiles(["dist/css/swiper.min.css", "dist/js/swiper.js"], ["client"])
|
||||
}), Package.onTest(function(api) {});
|
||||
5
src/bower_components/alameda/alameda.js
vendored
5
src/bower_components/alameda/alameda.js
vendored
@@ -239,6 +239,7 @@ var requirejs, require, define;
|
||||
}
|
||||
|
||||
function delayedError(e) {
|
||||
console.log(e.stack);
|
||||
return setTimeout(function() {
|
||||
e.dynaId && trackedErrors[e.dynaId] || (trackedErrors[e.dynaId] = !0, req.onError(e))
|
||||
}), e
|
||||
@@ -265,7 +266,7 @@ var requirejs, require, define;
|
||||
trackedErrors = obj(),
|
||||
urlFetched = obj(),
|
||||
bundlesMap = obj(),
|
||||
asyncResolve = Promise.resolve();
|
||||
asyncResolve = Promise.resolve(undefined);
|
||||
return load = "function" == typeof importScripts ? function(map) {
|
||||
var url = map.url;
|
||||
urlFetched[url] || (urlFetched[url] = !0, getDefer(map.id), importScripts(url), takeQueue(map.id))
|
||||
@@ -415,4 +416,4 @@ var requirejs, require, define;
|
||||
baseUrl: subPath
|
||||
})), topReq([dataMain])))
|
||||
}
|
||||
}(this, "undefined" != typeof Promise ? Promise : void 0);
|
||||
}(this, "undefined" != typeof Promise ? Promise : void 0);
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
define(["apiclientcore", "localassetmanager"], function(ApiClient, localassetmanager) {
|
||||
//TODO: (vitorsemeano) modify this lines for webpack
|
||||
define(["bower_components/apiclient/apiclientcore", "localassetmanager"], function(ApiClient, localassetmanager) {
|
||||
"use strict";
|
||||
|
||||
if ("cordova" !== window.appMode && "android" !== window.appMode) {
|
||||
return ApiClient;
|
||||
}
|
||||
|
||||
function isLocalId(str) {
|
||||
return startsWith(str, localPrefix)
|
||||
}
|
||||
@@ -242,7 +242,7 @@ define(["events", "appStorage"], function(events, appStorage) {
|
||||
var url = serverAddress || this._serverAddress;
|
||||
if (!url) throw new Error("serverAddress is yet not set");
|
||||
var lowered = url.toLowerCase();
|
||||
return -1 === lowered.indexOf("/emby") && -1 === lowered.indexOf("/mediabrowser") && (url += "/emby"), "/" !== name.charAt(0) && (url += "/"), url += name, params && (params = paramsToString(params)) && (url += "?" + params), url
|
||||
return "/" !== name.charAt(0) && (url += "/"), url += name, params && (params = paramsToString(params)) && (url += "?" + params), url
|
||||
}, ApiClient.prototype.fetchWithFailover = function(request, enableReconnection) {
|
||||
console.log("Requesting " + request.url), request.timeout = 3e4;
|
||||
var instance = this;
|
||||
@@ -303,6 +303,7 @@ define(["events", "appStorage"], function(events, appStorage) {
|
||||
}, ApiClient.prototype.logout = function() {
|
||||
stopBitrateDetection(this), this.closeWebSocket();
|
||||
var done = function() {
|
||||
appStorage.removeItem("user-" + this._currentUser.Id + "-" + this._currentUser.ServerId)
|
||||
this.setAuthenticationInfo(null, null)
|
||||
}.bind(this);
|
||||
if (this.accessToken()) {
|
||||
@@ -1189,14 +1190,12 @@ define(["events", "appStorage"], function(events, appStorage) {
|
||||
data: JSON.stringify(info),
|
||||
contentType: "application/json"
|
||||
})
|
||||
}, ApiClient.prototype.createUser = function(name) {
|
||||
}, ApiClient.prototype.createUser = function(user) {
|
||||
var url = this.getUrl("Users/New");
|
||||
return this.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: {
|
||||
Name: name
|
||||
},
|
||||
data: user,
|
||||
dataType: "json"
|
||||
})
|
||||
}, ApiClient.prototype.updateUser = function(user) {
|
||||
53
src/bower_components/apiclient/appStorage.js
vendored
Normal file
53
src/bower_components/apiclient/appStorage.js
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function onCachePutFail(e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
function updateCache(instance) {
|
||||
if (instance.cache) {
|
||||
instance.cache.put("data", new Response(JSON.stringify(instance.localData))).catch(onCachePutFail);
|
||||
}
|
||||
}
|
||||
|
||||
function onCacheOpened(result) {
|
||||
this.cache = result;
|
||||
this.localData = {};
|
||||
}
|
||||
|
||||
function MyStore() {
|
||||
|
||||
this.setItem = function(name, value) {
|
||||
localStorage.setItem(name, value);
|
||||
|
||||
if (this.localData && this.localData[name] !== value) {
|
||||
this.localData[name] = value;
|
||||
updateCache(this);
|
||||
}
|
||||
};
|
||||
|
||||
this.getItem = function(name) {
|
||||
return localStorage.getItem(name);
|
||||
};
|
||||
|
||||
this.removeItem = function(name) {
|
||||
localStorage.removeItem(name);
|
||||
|
||||
if (this.localData) {
|
||||
delete this.localData[name];
|
||||
updateCache(this);
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
if (self.caches) {
|
||||
self.caches.open("embydata").then(onCacheOpened.bind(this));
|
||||
}
|
||||
} catch (err) {
|
||||
console.log("Error opening cache: " + err);
|
||||
}
|
||||
}
|
||||
|
||||
return new MyStore;
|
||||
});
|
||||
@@ -36,11 +36,11 @@ define(["events", "apiclient", "appStorage"], function(events, apiClientFactory,
|
||||
}
|
||||
|
||||
function updateServerInfo(server, systemInfo) {
|
||||
server.Name = systemInfo.ServerName, systemInfo.Id && (server.Id = systemInfo.Id), systemInfo.LocalAddress && (server.LocalAddress = systemInfo.LocalAddress), systemInfo.WanAddress && (server.RemoteAddress = systemInfo.WanAddress)
|
||||
server.Name = systemInfo.ServerName, systemInfo.Id && (server.Id = systemInfo.Id), systemInfo.LocalAddress && (server.LocalAddress = systemInfo.LocalAddress)
|
||||
}
|
||||
|
||||
function getEmbyServerUrl(baseUrl, handler) {
|
||||
return baseUrl + "/emby/" + handler
|
||||
return baseUrl + "/" + handler
|
||||
}
|
||||
|
||||
function getFetchPromise(request) {
|
||||
@@ -269,12 +269,15 @@ define(["events", "apiclient", "appStorage"], function(events, apiClientFactory,
|
||||
});
|
||||
resolve(servers)
|
||||
};
|
||||
require(["serverdiscovery"], function(serverDiscovery) {
|
||||
serverDiscovery.findServers(1e3).then(onFinish, function() {
|
||||
|
||||
if (window.NativeShell && typeof window.NativeShell.findServers === 'function') {
|
||||
window.NativeShell.findServers(1e3).then(onFinish, function() {
|
||||
onFinish([])
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
} else {
|
||||
resolve([]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function convertEndpointAddressToManualAddress(info) {
|
||||
@@ -741,4 +744,4 @@ define(["events", "apiclient", "appStorage"], function(events, apiClientFactory,
|
||||
}
|
||||
}
|
||||
}, ConnectionManager
|
||||
});
|
||||
});
|
||||
@@ -13,7 +13,7 @@ define(["events", "appStorage"], function(events, appStorage) {
|
||||
}
|
||||
|
||||
function Credentials(key) {
|
||||
this.key = key || "servercredentials3"
|
||||
this.key = key || "jellyfin_credentials"
|
||||
}
|
||||
return Credentials.prototype.clear = function() {
|
||||
this._credentials = null, appStorage.removeItem(this.key)
|
||||
3
src/bower_components/apiclient/package.json
vendored
Normal file
3
src/bower_components/apiclient/package.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"main": "apiclient.js"
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function MyStore() {}
|
||||
|
||||
function updateCache(instance) {
|
||||
instance.cache.put("data", new Response(JSON.stringify(instance.localData)))
|
||||
}
|
||||
return MyStore.prototype.init = function() {
|
||||
var instance = this;
|
||||
return caches.open("embydata").then(function(result) {
|
||||
instance.cache = result, instance.localData = {}
|
||||
})
|
||||
}, MyStore.prototype.setItem = function(name, value) {
|
||||
if (this.localData) {
|
||||
this.localData[name] !== value && (this.localData[name] = value, updateCache(this))
|
||||
}
|
||||
}, MyStore.prototype.getItem = function(name) {
|
||||
if (this.localData) return this.localData[name]
|
||||
}, MyStore.prototype.removeItem = function(name) {
|
||||
this.localData && (this.localData[name] = null, delete this.localData[name], updateCache(this))
|
||||
}, new MyStore
|
||||
});
|
||||
@@ -1,37 +0,0 @@
|
||||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function onCachePutFail(e) {
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
function updateCache(instance) {
|
||||
var cache = instance.cache;
|
||||
cache && cache.put("data", new Response(JSON.stringify(instance.localData))).catch(onCachePutFail)
|
||||
}
|
||||
|
||||
function onCacheOpened(result) {
|
||||
this.cache = result, this.localData = {}
|
||||
}
|
||||
|
||||
function MyStore() {
|
||||
try {
|
||||
self.caches && caches.open("embydata").then(onCacheOpened.bind(this))
|
||||
} catch (err) {
|
||||
console.log("Error opening cache: " + err)
|
||||
}
|
||||
}
|
||||
return MyStore.prototype.setItem = function(name, value) {
|
||||
localStorage.setItem(name, value);
|
||||
var localData = this.localData;
|
||||
if (localData) {
|
||||
localData[name] !== value && (localData[name] = value, updateCache(this))
|
||||
}
|
||||
}, MyStore.prototype.getItem = function(name) {
|
||||
return localStorage.getItem(name)
|
||||
}, MyStore.prototype.removeItem = function(name) {
|
||||
localStorage.removeItem(name);
|
||||
var localData = this.localData;
|
||||
localData && (localData[name] = null, delete localData[name], updateCache(this))
|
||||
}, new MyStore
|
||||
});
|
||||
@@ -1,14 +0,0 @@
|
||||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function MyStore() {
|
||||
this.localData = {}
|
||||
}
|
||||
return MyStore.prototype.setItem = function(name, value) {
|
||||
this.localData[name] = value
|
||||
}, MyStore.prototype.getItem = function(name) {
|
||||
return this.localData[name]
|
||||
}, MyStore.prototype.removeItem = function(name) {
|
||||
this.localData[name] = null
|
||||
}, new MyStore
|
||||
});
|
||||
@@ -1,8 +0,0 @@
|
||||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function FileUpload() {}
|
||||
return FileUpload.prototype.upload = function(file, url) {
|
||||
return Promise.reject()
|
||||
}, FileUpload
|
||||
});
|
||||
@@ -1,8 +0,0 @@
|
||||
define([], function() {
|
||||
"use strict";
|
||||
return {
|
||||
findServers: function(timeoutMs) {
|
||||
return Promise.resolve([])
|
||||
}
|
||||
}
|
||||
});
|
||||
15
src/bower_components/emby-apiclient/wakeonlan.js
vendored
15
src/bower_components/emby-apiclient/wakeonlan.js
vendored
@@ -1,15 +0,0 @@
|
||||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function send(info) {
|
||||
return Promise.reject()
|
||||
}
|
||||
|
||||
function isSupported() {
|
||||
return !1
|
||||
}
|
||||
return {
|
||||
send: send,
|
||||
isSupported: isSupported
|
||||
}
|
||||
});
|
||||
@@ -1,34 +0,0 @@
|
||||
define(['dialog', 'globalize'], function (dialog, globalize) {
|
||||
'use strict';
|
||||
|
||||
return function (text, title) {
|
||||
|
||||
var options;
|
||||
if (typeof text === 'string') {
|
||||
options = {
|
||||
title: title,
|
||||
text: text
|
||||
};
|
||||
} else {
|
||||
options = text;
|
||||
}
|
||||
|
||||
var items = [];
|
||||
|
||||
items.push({
|
||||
name: globalize.translate('ButtonGotIt'),
|
||||
id: 'ok',
|
||||
type: 'submit'
|
||||
});
|
||||
|
||||
options.buttons = items;
|
||||
|
||||
return dialog(options).then(function (result) {
|
||||
if (result === 'ok') {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return Promise.reject();
|
||||
});
|
||||
};
|
||||
});
|
||||
@@ -1,23 +0,0 @@
|
||||
define([], function () {
|
||||
'use strict';
|
||||
|
||||
function replaceAll(str, find, replace) {
|
||||
|
||||
return str.split(find).join(replace);
|
||||
}
|
||||
|
||||
return function (options) {
|
||||
|
||||
if (typeof options === 'string') {
|
||||
options = {
|
||||
text: options
|
||||
};
|
||||
}
|
||||
|
||||
var text = replaceAll(options.text || '', '<br/>', '\n');
|
||||
|
||||
alert(text);
|
||||
|
||||
return Promise.resolve();
|
||||
};
|
||||
});
|
||||
@@ -1,7 +0,0 @@
|
||||
.card-round:focus > .cardBox-focustransform {
|
||||
transform: scale(1.26, 1.26);
|
||||
}
|
||||
|
||||
.cardImageContainer-round, .cardImage-round {
|
||||
border-radius: 1000px;
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
.emby-scrollbuttons-scroller {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.scrollbuttoncontainer {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1;
|
||||
font-size: 3em;
|
||||
color: #fff;
|
||||
display: none;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.scrollbuttoncontainer-left {
|
||||
background: rgba(20, 20, 20, .5);
|
||||
background: -moz-linear-gradient(left,#000 0,rgba(0,0,0,0) 100%);
|
||||
background: -webkit-linear-gradient(left,#000 0,rgba(0,0,0,0) 100%);
|
||||
background: linear-gradient(to right,#000,rgba(0,0,0,0));
|
||||
}
|
||||
|
||||
.scrollbuttoncontainer-right {
|
||||
background: rgba(20, 20, 20, .5);
|
||||
background: -moz-linear-gradient(right,#000 0,rgba(0,0,0,0) 100%);
|
||||
background: -webkit-linear-gradient(right,#000 0,rgba(0,0,0,0) 100%);
|
||||
background: linear-gradient(to left,#000,rgba(0,0,0,0));
|
||||
}
|
||||
|
||||
.emby-scrollbuttons-scroller:hover .scrollbuttoncontainer {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.scrollbuttoncontainer-left {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.scrollbuttoncontainer-right {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.emby-scrollbuttons-scrollbutton {
|
||||
margin: 0 -.2em;
|
||||
transition: transform 160ms ease-out;
|
||||
}
|
||||
|
||||
.scrollbuttoncontainer:hover > .emby-scrollbuttons-scrollbutton {
|
||||
transform: scale(1.3, 1.3);
|
||||
}
|
||||
|
||||
.emby-scrollbuttons-scrollbutton:after {
|
||||
content: '';
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.emby-scrollbuttons-scrollbutton:focus {
|
||||
color: inherit !important;
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
define(['multi-download'], function (multiDownload) {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
download: function (items) {
|
||||
|
||||
multiDownload(items.map(function (item) {
|
||||
return item.url;
|
||||
}));
|
||||
}
|
||||
};
|
||||
});
|
||||
@@ -1,12 +0,0 @@
|
||||
define([], function () {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
fileExists: function (path) {
|
||||
return Promise.reject();
|
||||
},
|
||||
directoryExists: function (path) {
|
||||
return Promise.reject();
|
||||
}
|
||||
};
|
||||
});
|
||||
@@ -1,26 +0,0 @@
|
||||
define(['dom', 'fullscreenManager'], function (dom, fullscreenManager) {
|
||||
'use strict';
|
||||
|
||||
function isTargetValid(target) {
|
||||
|
||||
if (dom.parentWithTag(target, ['BUTTON', 'INPUT', 'TEXTAREA'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
dom.addEventListener(window, 'dblclick', function (e) {
|
||||
|
||||
if (isTargetValid(e.target)) {
|
||||
if (fullscreenManager.isFullScreen()) {
|
||||
fullscreenManager.exitFullscreen();
|
||||
} else {
|
||||
fullscreenManager.requestFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
}, {
|
||||
passive: true
|
||||
});
|
||||
});
|
||||
@@ -1,88 +0,0 @@
|
||||
define(['dialogHelper', 'layoutManager', 'globalize', 'require', 'events', 'homescreenSettings', 'paper-icon-button-light', 'css!./../formdialog'], function (dialogHelper, layoutManager, globalize, require, events, HomescreenSettings) {
|
||||
'use strict';
|
||||
|
||||
function centerFocus(elem, horiz, on) {
|
||||
require(['scrollHelper'], function (scrollHelper) {
|
||||
var fn = on ? 'on' : 'off';
|
||||
scrollHelper.centerFocus[fn](elem, horiz);
|
||||
});
|
||||
}
|
||||
|
||||
function show(options) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['text!./homescreensettingsdialog.template.html'], function (template) {
|
||||
|
||||
var dialogOptions = {
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
};
|
||||
|
||||
if (layoutManager.tv) {
|
||||
dialogOptions.size = 'fullscreen';
|
||||
} else {
|
||||
dialogOptions.size = 'medium-tall';
|
||||
}
|
||||
|
||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
||||
|
||||
dlg.classList.add('formDialog');
|
||||
|
||||
var html = '';
|
||||
var submitted = false;
|
||||
|
||||
html += globalize.translateDocument(template, 'core');
|
||||
|
||||
dlg.innerHTML = html;
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, true);
|
||||
}
|
||||
|
||||
var homescreenSettingsInstance = new HomescreenSettings({
|
||||
serverId: options.serverId,
|
||||
userId: options.userId,
|
||||
element: dlg.querySelector('.settingsContent'),
|
||||
userSettings: options.userSettings,
|
||||
enableSaveButton: false,
|
||||
enableSaveConfirmation: false
|
||||
});
|
||||
|
||||
dialogHelper.open(dlg);
|
||||
|
||||
dlg.addEventListener('close', function () {
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, false);
|
||||
}
|
||||
|
||||
if (submitted) {
|
||||
resolve();
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
|
||||
dlg.querySelector('.btnCancel').addEventListener('click', function (e) {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
|
||||
dlg.querySelector('.btnSave').addEventListener('click', function (e) {
|
||||
|
||||
submitted = true;
|
||||
homescreenSettingsInstance.submit();
|
||||
});
|
||||
|
||||
events.on(homescreenSettingsInstance, 'saved', function () {
|
||||
submitted = true;
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
show: show
|
||||
};
|
||||
});
|
||||
@@ -1,22 +0,0 @@
|
||||
<div class="formDialogHeader">
|
||||
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>
|
||||
<h3 class="formDialogHeaderTitle">
|
||||
${HeaderDisplaySettings}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="formDialogContent smoothScrollY">
|
||||
<div class="dialogContentInner dialog-content-centered">
|
||||
|
||||
<div class="settingsContent">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="formDialogFooter">
|
||||
<button is="emby-button" type="button" class="raised button-submit block formDialogFooterItem btnSave">
|
||||
<span>${Save}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,11 +0,0 @@
|
||||
.homeLibraryButton {
|
||||
min-width: 18%;
|
||||
margin: .5em !important;
|
||||
}
|
||||
|
||||
@media all and (max-width: 50em) {
|
||||
|
||||
.homeLibraryButton {
|
||||
width: 46% !important;
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
<div class="formDialogHeader">
|
||||
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>
|
||||
<h3 class="formDialogHeaderTitle">
|
||||
${Search}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="formDialogContent">
|
||||
<div class="dialogContentInner">
|
||||
<div class="flex align-items-center justify-content-center flex-wrap-wrap" style="margin: 2em 0;">
|
||||
|
||||
<div style="margin: 0;">
|
||||
<label for="selectImageProvider" style="display: inline-block;">${LabelSource}</label>
|
||||
<select id="selectImageProvider" style="padding-left:.5em;padding-right:0;display: inline-block;width:auto!important;">
|
||||
<option value="">${All}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div style="margin-left:1em;">
|
||||
<label for="selectBrowsableImageType" style="display: inline-block;">${LabelType}</label>
|
||||
<select id="selectBrowsableImageType" style="padding-left:.5em;padding-right:0;display: inline-block;width:auto!important;">
|
||||
<option value="Primary">${Primary}</option>
|
||||
<option value="Art">${Art}</option>
|
||||
<option value="Backdrop">${Backdrop}</option>
|
||||
<option value="Banner">${Banner}</option>
|
||||
<option value="Box">${Box}</option>
|
||||
<option value="BoxRear">${BoxRear}</option>
|
||||
<option value="Disc">${Disc}</option>
|
||||
<option value="Logo">${Logo}</option>
|
||||
<option value="Menu">${Menu}</option>
|
||||
<option value="Screenshot">${Screenshot}</option>
|
||||
<option value="Thumb">${Thumb}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="availableImagesPaging" style="margin-left:1em;"></div>
|
||||
<label style="margin: 0 0 0 1em;width:auto;">
|
||||
<input id="chkAllLanguages" type="checkbox" is="emby-checkbox" />
|
||||
<span>${AllLanguages}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="availableImagesList vertical-wrap centered"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,255 +0,0 @@
|
||||
define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', 'require', 'css!./style'], function (lazyLoader, imageFetcher, layoutManager, browser, appSettings, require) {
|
||||
'use strict';
|
||||
|
||||
var requestIdleCallback = window.requestIdleCallback || function (fn) {
|
||||
fn();
|
||||
};
|
||||
|
||||
var self = {};
|
||||
|
||||
// seeing slow performance with firefox
|
||||
var enableFade = false;
|
||||
|
||||
function fillImage(elem, source, enableEffects) {
|
||||
|
||||
if (!elem) {
|
||||
throw new Error('elem cannot be null');
|
||||
}
|
||||
|
||||
if (!source) {
|
||||
source = elem.getAttribute('data-src');
|
||||
}
|
||||
|
||||
if (!source) {
|
||||
return;
|
||||
}
|
||||
|
||||
fillImageElement(elem, source, enableEffects);
|
||||
}
|
||||
|
||||
function fillImageElement(elem, source, enableEffects) {
|
||||
imageFetcher.loadImage(elem, source).then(function () {
|
||||
|
||||
var fillingVibrant = false;//fillVibrant(elem, source);
|
||||
|
||||
if (enableFade && enableEffects !== false && !fillingVibrant) {
|
||||
fadeIn(elem);
|
||||
}
|
||||
|
||||
elem.removeAttribute("data-src");
|
||||
});
|
||||
}
|
||||
|
||||
function fillVibrant(img, url, canvas, canvasContext) {
|
||||
|
||||
var vibrantElement = img.getAttribute('data-vibrant');
|
||||
if (!vibrantElement) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (window.Vibrant) {
|
||||
fillVibrantOnLoaded(img, url, vibrantElement, canvas, canvasContext);
|
||||
return true;
|
||||
}
|
||||
|
||||
require(['vibrant'], function () {
|
||||
fillVibrantOnLoaded(img, url, vibrantElement, canvas, canvasContext);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
function fillVibrantOnLoaded(img, url, vibrantElement) {
|
||||
|
||||
vibrantElement = document.getElementById(vibrantElement);
|
||||
if (!vibrantElement) {
|
||||
return;
|
||||
}
|
||||
|
||||
requestIdleCallback(function () {
|
||||
|
||||
//var now = new Date().getTime();
|
||||
getVibrantInfoFromElement(img, url).then(function (vibrantInfo) {
|
||||
|
||||
var swatch = vibrantInfo.split('|');
|
||||
//console.log('vibrant took ' + (new Date().getTime() - now) + 'ms');
|
||||
if (swatch.length) {
|
||||
|
||||
var index = 0;
|
||||
var style = vibrantElement.style;
|
||||
style.backgroundColor = swatch[index];
|
||||
style.color = swatch[index + 1];
|
||||
|
||||
var classList = vibrantElement.classList;
|
||||
|
||||
if (classList.contains('cardFooter')) {
|
||||
classList.add('cardFooter-vibrant');
|
||||
} else {
|
||||
classList.add('vibrant');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
/*
|
||||
* Results into:
|
||||
* Vibrant #7a4426
|
||||
* Muted #7b9eae
|
||||
* DarkVibrant #348945
|
||||
* DarkMuted #141414
|
||||
* LightVibrant #f3ccb4
|
||||
*/
|
||||
}
|
||||
|
||||
function getVibrantInfoFromElement(elem, url) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['vibrant'], function () {
|
||||
|
||||
if (elem.tagName === 'IMG') {
|
||||
resolve(getVibrantInfo(elem, url));
|
||||
return;
|
||||
}
|
||||
|
||||
var img = new Image();
|
||||
img.onload = function () {
|
||||
resolve(getVibrantInfo(img, url));
|
||||
};
|
||||
img.src = url;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getSettingsKey(url) {
|
||||
|
||||
var parts = url.split('://');
|
||||
url = parts[parts.length - 1];
|
||||
|
||||
url = url.substring(url.indexOf('/') + 1);
|
||||
|
||||
url = url.split('?')[0];
|
||||
|
||||
var cacheKey = 'vibrant31';
|
||||
//cacheKey = 'vibrant' + new Date().getTime();
|
||||
return cacheKey + url;
|
||||
}
|
||||
|
||||
function getCachedVibrantInfo(url) {
|
||||
|
||||
return appSettings.get(getSettingsKey(url));
|
||||
}
|
||||
|
||||
function getVibrantInfo(img, url) {
|
||||
|
||||
var value = getCachedVibrantInfo(url);
|
||||
if (value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
var vibrant = new Vibrant(img);
|
||||
var swatches = vibrant.swatches();
|
||||
|
||||
value = '';
|
||||
var swatch = swatches.DarkVibrant;
|
||||
value += getSwatchString(swatch);
|
||||
|
||||
appSettings.set(getSettingsKey(url), value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
function getSwatchString(swatch) {
|
||||
|
||||
if (swatch) {
|
||||
return swatch.getHex() + '|' + swatch.getBodyTextColor() + '|' + swatch.getTitleTextColor();
|
||||
}
|
||||
return '||';
|
||||
}
|
||||
|
||||
function fadeIn(elem) {
|
||||
|
||||
var cssClass = 'lazy-image-fadein';
|
||||
|
||||
elem.classList.add(cssClass);
|
||||
}
|
||||
|
||||
function lazyChildren(elem) {
|
||||
|
||||
lazyLoader.lazyChildren(elem, fillImage);
|
||||
}
|
||||
|
||||
function getPrimaryImageAspectRatio(items) {
|
||||
|
||||
var values = [];
|
||||
|
||||
for (var i = 0, length = items.length; i < length; i++) {
|
||||
|
||||
var ratio = items[i].PrimaryImageAspectRatio || 0;
|
||||
|
||||
if (!ratio) {
|
||||
continue;
|
||||
}
|
||||
|
||||
values[values.length] = ratio;
|
||||
}
|
||||
|
||||
if (!values.length) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Use the median
|
||||
values.sort(function (a, b) { return a - b; });
|
||||
|
||||
var half = Math.floor(values.length / 2);
|
||||
|
||||
var result;
|
||||
|
||||
if (values.length % 2) {
|
||||
result = values[half];
|
||||
}
|
||||
else {
|
||||
result = (values[half - 1] + values[half]) / 2.0;
|
||||
}
|
||||
|
||||
// If really close to 2:3 (poster image), just return 2:3
|
||||
var aspect2x3 = 2 / 3;
|
||||
if (Math.abs(aspect2x3 - result) <= 0.15) {
|
||||
return aspect2x3;
|
||||
}
|
||||
|
||||
// If really close to 16:9 (episode image), just return 16:9
|
||||
var aspect16x9 = 16 / 9;
|
||||
if (Math.abs(aspect16x9 - result) <= 0.2) {
|
||||
return aspect16x9;
|
||||
}
|
||||
|
||||
// If really close to 1 (square image), just return 1
|
||||
if (Math.abs(1 - result) <= 0.15) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// If really close to 4:3 (poster image), just return 2:3
|
||||
var aspect4x3 = 4 / 3;
|
||||
if (Math.abs(aspect4x3 - result) <= 0.15) {
|
||||
return aspect4x3;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function fillImages(elems) {
|
||||
|
||||
for (var i = 0, length = elems.length; i < length; i++) {
|
||||
var elem = elems[0];
|
||||
fillImage(elem);
|
||||
}
|
||||
}
|
||||
|
||||
self.fillImages = fillImages;
|
||||
self.lazyImage = fillImage;
|
||||
self.lazyChildren = lazyChildren;
|
||||
self.getPrimaryImageAspectRatio = getPrimaryImageAspectRatio;
|
||||
self.getCachedVibrantInfo = getCachedVibrantInfo;
|
||||
self.getVibrantInfoFromElement = getVibrantInfoFromElement;
|
||||
|
||||
return self;
|
||||
});
|
||||
@@ -1,672 +0,0 @@
|
||||
define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', 'playbackManager', 'loading', 'appSettings', 'browser', 'actionsheet'], function (appHost, globalize, connectionManager, itemHelper, appRouter, playbackManager, loading, appSettings, browser, actionsheet) {
|
||||
'use strict';
|
||||
|
||||
function getCommands(options) {
|
||||
|
||||
var item = options.item;
|
||||
|
||||
var canPlay = playbackManager.canPlay(item);
|
||||
|
||||
var commands = [];
|
||||
|
||||
var user = options.user;
|
||||
|
||||
var restrictOptions = (browser.operaTv || browser.web0s) && !user.Policy.IsAdministrator;
|
||||
|
||||
if (canPlay && item.MediaType !== 'Photo') {
|
||||
if (options.play !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('Play'),
|
||||
id: 'resume'
|
||||
});
|
||||
}
|
||||
|
||||
if (options.playAllFromHere && item.Type !== 'Program' && item.Type !== 'TvChannel') {
|
||||
commands.push({
|
||||
name: globalize.translate('PlayAllFromHere'),
|
||||
id: 'playallfromhere'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (playbackManager.canQueue(item)) {
|
||||
|
||||
if (options.queue !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('AddToPlayQueue'),
|
||||
id: 'queue'
|
||||
});
|
||||
}
|
||||
|
||||
if (options.queue !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('PlayNext'),
|
||||
id: 'queuenext'
|
||||
});
|
||||
}
|
||||
|
||||
//if (options.queueAllFromHere) {
|
||||
// commands.push({
|
||||
// name: globalize.translate('QueueAllFromHere'),
|
||||
// id: 'queueallfromhere'
|
||||
// });
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (item.IsFolder || item.Type === "MusicArtist" || item.Type === "MusicGenre") {
|
||||
if (item.CollectionType !== 'livetv') {
|
||||
if (options.shuffle !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('Shuffle'),
|
||||
id: 'shuffle'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (item.MediaType === "Audio" || item.Type === "MusicAlbum" || item.Type === "MusicArtist" || item.Type === "MusicGenre") {
|
||||
if (options.instantMix !== false && !itemHelper.isLocalItem(item)) {
|
||||
commands.push({
|
||||
name: globalize.translate('InstantMix'),
|
||||
id: 'instantmix'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (commands.length) {
|
||||
commands.push({
|
||||
divider: true
|
||||
});
|
||||
}
|
||||
|
||||
if (!restrictOptions) {
|
||||
if (itemHelper.supportsAddingToCollection(item)) {
|
||||
commands.push({
|
||||
name: globalize.translate('AddToCollection'),
|
||||
id: 'addtocollection'
|
||||
});
|
||||
}
|
||||
|
||||
if (itemHelper.supportsAddingToPlaylist(item)) {
|
||||
commands.push({
|
||||
name: globalize.translate('AddToPlaylist'),
|
||||
id: 'addtoplaylist'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if ((item.Type === 'Timer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('CancelRecording'),
|
||||
id: 'canceltimer'
|
||||
});
|
||||
}
|
||||
|
||||
if ((item.Type === 'Recording' && item.Status === 'InProgress') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('CancelRecording'),
|
||||
id: 'canceltimer'
|
||||
});
|
||||
}
|
||||
|
||||
if ((item.Type === 'SeriesTimer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('CancelSeries'),
|
||||
id: 'cancelseriestimer'
|
||||
});
|
||||
}
|
||||
|
||||
if (itemHelper.canConvert(item, user, connectionManager.getApiClient(item))) {
|
||||
commands.push({
|
||||
name: globalize.translate('Convert'),
|
||||
id: 'convert'
|
||||
});
|
||||
}
|
||||
|
||||
if (item.CanDelete && options.deleteItem !== false) {
|
||||
|
||||
if (item.Type === 'Playlist' || item.Type === 'BoxSet') {
|
||||
commands.push({
|
||||
name: globalize.translate('Delete'),
|
||||
id: 'delete'
|
||||
});
|
||||
} else {
|
||||
commands.push({
|
||||
name: globalize.translate('DeleteMedia'),
|
||||
id: 'delete'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (item.CanDownload && appHost.supports('filedownload')) {
|
||||
commands.push({
|
||||
name: globalize.translate('Download'),
|
||||
id: 'download'
|
||||
});
|
||||
}
|
||||
|
||||
if (appHost.supports('sync') && options.syncLocal !== false) {
|
||||
if (itemHelper.canSync(user, item)) {
|
||||
commands.push({
|
||||
name: globalize.translate('Download'),
|
||||
id: 'synclocal'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var canEdit = itemHelper.canEdit(user, item);
|
||||
if (canEdit) {
|
||||
|
||||
if (options.edit !== false && item.Type !== 'SeriesTimer') {
|
||||
|
||||
var text = (item.Type === 'Timer' || item.Type === 'SeriesTimer') ? globalize.translate('Edit') : globalize.translate('EditMetadata');
|
||||
|
||||
commands.push({
|
||||
name: text,
|
||||
id: 'edit'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (itemHelper.canEditImages(user, item)) {
|
||||
|
||||
if (options.editImages !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('EditImages'),
|
||||
id: 'editimages'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (canEdit) {
|
||||
|
||||
if (item.MediaType === 'Video' && item.Type !== 'TvChannel' && item.Type !== 'Program' && item.LocationType !== 'Virtual' && !(item.Type === 'Recording' && item.Status !== 'Completed')) {
|
||||
if (options.editSubtitles !== false) {
|
||||
commands.push({
|
||||
name: globalize.translate('EditSubtitles'),
|
||||
id: 'editsubtitles'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (options.identify !== false) {
|
||||
if (itemHelper.canIdentify(user, item)) {
|
||||
commands.push({
|
||||
name: globalize.translate('Identify'),
|
||||
id: 'identify'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (item.Type === 'Program' && options.record !== false) {
|
||||
|
||||
if (item.TimerId) {
|
||||
commands.push({
|
||||
name: Globalize.translate('ManageRecording'),
|
||||
id: 'record'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (item.Type === 'Program' && options.record !== false) {
|
||||
|
||||
if (!item.TimerId) {
|
||||
commands.push({
|
||||
name: Globalize.translate('Record'),
|
||||
id: 'record'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (itemHelper.canRefreshMetadata(item, user)) {
|
||||
commands.push({
|
||||
name: globalize.translate('RefreshMetadata'),
|
||||
id: 'refresh'
|
||||
});
|
||||
}
|
||||
|
||||
if (item.PlaylistItemId && options.playlistId) {
|
||||
commands.push({
|
||||
name: globalize.translate('RemoveFromPlaylist'),
|
||||
id: 'removefromplaylist'
|
||||
});
|
||||
}
|
||||
|
||||
if (options.collectionId) {
|
||||
commands.push({
|
||||
name: globalize.translate('RemoveFromCollection'),
|
||||
id: 'removefromcollection'
|
||||
});
|
||||
}
|
||||
|
||||
if (!restrictOptions) {
|
||||
if (options.share === true) {
|
||||
if (itemHelper.canShare(item, user)) {
|
||||
commands.push({
|
||||
name: globalize.translate('Share'),
|
||||
id: 'share'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (options.sync !== false) {
|
||||
if (itemHelper.canSync(user, item)) {
|
||||
commands.push({
|
||||
name: globalize.translate('Sync'),
|
||||
id: 'sync'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (options.openAlbum !== false && item.AlbumId && item.MediaType !== 'Photo') {
|
||||
commands.push({
|
||||
name: Globalize.translate('ViewAlbum'),
|
||||
id: 'album'
|
||||
});
|
||||
}
|
||||
|
||||
if (options.openArtist !== false && item.ArtistItems && item.ArtistItems.length) {
|
||||
commands.push({
|
||||
name: Globalize.translate('ViewArtist'),
|
||||
id: 'artist'
|
||||
});
|
||||
}
|
||||
|
||||
return commands;
|
||||
}
|
||||
|
||||
function getResolveFunction(resolve, id, changed, deleted) {
|
||||
|
||||
return function () {
|
||||
resolve({
|
||||
command: id,
|
||||
updated: changed,
|
||||
deleted: deleted
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
function executeCommand(item, id, options) {
|
||||
|
||||
var itemId = item.Id;
|
||||
var serverId = item.ServerId;
|
||||
var apiClient = connectionManager.getApiClient(serverId);
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
switch (id) {
|
||||
|
||||
case 'addtocollection':
|
||||
{
|
||||
require(['collectionEditor'], function (collectionEditor) {
|
||||
|
||||
new collectionEditor().show({
|
||||
items: [itemId],
|
||||
serverId: serverId
|
||||
|
||||
}).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'addtoplaylist':
|
||||
{
|
||||
require(['playlistEditor'], function (playlistEditor) {
|
||||
|
||||
new playlistEditor().show({
|
||||
items: [itemId],
|
||||
serverId: serverId
|
||||
|
||||
}).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'download':
|
||||
{
|
||||
require(['fileDownloader'], function (fileDownloader) {
|
||||
var downloadHref = apiClient.getItemDownloadUrl(itemId);
|
||||
|
||||
fileDownloader.download([
|
||||
{
|
||||
url: downloadHref,
|
||||
itemId: itemId,
|
||||
serverId: serverId
|
||||
}]);
|
||||
|
||||
getResolveFunction(getResolveFunction(resolve, id), id)();
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case 'editsubtitles':
|
||||
{
|
||||
require(['subtitleEditor'], function (subtitleEditor) {
|
||||
|
||||
subtitleEditor.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'edit':
|
||||
{
|
||||
editItem(apiClient, item).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));
|
||||
break;
|
||||
}
|
||||
case 'editimages':
|
||||
{
|
||||
require(['imageEditor'], function (imageEditor) {
|
||||
|
||||
imageEditor.show({
|
||||
itemId: itemId,
|
||||
serverId: serverId
|
||||
|
||||
}).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'identify':
|
||||
{
|
||||
require(['itemIdentifier'], function (itemIdentifier) {
|
||||
|
||||
itemIdentifier.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'refresh':
|
||||
{
|
||||
refresh(apiClient, item);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'open':
|
||||
{
|
||||
appRouter.showItem(item);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'play':
|
||||
{
|
||||
play(item, false);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'resume':
|
||||
{
|
||||
play(item, true);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'queue':
|
||||
{
|
||||
play(item, false, true);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'queuenext':
|
||||
{
|
||||
play(item, false, true, true);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'record':
|
||||
require(['recordingCreator'], function (recordingCreator) {
|
||||
recordingCreator.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id));
|
||||
});
|
||||
break;
|
||||
case 'shuffle':
|
||||
{
|
||||
playbackManager.shuffle(item);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'instantmix':
|
||||
{
|
||||
playbackManager.instantMix(item);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'delete':
|
||||
{
|
||||
deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id));
|
||||
break;
|
||||
}
|
||||
case 'share':
|
||||
{
|
||||
navigator.share({
|
||||
title: item.Name,
|
||||
text: item.Overview,
|
||||
url: "https://github.com/jellyfin/jellyfin"
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'album':
|
||||
{
|
||||
appRouter.showItem(item.AlbumId, item.ServerId);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'artist':
|
||||
{
|
||||
appRouter.showItem(item.ArtistItems[0].Id, item.ServerId);
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'playallfromhere':
|
||||
{
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'queueallfromhere':
|
||||
{
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'convert':
|
||||
{
|
||||
require(['syncDialog'], function (syncDialog) {
|
||||
syncDialog.showMenu({
|
||||
items: [item],
|
||||
serverId: serverId,
|
||||
mode: 'convert'
|
||||
});
|
||||
});
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'sync':
|
||||
{
|
||||
require(['syncDialog'], function (syncDialog) {
|
||||
syncDialog.showMenu({
|
||||
items: [item],
|
||||
serverId: serverId,
|
||||
mode: 'sync'
|
||||
});
|
||||
});
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'synclocal':
|
||||
{
|
||||
require(['syncDialog'], function (syncDialog) {
|
||||
syncDialog.showMenu({
|
||||
items: [item],
|
||||
serverId: serverId,
|
||||
mode: 'download'
|
||||
});
|
||||
});
|
||||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
}
|
||||
case 'removefromplaylist':
|
||||
|
||||
apiClient.ajax({
|
||||
|
||||
url: apiClient.getUrl('Playlists/' + options.playlistId + '/Items', {
|
||||
EntryIds: [item.PlaylistItemId].join(',')
|
||||
}),
|
||||
|
||||
type: 'DELETE'
|
||||
|
||||
}).then(function () {
|
||||
|
||||
getResolveFunction(resolve, id, true)();
|
||||
});
|
||||
|
||||
break;
|
||||
case 'removefromcollection':
|
||||
|
||||
apiClient.ajax({
|
||||
type: "DELETE",
|
||||
url: apiClient.getUrl("Collections/" + options.collectionId + "/Items", {
|
||||
|
||||
Ids: [item.Id].join(',')
|
||||
})
|
||||
|
||||
}).then(function () {
|
||||
|
||||
getResolveFunction(resolve, id, true)();
|
||||
});
|
||||
|
||||
break;
|
||||
case 'canceltimer':
|
||||
deleteTimer(apiClient, item, resolve, id);
|
||||
break;
|
||||
case 'cancelseriestimer':
|
||||
deleteSeriesTimer(apiClient, item, resolve, id);
|
||||
break;
|
||||
default:
|
||||
reject();
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function deleteTimer(apiClient, item, resolve, command) {
|
||||
|
||||
require(['recordingHelper'], function (recordingHelper) {
|
||||
|
||||
var timerId = item.TimerId || item.Id;
|
||||
|
||||
recordingHelper.cancelTimerWithConfirmation(timerId, item.ServerId).then(function () {
|
||||
getResolveFunction(resolve, command, true)();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function deleteSeriesTimer(apiClient, item, resolve, command) {
|
||||
|
||||
require(['recordingHelper'], function (recordingHelper) {
|
||||
|
||||
recordingHelper.cancelSeriesTimerWithConfirmation(item.Id, item.ServerId).then(function () {
|
||||
getResolveFunction(resolve, command, true)();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function play(item, resume, queue, queueNext) {
|
||||
|
||||
var method = queue ? (queueNext ? 'queueNext' : 'queue') : 'play';
|
||||
|
||||
var startPosition = 0;
|
||||
if (resume && item.UserData && item.UserData.PlaybackPositionTicks) {
|
||||
startPosition = item.UserData.PlaybackPositionTicks;
|
||||
}
|
||||
|
||||
if (item.Type === 'Program') {
|
||||
playbackManager[method]({
|
||||
ids: [item.ChannelId],
|
||||
startPositionTicks: startPosition,
|
||||
serverId: item.ServerId
|
||||
});
|
||||
} else {
|
||||
playbackManager[method]({
|
||||
items: [item],
|
||||
startPositionTicks: startPosition
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function editItem(apiClient, item) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
var serverId = apiClient.serverInfo().Id;
|
||||
|
||||
if (item.Type === 'Timer') {
|
||||
require(['recordingEditor'], function (recordingEditor) {
|
||||
|
||||
recordingEditor.show(item.Id, serverId).then(resolve, reject);
|
||||
});
|
||||
} else if (item.Type === 'SeriesTimer') {
|
||||
require(['seriesRecordingEditor'], function (recordingEditor) {
|
||||
|
||||
recordingEditor.show(item.Id, serverId).then(resolve, reject);
|
||||
});
|
||||
} else {
|
||||
require(['metadataEditor'], function (metadataEditor) {
|
||||
|
||||
metadataEditor.show(item.Id, serverId).then(resolve, reject);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function deleteItem(apiClient, item) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['deleteHelper'], function (deleteHelper) {
|
||||
|
||||
deleteHelper.deleteItem({
|
||||
|
||||
item: item,
|
||||
navigate: false
|
||||
|
||||
}).then(function () {
|
||||
|
||||
resolve(true);
|
||||
|
||||
}, reject);
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function refresh(apiClient, item) {
|
||||
|
||||
require(['refreshDialog'], function (refreshDialog) {
|
||||
new refreshDialog({
|
||||
itemIds: [item.Id],
|
||||
serverId: apiClient.serverInfo().Id,
|
||||
mode: item.Type === 'CollectionFolder' ? 'scan' : null
|
||||
}).show();
|
||||
});
|
||||
}
|
||||
|
||||
function show(options) {
|
||||
|
||||
var commands = getCommands(options);
|
||||
|
||||
if (!commands.length) {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
return actionsheet.show({
|
||||
|
||||
items: commands,
|
||||
positionTo: options.positionTo,
|
||||
|
||||
resolveOnClick: ['share']
|
||||
|
||||
}).then(function (id) {
|
||||
return executeCommand(options.item, id, options);
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
getCommands: getCommands,
|
||||
show: show
|
||||
};
|
||||
});
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 38 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 38 KiB |
@@ -1,80 +0,0 @@
|
||||
define(['playbackManager', 'itemHelper'], function (playbackManager, itemHelper) {
|
||||
"use strict";
|
||||
|
||||
function getRequirePromise(deps) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(deps, resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function validatePlayback(options) {
|
||||
|
||||
var feature = 'playback';
|
||||
if (options.item && (options.item.Type === 'TvChannel' || options.item.Type === 'Recording')) {
|
||||
feature = 'livetv';
|
||||
}
|
||||
|
||||
if (feature === 'playback') {
|
||||
var player = playbackManager.getCurrentPlayer();
|
||||
if (player && !player.isLocalPlayer) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
}
|
||||
|
||||
return getRequirePromise(["registrationServices"]).then(function (registrationServices) {
|
||||
|
||||
return registrationServices.validateFeature(feature, options).then(function (result) {
|
||||
|
||||
if (result && result.enableTimeLimit) {
|
||||
startAutoStopTimer();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var autoStopTimeout;
|
||||
function startAutoStopTimer() {
|
||||
stopAutoStopTimer();
|
||||
autoStopTimeout = setTimeout(onAutoStopTimeout, 63000);
|
||||
}
|
||||
|
||||
function onAutoStopTimeout() {
|
||||
stopAutoStopTimer();
|
||||
playbackManager.stop();
|
||||
}
|
||||
|
||||
function stopAutoStopTimer() {
|
||||
|
||||
var timeout = autoStopTimeout;
|
||||
if (timeout) {
|
||||
clearTimeout(timeout);
|
||||
autoStopTimeout = null;
|
||||
}
|
||||
}
|
||||
|
||||
function PlaybackValidation() {
|
||||
|
||||
this.name = 'Playback validation';
|
||||
this.type = 'preplayintercept';
|
||||
this.id = 'playbackvalidation';
|
||||
this.order = -1;
|
||||
}
|
||||
|
||||
PlaybackValidation.prototype.intercept = function (options) {
|
||||
|
||||
// Don't care about video backdrops, or theme music or any kind of non-fullscreen playback
|
||||
if (!options.fullscreen) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
if (options.item && itemHelper.isLocalItem(options.item)) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return validatePlayback(options);
|
||||
};
|
||||
|
||||
return PlaybackValidation;
|
||||
});
|
||||
@@ -1,25 +0,0 @@
|
||||
if (!Array.prototype.filter) {
|
||||
Array.prototype.filter = function (fun /*, thisp*/) {
|
||||
"use strict";
|
||||
|
||||
if (this == null)
|
||||
throw new TypeError();
|
||||
|
||||
var t = Object(this);
|
||||
var len = t.length >>> 0;
|
||||
if (typeof fun != "function")
|
||||
throw new TypeError();
|
||||
|
||||
var res = [];
|
||||
var thisp = arguments[1];
|
||||
for (var i = 0; i < len; i++) {
|
||||
if (i in t) {
|
||||
var val = t[i]; // in case fun mutates this
|
||||
if (fun.call(thisp, val, i, t))
|
||||
res.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
if (!Function.prototype.bind) {
|
||||
Function.prototype.bind = function (oThis) {
|
||||
if (typeof this !== 'function') {
|
||||
// closest thing possible to the ECMAScript 5
|
||||
// internal IsCallable function
|
||||
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
|
||||
}
|
||||
|
||||
var aArgs = Array.prototype.slice.call(arguments, 1),
|
||||
fToBind = this,
|
||||
fNOP = function () { },
|
||||
fBound = function () {
|
||||
return fToBind.apply(this instanceof fNOP
|
||||
? this
|
||||
: oThis,
|
||||
aArgs.concat(Array.prototype.slice.call(arguments)));
|
||||
};
|
||||
|
||||
if (this.prototype) {
|
||||
// Function.prototype doesn't have a prototype property
|
||||
fNOP.prototype = this.prototype;
|
||||
}
|
||||
fBound.prototype = new fNOP();
|
||||
|
||||
return fBound;
|
||||
};
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
|
||||
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
|
||||
|
||||
// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
|
||||
|
||||
// MIT license
|
||||
|
||||
(function () {
|
||||
var lastTime = 0;
|
||||
var vendors = ['ms', 'moz', 'webkit', 'o'];
|
||||
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
|
||||
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
|
||||
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame']
|
||||
|| window[vendors[x] + 'CancelRequestAnimationFrame'];
|
||||
}
|
||||
|
||||
if (!window.requestAnimationFrame)
|
||||
window.requestAnimationFrame = function (callback, element) {
|
||||
var currTime = new Date().getTime();
|
||||
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
||||
var id = window.setTimeout(function () { callback(currTime + timeToCall); },
|
||||
timeToCall);
|
||||
lastTime = currTime + timeToCall;
|
||||
return id;
|
||||
};
|
||||
|
||||
if (!window.cancelAnimationFrame)
|
||||
window.cancelAnimationFrame = function (id) {
|
||||
clearTimeout(id);
|
||||
};
|
||||
}());
|
||||
@@ -1,16 +0,0 @@
|
||||
define(['appSettings', 'loading', 'apphost', 'events', 'shell', 'globalize', 'dialogHelper', 'connectionManager', 'layoutManager', 'emby-button', 'emby-linkbutton'], function (appSettings, loading, appHost, events, shell, globalize, dialogHelper, connectionManager, layoutManager) {
|
||||
'use strict';
|
||||
|
||||
function validateFeature(feature, options) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function showPremiereInfo() {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return {
|
||||
validateFeature: validateFeature,
|
||||
showPremiereInfo: showPremiereInfo
|
||||
};
|
||||
});
|
||||
@@ -1,6 +0,0 @@
|
||||
self.addEventListener('sync', function (event) {
|
||||
'use strict';
|
||||
|
||||
if (event.tag === 'emby-sync') {
|
||||
}
|
||||
});
|
||||
21
src/bower_components/emby-webcomponents/shell.js
vendored
21
src/bower_components/emby-webcomponents/shell.js
vendored
@@ -1,21 +0,0 @@
|
||||
define([], function () {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
openUrl: function (url) {
|
||||
window.open(url, '_blank');
|
||||
},
|
||||
canExec: false,
|
||||
exec: function (options) {
|
||||
// options.path
|
||||
// options.arguments
|
||||
return Promise.reject();
|
||||
},
|
||||
enableFullscreen: function () {
|
||||
// do nothing since this is for native apps
|
||||
},
|
||||
disableFullscreen: function () {
|
||||
// do nothing since this is for native apps
|
||||
}
|
||||
};
|
||||
});
|
||||
@@ -1,355 +0,0 @@
|
||||
define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, pluginManager, backdrop, globalize, require, appSettings) {
|
||||
'use strict';
|
||||
|
||||
var currentSkin;
|
||||
|
||||
function getCurrentSkin() {
|
||||
return currentSkin;
|
||||
}
|
||||
|
||||
function getRequirePromise(deps) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(deps, resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function loadSkin(id) {
|
||||
|
||||
var newSkin = pluginManager.plugins().filter(function (p) {
|
||||
return p.id === id;
|
||||
})[0];
|
||||
|
||||
if (!newSkin) {
|
||||
newSkin = pluginManager.plugins().filter(function (p) {
|
||||
return p.id === 'defaultskin';
|
||||
})[0];
|
||||
}
|
||||
|
||||
var unloadPromise;
|
||||
|
||||
if (currentSkin) {
|
||||
|
||||
if (currentSkin.id === newSkin.id) {
|
||||
// Nothing to do, it's already the active skin
|
||||
return Promise.resolve(currentSkin);
|
||||
}
|
||||
unloadPromise = unloadSkin(currentSkin);
|
||||
} else {
|
||||
unloadPromise = Promise.resolve();
|
||||
}
|
||||
|
||||
return unloadPromise.then(function () {
|
||||
var deps = newSkin.getDependencies();
|
||||
|
||||
console.log('Loading skin dependencies');
|
||||
|
||||
return getRequirePromise(deps).then(function () {
|
||||
|
||||
console.log('Skin dependencies loaded');
|
||||
|
||||
var strings = newSkin.getTranslations ? newSkin.getTranslations() : [];
|
||||
|
||||
return globalize.loadStrings({
|
||||
|
||||
name: newSkin.id,
|
||||
strings: strings
|
||||
|
||||
}).then(function () {
|
||||
|
||||
globalize.defaultModule(newSkin.id);
|
||||
return loadSkinHeader(newSkin);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function unloadSkin(skin) {
|
||||
|
||||
unloadTheme();
|
||||
backdrop.clear();
|
||||
|
||||
console.log('Unloading skin: ' + skin.name);
|
||||
|
||||
// TODO: unload css
|
||||
|
||||
return skin.unload().then(function () {
|
||||
document.dispatchEvent(new CustomEvent("skinunload", {
|
||||
detail: {
|
||||
name: skin.name
|
||||
}
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
function loadSkinHeader(skin) {
|
||||
|
||||
return getSkinHeader(skin).then(function (headerHtml) {
|
||||
|
||||
document.querySelector('.skinHeader').innerHTML = headerHtml;
|
||||
|
||||
currentSkin = skin;
|
||||
skin.load();
|
||||
|
||||
return skin;
|
||||
});
|
||||
}
|
||||
|
||||
var cacheParam = new Date().getTime();
|
||||
|
||||
function getSkinHeader(skin) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
if (!skin.getHeaderTemplate) {
|
||||
resolve('');
|
||||
return;
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
var url = skin.getHeaderTemplate();
|
||||
url += url.indexOf('?') === -1 ? '?' : '&';
|
||||
url += 'v=' + cacheParam;
|
||||
|
||||
xhr.open('GET', url, true);
|
||||
|
||||
xhr.onload = function (e) {
|
||||
if (this.status < 400) {
|
||||
resolve(this.response);
|
||||
} else {
|
||||
resolve('');
|
||||
}
|
||||
};
|
||||
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
|
||||
function loadUserSkin(options) {
|
||||
|
||||
var skin = userSettings.get('skin', false) || 'defaultskin';
|
||||
|
||||
loadSkin(skin).then(function (skin) {
|
||||
|
||||
options = options || {};
|
||||
if (options.start) {
|
||||
Emby.Page.invokeShortcut(options.start);
|
||||
} else {
|
||||
Emby.Page.goHome();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
events.on(userSettings, 'change', function (e, name) {
|
||||
if (name === 'skin' || name === 'language') {
|
||||
loadUserSkin();
|
||||
}
|
||||
});
|
||||
|
||||
var themeStyleElement;
|
||||
var currentThemeId;
|
||||
function unloadTheme() {
|
||||
var elem = themeStyleElement;
|
||||
if (elem) {
|
||||
|
||||
elem.parentNode.removeChild(elem);
|
||||
themeStyleElement = null;
|
||||
currentThemeId = null;
|
||||
}
|
||||
}
|
||||
|
||||
function getThemes() {
|
||||
|
||||
if (currentSkin.getThemes) {
|
||||
return currentSkin.getThemes();
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
var skinManager = {
|
||||
getCurrentSkin: getCurrentSkin,
|
||||
loadSkin: loadSkin,
|
||||
loadUserSkin: loadUserSkin,
|
||||
getThemes: getThemes
|
||||
};
|
||||
|
||||
function onRegistrationSuccess() {
|
||||
appSettings.set('appthemesregistered', 'true');
|
||||
}
|
||||
|
||||
function onRegistrationFailure() {
|
||||
appSettings.set('appthemesregistered', 'false');
|
||||
}
|
||||
|
||||
function isRegistered() {
|
||||
|
||||
getRequirePromise(['registrationServices']).then(function (registrationServices) {
|
||||
registrationServices.validateFeature('themes', {
|
||||
|
||||
showDialog: false
|
||||
|
||||
}).then(onRegistrationSuccess, onRegistrationFailure);
|
||||
});
|
||||
|
||||
return appSettings.get('appthemesregistered') !== 'false';
|
||||
}
|
||||
|
||||
function getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty) {
|
||||
|
||||
var themes = skinManager.getThemes();
|
||||
var defaultTheme;
|
||||
var selectedTheme;
|
||||
|
||||
for (var i = 0, length = themes.length; i < length; i++) {
|
||||
|
||||
var theme = themes[i];
|
||||
if (theme[isDefaultProperty]) {
|
||||
defaultTheme = theme;
|
||||
}
|
||||
if (id === theme.id) {
|
||||
selectedTheme = theme;
|
||||
}
|
||||
}
|
||||
|
||||
selectedTheme = selectedTheme || defaultTheme;
|
||||
|
||||
if (selectedTheme.id !== defaultTheme.id && requiresRegistration && !isRegistered()) {
|
||||
selectedTheme = defaultTheme;
|
||||
}
|
||||
|
||||
var embyWebComponentsBowerPath = 'bower_components/emby-webcomponents';
|
||||
|
||||
return {
|
||||
stylesheetPath: require.toUrl(embyWebComponentsBowerPath + '/themes/' + selectedTheme.id + '/theme.css'),
|
||||
themeId: selectedTheme.id
|
||||
};
|
||||
}
|
||||
|
||||
var themeResources = {};
|
||||
var lastSound = 0;
|
||||
var currentSound;
|
||||
|
||||
function loadThemeResources(id) {
|
||||
|
||||
lastSound = 0;
|
||||
|
||||
if (currentSound) {
|
||||
currentSound.stop();
|
||||
currentSound = null;
|
||||
}
|
||||
|
||||
backdrop.clear();
|
||||
}
|
||||
|
||||
function onThemeLoaded() {
|
||||
document.documentElement.classList.remove('preload');
|
||||
|
||||
|
||||
try {
|
||||
var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue("background-color");
|
||||
|
||||
if (color) {
|
||||
appHost.setThemeColor(color);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
console.log('Error setting theme color: ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
skinManager.setTheme = function (id, context) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
var requiresRegistration = true;
|
||||
|
||||
if (currentThemeId && currentThemeId === id) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
var isDefaultProperty = context === 'serverdashboard' ? 'isDefaultServerDashboard' : 'isDefault';
|
||||
var info = getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty);
|
||||
|
||||
if (currentThemeId && currentThemeId === info.themeId) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
var linkUrl = info.stylesheetPath;
|
||||
|
||||
unloadTheme();
|
||||
|
||||
var link = document.createElement('link');
|
||||
|
||||
link.setAttribute('rel', 'stylesheet');
|
||||
link.setAttribute('type', 'text/css');
|
||||
link.onload = function () {
|
||||
|
||||
onThemeLoaded();
|
||||
resolve();
|
||||
};
|
||||
|
||||
link.setAttribute('href', linkUrl);
|
||||
document.head.appendChild(link);
|
||||
themeStyleElement = link;
|
||||
currentThemeId = info.themeId;
|
||||
loadThemeResources(info.themeId);
|
||||
|
||||
onViewBeforeShow({});
|
||||
});
|
||||
};
|
||||
|
||||
function onViewBeforeShow(e) {
|
||||
|
||||
if (e.detail && e.detail.type === 'video-osd') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (themeResources.backdrop) {
|
||||
|
||||
backdrop.setBackdrop(themeResources.backdrop);
|
||||
}
|
||||
|
||||
if (!browser.mobile && userSettings.enableThemeSongs()) {
|
||||
if (lastSound === 0) {
|
||||
|
||||
if (themeResources.themeSong) {
|
||||
playSound(themeResources.themeSong);
|
||||
}
|
||||
|
||||
} else if ((new Date().getTime() - lastSound) > 30000) {
|
||||
if (themeResources.effect) {
|
||||
playSound(themeResources.effect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('viewshow', onViewBeforeShow);
|
||||
|
||||
function playSound(path, volume) {
|
||||
|
||||
lastSound = new Date().getTime();
|
||||
|
||||
require(['howler'], function (howler) {
|
||||
|
||||
try {
|
||||
var sound = new Howl({
|
||||
src: [path],
|
||||
volume: volume || 0.1
|
||||
});
|
||||
|
||||
sound.play();
|
||||
currentSound = sound;
|
||||
}
|
||||
catch (err) {
|
||||
console.log('Error playing sound: ' + err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return skinManager;
|
||||
});
|
||||
@@ -1,129 +0,0 @@
|
||||
define([], function () {
|
||||
'use strict';
|
||||
|
||||
function getStaticBackdrops() {
|
||||
var list = [];
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg1-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg2-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg3-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg4-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg5-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg6-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg7-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg8-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg9-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg10-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg11-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg12-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg13-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg14-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
list.push([
|
||||
{
|
||||
url: 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/images/wallpaper/bg15-1920.jpg',
|
||||
width: 1920
|
||||
}
|
||||
]);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
function getRandomInt(min, max) {
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
|
||||
function getRandomImageUrl() {
|
||||
var images = getStaticBackdrops();
|
||||
var index = getRandomInt(0, images.length - 1);
|
||||
return images[index][0].url;
|
||||
}
|
||||
|
||||
return {
|
||||
getStaticBackdrops: getStaticBackdrops,
|
||||
getRandomImageUrl: getRandomImageUrl
|
||||
};
|
||||
});
|
||||
@@ -1,188 +0,0 @@
|
||||
define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby-button'], function (connectionManager, serverNotifications, events, globalize, EmbyButtonPrototype) {
|
||||
'use strict';
|
||||
|
||||
function onClick(e) {
|
||||
|
||||
var button = this;
|
||||
var id = button.getAttribute('data-id');
|
||||
var serverId = button.getAttribute('data-serverid');
|
||||
var apiClient = connectionManager.getApiClient(serverId);
|
||||
|
||||
if (!button.classList.contains('downloadbutton-on')) {
|
||||
|
||||
require(['syncDialog'], function (syncDialog) {
|
||||
syncDialog.showMenu({
|
||||
|
||||
items: [id],
|
||||
mode: 'download',
|
||||
serverId: serverId
|
||||
|
||||
}).then(function () {
|
||||
|
||||
button.dispatchEvent(new CustomEvent('download', {
|
||||
cancelable: false
|
||||
}));
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
require(['confirm'], function (confirm) {
|
||||
|
||||
confirm({
|
||||
|
||||
text: globalize.translate('ConfirmRemoveDownload'),
|
||||
confirmText: globalize.translate('RemoveDownload'),
|
||||
cancelText: globalize.translate('KeepDownload'),
|
||||
primary: 'cancel'
|
||||
|
||||
}).then(function () {
|
||||
apiClient.cancelSyncItems([id]);
|
||||
|
||||
button.dispatchEvent(new CustomEvent('download-cancel', {
|
||||
cancelable: false
|
||||
}));
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function updateSyncStatus(button, syncPercent) {
|
||||
|
||||
var icon = button.iconElement;
|
||||
if (!icon) {
|
||||
button.iconElement = button.querySelector('i');
|
||||
icon = button.iconElement;
|
||||
}
|
||||
|
||||
if (syncPercent != null) {
|
||||
button.classList.add('downloadbutton-on');
|
||||
|
||||
if (icon) {
|
||||
icon.classList.add('downloadbutton-icon-on');
|
||||
}
|
||||
|
||||
} else {
|
||||
button.classList.remove('downloadbutton-on');
|
||||
|
||||
if (icon) {
|
||||
icon.classList.remove('downloadbutton-icon-on');
|
||||
}
|
||||
}
|
||||
|
||||
if ((syncPercent || 0) >= 100) {
|
||||
button.classList.add('downloadbutton-complete');
|
||||
|
||||
if (icon) {
|
||||
icon.classList.add('downloadbutton-icon-complete');
|
||||
}
|
||||
} else {
|
||||
button.classList.remove('downloadbutton-complete');
|
||||
|
||||
if (icon) {
|
||||
icon.classList.remove('downloadbutton-icon-complete');
|
||||
}
|
||||
}
|
||||
|
||||
var text;
|
||||
if ((syncPercent || 0) >= 100) {
|
||||
text = globalize.translate('Downloaded');
|
||||
} else if (syncPercent != null) {
|
||||
text = globalize.translate('Downloading');
|
||||
} else {
|
||||
text = globalize.translate('Download');
|
||||
}
|
||||
|
||||
var textElement = button.querySelector('.emby-downloadbutton-downloadtext');
|
||||
if (textElement) {
|
||||
textElement.innerHTML = text;
|
||||
}
|
||||
|
||||
button.title = text;
|
||||
}
|
||||
|
||||
function clearEvents(button) {
|
||||
|
||||
button.removeEventListener('click', onClick);
|
||||
}
|
||||
|
||||
function bindEvents(button) {
|
||||
|
||||
clearEvents(button);
|
||||
|
||||
button.addEventListener('click', onClick);
|
||||
}
|
||||
|
||||
var EmbyDownloadButtonPrototype = Object.create(EmbyButtonPrototype);
|
||||
|
||||
EmbyDownloadButtonPrototype.createdCallback = function () {
|
||||
|
||||
// base method
|
||||
if (EmbyButtonPrototype.createdCallback) {
|
||||
EmbyButtonPrototype.createdCallback.call(this);
|
||||
}
|
||||
};
|
||||
|
||||
EmbyDownloadButtonPrototype.attachedCallback = function () {
|
||||
|
||||
// base method
|
||||
if (EmbyButtonPrototype.attachedCallback) {
|
||||
EmbyButtonPrototype.attachedCallback.call(this);
|
||||
}
|
||||
|
||||
var itemId = this.getAttribute('data-id');
|
||||
var serverId = this.getAttribute('data-serverid');
|
||||
if (itemId && serverId) {
|
||||
|
||||
bindEvents(this);
|
||||
}
|
||||
};
|
||||
|
||||
EmbyDownloadButtonPrototype.detachedCallback = function () {
|
||||
|
||||
// base method
|
||||
if (EmbyButtonPrototype.detachedCallback) {
|
||||
EmbyButtonPrototype.detachedCallback.call(this);
|
||||
}
|
||||
|
||||
clearEvents(this);
|
||||
|
||||
this.iconElement = null;
|
||||
};
|
||||
|
||||
function fetchAndUpdate(button, item) {
|
||||
|
||||
connectionManager.getApiClient(item.ServerId).getSyncStatus(item.Id).then(function (result) {
|
||||
|
||||
updateSyncStatus(button, result.Progress);
|
||||
|
||||
}, function () {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
EmbyDownloadButtonPrototype.setItem = function (item) {
|
||||
|
||||
if (item) {
|
||||
|
||||
this.setAttribute('data-id', item.Id);
|
||||
this.setAttribute('data-serverid', item.ServerId);
|
||||
|
||||
fetchAndUpdate(this, item);
|
||||
|
||||
bindEvents(this);
|
||||
|
||||
} else {
|
||||
|
||||
this.removeAttribute('data-id');
|
||||
this.removeAttribute('data-serverid');
|
||||
clearEvents(this);
|
||||
}
|
||||
};
|
||||
|
||||
document.registerElement('emby-downloadbutton', {
|
||||
prototype: EmbyDownloadButtonPrototype,
|
||||
extends: 'button'
|
||||
});
|
||||
});
|
||||
736
src/bower_components/emby-webcomponents/sync/sync.js
vendored
736
src/bower_components/emby-webcomponents/sync/sync.js
vendored
@@ -1,736 +0,0 @@
|
||||
define(['apphost', 'globalize', 'connectionManager', 'layoutManager', 'focusManager', 'scrollHelper', 'appSettings', 'registrationServices', 'dialogHelper', 'paper-icon-button-light', 'formDialogStyle'], function (appHost, globalize, connectionManager, layoutManager, focusManager, scrollHelper, appSettings, registrationServices, dialogHelper) {
|
||||
'use strict';
|
||||
|
||||
var currentDialogOptions;
|
||||
|
||||
function submitJob(dlg, apiClient, userId, syncOptions, form) {
|
||||
|
||||
if (!userId) {
|
||||
throw new Error('userId cannot be null');
|
||||
}
|
||||
|
||||
if (!syncOptions) {
|
||||
throw new Error('syncOptions cannot be null');
|
||||
}
|
||||
|
||||
if (!form) {
|
||||
throw new Error('form cannot be null');
|
||||
}
|
||||
|
||||
var selectSyncTarget = form.querySelector('#selectSyncTarget');
|
||||
var target = selectSyncTarget ? selectSyncTarget.value : null;
|
||||
|
||||
if (!target) {
|
||||
|
||||
require(['toast'], function (toast) {
|
||||
toast(globalize.translate('PleaseSelectDeviceToSyncTo'));
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
var options = {
|
||||
|
||||
userId: userId,
|
||||
TargetId: target,
|
||||
|
||||
ParentId: syncOptions.ParentId,
|
||||
Category: syncOptions.Category
|
||||
};
|
||||
|
||||
setJobValues(options, form);
|
||||
|
||||
if (syncOptions.items && syncOptions.items.length) {
|
||||
options.ItemIds = (syncOptions.items || []).map(function (i) {
|
||||
return i.Id || i;
|
||||
}).join(',');
|
||||
}
|
||||
|
||||
apiClient.ajax({
|
||||
|
||||
type: "POST",
|
||||
url: apiClient.getUrl("Sync/Jobs"),
|
||||
data: JSON.stringify(options),
|
||||
contentType: "application/json",
|
||||
dataType: 'json'
|
||||
|
||||
}).then(function () {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
require(['toast'], function (toast) {
|
||||
|
||||
showSubmissionToast(target, apiClient);
|
||||
|
||||
if (syncOptions.mode === 'download') {
|
||||
syncNow();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function showSubmissionToast(targetId, apiClient) {
|
||||
|
||||
require(['toast'], function (toast) {
|
||||
|
||||
var msg = targetId === apiClient.deviceId() ?
|
||||
globalize.translate('DownloadingDots') :
|
||||
globalize.translate('SyncingDots');
|
||||
|
||||
toast(msg);
|
||||
});
|
||||
}
|
||||
|
||||
function syncNow() {
|
||||
require(['localsync'], function (localSync) {
|
||||
localSync.sync();
|
||||
});
|
||||
}
|
||||
|
||||
function submitQuickSyncJob(apiClient, userId, targetId, syncOptions) {
|
||||
|
||||
if (!userId) {
|
||||
throw new Error('userId cannot be null');
|
||||
}
|
||||
|
||||
if (!syncOptions) {
|
||||
throw new Error('syncOptions cannot be null');
|
||||
}
|
||||
|
||||
if (!targetId) {
|
||||
throw new Error('targetId cannot be null');
|
||||
}
|
||||
|
||||
var options = {
|
||||
|
||||
userId: userId,
|
||||
TargetId: targetId,
|
||||
|
||||
ParentId: syncOptions.ParentId,
|
||||
Category: syncOptions.Category,
|
||||
Quality: syncOptions.Quality,
|
||||
Bitrate: syncOptions.Bitrate
|
||||
};
|
||||
|
||||
if (syncOptions.items && syncOptions.items.length) {
|
||||
options.ItemIds = (syncOptions.items || []).map(function (i) {
|
||||
return i.Id || i;
|
||||
}).join(',');
|
||||
}
|
||||
|
||||
return apiClient.ajax({
|
||||
|
||||
type: "POST",
|
||||
url: apiClient.getUrl("Sync/Jobs"),
|
||||
data: JSON.stringify(options),
|
||||
contentType: "application/json",
|
||||
dataType: 'json'
|
||||
|
||||
}).then(function () {
|
||||
|
||||
require(['toast'], function (toast) {
|
||||
|
||||
showSubmissionToast(targetId, apiClient);
|
||||
|
||||
if (syncOptions.mode === 'download') {
|
||||
syncNow();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function setJobValues(job, form) {
|
||||
|
||||
var txtBitrate = form.querySelector('#txtBitrate');
|
||||
var bitrate = txtBitrate ? txtBitrate.value : null;
|
||||
|
||||
if (bitrate) {
|
||||
bitrate = parseFloat(bitrate) * 1000000;
|
||||
}
|
||||
job.Bitrate = bitrate;
|
||||
|
||||
var selectQuality = form.querySelector('#selectQuality');
|
||||
if (selectQuality) {
|
||||
job.Quality = selectQuality.value;
|
||||
|
||||
appSettings.set('sync-lastquality', job.Quality || '');
|
||||
}
|
||||
|
||||
var selectProfile = form.querySelector('#selectProfile');
|
||||
if (selectProfile) {
|
||||
job.Profile = selectProfile.value;
|
||||
}
|
||||
|
||||
var txtItemLimit = form.querySelector('#txtItemLimit');
|
||||
if (txtItemLimit) {
|
||||
job.ItemLimit = txtItemLimit.value || null;
|
||||
}
|
||||
|
||||
var chkSyncNewContent = form.querySelector('#chkSyncNewContent');
|
||||
if (chkSyncNewContent) {
|
||||
job.SyncNewContent = chkSyncNewContent.checked;
|
||||
}
|
||||
|
||||
var chkUnwatchedOnly = form.querySelector('#chkUnwatchedOnly');
|
||||
if (chkUnwatchedOnly) {
|
||||
job.UnwatchedOnly = chkUnwatchedOnly.checked;
|
||||
}
|
||||
}
|
||||
|
||||
function renderForm(options) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['emby-checkbox', 'emby-input', 'emby-select'], function () {
|
||||
|
||||
renderFormInternal(options, connectionManager.deviceId(), resolve);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function renderFormInternal(options, defaultTargetId, resolve) {
|
||||
|
||||
var elem = options.elem;
|
||||
var dialogOptions = options.dialogOptions;
|
||||
|
||||
var targets = dialogOptions.Targets;
|
||||
|
||||
var html = '';
|
||||
|
||||
var mode = options.mode;
|
||||
var targetContainerClass = mode === 'download' ? ' hide' : '';
|
||||
|
||||
var syncTargetLabel = mode === 'convert' ? globalize.translate('LabelConvertTo') : globalize.translate('LabelSyncTo');
|
||||
|
||||
if (options.readOnlySyncTarget) {
|
||||
html += '<div class="inputContainer' + targetContainerClass + '">';
|
||||
html += '<input is="emby-input" type="text" id="selectSyncTarget" readonly label="' + syncTargetLabel + '"/>';
|
||||
html += '</div>';
|
||||
} else {
|
||||
html += '<div class="selectContainer' + targetContainerClass + '">';
|
||||
html += '<select is="emby-select" id="selectSyncTarget" required="required" label="' + syncTargetLabel + '">';
|
||||
|
||||
html += targets.map(function (t) {
|
||||
|
||||
var isSelected = defaultTargetId === t.Id;
|
||||
var selectedHtml = isSelected ? ' selected="selected"' : '';
|
||||
return '<option' + selectedHtml + ' value="' + t.Id + '">' + t.Name + '</option>';
|
||||
|
||||
}).join('');
|
||||
html += '</select>';
|
||||
if (!targets.length) {
|
||||
html += '<div class="fieldDescription">' + globalize.translate('LabelSyncNoTargetsHelp') + '</div>';
|
||||
}
|
||||
|
||||
if (appHost.supports('externallinks')) {
|
||||
html += '<div class="fieldDescription"><a is="emby-linkbutton" class="button-link lnkLearnMore" href="https://github.com/MediaBrowser/Wiki/wiki/Sync" target="_blank">' + globalize.translate('LearnMore') + '</a></div>';
|
||||
}
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
html += '<div class="fldProfile selectContainer hide">';
|
||||
html += '<select is="emby-select" id="selectProfile" label="' + globalize.translate('LabelProfile') + '">';
|
||||
html += '</select>';
|
||||
html += '<div class="fieldDescription profileDescription"></div>';
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="fldQuality selectContainer hide">';
|
||||
html += '<select is="emby-select" id="selectQuality" required="required" label="' + globalize.translate('LabelQuality') + '">';
|
||||
html += '</select>';
|
||||
html += '<div class="fieldDescription qualityDescription"></div>';
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="fldBitrate inputContainer hide">';
|
||||
html += '<input is="emby-input" type="number" step=".1" min=".1" id="txtBitrate" label="' + globalize.translate('LabelBitrateMbps') + '"/>';
|
||||
html += '</div>';
|
||||
|
||||
if (dialogOptions.Options.indexOf('UnwatchedOnly') !== -1) {
|
||||
html += '<div class="checkboxContainer checkboxContainer-withDescription">';
|
||||
html += '<label>';
|
||||
html += '<input is="emby-checkbox" type="checkbox" id="chkUnwatchedOnly"/>';
|
||||
|
||||
if (mode === 'convert') {
|
||||
html += '<span>' + globalize.translate('ConvertUnwatchedVideosOnly') + '</span>';
|
||||
} else {
|
||||
html += '<span>' + globalize.translate('SyncUnwatchedVideosOnly') + '</span>';
|
||||
}
|
||||
|
||||
html += '</label>';
|
||||
|
||||
if (mode === 'convert') {
|
||||
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('ConvertUnwatchedVideosOnlyHelp') + '</div>';
|
||||
} else {
|
||||
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('SyncUnwatchedVideosOnlyHelp') + '</div>';
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
if (dialogOptions.Options.indexOf('SyncNewContent') !== -1) {
|
||||
html += '<div class="checkboxContainer checkboxContainer-withDescription">';
|
||||
html += '<label>';
|
||||
html += '<input is="emby-checkbox" type="checkbox" id="chkSyncNewContent"/>';
|
||||
|
||||
if (mode === 'convert') {
|
||||
html += '<span>' + globalize.translate('AutomaticallyConvertNewContent') + '</span>';
|
||||
} else {
|
||||
html += '<span>' + globalize.translate('AutomaticallySyncNewContent') + '</span>';
|
||||
}
|
||||
|
||||
html += '</label>';
|
||||
|
||||
if (mode === 'convert') {
|
||||
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('AutomaticallyConvertNewContentHelp') + '</div>';
|
||||
} else {
|
||||
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('AutomaticallySyncNewContentHelp') + '</div>';
|
||||
}
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
if (dialogOptions.Options.indexOf('ItemLimit') !== -1) {
|
||||
html += '<div class="inputContainer">';
|
||||
html += '<input is="emby-input" type="number" step="1" min="1" id="txtItemLimit" label="' + globalize.translate('LabelItemLimit') + '"/>';
|
||||
|
||||
if (mode === 'convert') {
|
||||
html += '<div class="fieldDescription">' + globalize.translate('ConvertItemLimitHelp') + '</div>';
|
||||
} else {
|
||||
html += '<div class="fieldDescription">' + globalize.translate('DownloadItemLimitHelp') + '</div>';
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
//html += '</div>';
|
||||
//html += '</div>';
|
||||
|
||||
elem.innerHTML = html;
|
||||
|
||||
var selectSyncTarget = elem.querySelector('#selectSyncTarget');
|
||||
if (selectSyncTarget) {
|
||||
selectSyncTarget.addEventListener('change', function () {
|
||||
loadQualityOptions(elem, this.value, options.dialogOptionsFn).then(resolve);
|
||||
});
|
||||
selectSyncTarget.dispatchEvent(new CustomEvent('change', {
|
||||
bubbles: true
|
||||
}));
|
||||
}
|
||||
|
||||
var selectProfile = elem.querySelector('#selectProfile');
|
||||
if (selectProfile) {
|
||||
selectProfile.addEventListener('change', function () {
|
||||
onProfileChange(elem, this.value);
|
||||
});
|
||||
|
||||
if (dialogOptions.ProfileOptions.length) {
|
||||
selectProfile.dispatchEvent(new CustomEvent('change', {
|
||||
bubbles: true
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
var selectQuality = elem.querySelector('#selectQuality');
|
||||
if (selectQuality) {
|
||||
selectQuality.addEventListener('change', function () {
|
||||
onQualityChange(elem, this.value);
|
||||
});
|
||||
selectQuality.dispatchEvent(new CustomEvent('change', {
|
||||
bubbles: true
|
||||
}));
|
||||
}
|
||||
|
||||
// This isn't ideal, but allow time for the change handlers above to run
|
||||
setTimeout(function () {
|
||||
focusManager.autoFocus(elem);
|
||||
}, 100);
|
||||
}
|
||||
|
||||
function showWifiMessage() {
|
||||
|
||||
require(['dialog', 'appRouter'], function (dialog, appRouter) {
|
||||
|
||||
var options = {
|
||||
|
||||
title: globalize.translate('HeaderWaitingForWifi'),
|
||||
text: globalize.translate('WifiRequiredToDownload')
|
||||
};
|
||||
|
||||
var items = [];
|
||||
|
||||
items.push({
|
||||
name: options.confirmText || globalize.translate('ButtonOk'),
|
||||
id: 'ok',
|
||||
type: 'submit'
|
||||
});
|
||||
|
||||
items.push({
|
||||
name: options.cancelText || globalize.translate('HeaderDownloadSettings'),
|
||||
id: 'downloadsettings',
|
||||
type: 'cancel'
|
||||
});
|
||||
|
||||
options.buttons = items;
|
||||
|
||||
dialog(options).then(function (result) {
|
||||
|
||||
if (result === 'ok') {
|
||||
return Promise.resolve();
|
||||
}
|
||||
if (result === 'downloadsettings') {
|
||||
appRouter.show(appRouter.getRouteUrl('downloadsettings'));
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return Promise.reject();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function validateNetwork() {
|
||||
|
||||
var network = navigator.connection ? navigator.connection.type : null;
|
||||
|
||||
switch (network) {
|
||||
|
||||
case 'cellular':
|
||||
case 'bluetooth':
|
||||
showWifiMessage();
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function showSyncMenu(options) {
|
||||
|
||||
if (options.mode === 'download' && appSettings.syncOnlyOnWifi() && !validateNetwork()) {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
return registrationServices.validateFeature('sync').then(function () {
|
||||
return showSyncMenuInternal(options);
|
||||
});
|
||||
}
|
||||
|
||||
function enableAutoSync(options) {
|
||||
|
||||
if (options.mode !== 'download') {
|
||||
return false;
|
||||
}
|
||||
|
||||
var firstItem = (options.items || [])[0] || {};
|
||||
|
||||
if (firstItem.Type === 'Audio') {
|
||||
return true;
|
||||
}
|
||||
if (firstItem.Type === 'MusicAlbum') {
|
||||
return true;
|
||||
}
|
||||
if (firstItem.Type === 'MusicArtist') {
|
||||
return true;
|
||||
}
|
||||
if (firstItem.Type === 'MusicGenre') {
|
||||
return true;
|
||||
}
|
||||
if (firstItem.Type === 'Playlist' && firstItem.MediaType === 'Audio') {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function showSyncMenuInternal(options) {
|
||||
|
||||
var apiClient = connectionManager.getApiClient(options.serverId);
|
||||
var userId = apiClient.getCurrentUserId();
|
||||
|
||||
if (enableAutoSync(options)) {
|
||||
|
||||
return submitQuickSyncJob(apiClient, userId, apiClient.deviceId(), {
|
||||
items: options.items,
|
||||
Quality: 'custom',
|
||||
Bitrate: appSettings.maxStaticMusicBitrate()
|
||||
});
|
||||
}
|
||||
|
||||
var dialogOptionsFn = getTargetDialogOptionsFn(apiClient, {
|
||||
UserId: userId,
|
||||
ItemIds: (options.items || []).map(function (i) {
|
||||
return i.Id || i;
|
||||
}).join(','),
|
||||
|
||||
ParentId: options.ParentId,
|
||||
Category: options.Category,
|
||||
IncludeProviders: options.mode === 'convert' ? 'ConvertSyncProvider' : null,
|
||||
ExcludeProviders: options.mode === 'convert' ? null : 'ConvertSyncProvider'
|
||||
});
|
||||
|
||||
return dialogOptionsFn().then(function (dialogOptions) {
|
||||
|
||||
currentDialogOptions = dialogOptions;
|
||||
|
||||
var dlgElementOptions = {
|
||||
removeOnClose: true,
|
||||
scrollY: false,
|
||||
autoFocus: false
|
||||
};
|
||||
|
||||
if (layoutManager.tv) {
|
||||
dlgElementOptions.size = 'fullscreen';
|
||||
} else {
|
||||
dlgElementOptions.size = 'small';
|
||||
}
|
||||
|
||||
var dlg = dialogHelper.createDialog(dlgElementOptions);
|
||||
|
||||
dlg.classList.add('formDialog');
|
||||
|
||||
var html = '';
|
||||
html += '<div class="formDialogHeader">';
|
||||
html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon"></i></button>';
|
||||
html += '<h3 class="formDialogHeaderTitle">';
|
||||
|
||||
var syncButtonLabel = options.mode === 'download' ?
|
||||
globalize.translate('Download') :
|
||||
(options.mode === 'convert' ? globalize.translate('Convert') : globalize.translate('Sync'));
|
||||
|
||||
html += syncButtonLabel;
|
||||
html += '</h3>';
|
||||
|
||||
if (appHost.supports('externallinks')) {
|
||||
html += '<a is="emby-linkbutton" href="https://github.com/MediaBrowser/Wiki/wiki/Sync" target="_blank" class="button-link lnkHelp" style="margin-top:0;display:inline-block;vertical-align:middle;margin-left:auto;"><i class="md-icon">info</i><span>' + globalize.translate('Help') + '</span></a>';
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="formDialogContent smoothScrollY" style="padding-top:2em;">';
|
||||
html += '<div class="dialogContentInner dialog-content-centered">';
|
||||
|
||||
html += '<form class="formSubmitSyncRequest" style="margin: auto;">';
|
||||
|
||||
html += '<div class="formFields"></div>';
|
||||
|
||||
html += '<div class="formDialogFooter">';
|
||||
|
||||
html += '<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem"><span>' + syncButtonLabel + '</span></button>';
|
||||
html += '</div>';
|
||||
|
||||
html += '</form>';
|
||||
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
|
||||
dlg.innerHTML = html;
|
||||
|
||||
var submitted = false;
|
||||
|
||||
dlg.querySelector('form').addEventListener('submit', function (e) {
|
||||
|
||||
submitted = submitJob(dlg, apiClient, userId, options, this);
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
dlg.querySelector('.btnCancel').addEventListener('click', function () {
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
|
||||
if (layoutManager.tv) {
|
||||
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
|
||||
}
|
||||
|
||||
var promise = dialogHelper.open(dlg);
|
||||
|
||||
renderForm({
|
||||
elem: dlg.querySelector('.formFields'),
|
||||
dialogOptions: dialogOptions,
|
||||
dialogOptionsFn: dialogOptionsFn,
|
||||
mode: options.mode
|
||||
});
|
||||
|
||||
return promise.then(function () {
|
||||
if (layoutManager.tv) {
|
||||
scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
|
||||
}
|
||||
|
||||
if (submitted) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return Promise.reject();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getTargetDialogOptionsFn(apiClient, query) {
|
||||
|
||||
return function (targetId) {
|
||||
|
||||
query.TargetId = targetId;
|
||||
return apiClient.getJSON(apiClient.getUrl('Sync/Options', query));
|
||||
};
|
||||
}
|
||||
|
||||
function setQualityFieldVisible(form, visible) {
|
||||
|
||||
var fldQuality = form.querySelector('.fldQuality');
|
||||
var selectQuality = form.querySelector('#selectQuality');
|
||||
|
||||
if (visible) {
|
||||
if (fldQuality) {
|
||||
fldQuality.classList.remove('hide');
|
||||
}
|
||||
if (selectQuality) {
|
||||
//selectQuality.setAttribute('required', 'required');
|
||||
|
||||
// This is a hack due to what appears to be a edge bug but it shoudln't matter as the list always has selectable items
|
||||
selectQuality.removeAttribute('required');
|
||||
}
|
||||
} else {
|
||||
if (fldQuality) {
|
||||
fldQuality.classList.add('hide');
|
||||
}
|
||||
if (selectQuality) {
|
||||
selectQuality.removeAttribute('required');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onProfileChange(form, profileId) {
|
||||
|
||||
var options = currentDialogOptions || {};
|
||||
|
||||
var profileOptions = options.ProfileOptions || [];
|
||||
|
||||
if (!profileOptions.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
var option = profileOptions.filter(function (o) {
|
||||
return o.Id === profileId;
|
||||
})[0];
|
||||
|
||||
var qualityOptions = options.QualityOptions || [];
|
||||
|
||||
if (option) {
|
||||
form.querySelector('.profileDescription').innerHTML = option.Description || '';
|
||||
setQualityFieldVisible(form, qualityOptions.length > 0 && option.EnableQualityOptions && options.Options.indexOf('Quality') !== -1);
|
||||
} else {
|
||||
form.querySelector('.profileDescription').innerHTML = '';
|
||||
setQualityFieldVisible(form, qualityOptions.length > 0 && options.Options.indexOf('Quality') !== -1);
|
||||
}
|
||||
}
|
||||
|
||||
function onQualityChange(form, qualityId) {
|
||||
|
||||
var options = currentDialogOptions || {};
|
||||
var option = (options.QualityOptions || []).filter(function (o) {
|
||||
return o.Id === qualityId;
|
||||
})[0];
|
||||
|
||||
var qualityDescription = form.querySelector('.qualityDescription');
|
||||
|
||||
if (option) {
|
||||
qualityDescription.innerHTML = option.Description || '';
|
||||
} else {
|
||||
qualityDescription.innerHTML = '';
|
||||
}
|
||||
|
||||
var fldBitrate = form.querySelector('.fldBitrate');
|
||||
var txtBitrate = form.querySelector('#txtBitrate');
|
||||
|
||||
if (qualityId === 'custom') {
|
||||
|
||||
if (fldBitrate) {
|
||||
fldBitrate.classList.remove('hide');
|
||||
}
|
||||
if (txtBitrate) {
|
||||
txtBitrate.setAttribute('required', 'required');
|
||||
}
|
||||
} else {
|
||||
if (fldBitrate) {
|
||||
fldBitrate.classList.add('hide');
|
||||
}
|
||||
if (txtBitrate) {
|
||||
txtBitrate.removeAttribute('required');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function renderTargetDialogOptions(form, options) {
|
||||
|
||||
currentDialogOptions = options;
|
||||
|
||||
var fldProfile = form.querySelector('.fldProfile');
|
||||
var selectProfile = form.querySelector('#selectProfile');
|
||||
|
||||
if (options.ProfileOptions.length && options.Options.indexOf('Profile') !== -1) {
|
||||
if (fldProfile) {
|
||||
fldProfile.classList.remove('hide');
|
||||
}
|
||||
if (selectProfile) {
|
||||
selectProfile.setAttribute('required', 'required');
|
||||
}
|
||||
} else {
|
||||
if (fldProfile) {
|
||||
fldProfile.classList.add('hide');
|
||||
}
|
||||
if (selectProfile) {
|
||||
selectProfile.removeAttribute('required');
|
||||
}
|
||||
}
|
||||
|
||||
setQualityFieldVisible(form, options.QualityOptions.length > 0);
|
||||
|
||||
if (selectProfile) {
|
||||
selectProfile.innerHTML = options.ProfileOptions.map(function (o) {
|
||||
|
||||
var selectedAttribute = o.IsDefault ? ' selected="selected"' : '';
|
||||
return '<option value="' + o.Id + '"' + selectedAttribute + '>' + o.Name + '</option>';
|
||||
|
||||
}).join('');
|
||||
|
||||
selectProfile.dispatchEvent(new CustomEvent('change', {
|
||||
bubbles: true
|
||||
}));
|
||||
}
|
||||
|
||||
var selectQuality = form.querySelector('#selectQuality');
|
||||
if (selectQuality) {
|
||||
selectQuality.innerHTML = options.QualityOptions.map(function (o) {
|
||||
|
||||
var selectedAttribute = o.IsDefault ? ' selected="selected"' : '';
|
||||
return '<option value="' + o.Id + '"' + selectedAttribute + '>' + o.Name + '</option>';
|
||||
|
||||
}).join('');
|
||||
|
||||
var lastQuality = appSettings.get('sync-lastquality');
|
||||
if (lastQuality && options.QualityOptions.filter(function (i) {
|
||||
|
||||
return i.Id === lastQuality;
|
||||
|
||||
}).length) {
|
||||
selectQuality.value = lastQuality;
|
||||
}
|
||||
|
||||
selectQuality.dispatchEvent(new CustomEvent('change', {
|
||||
bubbles: true
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
function loadQualityOptions(form, targetId, dialogOptionsFn) {
|
||||
|
||||
return dialogOptionsFn(targetId).then(function (options) {
|
||||
|
||||
return renderTargetDialogOptions(form, options);
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
showMenu: showSyncMenu,
|
||||
renderForm: renderForm,
|
||||
setJobValues: setJobValues
|
||||
};
|
||||
});
|
||||
@@ -1,451 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #eee;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #52B54B
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #383838;
|
||||
border-color: rgba(255, 255, 255, .135)
|
||||
}
|
||||
|
||||
.skinHeader {
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #52B54B;
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37)
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
.dialog,
|
||||
html {
|
||||
background-color: #282828
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(0, 0, 0, .86)
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #52B54B;
|
||||
background-color: rgba(82, 181, 75, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .paper-icon-button-light:focus {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .2)
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #404040;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #505050
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #5EC157;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #bbb;
|
||||
color: rgba(255, 255, 255, .7)
|
||||
}
|
||||
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: #52B54B
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.collapseContent,
|
||||
.formDialogFooter:not(.formDialogFooter-clear),
|
||||
.formDialogHeader:not(.formDialogHeader-clear),
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #222
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #d2b019
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #338abb
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #6b689d
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #dd452b
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #5ccea9
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #999;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.actionsheetDivider {
|
||||
background: #444;
|
||||
background: rgba(255, 255, 255, .14)
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #222
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #101010;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #52B54B
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #52B54B
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #999;
|
||||
color: rgba(255, 255, 255, .5);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #52B54B;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #1c1c1c;
|
||||
background: rgba(30, 30, 30, .9)
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: rgba(30, 30, 30, .9) !important
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #333
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #52B54B
|
||||
}
|
||||
|
||||
.button-flat-accent,
|
||||
.button-link {
|
||||
color: #52B54B
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #ddd;
|
||||
background: rgba(170, 170, 190, .2)
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #1c1c1c;
|
||||
border: .07em solid #1c1c1c;
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #52B54B
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #1c1c1c;
|
||||
border: .07em solid #1c1c1c
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: inherit;
|
||||
background: #222
|
||||
}
|
||||
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #52B54B !important
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #52B54B !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline {
|
||||
border-color: #52B54B
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(82, 181, 75, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #52B54B
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.fullSyncIndicator,
|
||||
.playedIndicator {
|
||||
background: #52B54B
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background-color: #1c1c1f;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .7)
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #252528
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #52B54B !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #999;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.emby-tab-button-active,
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #fff;
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: #383838
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: #1e1e1e !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #52B54B !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(255, 255, 255, .3)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #52B54B
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#191919));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #191919);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #191919);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #191919)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #ddd;
|
||||
background: #111;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #52B54B
|
||||
}
|
||||
|
||||
.layout-desktop ::-webkit-scrollbar {
|
||||
width: 1em;
|
||||
height: 1em
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3)
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track-piece {
|
||||
background-color: #3b3b3b
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:horizontal,
|
||||
::-webkit-scrollbar-thumb:vertical {
|
||||
-webkit-border-radius: 2px;
|
||||
background: center no-repeat #888
|
||||
}
|
||||
@@ -1,449 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #eee;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #c33
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #383838;
|
||||
border-color: rgba(255, 255, 255, .135)
|
||||
}
|
||||
|
||||
.skinHeader {
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #c33;
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37)
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
.dialog,
|
||||
html {
|
||||
background-color: #282828
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(0, 0, 0, .86)
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #c33;
|
||||
background-color: rgba(204, 51, 51, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .paper-icon-button-light:focus {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .2)
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #404040;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #505050
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #c33
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #D83F3F
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #bbb;
|
||||
color: rgba(255, 255, 255, .7)
|
||||
}
|
||||
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.collapseContent,
|
||||
.formDialogFooter:not(.formDialogFooter-clear),
|
||||
.formDialogHeader:not(.formDialogHeader-clear),
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #222
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #d2b019
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #338abb
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #6b689d
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #dd452b
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #5ccea9
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #999;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.actionsheetDivider {
|
||||
background: #444;
|
||||
background: rgba(255, 255, 255, .14)
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #222
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #101010;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #c33
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #999;
|
||||
color: rgba(255, 255, 255, .5);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #c33;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #1c1c1c;
|
||||
background: rgba(30, 30, 30, .9)
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: rgba(30, 30, 30, .9) !important
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #333
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #c33
|
||||
}
|
||||
|
||||
.button-flat-accent,
|
||||
.button-link {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #ddd;
|
||||
background: rgba(170, 170, 190, .2)
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #1c1c1c;
|
||||
border: .07em solid #1c1c1c;
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #c33
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #1c1c1c;
|
||||
border: .07em solid #1c1c1c
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: inherit;
|
||||
background: #222
|
||||
}
|
||||
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #c33 !important
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #c33 !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline {
|
||||
border-color: #c33
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(204, 51, 51, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #c33
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.playedIndicator {
|
||||
background: #c33
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
background: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background-color: #1c1c1f;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .7)
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #252528
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #c33 !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #999;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.emby-tab-button-active,
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #fff;
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: #383838
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: #1e1e1e !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #c33 !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(255, 255, 255, .3)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#191919));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #191919);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #191919);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #191919)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #ddd;
|
||||
background: #111;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #c33
|
||||
}
|
||||
|
||||
.layout-desktop ::-webkit-scrollbar {
|
||||
width: 1em;
|
||||
height: 1em
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3)
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track-piece {
|
||||
background-color: #3b3b3b
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:horizontal,
|
||||
::-webkit-scrollbar-thumb:vertical {
|
||||
-webkit-border-radius: 2px;
|
||||
background: center no-repeat #888
|
||||
}
|
||||
@@ -1,433 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #222;
|
||||
color: rgba(0, 0, 0, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #2196F3
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #ccc;
|
||||
border-color: rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.collapseContent {
|
||||
background-color: #eaeaea
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #2196F3;
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
-webkit-backdrop-filter: none !important;
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
html {
|
||||
background-color: #f2f2f2
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(255, 255, 255, .94)
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: #f0f0f0
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #2196F3;
|
||||
background-color: rgba(33, 150, 243, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .paper-icon-button-light:focus {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .2)
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #d8d8d8;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #ccc;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #2196F3;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #2DA2FF;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #555
|
||||
}
|
||||
|
||||
.button-link,
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: #2196F3
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #fff
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #009688
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #D32F2F
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #0288D1
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #388E3C
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #F57F17
|
||||
}
|
||||
|
||||
.formDialogHeader:not(.formDialogHeader-clear) {
|
||||
background-color: #2196F3;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.formDialogFooter:not(.formDialogFooter-clear) {
|
||||
background-color: #f0f0f0;
|
||||
border-top: 1px solid rgba(0, 0, 0, .08);
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #888
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.formDialogHeader a,
|
||||
.toast {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #ddd
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #282828;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.nowPlayingBarSecondaryText {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #2196F3
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #2196F3;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #2196F3
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected,
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #2196F3;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #f8f8f8
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: #f0f0f0 !important
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #ddd
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #2196F3
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #333;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158);
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #2196F3
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #2196F3
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: #000;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #2196F3;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(33, 150, 243, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #2196F3
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.fullSyncIndicator,
|
||||
.playedIndicator {
|
||||
background: #2196F3
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #f2f2f2
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #2196F3 !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #2196F3;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.emby-tab-button-active,
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1)
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: rgba(0, 0, 0, .12)
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: rgba(0, 0, 0, .1) !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #2196F3 !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #2196F3
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #2196F3;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #000;
|
||||
background: #fff3a5;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #2196F3
|
||||
}
|
||||
@@ -1,434 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #222;
|
||||
color: rgba(0, 0, 0, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #303030
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #ccc;
|
||||
border-color: rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.collapseContent {
|
||||
background-color: #eaeaea
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #303030;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .87);
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37)
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
-webkit-backdrop-filter: none !important;
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
html {
|
||||
background-color: #f2f2f2
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(255, 255, 255, .94)
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: #f0f0f0
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #52b54b;
|
||||
background-color: rgba(82, 181, 75, .2)
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #d8d8d8;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #ccc
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #52b54b;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #5EC157
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #555
|
||||
}
|
||||
|
||||
.button-link,
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: green
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #fff
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #009688
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #D32F2F
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #0288D1
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #388E3C
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #F57F17
|
||||
}
|
||||
|
||||
.formDialogHeader:not(.formDialogHeader-clear) {
|
||||
background-color: #52b54b;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.formDialogFooter:not(.formDialogFooter-clear) {
|
||||
background-color: #f0f0f0;
|
||||
border-top: 1px solid #ddd;
|
||||
border-top: 1px solid rgba(0, 0, 0, .08);
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #888
|
||||
}
|
||||
|
||||
.actionsheetDivider {
|
||||
background: #ddd;
|
||||
background: rgba(0, 0, 0, .14)
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.formDialogHeader a,
|
||||
.toast {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #ddd
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #282828;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.nowPlayingBarSecondaryText {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #52b54b
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #52b54b;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #52b54b
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected,
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #52b54b;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #f8f8f8
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: #f0f0f0 !important
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #ddd
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #52b54b
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #333;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158);
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #52b54b
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #52b54b
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: #000;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #52b54b;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(82, 181, 75, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #52b54b
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.fullSyncIndicator,
|
||||
.playedIndicator {
|
||||
background: #52b54b
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #f2f2f2
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #52b54b !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #52b54b;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #999;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.emby-tab-button-active {
|
||||
color: #52b54b
|
||||
}
|
||||
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #52b54b;
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: rgba(0, 0, 0, .12)
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: rgba(0, 0, 0, .1) !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #52b54b !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #52b54b
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #52b54b;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #000;
|
||||
background: #fff3a5;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #52b54b
|
||||
}
|
||||
@@ -1,443 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #222;
|
||||
color: rgba(0, 0, 0, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #52B54B
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #ccc;
|
||||
border-color: rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.collapseContent {
|
||||
background-color: #eaeaea
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #52B54B;
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
-webkit-backdrop-filter: none !important;
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
html {
|
||||
background-color: #f2f2f2
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(255, 255, 255, .94)
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: #f0f0f0
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #52B54B;
|
||||
background-color: rgba(82, 181, 75, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .paper-icon-button-light:focus {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .button-link {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #d8d8d8;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #ccc;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #5EC157;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #555
|
||||
}
|
||||
|
||||
.button-link,
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: green
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #fff
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #009688
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #D32F2F
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #0288D1
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #388E3C
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #F57F17
|
||||
}
|
||||
|
||||
.formDialogHeader:not(.formDialogHeader-clear) {
|
||||
background-color: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.formDialogFooter:not(.formDialogFooter-clear) {
|
||||
background-color: #f0f0f0;
|
||||
border-top: 1px solid #ddd;
|
||||
border-top: 1px solid rgba(0, 0, 0, .08);
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #888
|
||||
}
|
||||
|
||||
.actionsheetDivider {
|
||||
background: #ddd;
|
||||
background: rgba(0, 0, 0, .14)
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.formDialogHeader a,
|
||||
.toast {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #ddd
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #282828;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.nowPlayingBarSecondaryText {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #52B54B
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #52B54B
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected,
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #52B54B;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #f8f8f8
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: #f0f0f0 !important
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #ddd
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #52B54B
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #333;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158);
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #52B54B
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #52B54B
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: #000;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(82, 181, 75, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #52B54B
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.fullSyncIndicator,
|
||||
.playedIndicator {
|
||||
background: #52B54B
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #f2f2f2
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #52B54B !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.emby-tab-button-active,
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1)
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: rgba(0, 0, 0, .12)
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: rgba(0, 0, 0, .1) !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #52B54B !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #52B54B
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #52B54B;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #000;
|
||||
background: #fff3a5;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #52B54B
|
||||
}
|
||||
@@ -1,440 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #222;
|
||||
color: rgba(0, 0, 0, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #E91E63
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #ccc;
|
||||
border-color: rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.collapseContent {
|
||||
background-color: #eaeaea
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #E91E63;
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
-webkit-backdrop-filter: none !important;
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
html {
|
||||
background-color: #f2f2f2
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(255, 255, 255, .94)
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: #f0f0f0
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #E91E63;
|
||||
background-color: rgba(233, 30, 99, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .paper-icon-button-light:focus {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .2)
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #d8d8d8;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #ccc;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #E91E63;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #F52A6F;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7)
|
||||
}
|
||||
|
||||
.button-link,
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: #E91E63
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #F8BBD0
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #009688
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #D32F2F
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #0288D1
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #388E3C
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #F57F17
|
||||
}
|
||||
|
||||
.formDialogHeader:not(.formDialogHeader-clear) {
|
||||
background-color: #E91E63;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.formDialogFooter:not(.formDialogFooter-clear) {
|
||||
background-color: #f0f0f0;
|
||||
border-top: 1px solid rgba(0, 0, 0, .08);
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #888;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.actionsheetDivider {
|
||||
background: #ddd;
|
||||
background: rgba(0, 0, 0, .14)
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.formDialogHeader a,
|
||||
.toast {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #ddd
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #282828;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.nowPlayingBarSecondaryText {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #E91E63
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #E91E63;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #E91E63
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected,
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #E91E63;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #f8f8f8
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: #f0f0f0 !important
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #ddd
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #E91E63
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #333;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158);
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #E91E63
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #E91E63
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: #000;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #E91E63;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(233, 30, 99, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #E91E63
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.fullSyncIndicator,
|
||||
.playedIndicator {
|
||||
background: #E91E63
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #f2f2f2
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #E91E63 !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #E91E63;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.emby-tab-button-active,
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1)
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: rgba(0, 0, 0, .12)
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: rgba(0, 0, 0, .1) !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #E91E63 !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #E91E63
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #E91E63;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #000;
|
||||
background: #fff3a5;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #E91E63
|
||||
}
|
||||
@@ -1,441 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #222;
|
||||
color: rgba(0, 0, 0, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #673AB7
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #ccc;
|
||||
border-color: rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.collapseContent {
|
||||
background-color: #eaeaea
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #673AB7;
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
-webkit-backdrop-filter: none !important;
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
html {
|
||||
background-color: #EDE7F6
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(237, 241, 236, .94)
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: #f0f0f0
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #673AB7;
|
||||
background-color: rgba(103, 58, 183, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .paper-icon-button-light:focus {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .2)
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #d8d8d8;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #ccc;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #673AB7;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #7346C3;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7)
|
||||
}
|
||||
|
||||
.button-link,
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: #673AB7
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #D1C4E9
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #009688
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #D32F2F
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #0288D1
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #388E3C
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #F57F17
|
||||
}
|
||||
|
||||
.formDialogHeader:not(.formDialogHeader-clear) {
|
||||
background-color: #673AB7;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.formDialogFooter:not(.formDialogFooter-clear) {
|
||||
background-color: #f0f0f0;
|
||||
border-top: 1px solid #ddd;
|
||||
border-top: 1px solid rgba(0, 0, 0, .08);
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #888;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.actionsheetDivider {
|
||||
background: #ddd;
|
||||
background: rgba(0, 0, 0, .14)
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #ddd
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.formDialogHeader a,
|
||||
.toast {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #ddd
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #282828;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.nowPlayingBarSecondaryText {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #673AB7
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #673AB7;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #673AB7
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected,
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #673AB7;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #f8f8f8
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: #f0f0f0 !important
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #673AB7
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #333;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158);
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #673AB7
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #673AB7
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: #000;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #673AB7;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(103, 58, 183, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #673AB7
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.fullSyncIndicator,
|
||||
.playedIndicator {
|
||||
background: #673AB7
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #f2f2f2
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #673AB7 !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #673AB7;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, .54)
|
||||
}
|
||||
|
||||
.emby-tab-button-active,
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1)
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: rgba(0, 0, 0, .12)
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: rgba(0, 0, 0, .1) !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #673AB7 !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #673AB7
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #673AB7;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#EDE7F6));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #EDE7F6);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #EDE7F6);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #EDE7F6)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #000;
|
||||
background: #fff3a5;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #673AB7
|
||||
}
|
||||
@@ -1,439 +0,0 @@
|
||||
.skinHeader,
|
||||
html {
|
||||
color: #222;
|
||||
color: rgba(0, 0, 0, .87)
|
||||
}
|
||||
|
||||
.wizardStartForm,
|
||||
.ui-corner-all,
|
||||
.ui-shadow {
|
||||
background-color: #c33
|
||||
}
|
||||
|
||||
.emby-collapsible-button {
|
||||
border-color: #ccc;
|
||||
border-color: rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.collapseContent {
|
||||
background-color: #eaeaea
|
||||
}
|
||||
|
||||
.skinHeader-withBackground {
|
||||
background-color: #c33;
|
||||
-webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
}
|
||||
|
||||
.skinHeader.semiTransparent {
|
||||
-webkit-backdrop-filter: none !important;
|
||||
backdrop-filter: none !important;
|
||||
background-color: rgba(0, 0, 0, .3);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.pageTitleWithDefaultLogo {
|
||||
background-image: url(../logowhite.png)
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
html {
|
||||
background-color: #f2f2f2
|
||||
}
|
||||
|
||||
.backgroundContainer.withBackdrop {
|
||||
background-color: rgba(255, 255, 255, .94)
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: #f0f0f0
|
||||
}
|
||||
|
||||
.paper-icon-button-light:focus {
|
||||
color: #c33;
|
||||
background-color: rgba(204, 51, 51, .2)
|
||||
}
|
||||
|
||||
.skinHeader-withBackground .paper-icon-button-light:focus {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .2)
|
||||
}
|
||||
|
||||
.fab,
|
||||
.raised {
|
||||
background: #d8d8d8;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.fab:focus,
|
||||
.raised:focus {
|
||||
background: #ccc;
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.button-submit {
|
||||
background: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button-submit:focus {
|
||||
background: #D83F3F;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.checkboxLabel {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.checkboxListLabel,
|
||||
.inputLabel,
|
||||
.inputLabelUnfocused,
|
||||
.paperListLabel,
|
||||
.textareaLabelUnfocused {
|
||||
color: #555
|
||||
}
|
||||
|
||||
.button-link,
|
||||
.inputLabelFocused,
|
||||
.selectLabelFocused,
|
||||
.textareaLabelFocused {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.checkboxOutline {
|
||||
border-color: currentColor
|
||||
}
|
||||
|
||||
.paperList,
|
||||
.visualCardBox {
|
||||
background-color: #fff
|
||||
}
|
||||
|
||||
.defaultCardBackground1 {
|
||||
background-color: #009688
|
||||
}
|
||||
|
||||
.defaultCardBackground2 {
|
||||
background-color: #D32F2F
|
||||
}
|
||||
|
||||
.defaultCardBackground3 {
|
||||
background-color: #0288D1
|
||||
}
|
||||
|
||||
.defaultCardBackground4 {
|
||||
background-color: #388E3C
|
||||
}
|
||||
|
||||
.defaultCardBackground5 {
|
||||
background-color: #F57F17
|
||||
}
|
||||
|
||||
.formDialogHeader:not(.formDialogHeader-clear) {
|
||||
background-color: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.formDialogFooter:not(.formDialogFooter-clear) {
|
||||
background-color: #f0f0f0;
|
||||
border-top: 1px solid #ddd;
|
||||
border-top: 1px solid rgba(0, 0, 0, .08);
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.cardText-secondary,
|
||||
.fieldDescription,
|
||||
.guide-programNameCaret,
|
||||
.listItem .secondary,
|
||||
.nowPlayingBarSecondaryText,
|
||||
.programSecondaryTitle,
|
||||
.secondaryText {
|
||||
color: #888
|
||||
}
|
||||
|
||||
.actionsheetDivider {
|
||||
background: #ddd;
|
||||
background: rgba(0, 0, 0, .14)
|
||||
}
|
||||
|
||||
.cardFooter-vibrant .cardText-secondary {
|
||||
color: inherit;
|
||||
opacity: .5
|
||||
}
|
||||
|
||||
.formDialogHeader a,
|
||||
.toast {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover {
|
||||
background-color: #ddd
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: #303030;
|
||||
color: rgba(255, 255, 255, .87)
|
||||
}
|
||||
|
||||
.appfooter {
|
||||
background: #282828;
|
||||
color: #ccc;
|
||||
color: rgba(255, 255, 255, .78)
|
||||
}
|
||||
|
||||
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) {
|
||||
.appfooter-blurred {
|
||||
background: rgba(24, 24, 24, .7);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
backdrop-filter: blur(20px)
|
||||
}
|
||||
}
|
||||
|
||||
.nowPlayingBarSecondaryText {
|
||||
color: #999
|
||||
}
|
||||
|
||||
.itemSelectionPanel {
|
||||
border: 1px solid #c33
|
||||
}
|
||||
|
||||
.selectionCommandsPanel {
|
||||
background: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.upNextDialog-countdownText {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.alphaPickerButton {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .7);
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.alphaPickerButton-selected,
|
||||
.alphaPickerButton-tv:focus {
|
||||
background-color: #c33;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.detailTableBodyRow-shaded:nth-child(even) {
|
||||
background: #f8f8f8
|
||||
}
|
||||
|
||||
.listItem-border {
|
||||
border-color: #f0f0f0 !important
|
||||
}
|
||||
|
||||
.listItem:focus {
|
||||
background: #ddd
|
||||
}
|
||||
|
||||
.progressring-spiner {
|
||||
border-color: #c33
|
||||
}
|
||||
|
||||
.mediaInfoText {
|
||||
color: #333;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.mediaInfoTimerIcon,
|
||||
.starIcon {
|
||||
color: #CB272A
|
||||
}
|
||||
|
||||
.emby-input,
|
||||
.emby-textarea {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158);
|
||||
-webkit-border-radius: .15em;
|
||||
border-radius: .15em
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-textarea:focus {
|
||||
border-color: #c33
|
||||
}
|
||||
|
||||
.emby-select-withcolor {
|
||||
color: inherit;
|
||||
background: #fff;
|
||||
border: .07em solid rgba(0, 0, 0, .158)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.emby-select-withcolor:focus {
|
||||
border-color: #c33
|
||||
}
|
||||
|
||||
.emby-select-withcolor>option {
|
||||
color: #000;
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.emby-select-tv-withcolor:focus {
|
||||
background-color: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-checkbox:focus+span+.emby-checkbox-focushelper {
|
||||
background-color: rgba(204, 51, 51, .26)
|
||||
}
|
||||
|
||||
.emby-checkbox:checked+span+span+.checkboxOutline,
|
||||
.itemProgressBarForeground {
|
||||
background-color: #c33
|
||||
}
|
||||
|
||||
.itemProgressBarForeground-recording {
|
||||
background-color: #CB272A
|
||||
}
|
||||
|
||||
.countIndicator,
|
||||
.playedIndicator {
|
||||
background: #c33
|
||||
}
|
||||
|
||||
.fullSyncIndicator {
|
||||
background: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.mainDrawer {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #f2f2f2
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: #c33 !important;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-button-focusscale:focus {
|
||||
background: #c33;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.emby-tab-button {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.emby-tab-button-active,
|
||||
.emby-tab-button-active.emby-button-tv {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1)
|
||||
}
|
||||
|
||||
.emby-tab-button.emby-button-tv:focus {
|
||||
color: #fff;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
background: 0 0
|
||||
}
|
||||
|
||||
.channelPrograms,
|
||||
.guide-channelHeaderCell,
|
||||
.programCell {
|
||||
border-color: rgba(0, 0, 0, .12)
|
||||
}
|
||||
|
||||
.programCell-sports {
|
||||
background: #3949AB !important
|
||||
}
|
||||
|
||||
.programCell-movie {
|
||||
background: #5E35B1 !important
|
||||
}
|
||||
|
||||
.programCell-kids {
|
||||
background: #039BE5 !important
|
||||
}
|
||||
|
||||
.programCell-news {
|
||||
background: #43A047 !important
|
||||
}
|
||||
|
||||
.programCell-active {
|
||||
background: rgba(0, 0, 0, .1) !important
|
||||
}
|
||||
|
||||
.guide-channelHeaderCell:focus,
|
||||
.programCell:focus {
|
||||
background-color: #c33 !important;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
.guide-programTextIcon {
|
||||
color: #1e1e1e;
|
||||
background: #555
|
||||
}
|
||||
|
||||
.guide-headerTimeslots {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.guide-date-tab-button {
|
||||
color: #555;
|
||||
color: rgba(0, 0, 0, .54)
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-tab-button-active,
|
||||
.guide-date-tab-button:focus {
|
||||
color: #00a4dc
|
||||
}
|
||||
|
||||
.guide-date-tab-button.emby-button-tv:focus {
|
||||
background-color: #00a4dc;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.itemBackdropFader {
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(#f2f2f2));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, 0), #f2f2f2);
|
||||
background: linear-gradient(rgba(0, 0, 0, 0), #f2f2f2)
|
||||
}
|
||||
|
||||
.infoBanner {
|
||||
color: #000;
|
||||
background: #fff3a5;
|
||||
padding: 1em;
|
||||
-webkit-border-radius: .25em;
|
||||
border-radius: .25em
|
||||
}
|
||||
|
||||
.ratingbutton-icon-withrating {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.downloadbutton-icon-complete,
|
||||
.downloadbutton-icon-on {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.playstatebutton-icon-played {
|
||||
color: #c33
|
||||
}
|
||||
|
||||
.repeatButton-active {
|
||||
color: #4285F4
|
||||
}
|
||||
|
||||
.card:focus .card-focuscontent {
|
||||
border-color: #c33
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 48 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 49 KiB |
@@ -1,313 +0,0 @@
|
||||
define(['browser', 'dom', 'layoutManager', 'css!./viewcontainer-lite'], function (browser, dom, layoutManager) {
|
||||
'use strict';
|
||||
|
||||
var mainAnimatedPages = document.querySelector('.mainAnimatedPages');
|
||||
var allPages = [];
|
||||
var currentUrls = [];
|
||||
var pageContainerCount = 3;
|
||||
var selectedPageIndex = -1;
|
||||
|
||||
function enableAnimation() {
|
||||
|
||||
// too slow
|
||||
if (browser.tv) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return browser.supportsCssAnimation();
|
||||
}
|
||||
|
||||
function findLastView(parent, className) {
|
||||
|
||||
var nodes = parent.childNodes;
|
||||
for (var i = nodes.length - 1; i >= 0; i--) {
|
||||
var node = nodes[i];
|
||||
var classList = node.classList;
|
||||
if (classList && classList.contains(className)) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function findViewBefore(elem, className) {
|
||||
|
||||
var node = elem.previousSibling;
|
||||
while (node) {
|
||||
var classList = node.classList;
|
||||
if (classList && classList.contains(className)) {
|
||||
return node;
|
||||
}
|
||||
|
||||
node = node.previousSibling;
|
||||
}
|
||||
}
|
||||
|
||||
function loadView(options) {
|
||||
|
||||
if (options.cancel) {
|
||||
return;
|
||||
}
|
||||
|
||||
cancelActiveAnimations();
|
||||
|
||||
var selected = selectedPageIndex;
|
||||
var previousAnimatable = selected === -1 ? null : allPages[selected];
|
||||
var pageIndex = selected + 1;
|
||||
|
||||
if (pageIndex >= pageContainerCount) {
|
||||
pageIndex = 0;
|
||||
}
|
||||
|
||||
var viewHtml = options.view;
|
||||
|
||||
var properties = [];
|
||||
if (options.fullscreen) {
|
||||
properties.push('fullscreen');
|
||||
}
|
||||
|
||||
var currentPage = allPages[pageIndex];
|
||||
|
||||
var view;
|
||||
|
||||
if (currentPage) {
|
||||
triggerDestroy(currentPage);
|
||||
currentPage.insertAdjacentHTML('beforebegin', viewHtml);
|
||||
view = findViewBefore(currentPage, 'view');
|
||||
|
||||
mainAnimatedPages.removeChild(currentPage);
|
||||
|
||||
} else {
|
||||
mainAnimatedPages.insertAdjacentHTML('beforeend', viewHtml);
|
||||
|
||||
view = findLastView(mainAnimatedPages, 'view');
|
||||
}
|
||||
|
||||
view.classList.add('mainAnimatedPage');
|
||||
|
||||
if (properties.length) {
|
||||
view.setAttribute('data-properties', properties.join(','));
|
||||
}
|
||||
|
||||
if (options.type) {
|
||||
view.setAttribute('data-type', options.type);
|
||||
}
|
||||
|
||||
allPages[pageIndex] = view;
|
||||
|
||||
if (onBeforeChange) {
|
||||
onBeforeChange(view, false, options);
|
||||
}
|
||||
|
||||
beforeAnimate(allPages, pageIndex, selected);
|
||||
|
||||
// animate here
|
||||
return animate(view, previousAnimatable, options.transition, options.isBack).then(function () {
|
||||
|
||||
selectedPageIndex = pageIndex;
|
||||
currentUrls[pageIndex] = options.url;
|
||||
if (!options.cancel && previousAnimatable) {
|
||||
afterAnimate(allPages, pageIndex);
|
||||
}
|
||||
|
||||
return view;
|
||||
});
|
||||
}
|
||||
|
||||
function beforeAnimate(allPages, newPageIndex, oldPageIndex) {
|
||||
for (var i = 0, length = allPages.length; i < length; i++) {
|
||||
if (newPageIndex === i || oldPageIndex === i) {
|
||||
//allPages[i].classList.remove('hide');
|
||||
} else {
|
||||
allPages[i].classList.add('hide');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function afterAnimate(allPages, newPageIndex) {
|
||||
for (var i = 0, length = allPages.length; i < length; i++) {
|
||||
if (newPageIndex === i) {
|
||||
//allPages[i].classList.remove('hide');
|
||||
} else {
|
||||
allPages[i].classList.add('hide');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function animate(newAnimatedPage, oldAnimatedPage, transition, isBack) {
|
||||
|
||||
if (enableAnimation() && oldAnimatedPage) {
|
||||
if (transition === 'slide') {
|
||||
return slide(newAnimatedPage, oldAnimatedPage, transition, isBack);
|
||||
} else if (transition === 'fade') {
|
||||
return fade(newAnimatedPage, oldAnimatedPage, transition, isBack);
|
||||
} else {
|
||||
clearAnimation(newAnimatedPage);
|
||||
if (oldAnimatedPage) {
|
||||
clearAnimation(oldAnimatedPage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function clearAnimation(elem) {
|
||||
setAnimation(elem, 'none');
|
||||
}
|
||||
|
||||
function slide(newAnimatedPage, oldAnimatedPage, transition, isBack) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
var duration = layoutManager.tv ? 450 : 160;
|
||||
|
||||
var animations = [];
|
||||
|
||||
if (oldAnimatedPage) {
|
||||
if (isBack) {
|
||||
setAnimation(oldAnimatedPage, 'view-slideright-r ' + duration + 'ms ease-out normal both');
|
||||
} else {
|
||||
setAnimation(oldAnimatedPage, 'view-slideleft-r ' + duration + 'ms ease-out normal both');
|
||||
}
|
||||
animations.push(oldAnimatedPage);
|
||||
}
|
||||
|
||||
if (isBack) {
|
||||
setAnimation(newAnimatedPage, 'view-slideright ' + duration + 'ms ease-out normal both');
|
||||
} else {
|
||||
setAnimation(newAnimatedPage, 'view-slideleft ' + duration + 'ms ease-out normal both');
|
||||
}
|
||||
animations.push(newAnimatedPage);
|
||||
|
||||
currentAnimations = animations;
|
||||
|
||||
var onAnimationComplete = function () {
|
||||
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: true
|
||||
});
|
||||
resolve();
|
||||
};
|
||||
|
||||
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: true
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function fade(newAnimatedPage, oldAnimatedPage, transition, isBack) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
var duration = layoutManager.tv ? 450 : 270;
|
||||
var animations = [];
|
||||
|
||||
newAnimatedPage.style.opacity = 0;
|
||||
setAnimation(newAnimatedPage, 'view-fadein ' + duration + 'ms ease-in normal both');
|
||||
animations.push(newAnimatedPage);
|
||||
|
||||
if (oldAnimatedPage) {
|
||||
setAnimation(oldAnimatedPage, 'view-fadeout ' + duration + 'ms ease-out normal both');
|
||||
animations.push(oldAnimatedPage);
|
||||
}
|
||||
|
||||
currentAnimations = animations;
|
||||
|
||||
var onAnimationComplete = function () {
|
||||
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: true
|
||||
});
|
||||
resolve();
|
||||
};
|
||||
|
||||
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: true
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function setAnimation(elem, value) {
|
||||
|
||||
requestAnimationFrame(function () {
|
||||
elem.style.animation = value;
|
||||
});
|
||||
}
|
||||
|
||||
var currentAnimations = [];
|
||||
function cancelActiveAnimations() {
|
||||
|
||||
var animations = currentAnimations;
|
||||
for (var i = 0, length = animations.length; i < length; i++) {
|
||||
animations[i].style.animation = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
var onBeforeChange;
|
||||
function setOnBeforeChange(fn) {
|
||||
onBeforeChange = fn;
|
||||
}
|
||||
|
||||
function tryRestoreView(options) {
|
||||
|
||||
var url = options.url;
|
||||
var index = currentUrls.indexOf(url);
|
||||
|
||||
if (index !== -1) {
|
||||
|
||||
var animatable = allPages[index];
|
||||
var view = animatable;
|
||||
|
||||
if (view) {
|
||||
|
||||
if (options.cancel) {
|
||||
return;
|
||||
}
|
||||
|
||||
cancelActiveAnimations();
|
||||
|
||||
var selected = selectedPageIndex;
|
||||
var previousAnimatable = selected === -1 ? null : allPages[selected];
|
||||
|
||||
if (onBeforeChange) {
|
||||
onBeforeChange(view, true, options);
|
||||
}
|
||||
|
||||
beforeAnimate(allPages, index, selected);
|
||||
|
||||
animatable.classList.remove('hide');
|
||||
|
||||
return animate(animatable, previousAnimatable, options.transition, options.isBack).then(function () {
|
||||
|
||||
selectedPageIndex = index;
|
||||
if (!options.cancel && previousAnimatable) {
|
||||
afterAnimate(allPages, index);
|
||||
}
|
||||
return view;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
function triggerDestroy(view) {
|
||||
|
||||
view.dispatchEvent(new CustomEvent('viewdestroy', {
|
||||
cancelable: false
|
||||
}));
|
||||
}
|
||||
|
||||
function reset() {
|
||||
|
||||
allPages = [];
|
||||
currentUrls = [];
|
||||
mainAnimatedPages.innerHTML = '';
|
||||
selectedPageIndex = -1;
|
||||
}
|
||||
|
||||
return {
|
||||
loadView: loadView,
|
||||
tryRestoreView: tryRestoreView,
|
||||
reset: reset,
|
||||
setOnBeforeChange: setOnBeforeChange
|
||||
};
|
||||
});
|
||||
8745
src/bower_components/hlsjs/dist/hls.min.js
vendored
8745
src/bower_components/hlsjs/dist/hls.min.js
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"folders":
|
||||
[
|
||||
{
|
||||
"path": ".",
|
||||
"folder_exclude_patterns": [
|
||||
".git",
|
||||
"node_modules",
|
||||
"dist",
|
||||
"lib"
|
||||
],
|
||||
"file_exclude_patterns": [
|
||||
".gitignore",
|
||||
"hls.js.sublime-project",
|
||||
"hls.js.sublime-workspace"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
853
src/bower_components/howlerjs/dist/howler.min.js
vendored
853
src/bower_components/howlerjs/dist/howler.min.js
vendored
@@ -1,853 +0,0 @@
|
||||
/*! howler.js v2.0.14 | (c) 2013-2018, James Simpson of GoldFire Studios | MIT License | howlerjs.com */ ! function() {
|
||||
"use strict";
|
||||
var e = function() {
|
||||
this.init()
|
||||
};
|
||||
e.prototype = {
|
||||
init: function() {
|
||||
var e = this || n;
|
||||
return e._counter = 1e3, e._codecs = {}, e._howls = [], e._muted = !1, e._volume = 1, e._canPlayEvent = "canplaythrough", e._navigator = "undefined" != typeof window && window.navigator ? window.navigator : null, e.masterGain = null, e.noAudio = !1, e.usingWebAudio = !0, e.autoSuspend = !0, e.ctx = null, e.mobileAutoEnable = !0, e._setup(), e
|
||||
},
|
||||
volume: function(e) {
|
||||
var o = this || n;
|
||||
if (e = parseFloat(e), o.ctx || _(), void 0 !== e && e >= 0 && e <= 1) {
|
||||
if (o._volume = e, o._muted) return o;
|
||||
o.usingWebAudio && o.masterGain.gain.setValueAtTime(e, n.ctx.currentTime);
|
||||
for (var t = 0; t < o._howls.length; t++)
|
||||
if (!o._howls[t]._webAudio)
|
||||
for (var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) {
|
||||
var u = o._howls[t]._soundById(r[a]);
|
||||
u && u._node && (u._node.volume = u._volume * e)
|
||||
}
|
||||
return o
|
||||
}
|
||||
return o._volume
|
||||
},
|
||||
mute: function(e) {
|
||||
var o = this || n;
|
||||
o.ctx || _(), o._muted = e, o.usingWebAudio && o.masterGain.gain.setValueAtTime(e ? 0 : o._volume, n.ctx.currentTime);
|
||||
for (var t = 0; t < o._howls.length; t++)
|
||||
if (!o._howls[t]._webAudio)
|
||||
for (var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) {
|
||||
var u = o._howls[t]._soundById(r[a]);
|
||||
u && u._node && (u._node.muted = !!e || u._muted)
|
||||
}
|
||||
return o
|
||||
},
|
||||
unload: function() {
|
||||
for (var e = this || n, o = e._howls.length - 1; o >= 0; o--) e._howls[o].unload();
|
||||
return e.usingWebAudio && e.ctx && void 0 !== e.ctx.close && (e.ctx.close(), e.ctx = null, _()), e
|
||||
},
|
||||
codecs: function(e) {
|
||||
return (this || n)._codecs[e.replace(/^x-/, "")]
|
||||
},
|
||||
_setup: function() {
|
||||
var e = this || n;
|
||||
if (e.state = e.ctx ? e.ctx.state || "running" : "running", e._autoSuspend(), !e.usingWebAudio)
|
||||
if ("undefined" != typeof Audio) try {
|
||||
var o = new Audio;
|
||||
void 0 === o.oncanplaythrough && (e._canPlayEvent = "canplay")
|
||||
} catch (n) {
|
||||
e.noAudio = !0
|
||||
} else e.noAudio = !0;
|
||||
try {
|
||||
var o = new Audio;
|
||||
o.muted && (e.noAudio = !0)
|
||||
} catch (e) {}
|
||||
return e.noAudio || e._setupCodecs(), e
|
||||
},
|
||||
_setupCodecs: function() {
|
||||
var e = this || n,
|
||||
o = null;
|
||||
try {
|
||||
o = "undefined" != typeof Audio ? new Audio : null
|
||||
} catch (n) {
|
||||
return e
|
||||
}
|
||||
if (!o || "function" != typeof o.canPlayType) return e;
|
||||
var t = o.canPlayType("audio/mpeg;").replace(/^no$/, ""),
|
||||
r = e._navigator && e._navigator.userAgent.match(/OPR\/([0-6].)/g),
|
||||
a = r && parseInt(r[0].split("/")[1], 10) < 33;
|
||||
return e._codecs = {
|
||||
mp3: !(a || !t && !o.canPlayType("audio/mp3;").replace(/^no$/, "")),
|
||||
mpeg: !!t,
|
||||
opus: !!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, ""),
|
||||
ogg: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ""),
|
||||
oga: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ""),
|
||||
wav: !!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ""),
|
||||
aac: !!o.canPlayType("audio/aac;").replace(/^no$/, ""),
|
||||
caf: !!o.canPlayType("audio/x-caf;").replace(/^no$/, ""),
|
||||
m4a: !!(o.canPlayType("audio/x-m4a;") || o.canPlayType("audio/m4a;") || o.canPlayType("audio/aac;")).replace(/^no$/, ""),
|
||||
mp4: !!(o.canPlayType("audio/x-mp4;") || o.canPlayType("audio/mp4;") || o.canPlayType("audio/aac;")).replace(/^no$/, ""),
|
||||
weba: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ""),
|
||||
webm: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ""),
|
||||
dolby: !!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/, ""),
|
||||
flac: !!(o.canPlayType("audio/x-flac;") || o.canPlayType("audio/flac;")).replace(/^no$/, "")
|
||||
}, e
|
||||
},
|
||||
_enableMobileAudio: function() {
|
||||
var e = this || n,
|
||||
o = /iPhone|iPad|iPod|Android|BlackBerry|BB10|Silk|Mobi|Chrome/i.test(e._navigator && e._navigator.userAgent);
|
||||
if (!e._mobileEnabled && e.ctx && o) {
|
||||
e._mobileEnabled = !1, e.mobileAutoEnable = !1, e._mobileUnloaded || 44100 === e.ctx.sampleRate || (e._mobileUnloaded = !0, e.unload()), e._scratchBuffer = e.ctx.createBuffer(1, 1, 22050);
|
||||
var t = function(o) {
|
||||
o.preventDefault(), n._autoResume();
|
||||
var r = e.ctx.createBufferSource();
|
||||
r.buffer = e._scratchBuffer, r.connect(e.ctx.destination), void 0 === r.start ? r.noteOn(0) : r.start(0), "function" == typeof e.ctx.resume && e.ctx.resume(), r.onended = function() {
|
||||
r.disconnect(0), e._mobileEnabled = !0, document.removeEventListener("touchstart", t, !0), document.removeEventListener("touchend", t, !0), document.removeEventListener("click", t, !0);
|
||||
for (var n = 0; n < e._howls.length; n++) e._howls[n]._emit("unlock")
|
||||
}
|
||||
};
|
||||
return document.addEventListener("touchstart", t, !0), document.addEventListener("touchend", t, !0), document.addEventListener("click", t, !0), e
|
||||
}
|
||||
},
|
||||
_autoSuspend: function() {
|
||||
var e = this;
|
||||
if (e.autoSuspend && e.ctx && void 0 !== e.ctx.suspend && n.usingWebAudio) {
|
||||
for (var o = 0; o < e._howls.length; o++)
|
||||
if (e._howls[o]._webAudio)
|
||||
for (var t = 0; t < e._howls[o]._sounds.length; t++)
|
||||
if (!e._howls[o]._sounds[t]._paused) return e;
|
||||
return e._suspendTimer && clearTimeout(e._suspendTimer), e._suspendTimer = setTimeout(function() {
|
||||
e.autoSuspend && (e._suspendTimer = null, e.state = "suspending", e.ctx.suspend().then(function() {
|
||||
e.state = "suspended", e._resumeAfterSuspend && (delete e._resumeAfterSuspend, e._autoResume())
|
||||
}))
|
||||
}, 3e4), e
|
||||
}
|
||||
},
|
||||
_autoResume: function() {
|
||||
var e = this;
|
||||
if (e.ctx && void 0 !== e.ctx.resume && n.usingWebAudio) return "running" === e.state && e._suspendTimer ? (clearTimeout(e._suspendTimer), e._suspendTimer = null) : "suspended" === e.state ? (e.ctx.resume().then(function() {
|
||||
e.state = "running";
|
||||
for (var n = 0; n < e._howls.length; n++) e._howls[n]._emit("resume")
|
||||
}), e._suspendTimer && (clearTimeout(e._suspendTimer), e._suspendTimer = null)) : "suspending" === e.state && (e._resumeAfterSuspend = !0), e
|
||||
}
|
||||
};
|
||||
var n = new e,
|
||||
o = function(e) {
|
||||
var n = this;
|
||||
if (!e.src || 0 === e.src.length) return void console.error("An array of source files must be passed with any new Howl.");
|
||||
n.init(e)
|
||||
};
|
||||
o.prototype = {
|
||||
init: function(e) {
|
||||
var o = this;
|
||||
return n.ctx || _(), o._autoplay = e.autoplay || !1, o._format = "string" != typeof e.format ? e.format : [e.format], o._html5 = e.html5 || !1, o._muted = e.mute || !1, o._loop = e.loop || !1, o._pool = e.pool || 5, o._preload = "boolean" != typeof e.preload || e.preload, o._rate = e.rate || 1, o._sprite = e.sprite || {}, o._src = "string" != typeof e.src ? e.src : [e.src], o._volume = void 0 !== e.volume ? e.volume : 1, o._xhrWithCredentials = e.xhrWithCredentials || !1, o._duration = 0, o._state = "unloaded", o._sounds = [], o._endTimers = {}, o._queue = [], o._playLock = !1, o._onend = e.onend ? [{
|
||||
fn: e.onend
|
||||
}] : [], o._onfade = e.onfade ? [{
|
||||
fn: e.onfade
|
||||
}] : [], o._onload = e.onload ? [{
|
||||
fn: e.onload
|
||||
}] : [], o._onloaderror = e.onloaderror ? [{
|
||||
fn: e.onloaderror
|
||||
}] : [], o._onplayerror = e.onplayerror ? [{
|
||||
fn: e.onplayerror
|
||||
}] : [], o._onpause = e.onpause ? [{
|
||||
fn: e.onpause
|
||||
}] : [], o._onplay = e.onplay ? [{
|
||||
fn: e.onplay
|
||||
}] : [], o._onstop = e.onstop ? [{
|
||||
fn: e.onstop
|
||||
}] : [], o._onmute = e.onmute ? [{
|
||||
fn: e.onmute
|
||||
}] : [], o._onvolume = e.onvolume ? [{
|
||||
fn: e.onvolume
|
||||
}] : [], o._onrate = e.onrate ? [{
|
||||
fn: e.onrate
|
||||
}] : [], o._onseek = e.onseek ? [{
|
||||
fn: e.onseek
|
||||
}] : [], o._onunlock = e.onunlock ? [{
|
||||
fn: e.onunlock
|
||||
}] : [], o._onresume = [], o._webAudio = n.usingWebAudio && !o._html5, void 0 !== n.ctx && n.ctx && n.mobileAutoEnable && n._enableMobileAudio(), n._howls.push(o), o._autoplay && o._queue.push({
|
||||
event: "play",
|
||||
action: function() {
|
||||
o.play()
|
||||
}
|
||||
}), o._preload && o.load(), o
|
||||
},
|
||||
load: function() {
|
||||
var e = this,
|
||||
o = null;
|
||||
if (n.noAudio) return void e._emit("loaderror", null, "No audio support.");
|
||||
"string" == typeof e._src && (e._src = [e._src]);
|
||||
for (var r = 0; r < e._src.length; r++) {
|
||||
var u, i;
|
||||
if (e._format && e._format[r]) u = e._format[r];
|
||||
else {
|
||||
if ("string" != typeof(i = e._src[r])) {
|
||||
e._emit("loaderror", null, "Non-string found in selected audio sources - ignoring.");
|
||||
continue
|
||||
}
|
||||
u = /^data:audio\/([^;,]+);/i.exec(i), u || (u = /\.([^.]+)$/.exec(i.split("?", 1)[0])), u && (u = u[1].toLowerCase())
|
||||
}
|
||||
if (u || console.warn('No file extension was found. Consider using the "format" property or specify an extension.'), u && n.codecs(u)) {
|
||||
o = e._src[r];
|
||||
break
|
||||
}
|
||||
}
|
||||
return o ? (e._src = o, e._state = "loading", "https:" === window.location.protocol && "http:" === o.slice(0, 5) && (e._html5 = !0, e._webAudio = !1), new t(e), e._webAudio && a(e), e) : void e._emit("loaderror", null, "No codec support for selected audio sources.")
|
||||
},
|
||||
play: function(e, o) {
|
||||
var t = this,
|
||||
r = null;
|
||||
if ("number" == typeof e) r = e, e = null;
|
||||
else {
|
||||
if ("string" == typeof e && "loaded" === t._state && !t._sprite[e]) return null;
|
||||
if (void 0 === e) {
|
||||
e = "__default";
|
||||
for (var a = 0, u = 0; u < t._sounds.length; u++) t._sounds[u]._paused && !t._sounds[u]._ended && (a++, r = t._sounds[u]._id);
|
||||
1 === a ? e = null : r = null
|
||||
}
|
||||
}
|
||||
var i = r ? t._soundById(r) : t._inactiveSound();
|
||||
if (!i) return null;
|
||||
if (r && !e && (e = i._sprite || "__default"), "loaded" !== t._state) {
|
||||
i._sprite = e, i._ended = !1;
|
||||
var d = i._id;
|
||||
return t._queue.push({
|
||||
event: "play",
|
||||
action: function() {
|
||||
t.play(d)
|
||||
}
|
||||
}), d
|
||||
}
|
||||
if (r && !i._paused) return o || t._loadQueue("play"), i._id;
|
||||
t._webAudio && n._autoResume();
|
||||
var _ = Math.max(0, i._seek > 0 ? i._seek : t._sprite[e][0] / 1e3),
|
||||
s = Math.max(0, (t._sprite[e][0] + t._sprite[e][1]) / 1e3 - _),
|
||||
l = 1e3 * s / Math.abs(i._rate);
|
||||
if (i._paused = !1, i._ended = !1, i._sprite = e, i._seek = _, i._start = t._sprite[e][0] / 1e3, i._stop = (t._sprite[e][0] + t._sprite[e][1]) / 1e3, i._loop = !(!i._loop && !t._sprite[e][2]), i._seek >= i._stop) return void t._ended(i);
|
||||
var c = i._node;
|
||||
if (t._webAudio) {
|
||||
var f = function() {
|
||||
t._refreshBuffer(i);
|
||||
var e = i._muted || t._muted ? 0 : i._volume;
|
||||
c.gain.setValueAtTime(e, n.ctx.currentTime), i._playStart = n.ctx.currentTime, void 0 === c.bufferSource.start ? i._loop ? c.bufferSource.noteGrainOn(0, _, 86400) : c.bufferSource.noteGrainOn(0, _, s) : i._loop ? c.bufferSource.start(0, _, 86400) : c.bufferSource.start(0, _, s), l !== 1 / 0 && (t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l)), o || setTimeout(function() {
|
||||
t._emit("play", i._id)
|
||||
}, 0)
|
||||
};
|
||||
"running" === n.state ? f() : (t.once("resume", f), t._clearTimer(i._id))
|
||||
} else {
|
||||
var p = function() {
|
||||
c.currentTime = _, c.muted = i._muted || t._muted || n._muted || c.muted, c.volume = i._volume * n.volume(), c.playbackRate = i._rate;
|
||||
try {
|
||||
var r = c.play();
|
||||
if ("undefined" != typeof Promise && (r instanceof Promise || "function" == typeof r.then) ? (t._playLock = !0, r.then(function() {
|
||||
t._playLock = !1, o || t._emit("play", i._id)
|
||||
}).catch(function() {
|
||||
t._playLock = !1, t._emit("playerror", i._id, "Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.")
|
||||
})) : o || t._emit("play", i._id), c.playbackRate = i._rate, c.paused) return void t._emit("playerror", i._id, "Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");
|
||||
"__default" !== e || i._loop ? t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l) : (t._endTimers[i._id] = function() {
|
||||
t._ended(i), c.removeEventListener("ended", t._endTimers[i._id], !1)
|
||||
}, c.addEventListener("ended", t._endTimers[i._id], !1))
|
||||
} catch (e) {
|
||||
t._emit("playerror", i._id, e)
|
||||
}
|
||||
},
|
||||
m = window && window.ejecta || !c.readyState && n._navigator.isCocoonJS;
|
||||
if (c.readyState >= 3 || m) p();
|
||||
else {
|
||||
var v = function() {
|
||||
p(), c.removeEventListener(n._canPlayEvent, v, !1)
|
||||
};
|
||||
c.addEventListener(n._canPlayEvent, v, !1), t._clearTimer(i._id)
|
||||
}
|
||||
}
|
||||
return i._id
|
||||
},
|
||||
pause: function(e) {
|
||||
var n = this;
|
||||
if ("loaded" !== n._state || n._playLock) return n._queue.push({
|
||||
event: "pause",
|
||||
action: function() {
|
||||
n.pause(e)
|
||||
}
|
||||
}), n;
|
||||
for (var o = n._getSoundIds(e), t = 0; t < o.length; t++) {
|
||||
n._clearTimer(o[t]);
|
||||
var r = n._soundById(o[t]);
|
||||
if (r && !r._paused && (r._seek = n.seek(o[t]), r._rateSeek = 0, r._paused = !0, n._stopFade(o[t]), r._node))
|
||||
if (n._webAudio) {
|
||||
if (!r._node.bufferSource) continue;
|
||||
void 0 === r._node.bufferSource.stop ? r._node.bufferSource.noteOff(0) : r._node.bufferSource.stop(0), n._cleanBuffer(r._node)
|
||||
} else isNaN(r._node.duration) && r._node.duration !== 1 / 0 || r._node.pause();
|
||||
arguments[1] || n._emit("pause", r ? r._id : null)
|
||||
}
|
||||
return n
|
||||
},
|
||||
stop: function(e, n) {
|
||||
var o = this;
|
||||
if ("loaded" !== o._state || o._playLock) return o._queue.push({
|
||||
event: "stop",
|
||||
action: function() {
|
||||
o.stop(e)
|
||||
}
|
||||
}), o;
|
||||
for (var t = o._getSoundIds(e), r = 0; r < t.length; r++) {
|
||||
o._clearTimer(t[r]);
|
||||
var a = o._soundById(t[r]);
|
||||
a && (a._seek = a._start || 0, a._rateSeek = 0, a._paused = !0, a._ended = !0, o._stopFade(t[r]), a._node && (o._webAudio ? a._node.bufferSource && (void 0 === a._node.bufferSource.stop ? a._node.bufferSource.noteOff(0) : a._node.bufferSource.stop(0), o._cleanBuffer(a._node)) : isNaN(a._node.duration) && a._node.duration !== 1 / 0 || (a._node.currentTime = a._start || 0, a._node.pause())), n || o._emit("stop", a._id))
|
||||
}
|
||||
return o
|
||||
},
|
||||
mute: function(e, o) {
|
||||
var t = this;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "mute",
|
||||
action: function() {
|
||||
t.mute(e, o)
|
||||
}
|
||||
}), t;
|
||||
if (void 0 === o) {
|
||||
if ("boolean" != typeof e) return t._muted;
|
||||
t._muted = e
|
||||
}
|
||||
for (var r = t._getSoundIds(o), a = 0; a < r.length; a++) {
|
||||
var u = t._soundById(r[a]);
|
||||
u && (u._muted = e, u._interval && t._stopFade(u._id), t._webAudio && u._node ? u._node.gain.setValueAtTime(e ? 0 : u._volume, n.ctx.currentTime) : u._node && (u._node.muted = !!n._muted || e), t._emit("mute", u._id))
|
||||
}
|
||||
return t
|
||||
},
|
||||
volume: function() {
|
||||
var e, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) return t._volume;
|
||||
if (1 === r.length || 2 === r.length && void 0 === r[1]) {
|
||||
t._getSoundIds().indexOf(r[0]) >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0])
|
||||
} else r.length >= 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10));
|
||||
var a;
|
||||
if (!(void 0 !== e && e >= 0 && e <= 1)) return a = o ? t._soundById(o) : t._sounds[0], a ? a._volume : 0;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "volume",
|
||||
action: function() {
|
||||
t.volume.apply(t, r)
|
||||
}
|
||||
}), t;
|
||||
void 0 === o && (t._volume = e), o = t._getSoundIds(o);
|
||||
for (var u = 0; u < o.length; u++)(a = t._soundById(o[u])) && (a._volume = e, r[2] || t._stopFade(o[u]), t._webAudio && a._node && !a._muted ? a._node.gain.setValueAtTime(e, n.ctx.currentTime) : a._node && !a._muted && (a._node.volume = e * n.volume()), t._emit("volume", a._id));
|
||||
return t
|
||||
},
|
||||
fade: function(e, o, t, r) {
|
||||
var a = this;
|
||||
if ("loaded" !== a._state || a._playLock) return a._queue.push({
|
||||
event: "fade",
|
||||
action: function() {
|
||||
a.fade(e, o, t, r)
|
||||
}
|
||||
}), a;
|
||||
a.volume(e, r);
|
||||
for (var u = a._getSoundIds(r), i = 0; i < u.length; i++) {
|
||||
var d = a._soundById(u[i]);
|
||||
if (d) {
|
||||
if (r || a._stopFade(u[i]), a._webAudio && !d._muted) {
|
||||
var _ = n.ctx.currentTime,
|
||||
s = _ + t / 1e3;
|
||||
d._volume = e, d._node.gain.setValueAtTime(e, _), d._node.gain.linearRampToValueAtTime(o, s)
|
||||
}
|
||||
a._startFadeInterval(d, e, o, t, u[i], void 0 === r)
|
||||
}
|
||||
}
|
||||
return a
|
||||
},
|
||||
_startFadeInterval: function(e, n, o, t, r, a) {
|
||||
var u = this,
|
||||
i = n,
|
||||
d = o - n,
|
||||
_ = Math.abs(d / .01),
|
||||
s = Math.max(4, _ > 0 ? t / _ : t),
|
||||
l = Date.now();
|
||||
e._fadeTo = o, e._interval = setInterval(function() {
|
||||
var r = (Date.now() - l) / t;
|
||||
l = Date.now(), i += d * r, i = Math.max(0, i), i = Math.min(1, i), i = Math.round(100 * i) / 100, u._webAudio ? e._volume = i : u.volume(i, e._id, !0), a && (u._volume = i), (o < n && i <= o || o > n && i >= o) && (clearInterval(e._interval), e._interval = null, e._fadeTo = null, u.volume(o, e._id), u._emit("fade", e._id))
|
||||
}, s)
|
||||
},
|
||||
_stopFade: function(e) {
|
||||
var o = this,
|
||||
t = o._soundById(e);
|
||||
return t && t._interval && (o._webAudio && t._node.gain.cancelScheduledValues(n.ctx.currentTime), clearInterval(t._interval), t._interval = null, o.volume(t._fadeTo, e), t._fadeTo = null, o._emit("fade", e)), o
|
||||
},
|
||||
loop: function() {
|
||||
var e, n, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) return t._loop;
|
||||
if (1 === r.length) {
|
||||
if ("boolean" != typeof r[0]) return !!(o = t._soundById(parseInt(r[0], 10))) && o._loop;
|
||||
e = r[0], t._loop = e
|
||||
} else 2 === r.length && (e = r[0], n = parseInt(r[1], 10));
|
||||
for (var a = t._getSoundIds(n), u = 0; u < a.length; u++)(o = t._soundById(a[u])) && (o._loop = e, t._webAudio && o._node && o._node.bufferSource && (o._node.bufferSource.loop = e, e && (o._node.bufferSource.loopStart = o._start || 0, o._node.bufferSource.loopEnd = o._stop)));
|
||||
return t
|
||||
},
|
||||
rate: function() {
|
||||
var e, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) o = t._sounds[0]._id;
|
||||
else if (1 === r.length) {
|
||||
var a = t._getSoundIds(),
|
||||
u = a.indexOf(r[0]);
|
||||
u >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0])
|
||||
} else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10));
|
||||
var i;
|
||||
if ("number" != typeof e) return i = t._soundById(o), i ? i._rate : t._rate;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "rate",
|
||||
action: function() {
|
||||
t.rate.apply(t, r)
|
||||
}
|
||||
}), t;
|
||||
void 0 === o && (t._rate = e), o = t._getSoundIds(o);
|
||||
for (var d = 0; d < o.length; d++)
|
||||
if (i = t._soundById(o[d])) {
|
||||
i._rateSeek = t.seek(o[d]), i._playStart = t._webAudio ? n.ctx.currentTime : i._playStart, i._rate = e, t._webAudio && i._node && i._node.bufferSource ? i._node.bufferSource.playbackRate.setValueAtTime(e, n.ctx.currentTime) : i._node && (i._node.playbackRate = e);
|
||||
var _ = t.seek(o[d]),
|
||||
s = (t._sprite[i._sprite][0] + t._sprite[i._sprite][1]) / 1e3 - _,
|
||||
l = 1e3 * s / Math.abs(i._rate);
|
||||
!t._endTimers[o[d]] && i._paused || (t._clearTimer(o[d]), t._endTimers[o[d]] = setTimeout(t._ended.bind(t, i), l)), t._emit("rate", i._id)
|
||||
} return t
|
||||
},
|
||||
seek: function() {
|
||||
var e, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) o = t._sounds[0]._id;
|
||||
else if (1 === r.length) {
|
||||
var a = t._getSoundIds(),
|
||||
u = a.indexOf(r[0]);
|
||||
u >= 0 ? o = parseInt(r[0], 10) : t._sounds.length && (o = t._sounds[0]._id, e = parseFloat(r[0]))
|
||||
} else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10));
|
||||
if (void 0 === o) return t;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "seek",
|
||||
action: function() {
|
||||
t.seek.apply(t, r)
|
||||
}
|
||||
}), t;
|
||||
var i = t._soundById(o);
|
||||
if (i) {
|
||||
if (!("number" == typeof e && e >= 0)) {
|
||||
if (t._webAudio) {
|
||||
var d = t.playing(o) ? n.ctx.currentTime - i._playStart : 0,
|
||||
_ = i._rateSeek ? i._rateSeek - i._seek : 0;
|
||||
return i._seek + (_ + d * Math.abs(i._rate))
|
||||
}
|
||||
return i._node.currentTime
|
||||
}
|
||||
var s = t.playing(o);
|
||||
s && t.pause(o, !0), i._seek = e, i._ended = !1, t._clearTimer(o), !t._webAudio && i._node && (i._node.currentTime = e);
|
||||
var l = function() {
|
||||
t._emit("seek", o), s && t.play(o, !0)
|
||||
};
|
||||
if (s && !t._webAudio) {
|
||||
var c = function() {
|
||||
t._playLock ? setTimeout(c, 0) : l()
|
||||
};
|
||||
setTimeout(c, 0)
|
||||
} else l()
|
||||
}
|
||||
return t
|
||||
},
|
||||
playing: function(e) {
|
||||
var n = this;
|
||||
if ("number" == typeof e) {
|
||||
var o = n._soundById(e);
|
||||
return !!o && !o._paused
|
||||
}
|
||||
for (var t = 0; t < n._sounds.length; t++)
|
||||
if (!n._sounds[t]._paused) return !0;
|
||||
return !1
|
||||
},
|
||||
duration: function(e) {
|
||||
var n = this,
|
||||
o = n._duration,
|
||||
t = n._soundById(e);
|
||||
return t && (o = n._sprite[t._sprite][1] / 1e3), o
|
||||
},
|
||||
state: function() {
|
||||
return this._state
|
||||
},
|
||||
unload: function() {
|
||||
for (var e = this, o = e._sounds, t = 0; t < o.length; t++) {
|
||||
if (o[t]._paused || e.stop(o[t]._id), !e._webAudio) {
|
||||
/MSIE |Trident\//.test(n._navigator && n._navigator.userAgent) || (o[t]._node.src = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"), o[t]._node.removeEventListener("error", o[t]._errorFn, !1), o[t]._node.removeEventListener(n._canPlayEvent, o[t]._loadFn, !1)
|
||||
}
|
||||
delete o[t]._node, e._clearTimer(o[t]._id)
|
||||
}
|
||||
var a = n._howls.indexOf(e);
|
||||
a >= 0 && n._howls.splice(a, 1);
|
||||
var u = !0;
|
||||
for (t = 0; t < n._howls.length; t++)
|
||||
if (n._howls[t]._src === e._src) {
|
||||
u = !1;
|
||||
break
|
||||
} return r && u && delete r[e._src], n.noAudio = !1, e._state = "unloaded", e._sounds = [], e = null, null
|
||||
},
|
||||
on: function(e, n, o, t) {
|
||||
var r = this,
|
||||
a = r["_on" + e];
|
||||
return "function" == typeof n && a.push(t ? {
|
||||
id: o,
|
||||
fn: n,
|
||||
once: t
|
||||
} : {
|
||||
id: o,
|
||||
fn: n
|
||||
}), r
|
||||
},
|
||||
off: function(e, n, o) {
|
||||
var t = this,
|
||||
r = t["_on" + e],
|
||||
a = 0;
|
||||
if ("number" == typeof n && (o = n, n = null), n || o)
|
||||
for (a = 0; a < r.length; a++) {
|
||||
var u = o === r[a].id;
|
||||
if (n === r[a].fn && u || !n && u) {
|
||||
r.splice(a, 1);
|
||||
break
|
||||
}
|
||||
} else if (e) t["_on" + e] = [];
|
||||
else {
|
||||
var i = Object.keys(t);
|
||||
for (a = 0; a < i.length; a++) 0 === i[a].indexOf("_on") && Array.isArray(t[i[a]]) && (t[i[a]] = [])
|
||||
} return t
|
||||
},
|
||||
once: function(e, n, o) {
|
||||
var t = this;
|
||||
return t.on(e, n, o, 1), t
|
||||
},
|
||||
_emit: function(e, n, o) {
|
||||
for (var t = this, r = t["_on" + e], a = r.length - 1; a >= 0; a--) r[a].id && r[a].id !== n && "load" !== e || (setTimeout(function(e) {
|
||||
e.call(this, n, o)
|
||||
}.bind(t, r[a].fn), 0), r[a].once && t.off(e, r[a].fn, r[a].id));
|
||||
return t._loadQueue(e), t
|
||||
},
|
||||
_loadQueue: function(e) {
|
||||
var n = this;
|
||||
if (n._queue.length > 0) {
|
||||
var o = n._queue[0];
|
||||
o.event === e && (n._queue.shift(), n._loadQueue()), e || o.action()
|
||||
}
|
||||
return n
|
||||
},
|
||||
_ended: function(e) {
|
||||
var o = this,
|
||||
t = e._sprite;
|
||||
if (!o._webAudio && e._node && !e._node.paused && !e._node.ended && e._node.currentTime < e._stop) return setTimeout(o._ended.bind(o, e), 100), o;
|
||||
var r = !(!e._loop && !o._sprite[t][2]);
|
||||
if (o._emit("end", e._id), !o._webAudio && r && o.stop(e._id, !0).play(e._id), o._webAudio && r) {
|
||||
o._emit("play", e._id), e._seek = e._start || 0, e._rateSeek = 0, e._playStart = n.ctx.currentTime;
|
||||
var a = 1e3 * (e._stop - e._start) / Math.abs(e._rate);
|
||||
o._endTimers[e._id] = setTimeout(o._ended.bind(o, e), a)
|
||||
}
|
||||
return o._webAudio && !r && (e._paused = !0, e._ended = !0, e._seek = e._start || 0, e._rateSeek = 0, o._clearTimer(e._id), o._cleanBuffer(e._node), n._autoSuspend()), o._webAudio || r || o.stop(e._id, !0), o
|
||||
},
|
||||
_clearTimer: function(e) {
|
||||
var n = this;
|
||||
if (n._endTimers[e]) {
|
||||
if ("function" != typeof n._endTimers[e]) clearTimeout(n._endTimers[e]);
|
||||
else {
|
||||
var o = n._soundById(e);
|
||||
o && o._node && o._node.removeEventListener("ended", n._endTimers[e], !1)
|
||||
}
|
||||
delete n._endTimers[e]
|
||||
}
|
||||
return n
|
||||
},
|
||||
_soundById: function(e) {
|
||||
for (var n = this, o = 0; o < n._sounds.length; o++)
|
||||
if (e === n._sounds[o]._id) return n._sounds[o];
|
||||
return null
|
||||
},
|
||||
_inactiveSound: function() {
|
||||
var e = this;
|
||||
e._drain();
|
||||
for (var n = 0; n < e._sounds.length; n++)
|
||||
if (e._sounds[n]._ended) return e._sounds[n].reset();
|
||||
return new t(e)
|
||||
},
|
||||
_drain: function() {
|
||||
var e = this,
|
||||
n = e._pool,
|
||||
o = 0,
|
||||
t = 0;
|
||||
if (!(e._sounds.length < n)) {
|
||||
for (t = 0; t < e._sounds.length; t++) e._sounds[t]._ended && o++;
|
||||
for (t = e._sounds.length - 1; t >= 0; t--) {
|
||||
if (o <= n) return;
|
||||
e._sounds[t]._ended && (e._webAudio && e._sounds[t]._node && e._sounds[t]._node.disconnect(0), e._sounds.splice(t, 1), o--)
|
||||
}
|
||||
}
|
||||
},
|
||||
_getSoundIds: function(e) {
|
||||
var n = this;
|
||||
if (void 0 === e) {
|
||||
for (var o = [], t = 0; t < n._sounds.length; t++) o.push(n._sounds[t]._id);
|
||||
return o
|
||||
}
|
||||
return [e]
|
||||
},
|
||||
_refreshBuffer: function(e) {
|
||||
var o = this;
|
||||
return e._node.bufferSource = n.ctx.createBufferSource(), e._node.bufferSource.buffer = r[o._src], e._panner ? e._node.bufferSource.connect(e._panner) : e._node.bufferSource.connect(e._node), e._node.bufferSource.loop = e._loop, e._loop && (e._node.bufferSource.loopStart = e._start || 0, e._node.bufferSource.loopEnd = e._stop || 0), e._node.bufferSource.playbackRate.setValueAtTime(e._rate, n.ctx.currentTime), o
|
||||
},
|
||||
_cleanBuffer: function(e) {
|
||||
var o = this;
|
||||
if (n._scratchBuffer && e.bufferSource) {
|
||||
e.bufferSource.onended = null, e.bufferSource.disconnect(0);
|
||||
try {
|
||||
e.bufferSource.buffer = n._scratchBuffer
|
||||
} catch (e) {}
|
||||
}
|
||||
return e.bufferSource = null, o
|
||||
}
|
||||
};
|
||||
var t = function(e) {
|
||||
this._parent = e, this.init()
|
||||
};
|
||||
t.prototype = {
|
||||
init: function() {
|
||||
var e = this,
|
||||
o = e._parent;
|
||||
return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._paused = !0, e._ended = !0, e._sprite = "__default", e._id = ++n._counter, o._sounds.push(e), e.create(), e
|
||||
},
|
||||
create: function() {
|
||||
var e = this,
|
||||
o = e._parent,
|
||||
t = n._muted || e._muted || e._parent._muted ? 0 : e._volume;
|
||||
return o._webAudio ? (e._node = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), e._node.gain.setValueAtTime(t, n.ctx.currentTime), e._node.paused = !0, e._node.connect(n.masterGain)) : (e._node = new Audio, e._errorFn = e._errorListener.bind(e), e._node.addEventListener("error", e._errorFn, !1), e._loadFn = e._loadListener.bind(e), e._node.addEventListener(n._canPlayEvent, e._loadFn, !1), e._node.src = o._src, e._node.preload = "auto", e._node.volume = t * n.volume(), e._node.load()), e
|
||||
},
|
||||
reset: function() {
|
||||
var e = this,
|
||||
o = e._parent;
|
||||
return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._rateSeek = 0, e._paused = !0, e._ended = !0, e._sprite = "__default", e._id = ++n._counter, e
|
||||
},
|
||||
_errorListener: function() {
|
||||
var e = this;
|
||||
e._parent._emit("loaderror", e._id, e._node.error ? e._node.error.code : 0), e._node.removeEventListener("error", e._errorFn, !1)
|
||||
},
|
||||
_loadListener: function() {
|
||||
var e = this,
|
||||
o = e._parent;
|
||||
o._duration = Math.ceil(10 * e._node.duration) / 10, 0 === Object.keys(o._sprite).length && (o._sprite = {
|
||||
__default: [0, 1e3 * o._duration]
|
||||
}), "loaded" !== o._state && (o._state = "loaded", o._emit("load"), o._loadQueue()), e._node.removeEventListener(n._canPlayEvent, e._loadFn, !1)
|
||||
}
|
||||
};
|
||||
var r = {},
|
||||
a = function(e) {
|
||||
var n = e._src;
|
||||
if (r[n]) return e._duration = r[n].duration, void d(e);
|
||||
if (/^data:[^;]+;base64,/.test(n)) {
|
||||
for (var o = atob(n.split(",")[1]), t = new Uint8Array(o.length), a = 0; a < o.length; ++a) t[a] = o.charCodeAt(a);
|
||||
i(t.buffer, e)
|
||||
} else {
|
||||
var _ = new XMLHttpRequest;
|
||||
_.open("GET", n, !0), _.withCredentials = e._xhrWithCredentials, _.responseType = "arraybuffer", _.onload = function() {
|
||||
var n = (_.status + "")[0];
|
||||
if ("0" !== n && "2" !== n && "3" !== n) return void e._emit("loaderror", null, "Failed loading audio file with status: " + _.status + ".");
|
||||
i(_.response, e)
|
||||
}, _.onerror = function() {
|
||||
e._webAudio && (e._html5 = !0, e._webAudio = !1, e._sounds = [], delete r[n], e.load())
|
||||
}, u(_)
|
||||
}
|
||||
},
|
||||
u = function(e) {
|
||||
try {
|
||||
e.send()
|
||||
} catch (n) {
|
||||
e.onerror()
|
||||
}
|
||||
},
|
||||
i = function(e, o) {
|
||||
var t = function(e) {
|
||||
e && o._sounds.length > 0 ? (r[o._src] = e, d(o, e)) : onError()
|
||||
},
|
||||
a = function() {
|
||||
o._emit("loaderror", null, "Decoding audio data failed.")
|
||||
};
|
||||
"undefined" != typeof Promise && 1 === n.ctx.decodeAudioData.length ? n.ctx.decodeAudioData(e).then(t).catch(a) : n.ctx.decodeAudioData(e, t, a)
|
||||
},
|
||||
d = function(e, n) {
|
||||
n && !e._duration && (e._duration = n.duration), 0 === Object.keys(e._sprite).length && (e._sprite = {
|
||||
__default: [0, 1e3 * e._duration]
|
||||
}), "loaded" !== e._state && (e._state = "loaded", e._emit("load"), e._loadQueue())
|
||||
},
|
||||
_ = function() {
|
||||
try {
|
||||
"undefined" != typeof AudioContext ? n.ctx = new AudioContext : "undefined" != typeof webkitAudioContext ? n.ctx = new webkitAudioContext : n.usingWebAudio = !1
|
||||
} catch (e) {
|
||||
n.usingWebAudio = !1
|
||||
}
|
||||
var e = /iP(hone|od|ad)/.test(n._navigator && n._navigator.platform),
|
||||
o = n._navigator && n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),
|
||||
t = o ? parseInt(o[1], 10) : null;
|
||||
if (e && t && t < 9) {
|
||||
var r = /safari/.test(n._navigator && n._navigator.userAgent.toLowerCase());
|
||||
(n._navigator && n._navigator.standalone && !r || n._navigator && !n._navigator.standalone && !r) && (n.usingWebAudio = !1)
|
||||
}
|
||||
n.usingWebAudio && (n.masterGain = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), n.masterGain.gain.setValueAtTime(n._muted ? 0 : 1, n.ctx.currentTime), n.masterGain.connect(n.ctx.destination)), n._setup()
|
||||
};
|
||||
"function" == typeof define && define.amd && define([], function() {
|
||||
return {
|
||||
Howler: n,
|
||||
Howl: o
|
||||
}
|
||||
}), "undefined" != typeof exports && (exports.Howler = n, exports.Howl = o), "undefined" != typeof window ? (window.HowlerGlobal = e, window.Howler = n, window.Howl = o, window.Sound = t) : "undefined" != typeof global && (global.HowlerGlobal = e, global.Howler = n, global.Howl = o, global.Sound = t)
|
||||
}();
|
||||
/*! Spatial Plugin */
|
||||
! function() {
|
||||
"use strict";
|
||||
HowlerGlobal.prototype._pos = [0, 0, 0], HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0], HowlerGlobal.prototype.stereo = function(e) {
|
||||
var n = this;
|
||||
if (!n.ctx || !n.ctx.listener) return n;
|
||||
for (var t = n._howls.length - 1; t >= 0; t--) n._howls[t].stereo(e);
|
||||
return n
|
||||
}, HowlerGlobal.prototype.pos = function(e, n, t) {
|
||||
var r = this;
|
||||
return r.ctx && r.ctx.listener ? (n = "number" != typeof n ? r._pos[1] : n, t = "number" != typeof t ? r._pos[2] : t, "number" != typeof e ? r._pos : (r._pos = [e, n, t], void 0 !== r.ctx.listener.positionX ? (r.ctx.listener.positionX.setTargetAtTime(r._pos[0], Howler.ctx.currentTime, .1), r.ctx.listener.positionY.setTargetAtTime(r._pos[1], Howler.ctx.currentTime, .1), r.ctx.listener.positionZ.setTargetAtTime(r._pos[2], Howler.ctx.currentTime, .1)) : r.ctx.listener.setPosition(r._pos[0], r._pos[1], r._pos[2]), r)) : r
|
||||
}, HowlerGlobal.prototype.orientation = function(e, n, t, r, o, i) {
|
||||
var a = this;
|
||||
if (!a.ctx || !a.ctx.listener) return a;
|
||||
var p = a._orientation;
|
||||
return n = "number" != typeof n ? p[1] : n, t = "number" != typeof t ? p[2] : t, r = "number" != typeof r ? p[3] : r, o = "number" != typeof o ? p[4] : o, i = "number" != typeof i ? p[5] : i, "number" != typeof e ? p : (a._orientation = [e, n, t, r, o, i], void 0 !== a.ctx.listener.forwardX ? (a.ctx.listener.forwardX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.forwardY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.forwardZ.setTargetAtTime(t, Howler.ctx.currentTime, .1), a.ctx.listener.upX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.upY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.upZ.setTargetAtTime(t, Howler.ctx.currentTime, .1)) : a.ctx.listener.setOrientation(e, n, t, r, o, i), a)
|
||||
}, Howl.prototype.init = function(e) {
|
||||
return function(n) {
|
||||
var t = this;
|
||||
return t._orientation = n.orientation || [1, 0, 0], t._stereo = n.stereo || null, t._pos = n.pos || null, t._pannerAttr = {
|
||||
coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : 360,
|
||||
coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : 360,
|
||||
coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : 0,
|
||||
distanceModel: void 0 !== n.distanceModel ? n.distanceModel : "inverse",
|
||||
maxDistance: void 0 !== n.maxDistance ? n.maxDistance : 1e4,
|
||||
panningModel: void 0 !== n.panningModel ? n.panningModel : "HRTF",
|
||||
refDistance: void 0 !== n.refDistance ? n.refDistance : 1,
|
||||
rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : 1
|
||||
}, t._onstereo = n.onstereo ? [{
|
||||
fn: n.onstereo
|
||||
}] : [], t._onpos = n.onpos ? [{
|
||||
fn: n.onpos
|
||||
}] : [], t._onorientation = n.onorientation ? [{
|
||||
fn: n.onorientation
|
||||
}] : [], e.call(this, n)
|
||||
}
|
||||
}(Howl.prototype.init), Howl.prototype.stereo = function(n, t) {
|
||||
var r = this;
|
||||
if (!r._webAudio) return r;
|
||||
if ("loaded" !== r._state) return r._queue.push({
|
||||
event: "stereo",
|
||||
action: function() {
|
||||
r.stereo(n, t)
|
||||
}
|
||||
}), r;
|
||||
var o = void 0 === Howler.ctx.createStereoPanner ? "spatial" : "stereo";
|
||||
if (void 0 === t) {
|
||||
if ("number" != typeof n) return r._stereo;
|
||||
r._stereo = n, r._pos = [n, 0, 0]
|
||||
}
|
||||
for (var i = r._getSoundIds(t), a = 0; a < i.length; a++) {
|
||||
var p = r._soundById(i[a]);
|
||||
if (p) {
|
||||
if ("number" != typeof n) return p._stereo;
|
||||
p._stereo = n, p._pos = [n, 0, 0], p._node && (p._pannerAttr.panningModel = "equalpower", p._panner && p._panner.pan || e(p, o), "spatial" === o ? void 0 !== p._panner.positionX ? (p._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime), p._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime)) : p._panner.setPosition(n, 0, 0) : p._panner.pan.setValueAtTime(n, Howler.ctx.currentTime)), r._emit("stereo", p._id)
|
||||
}
|
||||
}
|
||||
return r
|
||||
}, Howl.prototype.pos = function(n, t, r, o) {
|
||||
var i = this;
|
||||
if (!i._webAudio) return i;
|
||||
if ("loaded" !== i._state) return i._queue.push({
|
||||
event: "pos",
|
||||
action: function() {
|
||||
i.pos(n, t, r, o)
|
||||
}
|
||||
}), i;
|
||||
if (t = "number" != typeof t ? 0 : t, r = "number" != typeof r ? -.5 : r, void 0 === o) {
|
||||
if ("number" != typeof n) return i._pos;
|
||||
i._pos = [n, t, r]
|
||||
}
|
||||
for (var a = i._getSoundIds(o), p = 0; p < a.length; p++) {
|
||||
var s = i._soundById(a[p]);
|
||||
if (s) {
|
||||
if ("number" != typeof n) return s._pos;
|
||||
s._pos = [n, t, r], s._node && (s._panner && !s._panner.pan || e(s, "spatial"), void 0 !== s._panner.positionX ? (s._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.positionY.setValueAtTime(t, Howler.ctx.currentTime), s._panner.positionZ.setValueAtTime(r, Howler.ctx.currentTime)) : s._panner.setOrientation(n, t, r)), i._emit("pos", s._id)
|
||||
}
|
||||
}
|
||||
return i
|
||||
}, Howl.prototype.orientation = function(n, t, r, o) {
|
||||
var i = this;
|
||||
if (!i._webAudio) return i;
|
||||
if ("loaded" !== i._state) return i._queue.push({
|
||||
event: "orientation",
|
||||
action: function() {
|
||||
i.orientation(n, t, r, o)
|
||||
}
|
||||
}), i;
|
||||
if (t = "number" != typeof t ? i._orientation[1] : t, r = "number" != typeof r ? i._orientation[2] : r, void 0 === o) {
|
||||
if ("number" != typeof n) return i._orientation;
|
||||
i._orientation = [n, t, r]
|
||||
}
|
||||
for (var a = i._getSoundIds(o), p = 0; p < a.length; p++) {
|
||||
var s = i._soundById(a[p]);
|
||||
if (s) {
|
||||
if ("number" != typeof n) return s._orientation;
|
||||
s._orientation = [n, t, r], s._node && (s._panner || (s._pos || (s._pos = i._pos || [0, 0, -.5]), e(s, "spatial")), void 0 !== s._panner.orientationX ? (s._panner.orientationX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.orientationY.setValueAtTime(t, Howler.ctx.currentTime), s._panner.orientationZ.setValueAtTime(r, Howler.ctx.currentTime)) : s._panner.setOrientation(n, t, r)), i._emit("orientation", s._id)
|
||||
}
|
||||
}
|
||||
return i
|
||||
}, Howl.prototype.pannerAttr = function() {
|
||||
var n, t, r, o = this,
|
||||
i = arguments;
|
||||
if (!o._webAudio) return o;
|
||||
if (0 === i.length) return o._pannerAttr;
|
||||
if (1 === i.length) {
|
||||
if ("object" != typeof i[0]) return r = o._soundById(parseInt(i[0], 10)), r ? r._pannerAttr : o._pannerAttr;
|
||||
n = i[0], void 0 === t && (n.pannerAttr || (n.pannerAttr = {
|
||||
coneInnerAngle: n.coneInnerAngle,
|
||||
coneOuterAngle: n.coneOuterAngle,
|
||||
coneOuterGain: n.coneOuterGain,
|
||||
distanceModel: n.distanceModel,
|
||||
maxDistance: n.maxDistance,
|
||||
refDistance: n.refDistance,
|
||||
rolloffFactor: n.rolloffFactor,
|
||||
panningModel: n.panningModel
|
||||
}), o._pannerAttr = {
|
||||
coneInnerAngle: void 0 !== n.pannerAttr.coneInnerAngle ? n.pannerAttr.coneInnerAngle : o._coneInnerAngle,
|
||||
coneOuterAngle: void 0 !== n.pannerAttr.coneOuterAngle ? n.pannerAttr.coneOuterAngle : o._coneOuterAngle,
|
||||
coneOuterGain: void 0 !== n.pannerAttr.coneOuterGain ? n.pannerAttr.coneOuterGain : o._coneOuterGain,
|
||||
distanceModel: void 0 !== n.pannerAttr.distanceModel ? n.pannerAttr.distanceModel : o._distanceModel,
|
||||
maxDistance: void 0 !== n.pannerAttr.maxDistance ? n.pannerAttr.maxDistance : o._maxDistance,
|
||||
refDistance: void 0 !== n.pannerAttr.refDistance ? n.pannerAttr.refDistance : o._refDistance,
|
||||
rolloffFactor: void 0 !== n.pannerAttr.rolloffFactor ? n.pannerAttr.rolloffFactor : o._rolloffFactor,
|
||||
panningModel: void 0 !== n.pannerAttr.panningModel ? n.pannerAttr.panningModel : o._panningModel
|
||||
})
|
||||
} else 2 === i.length && (n = i[0], t = parseInt(i[1], 10));
|
||||
for (var a = o._getSoundIds(t), p = 0; p < a.length; p++)
|
||||
if (r = o._soundById(a[p])) {
|
||||
var s = r._pannerAttr;
|
||||
s = {
|
||||
coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : s.coneInnerAngle,
|
||||
coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : s.coneOuterAngle,
|
||||
coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : s.coneOuterGain,
|
||||
distanceModel: void 0 !== n.distanceModel ? n.distanceModel : s.distanceModel,
|
||||
maxDistance: void 0 !== n.maxDistance ? n.maxDistance : s.maxDistance,
|
||||
refDistance: void 0 !== n.refDistance ? n.refDistance : s.refDistance,
|
||||
rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : s.rolloffFactor,
|
||||
panningModel: void 0 !== n.panningModel ? n.panningModel : s.panningModel
|
||||
};
|
||||
var c = r._panner;
|
||||
c ? (c.coneInnerAngle = s.coneInnerAngle, c.coneOuterAngle = s.coneOuterAngle, c.coneOuterGain = s.coneOuterGain, c.distanceModel = s.distanceModel, c.maxDistance = s.maxDistance, c.refDistance = s.refDistance, c.rolloffFactor = s.rolloffFactor, c.panningModel = s.panningModel) : (r._pos || (r._pos = o._pos || [0, 0, -.5]), e(r, "spatial"))
|
||||
} return o
|
||||
}, Sound.prototype.init = function(e) {
|
||||
return function() {
|
||||
var n = this,
|
||||
t = n._parent;
|
||||
n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, e.call(this), n._stereo ? t.stereo(n._stereo) : n._pos && t.pos(n._pos[0], n._pos[1], n._pos[2], n._id)
|
||||
}
|
||||
}(Sound.prototype.init), Sound.prototype.reset = function(e) {
|
||||
return function() {
|
||||
var n = this,
|
||||
t = n._parent;
|
||||
return n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, n._stereo ? t.stereo(n._stereo) : n._pos ? t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) : n._panner && (n._panner.disconnect(0), n._panner = void 0, t._refreshBuffer(n)), e.call(this)
|
||||
}
|
||||
}(Sound.prototype.reset);
|
||||
var e = function(e, n) {
|
||||
n = n || "spatial", "spatial" === n ? (e._panner = Howler.ctx.createPanner(), e._panner.coneInnerAngle = e._pannerAttr.coneInnerAngle, e._panner.coneOuterAngle = e._pannerAttr.coneOuterAngle, e._panner.coneOuterGain = e._pannerAttr.coneOuterGain, e._panner.distanceModel = e._pannerAttr.distanceModel, e._panner.maxDistance = e._pannerAttr.maxDistance, e._panner.refDistance = e._pannerAttr.refDistance, e._panner.rolloffFactor = e._pannerAttr.rolloffFactor, e._panner.panningModel = e._pannerAttr.panningModel, void 0 !== e._panner.positionX ? (e._panner.positionX.setValueAtTime(e._pos[0], Howler.ctx.currentTime), e._panner.positionY.setValueAtTime(e._pos[1], Howler.ctx.currentTime), e._panner.positionZ.setValueAtTime(e._pos[2], Howler.ctx.currentTime)) : e._panner.setPosition(e._pos[0], e._pos[1], e._pos[2]), void 0 !== e._panner.orientationX ? (e._panner.orientationX.setValueAtTime(e._orientation[0], Howler.ctx.currentTime), e._panner.orientationY.setValueAtTime(e._orientation[1], Howler.ctx.currentTime), e._panner.orientationZ.setValueAtTime(e._orientation[2], Howler.ctx.currentTime)) : e._panner.setOrientation(e._orientation[0], e._orientation[1], e._orientation[2])) : (e._panner = Howler.ctx.createStereoPanner(), e._panner.pan.setValueAtTime(e._stereo, Howler.ctx.currentTime)), e._panner.connect(e._node), e._paused || e._parent.pause(e._id, !0).play(e._id, !0)
|
||||
}
|
||||
}();
|
||||
2607
src/bower_components/jquery/dist/jquery.slim.min.js
vendored
2607
src/bower_components/jquery/dist/jquery.slim.min.js
vendored
File diff suppressed because it is too large
Load Diff
91
src/bower_components/libjass/libjass.css
vendored
91
src/bower_components/libjass/libjass.css
vendored
@@ -1,91 +0,0 @@
|
||||
.libjass-wrapper {
|
||||
position: relative;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.libjass-subs,
|
||||
.libjass-subs .an {
|
||||
position: absolute
|
||||
}
|
||||
|
||||
.libjass-subs {
|
||||
overflow: hidden;
|
||||
line-height: 0
|
||||
}
|
||||
|
||||
.libjass-subs,
|
||||
.libjass-subs * {
|
||||
pointer-events: none;
|
||||
-webkit-animation-fill-mode: both !important;
|
||||
animation-fill-mode: both !important
|
||||
}
|
||||
|
||||
.libjass-subs.paused * {
|
||||
-webkit-animation-play-state: paused !important;
|
||||
animation-play-state: paused !important
|
||||
}
|
||||
|
||||
.libjass-subs .an1,
|
||||
.libjass-subs .an2,
|
||||
.libjass-subs .an3 {
|
||||
bottom: 0
|
||||
}
|
||||
|
||||
.libjass-subs .an4,
|
||||
.libjass-subs .an5,
|
||||
.libjass-subs .an6 {
|
||||
display: table;
|
||||
width: 100%;
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.libjass-subs .an4>*,
|
||||
.libjass-subs .an5>*,
|
||||
.libjass-subs .an6>* {
|
||||
display: table-cell;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.libjass-subs .an7,
|
||||
.libjass-subs .an8,
|
||||
.libjass-subs .an9 {
|
||||
top: 0
|
||||
}
|
||||
|
||||
.libjass-subs .an1,
|
||||
.libjass-subs .an4,
|
||||
.libjass-subs .an7 {
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.libjass-subs .an2,
|
||||
.libjass-subs .an5,
|
||||
.libjass-subs .an8 {
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.libjass-subs .an3,
|
||||
.libjass-subs .an6,
|
||||
.libjass-subs .an9 {
|
||||
text-align: right
|
||||
}
|
||||
|
||||
.libjass-subs div[data-dialogue-id]>span {
|
||||
-webkit-perspective-origin: center;
|
||||
perspective-origin: center;
|
||||
-webkit-perspective: 400px;
|
||||
perspective: 400px
|
||||
}
|
||||
|
||||
.libjass-font-measure {
|
||||
position: absolute;
|
||||
visibility: hidden;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
line-height: normal
|
||||
}
|
||||
|
||||
.libjass-filters {
|
||||
display: block
|
||||
}
|
||||
4185
src/bower_components/libjass/libjass.min.js
vendored
4185
src/bower_components/libjass/libjass.min.js
vendored
File diff suppressed because it is too large
Load Diff
36
src/bundle.js
Normal file
36
src/bundle.js
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* require.js module definitions bundled by webpack
|
||||
*/
|
||||
// Use define from require.js not webpack's define
|
||||
var _define = window.define;
|
||||
|
||||
// jstree
|
||||
var jstree = require("jstree");
|
||||
require("jstree/dist/themes/default/style.css");
|
||||
_define("jstree", function() { return jstree; });
|
||||
|
||||
// jquery
|
||||
var jquery = require("jquery");
|
||||
_define("jQuery", function() { return jquery; });
|
||||
|
||||
// hlsjs
|
||||
var hlsjs = require("hls.js");
|
||||
_define("hlsjs", function() { return hlsjs; });
|
||||
|
||||
// howler
|
||||
var howler = require("howler");
|
||||
_define("howler", function() { return howler; });
|
||||
|
||||
// swiper
|
||||
var swiper = require("swiper");
|
||||
require("swiper/dist/css/swiper.min.css");
|
||||
_define("swiper", function() { return swiper; });
|
||||
|
||||
// sortable
|
||||
var sortable = require("sortablejs");
|
||||
_define("sortable", function() { return sortable; });
|
||||
|
||||
// libjass
|
||||
var libjass = require("libjass");
|
||||
require("libjass/libjass.css");
|
||||
_define("libjass", function() { return libjass; });
|
||||
@@ -36,6 +36,7 @@
|
||||
font-weight: inherit;
|
||||
box-shadow: none;
|
||||
flex-shrink: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:focus {
|
||||
@@ -41,10 +41,6 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'browser', 'dom', 'emby-bu
|
||||
var windowHeight = windowSize.innerHeight;
|
||||
var windowWidth = windowSize.innerWidth;
|
||||
|
||||
if (windowWidth < 600 || windowHeight < 600) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var pos = getOffsets([options.positionTo])[0];
|
||||
|
||||
if (options.positionY !== 'top') {
|
||||
@@ -56,7 +52,7 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'browser', 'dom', 'emby-bu
|
||||
var height = dlg.offsetHeight || 300;
|
||||
var width = dlg.offsetWidth || 160;
|
||||
|
||||
// Account for popup size
|
||||
// Account for popup size
|
||||
pos.top -= height / 2;
|
||||
pos.left -= width / 2;
|
||||
|
||||
3
src/components/actionsheet/package.json
Normal file
3
src/components/actionsheet/package.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"main": "actionsheet.js"
|
||||
}
|
||||
@@ -4,14 +4,21 @@ define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotific
|
||||
function getEntryHtml(entry, apiClient) {
|
||||
var html = "";
|
||||
html += '<div class="listItem listItem-border">';
|
||||
var color = "Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity ? "#cc0000" : "#00a4dc";
|
||||
var color = "#00a4dc";
|
||||
var icon = "notifications";
|
||||
if ("Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity) {
|
||||
color = "#cc0000";
|
||||
icon = "notification_important";
|
||||
}
|
||||
if (entry.UserId && entry.UserPrimaryImageTag) {
|
||||
html += '<i class="listItemIcon md-icon" style="width:2em!important;height:2em!important;padding:0;color:transparent;background-color:' + color + ";background-image:url('" + apiClient.getUserImageUrl(entry.UserId, {
|
||||
type: "Primary",
|
||||
tag: entry.UserPrimaryImageTag,
|
||||
height: 40
|
||||
}) + "');background-repeat:no-repeat;background-position:center center;background-size: cover;\">dvr</i>"
|
||||
} else html += '<i class="listItemIcon md-icon" style="background-color:' + color + '">dvr</i>';
|
||||
} else {
|
||||
html += '<i class="listItemIcon md-icon" style="background-color:' + color + '">' + icon + '</i>';
|
||||
}
|
||||
html += '<div class="listItemBody three-line">', html += '<div class="listItemBodyText">', html += entry.Name, html += "</div>", html += '<div class="listItemBodyText secondary">';
|
||||
var date = datetime.parseISO8601Date(entry.Date, !0);
|
||||
return html += datetime.toLocaleString(date).toLowerCase(), html += "</div>", html += '<div class="listItemBodyText secondary listItemBodyText-nowrap">', html += entry.ShortOverview || "", html += "</div>", html += "</div>", entry.Overview && (html += '<button type="button" is="paper-icon-button-light" class="btnEntryInfo" data-id="' + entry.Id + '" title="' + globalize.translate("Info") + '"><i class="md-icon">info</i></button>'), html += "</div>"
|
||||
@@ -86,4 +93,4 @@ define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotific
|
||||
var onUpdate = this.updateFn;
|
||||
onUpdate && events.off(serverNotifications, "ActivityLogEntry", onUpdate), this.items = null, this.options = null
|
||||
}, ActivityLog
|
||||
});
|
||||
});
|
||||
|
||||
45
src/components/alert.js
Normal file
45
src/components/alert.js
Normal file
@@ -0,0 +1,45 @@
|
||||
define(['browser', 'dialog', 'globalize'], function (browser, dialog, globalize) {
|
||||
'use strict';
|
||||
|
||||
function replaceAll(originalString, strReplace, strWith) {
|
||||
var reg = new RegExp(strReplace, 'ig');
|
||||
return originalString.replace(reg, strWith);
|
||||
}
|
||||
|
||||
return function (text, title) {
|
||||
|
||||
var options;
|
||||
if (typeof text === 'string') {
|
||||
options = {
|
||||
title: title,
|
||||
text: text
|
||||
};
|
||||
} else {
|
||||
options = text;
|
||||
}
|
||||
|
||||
if (browser.tv && window.alert) {
|
||||
alert(replaceAll(options.text || '', '<br/>', '\n'));
|
||||
} else {
|
||||
var items = [];
|
||||
|
||||
items.push({
|
||||
name: globalize.translate('ButtonGotIt'),
|
||||
id: 'ok',
|
||||
type: 'submit'
|
||||
});
|
||||
|
||||
options.buttons = items;
|
||||
|
||||
return dialog(options).then(function (result) {
|
||||
if (result === 'ok') {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return Promise.reject();
|
||||
});
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
};
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user