Compare commits
2384 Commits
48f7a25a22
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16648d50f6 | ||
|
|
062dc0e75e | ||
|
|
42effd53fc | ||
|
|
3a3403bb1f | ||
|
|
6fb4989256 | ||
|
|
9750ca4b79 | ||
|
|
0500f7eda8 | ||
|
|
19beff7dbc | ||
|
|
dfe1b84992 | ||
|
|
3d3b544cb4 | ||
|
|
65fa6027ee | ||
|
|
b3a0ba72eb | ||
|
|
f3e2143b45 | ||
|
|
d289f95d3d | ||
|
|
d8b41ec9b5 | ||
|
|
05f7d8b814 | ||
|
|
c2fc09fdaa | ||
|
|
8a7210a3b9 | ||
|
|
e029ca7fd0 | ||
|
|
ffcfae69d5 | ||
|
|
dcaee01ce8 | ||
|
|
7561a4577e | ||
|
|
98b735dbae | ||
|
|
d2daed788c | ||
|
|
23257745a7 | ||
|
|
156954553d | ||
|
|
eb20af14a6 | ||
|
|
ae247c7a91 | ||
|
|
d49e6ef488 | ||
|
|
2b20d98ee0 | ||
|
|
b8cf6a3e71 | ||
|
|
af57f412c9 | ||
|
|
3696b81e69 | ||
|
|
5b6fefd43b | ||
|
|
a863ab888d | ||
|
|
209a81ef71 | ||
|
|
bd91dcbc77 | ||
|
|
b89f25405a | ||
|
|
198f08cb3a | ||
|
|
febaac3865 | ||
|
|
f82167656b | ||
|
|
6e20d7d216 | ||
|
|
612a489cdf | ||
|
|
db2e5b2da4 | ||
|
|
d81310ed25 | ||
|
|
ec86aa9286 | ||
|
|
5d58ddcd49 | ||
|
|
c515c8aeb3 | ||
|
|
debf92afd7 | ||
|
|
601f930324 | ||
|
|
e77ced44c7 | ||
|
|
9f37f54634 | ||
|
|
dc7f325d13 | ||
|
|
35c941488e | ||
|
|
fc32843c5a | ||
|
|
26b31fb10a | ||
|
|
9aa6c9c6c5 | ||
|
|
855a15bc73 | ||
|
|
3329661135 | ||
|
|
791bd6bf27 | ||
|
|
d6be985c4b | ||
|
|
7286846308 | ||
|
|
81dfce8b3d | ||
|
|
aff0e27c55 | ||
|
|
68fe786cb7 | ||
|
|
9a0b0a8989 | ||
|
|
60b8271e4f | ||
|
|
a52042b56c | ||
|
|
7a3dac865e | ||
|
|
74e0fb721d | ||
|
|
ba366df7a5 | ||
|
|
d4e6082d2e | ||
|
|
ea325b8ec5 | ||
|
|
41b1f39752 | ||
|
|
c75c3e3ed9 | ||
|
|
ee495a5cde | ||
|
|
b52e871cfe | ||
|
|
0fc725873e | ||
|
|
db14657101 | ||
|
|
5524efb3ba | ||
|
|
1397349058 | ||
|
|
25cac4d0ab | ||
|
|
5a282cc372 | ||
|
|
3e6592d1f3 | ||
|
|
b95e2fadf7 | ||
|
|
e3b922da6c | ||
|
|
9bf42ff6c0 | ||
|
|
ba127ee53d | ||
|
|
3ee73d2f77 | ||
|
|
4e68a69e02 | ||
|
|
570be66a91 | ||
|
|
0092aab579 | ||
|
|
78e9088ee5 | ||
|
|
cdb4644b42 | ||
|
|
f80f73d0d4 | ||
|
|
e70acdfe79 | ||
|
|
75c5a37567 | ||
|
|
9aa7fd77c4 | ||
|
|
6b768b6828 | ||
|
|
0f44b4d410 | ||
|
|
3368e2b343 | ||
|
|
8e77a5ef46 | ||
|
|
29dc94d77d | ||
|
|
03b039c937 | ||
|
|
f4f1afdf3b | ||
|
|
fefb165274 | ||
|
|
a3633c2f9f | ||
|
|
a007593390 | ||
|
|
f31c69f255 | ||
|
|
9a088599e6 | ||
|
|
01341b80d6 | ||
|
|
fec70db20b | ||
|
|
7bbb7cb43d | ||
|
|
e7a1ad42f5 | ||
|
|
be90982420 | ||
|
|
ce94456494 | ||
|
|
fe3fcd0741 | ||
|
|
5ca7537e24 | ||
|
|
35449ef906 | ||
|
|
bebebf8447 | ||
|
|
101c84763a | ||
|
|
36ca313a89 | ||
|
|
d07d3c2c8d | ||
|
|
4dfda71a94 | ||
|
|
75c2a77aea | ||
|
|
5bea829acb | ||
|
|
66acacc71a | ||
|
|
c646b1e29b | ||
|
|
4bd6e39a8c | ||
|
|
4154246ff2 | ||
|
|
e46607a5df | ||
|
|
ce6ad5c14a | ||
|
|
28ded0b4b9 | ||
|
|
f2c2c7856b | ||
|
|
74884a500e | ||
|
|
8b8f7fddd9 | ||
|
|
371e97f695 | ||
|
|
a77ce63548 | ||
|
|
85a5f13ec1 | ||
|
|
5bbfbc90a8 | ||
|
|
a6014a5d1a | ||
|
|
cc45502119 | ||
|
|
241e314c68 | ||
|
|
4843f0ebc7 | ||
|
|
79ff9eb58b | ||
|
|
e3126b1201 | ||
|
|
392d1daa2a | ||
|
|
d360854a6d | ||
|
|
786ef491ac | ||
|
|
f62e8d6bf6 | ||
|
|
b62c705b76 | ||
|
|
4dd236d5da | ||
|
|
d0f12c774d | ||
|
|
13745159c6 | ||
|
|
a41134555a | ||
|
|
7a7c6e92f6 | ||
|
|
9a8527a780 | ||
|
|
33179c0829 | ||
|
|
222be390ec | ||
|
|
3aa53e431d | ||
|
|
b79cf4fb78 | ||
|
|
93df88768c | ||
|
|
d4b73b6dd3 | ||
|
|
acb114012c | ||
|
|
e8d6345400 | ||
|
|
7062f04e78 | ||
|
|
d85e917935 | ||
|
|
5a210451e0 | ||
|
|
e91ff659e9 | ||
|
|
dc21571a6f | ||
|
|
b01913690e | ||
|
|
a05928e399 | ||
|
|
dfc9a88ba8 | ||
|
|
7562584830 | ||
|
|
26d8864659 | ||
|
|
cb0b0547cb | ||
|
|
7a70129b29 | ||
|
|
a373a899e3 | ||
|
|
ca925d4d7f | ||
|
|
43358550a9 | ||
|
|
506db492bc | ||
|
|
8d1b2975da | ||
|
|
ff4ac301c5 | ||
|
|
baa35b3c09 | ||
|
|
4f3b152b17 | ||
|
|
a7e2a2e5c3 | ||
|
|
b481ded6b3 | ||
|
|
fd205aed88 | ||
|
|
39cdea17f3 | ||
|
|
48af5939db | ||
|
|
a1be68366c | ||
|
|
37b92209f0 | ||
|
|
9754f9e9af | ||
|
|
ccd833665f | ||
|
|
a77e13c7de | ||
|
|
46dbbc75fc | ||
|
|
07c30108d0 | ||
|
|
6216879677 | ||
|
|
95c1bbc129 | ||
|
|
70da29e3c5 | ||
|
|
5764e1fd17 | ||
|
|
d554ef6b02 | ||
|
|
8126cc29d9 | ||
|
|
2e1b5561dd | ||
|
|
c830c86c54 | ||
|
|
ecf7abd2ae | ||
|
|
4b0e1b6711 | ||
|
|
6a49f40955 | ||
|
|
cb686a5bc2 | ||
|
|
27bf48eb05 | ||
|
|
7f2b1e03ff | ||
|
|
7386aa9da7 | ||
|
|
8438d2e3b3 | ||
|
|
f42d79d521 | ||
|
|
3189652fc8 | ||
|
|
3b5e7ee5ec | ||
|
|
85fbc9d2f2 | ||
|
|
2e9e678c51 | ||
|
|
bf4beafb96 | ||
|
|
3f8714003c | ||
|
|
82c436f663 | ||
|
|
2f7ddd277d | ||
|
|
0511b5a4a4 | ||
|
|
b4877d16da | ||
|
|
b61bc1ad3b | ||
|
|
53593947dd | ||
|
|
6b40a0da5e | ||
|
|
c083c4e6d4 | ||
|
|
a56e2a608e | ||
|
|
2e20e0344a | ||
|
|
762e605bd1 | ||
|
|
f76341f0dd | ||
|
|
eced595ead | ||
|
|
ef1722d25a | ||
|
|
9e0fc34486 | ||
|
|
16ca21d597 | ||
|
|
91771c9ef4 | ||
|
|
5042f8fb40 | ||
|
|
0951ab21c2 | ||
|
|
db5d42a02e | ||
|
|
888fa50d8a | ||
|
|
30923f7cda | ||
|
|
045efb6e2b | ||
|
|
3ae4b2d781 | ||
|
|
a5fda3e0e9 | ||
|
|
950048df9a | ||
|
|
0d20872489 | ||
|
|
fd8a2c346b | ||
|
|
314c43bcda | ||
|
|
6a5bb6a0f8 | ||
|
|
aa1a5bd95d | ||
|
|
5515c969de | ||
|
|
272a57de58 | ||
|
|
348b29910a | ||
|
|
f8edbef602 | ||
|
|
58e894dea1 | ||
|
|
14d8e06bc0 | ||
|
|
6f1e2258d0 | ||
|
|
c8d6a9250f | ||
|
|
9b60c2128e | ||
|
|
70ac1057ee | ||
|
|
6449fceef3 | ||
|
|
36ba4542a6 | ||
|
|
40bb73e897 | ||
|
|
c34905247c | ||
|
|
63f0410c5c | ||
|
|
2aa323427b | ||
|
|
176573733b | ||
|
|
e7b9147995 | ||
|
|
fe0d450af0 | ||
|
|
38784a6e59 | ||
|
|
defe45c396 | ||
|
|
05df904f1a | ||
|
|
718771ea64 | ||
|
|
07993556ff | ||
|
|
2a03707e16 | ||
|
|
13e4bf1adc | ||
|
|
bc857530e3 | ||
|
|
2a12f5ca1d | ||
|
|
b72bb39ff7 | ||
|
|
7cdc4a960f | ||
|
|
677c736621 | ||
|
|
f4300d8dfb | ||
|
|
83b5a5f8ba | ||
|
|
e272ae4dd2 | ||
|
|
16bc69f584 | ||
|
|
806ab35316 | ||
|
|
98551c4682 | ||
|
|
58ada146a9 | ||
|
|
856601d1d9 | ||
|
|
fa1ca2b5f3 | ||
|
|
d65c34800e | ||
|
|
e770aed8e3 | ||
|
|
75d3a79b03 | ||
|
|
351fd8def0 | ||
|
|
ef1984664d | ||
|
|
f0a2943687 | ||
|
|
e5d457bd55 | ||
|
|
b0b8295629 | ||
|
|
c0459201b6 | ||
|
|
6a2772fac4 | ||
|
|
bfb9581f12 | ||
|
|
c711d73cd0 | ||
|
|
3ced6a9f79 | ||
|
|
2a4dce106e | ||
|
|
b2116f728f | ||
|
|
0b6cfbe5bc | ||
|
|
debf539fd3 | ||
|
|
873ff465e1 | ||
|
|
37d283cac9 | ||
|
|
eba09e4cf9 | ||
|
|
938707f17f | ||
|
|
dde3ea3a34 | ||
|
|
157667f771 | ||
|
|
317f6c36a2 | ||
|
|
2ae185c7da | ||
|
|
39fcba7f04 | ||
|
|
de79f7f51e | ||
|
|
12d0403b64 | ||
|
|
0ae834ccf0 | ||
|
|
db7e9702dd | ||
|
|
d380c64f7c | ||
|
|
ba2fd254ff | ||
|
|
ff360423f6 | ||
|
|
763a913be6 | ||
|
|
ec85faf93a | ||
|
|
841d3a8475 | ||
|
|
cfb842bd89 | ||
|
|
56767cf965 | ||
|
|
bfb48abfdd | ||
|
|
9ec2ad25a7 | ||
|
|
5c090c604a | ||
|
|
1feb44f95d | ||
|
|
131751795f | ||
|
|
f3ecfb66e3 | ||
|
|
b7d58cbe13 | ||
|
|
e2124acad2 | ||
|
|
37275f8930 | ||
|
|
003aff49f9 | ||
|
|
f4c42a3cf5 | ||
|
|
7563873282 | ||
|
|
c64c4dd694 | ||
|
|
725087bf1c | ||
|
|
1ce8c47da2 | ||
|
|
a6f16b9f62 | ||
|
|
82f8b135bd | ||
|
|
5ac0d79b99 | ||
|
|
db62652dc8 | ||
|
|
1a2bf77692 | ||
|
|
d855100770 | ||
|
|
5161519bb3 | ||
|
|
b7beea60ce | ||
|
|
d0bb56e436 | ||
|
|
91981a6dd7 | ||
|
|
24adf04fe3 | ||
|
|
6a3e1d7390 | ||
|
|
9c4078a917 | ||
|
|
81c7925b86 | ||
|
|
2c7fb51d65 | ||
|
|
7b1433edd3 | ||
|
|
e70ea13161 | ||
|
|
3392b10182 | ||
|
|
9c1124b97f | ||
|
|
0d9a65a077 | ||
|
|
c85915bf97 | ||
|
|
6338e8fb8d | ||
|
|
6cb990dbdb | ||
|
|
c9ba7bb90b | ||
|
|
f04451f746 | ||
|
|
6705607f67 | ||
|
|
3767fc8bfe | ||
|
|
19dbd624ca | ||
|
|
e84beacca1 | ||
|
|
8c84839bdd | ||
|
|
7ad2051dd7 | ||
|
|
bddc33a734 | ||
|
|
5acc2c607b | ||
|
|
86669a89c6 | ||
|
|
5c12122e04 | ||
|
|
d600ee32f2 | ||
|
|
c6826b3300 | ||
|
|
97361a3977 | ||
|
|
bdb03bd622 | ||
|
|
aeceab3d4d | ||
|
|
41e9e0d85e | ||
|
|
3fb97ff3cf | ||
|
|
947b56148d | ||
|
|
a9ddce7150 | ||
|
|
5e081a8e2d | ||
|
|
b67824969f | ||
|
|
5ce3d79e49 | ||
|
|
a80e188d15 | ||
|
|
d06044ab28 | ||
|
|
42330a7d70 | ||
|
|
69d2550a85 | ||
|
|
7e87273d8d | ||
|
|
c311964a8a | ||
|
|
899691ebd7 | ||
|
|
c66d7aa26f | ||
|
|
9cf1514eb8 | ||
|
|
0a5a84c0d4 | ||
|
|
b0e8ae8b5b | ||
|
|
2872f90c2a | ||
|
|
562d476693 | ||
|
|
b392f24456 | ||
|
|
a08d091989 | ||
|
|
373c0a9e25 | ||
|
|
3902f32b23 | ||
|
|
72ab24bf1e | ||
|
|
c121ef0fd6 | ||
|
|
ce951f9a64 | ||
|
|
b6551ab79e | ||
|
|
b383482103 | ||
|
|
37b5e8c573 | ||
|
|
77ade22b08 | ||
|
|
8130cc314e | ||
|
|
6f6b3d102e | ||
|
|
d3bd6238b4 | ||
|
|
ca4e0e0f32 | ||
|
|
c9442fff45 | ||
|
|
d4bcf96c64 | ||
|
|
6ebfe79016 | ||
|
|
28e37ccccc | ||
|
|
3d754238ac | ||
|
|
a6b2608a83 | ||
|
|
dda72701f6 | ||
|
|
6096d1a811 | ||
|
|
d2b4ceb166 | ||
|
|
bcf5ca6024 | ||
|
|
9ae81afecc | ||
|
|
b5e016839e | ||
|
|
8aaa3bfb0b | ||
|
|
5c585d5d45 | ||
|
|
f5d6574cc6 | ||
|
|
9da2677903 | ||
|
|
8d8c17028b | ||
|
|
8b9570bb84 | ||
|
|
13c33856a2 | ||
|
|
678412f313 | ||
|
|
7836b40593 | ||
|
|
dc207ea255 | ||
|
|
79f78a0e63 | ||
|
|
ff457940a3 | ||
|
|
4731f7e6f6 | ||
|
|
4d91060fb8 | ||
|
|
221203d889 | ||
|
|
b4cb66111f | ||
|
|
2e64965fe5 | ||
|
|
89c0cd8b2a | ||
|
|
2052af7977 | ||
|
|
bc1238ad72 | ||
|
|
37495fc086 | ||
|
|
81b2d25f13 | ||
|
|
c1d548c3df | ||
|
|
3a933af347 | ||
|
|
18dcbfdb40 | ||
|
|
b3ebb32688 | ||
|
|
bd7f8b69b0 | ||
|
|
5f22e9cbdb | ||
|
|
ec58893b81 | ||
|
|
354d88cd14 | ||
|
|
376ad76590 | ||
|
|
a12c9182c0 | ||
|
|
1eb5e767f1 | ||
|
|
c530b15fbb | ||
|
|
f2cfa1c985 | ||
|
|
b1f663d4b7 | ||
|
|
19c892ab13 | ||
|
|
e13c8ccfe0 | ||
|
|
bf545ec70c | ||
|
|
043ca1efd4 | ||
|
|
559007d424 | ||
|
|
b903222a27 | ||
|
|
bfa43d45b9 | ||
|
|
62f40e34e2 | ||
|
|
4979e161ff | ||
|
|
2885a82f8e | ||
|
|
c23b3a1e19 | ||
|
|
a01b570f0e | ||
|
|
32d0eb13e7 | ||
|
|
4335c4693d | ||
|
|
31abbb9ffe | ||
|
|
9a548a4767 | ||
|
|
7351770d0f | ||
|
|
2a308c11c1 | ||
|
|
31d5fa14b0 | ||
|
|
c26a0bb739 | ||
|
|
c4afc3fd1c | ||
|
|
bdfa84081b | ||
|
|
2b63f30bd4 | ||
|
|
91c490d153 | ||
|
|
3a0e815387 | ||
|
|
623100608e | ||
|
|
816ae8f589 | ||
|
|
04dadd9d83 | ||
|
|
91fb7800cc | ||
|
|
f04968a40f | ||
|
|
3c595bf780 | ||
|
|
091149a75b | ||
|
|
b8f0661efb | ||
|
|
42ebd1f429 | ||
|
|
1a79f7b983 | ||
|
|
69810ea7cb | ||
|
|
9deff31fe1 | ||
|
|
1f845bccec | ||
|
|
535864bdd1 | ||
|
|
035c59255c | ||
|
|
92d0dd685a | ||
|
|
210f054ee2 | ||
|
|
0dc7c5572a | ||
|
|
2bcb4413ea | ||
|
|
f198929983 | ||
|
|
89da72d3d8 | ||
|
|
0bc156f863 | ||
|
|
7a0b364dcc | ||
|
|
e33b7b8d15 | ||
|
|
71d32edeef | ||
|
|
959b1d9ea4 | ||
|
|
e20999d438 | ||
|
|
4496f44fb3 | ||
|
|
3855d41e54 | ||
|
|
0d51e61e46 | ||
|
|
f770960191 | ||
|
|
022063ebd3 | ||
|
|
ded7fe0595 | ||
|
|
f8c38fa1fe | ||
|
|
42b5c0c150 | ||
|
|
bce340e3c2 | ||
|
|
d62c499022 | ||
|
|
b5eddf61f9 | ||
|
|
dc04577a6c | ||
|
|
51a364b41d | ||
|
|
6fcd31f035 | ||
|
|
ec83d43c76 | ||
|
|
d82fc704c1 | ||
|
|
39477e4561 | ||
|
|
af493bad49 | ||
|
|
1a34dbd76d | ||
|
|
f3e82375ad | ||
|
|
68e2ecfb1d | ||
|
|
54c2b51d22 | ||
|
|
7619c432ab | ||
|
|
6f8815b47b | ||
|
|
6d1faf4118 | ||
|
|
f82c6916ae | ||
|
|
1773e106fb | ||
|
|
3e3a3a09e8 | ||
|
|
11d08d001f | ||
|
|
f5ffc002f0 | ||
|
|
a8f0c25b50 | ||
|
|
7291926d40 | ||
|
|
01706d2648 | ||
|
|
8167809bd5 | ||
|
|
06f9efa492 | ||
|
|
a114211e87 | ||
|
|
26185ba1cb | ||
|
|
0063c55e34 | ||
|
|
722aca54e7 | ||
|
|
9e44418690 | ||
|
|
6636330e11 | ||
|
|
3e4c82bd23 | ||
|
|
df941b0021 | ||
|
|
96a5e5b693 | ||
|
|
23f76fd1be | ||
|
|
ffea90b5e8 | ||
|
|
61f1ad6a34 | ||
|
|
e096a6c4a4 | ||
|
|
0e69898c32 | ||
|
|
8194c1c8ea | ||
|
|
7cdcf0d7ba | ||
|
|
65bf8541a0 | ||
|
|
a12b88d6cf | ||
|
|
ceed11cf7e | ||
|
|
fbfd52e831 | ||
|
|
909dc36569 | ||
|
|
639ad6c79e | ||
|
|
32c89bcdb6 | ||
|
|
844c1d87a6 | ||
|
|
65dedc80ed | ||
|
|
37106e9230 | ||
|
|
2ac45c7b6d | ||
|
|
94d48b253a | ||
|
|
2da46c8c07 | ||
|
|
ca078bbabc | ||
|
|
2cf5a9efe9 | ||
|
|
0cf43f6eab | ||
|
|
175c76aa89 | ||
|
|
520f12975e | ||
|
|
e7c9b78827 | ||
|
|
255775a019 | ||
|
|
b679ae95f2 | ||
|
|
6d69f098f5 | ||
|
|
b7535a3151 | ||
|
|
15896d4c5b | ||
|
|
c110295413 | ||
|
|
c5545aae11 | ||
|
|
8894a1319e | ||
|
|
a487f21059 | ||
|
|
5ae2f8e3f4 | ||
|
|
2c58dfe426 | ||
|
|
47eb91a7e8 | ||
|
|
90027d12fb | ||
|
|
c78c12929a | ||
|
|
9eca44795f | ||
|
|
949136f465 | ||
|
|
341c6aed1e | ||
|
|
54d4fbdddc | ||
|
|
96a075cb2d | ||
|
|
b45a93194b | ||
|
|
0fe6a1119a | ||
|
|
928650b602 | ||
|
|
eb519ef474 | ||
|
|
1aa876acd9 | ||
|
|
fd39fa93d9 | ||
|
|
df820e6e71 | ||
|
|
5edf781da7 | ||
|
|
ea02ec3943 | ||
|
|
070ef182db | ||
|
|
d80ec2e6a6 | ||
|
|
707c8170bd | ||
|
|
edf1b64624 | ||
|
|
19121f5a3f | ||
|
|
2df3213936 | ||
|
|
8fdc313659 | ||
|
|
b5b09a7dce | ||
|
|
24cd92807c | ||
|
|
29ab61e713 | ||
|
|
c2fa571aa0 | ||
|
|
bed267b0b0 | ||
|
|
e24012f446 | ||
|
|
8d3f1c13cf | ||
|
|
d7ff6cee08 | ||
|
|
8b89119dfb | ||
|
|
81d2217fdc | ||
|
|
928f872044 | ||
|
|
01a8a24db6 | ||
|
|
87adc0472e | ||
|
|
712ad06ed4 | ||
|
|
4f247d23c4 | ||
|
|
790e77fc1f | ||
|
|
50af67e3c6 | ||
|
|
5b12a553bf | ||
|
|
8778ea1275 | ||
|
|
260e02a06f | ||
|
|
c307140db3 | ||
|
|
8790992ed3 | ||
|
|
783712ab2f | ||
|
|
21e0958a96 | ||
|
|
eea8d6cc68 | ||
|
|
1b0101f20a | ||
|
|
a525d9b200 | ||
|
|
2c2d7fdac8 | ||
|
|
95460c98a7 | ||
|
|
6f36f1c7d7 | ||
|
|
0d86a718c6 | ||
|
|
a62b026e2b | ||
|
|
5374d6fd39 | ||
|
|
d89ced2e6e | ||
|
|
ba11dc4252 | ||
|
|
5607930184 | ||
|
|
b8e9431225 | ||
|
|
5ed408226d | ||
|
|
8cc10b084d | ||
|
|
6e93528cca | ||
|
|
0c93ce2a17 | ||
|
|
24c15d9387 | ||
|
|
f0d12a4297 | ||
|
|
1163b010fb | ||
|
|
0ac8ae4d5a | ||
|
|
393cf38299 | ||
|
|
85b5b8203e | ||
|
|
1950dd2e62 | ||
|
|
91e31e8ce7 | ||
|
|
d3f15a6a2b | ||
|
|
b41317706f | ||
|
|
fd58c12fee | ||
|
|
efab316343 | ||
|
|
7cb41c7c5d | ||
|
|
6b1fec4b30 | ||
|
|
a9a6e89d1f | ||
|
|
3e17021057 | ||
|
|
6e1c4a9de8 | ||
|
|
cab1823f81 | ||
|
|
6f5b3b257d | ||
|
|
51bd1bff14 | ||
|
|
6cc872821c | ||
|
|
8feeb0f858 | ||
|
|
d877c03180 | ||
|
|
e8f41accb1 | ||
|
|
e5a1bfc846 | ||
|
|
ac51382d8b | ||
|
|
a740c8b046 | ||
|
|
717c31815b | ||
|
|
668221dafd | ||
|
|
f09a94cc6a | ||
|
|
9e7d46f081 | ||
|
|
efcbe2b1a1 | ||
|
|
ccc6d1c10c | ||
|
|
87afb4abe3 | ||
|
|
b1353f3bc3 | ||
|
|
35fc2370f0 | ||
|
|
22400ed954 | ||
|
|
f067a309a1 | ||
|
|
6590e457b5 | ||
|
|
386d464225 | ||
|
|
3aa542ab98 | ||
|
|
c5809bc289 | ||
|
|
73676b8628 | ||
|
|
035312bd9c | ||
|
|
856a5f4580 | ||
|
|
43134e0c8d | ||
|
|
1a74bdb68a | ||
|
|
c7947322c1 | ||
|
|
1c933c2f29 | ||
|
|
4a4dfde73e | ||
|
|
4e946b4db6 | ||
|
|
48c41b11e5 | ||
|
|
07cca4315b | ||
|
|
11be4a2cb9 | ||
|
|
80d8a9a830 | ||
|
|
e61411ca44 | ||
|
|
22144d3724 | ||
|
|
80e5d7828a | ||
|
|
893a3be393 | ||
|
|
fc6bb2feda | ||
|
|
8aeee8eea6 | ||
|
|
91574d2e5b | ||
|
|
d3a978c501 | ||
|
|
f81ec6f393 | ||
|
|
a989bcb169 | ||
|
|
596597e0e3 | ||
|
|
33bad4466e | ||
|
|
bca677b0a8 | ||
|
|
958c6d83fa | ||
|
|
0516b0cee6 | ||
|
|
acd29a1451 | ||
|
|
d0a4d06cd3 | ||
|
|
b8e7029cef | ||
|
|
325e8ea77d | ||
|
|
ad9113f624 | ||
|
|
215528171d | ||
|
|
889a13f206 | ||
|
|
4925295798 | ||
|
|
c69251f22a | ||
|
|
c62a529e76 | ||
|
|
4d8ef20735 | ||
|
|
ba55179ac2 | ||
|
|
1c26da447a | ||
|
|
1e03aa37b7 | ||
|
|
c581bea185 | ||
|
|
857771e5c6 | ||
|
|
1e96c23c4c | ||
|
|
56163f2b3d | ||
|
|
7fb24cb31b | ||
|
|
4a1a802740 | ||
|
|
36a51f0491 | ||
|
|
f11a009395 | ||
|
|
188d67e8eb | ||
|
|
1764831f47 | ||
|
|
6d1245ca85 | ||
|
|
fba788a510 | ||
|
|
405db5e002 | ||
|
|
cb9368376d | ||
|
|
8c37071145 | ||
|
|
54b2cd1209 | ||
|
|
f5d76e47b1 | ||
|
|
a0ed434360 | ||
|
|
00653a7cab | ||
|
|
13b50596e4 | ||
|
|
894eaeb43f | ||
|
|
2a4b0e9636 | ||
|
|
c849d097e1 | ||
|
|
644226531e | ||
|
|
129b03eb5a | ||
|
|
192145c948 | ||
|
|
ab46e8558d | ||
|
|
b6a402d964 | ||
|
|
74fbe29db5 | ||
|
|
e16fb2e57a | ||
|
|
c2afa571bf | ||
|
|
cc67532fd9 | ||
|
|
f5fa4b79a6 | ||
|
|
43752cef92 | ||
|
|
8b0b340031 | ||
|
|
91bd0c42be | ||
|
|
fb88e41087 | ||
|
|
7db724eda4 | ||
|
|
7f4e4df9e3 | ||
|
|
f956f0e112 | ||
|
|
43d85bcd34 | ||
|
|
0f05abcd27 | ||
|
|
00a52c5f83 | ||
|
|
5ac64d410e | ||
|
|
f9e8e0263a | ||
|
|
26f3bf8d6a | ||
|
|
2bdd85d795 | ||
|
|
6339a253c0 | ||
|
|
db1b72f95f | ||
|
|
7808ce452f | ||
|
|
9145ecb8a4 | ||
|
|
99c60a0f81 | ||
|
|
e019648a87 | ||
|
|
837f675e4f | ||
|
|
efd5b959db | ||
|
|
33adf5b668 | ||
|
|
00f59b3743 | ||
|
|
27ef621f75 | ||
|
|
f1f618d3a7 | ||
|
|
7171ac9252 | ||
|
|
33311b4954 | ||
|
|
43af2ef9c9 | ||
|
|
05d78d948b | ||
|
|
b932cc0c6c | ||
|
|
8749b464fd | ||
|
|
31f8bd4d84 | ||
|
|
f83ea2436d | ||
|
|
b96d996947 | ||
|
|
fc0661804f | ||
|
|
31e884359e | ||
|
|
d9d585d51a | ||
|
|
86ffcc3316 | ||
|
|
ae2d3591ee | ||
|
|
a6fb572a21 | ||
|
|
7e80cc628c | ||
|
|
e09795534c | ||
|
|
3379e9e517 | ||
|
|
a2006c2370 | ||
|
|
47f7c01c73 | ||
|
|
5c6f172b6b | ||
|
|
c0f4e888d7 | ||
|
|
d082f4f90d | ||
|
|
007b541028 | ||
|
|
b872d7a0ec | ||
|
|
214409a591 | ||
|
|
2a3f21976a | ||
|
|
a3c064be55 | ||
|
|
655cbf50f3 | ||
|
|
1e707ccefa | ||
|
|
1d38ba1141 | ||
|
|
9ea317939b | ||
|
|
353fe6d6f8 | ||
|
|
98bf7ea9dd | ||
|
|
90aa29d2d4 | ||
|
|
0369446681 | ||
|
|
238dce78b5 | ||
|
|
124ff3f5e3 | ||
|
|
1cf06a8b49 | ||
|
|
a8bdb7ab59 | ||
|
|
08fd69af39 | ||
|
|
560ff103ce | ||
|
|
edc724b475 | ||
|
|
ac904c849d | ||
|
|
5481b6e0a6 | ||
|
|
eba96df631 | ||
|
|
7caa325c5f | ||
|
|
e20641e101 | ||
|
|
8f81f71802 | ||
|
|
e7a4ccecf3 | ||
|
|
ec33a8b5a9 | ||
|
|
4a9aa62831 | ||
|
|
8b5eada088 | ||
|
|
eeb947d311 | ||
|
|
430d7a8cdd | ||
|
|
c94dcdd9e6 | ||
|
|
46c514f530 | ||
|
|
b29a34c76a | ||
|
|
20ba833147 | ||
|
|
1ed47c3173 | ||
|
|
ccac1f96dd | ||
|
|
c860bfebc1 | ||
|
|
d5806c3d31 | ||
|
|
bf36825fce | ||
|
|
a1780e2c4b | ||
|
|
02850eb6e3 | ||
|
|
71efd7a96f | ||
|
|
3508e47600 | ||
|
|
eef0be09b3 | ||
|
|
2df20aea38 | ||
|
|
1032c3cb57 | ||
|
|
5f26f8de27 | ||
|
|
328550b9a3 | ||
|
|
28455ecd5d | ||
|
|
54dbea659a | ||
|
|
447c1d748a | ||
|
|
4a10887e48 | ||
|
|
48015a4c95 | ||
|
|
abbfedf3f7 | ||
|
|
fa9153deb8 | ||
|
|
b287f5c2db | ||
|
|
2ebc2d441f | ||
|
|
5f2c9eb5df | ||
|
|
ce41e24434 | ||
|
|
c5d81e94e5 | ||
|
|
0500bdee2b | ||
|
|
e9a1df9123 | ||
|
|
277a06c3de | ||
|
|
c064efc812 | ||
|
|
1408074ef4 | ||
|
|
8c1f1b69ff | ||
|
|
5783507344 | ||
|
|
ae64c5225f | ||
|
|
d2f81d446b | ||
|
|
ab5b165c68 | ||
|
|
c3d4bf0e62 | ||
|
|
60f594a948 | ||
|
|
7f74d227f0 | ||
|
|
f59429c30a | ||
|
|
40276a11f9 | ||
|
|
0e846bec3f | ||
|
|
ba376fa074 | ||
|
|
d1b54dc2c5 | ||
|
|
b9c3efa24e | ||
|
|
40e613ed8d | ||
|
|
d033def947 | ||
|
|
671e110d99 | ||
|
|
b7a31b7933 | ||
|
|
1082effc17 | ||
|
|
693983dc29 | ||
|
|
6fe212796b | ||
|
|
bb1aa4aa55 | ||
|
|
7d77e0603b | ||
|
|
9f727a0fa0 | ||
|
|
997914ec27 | ||
|
|
37f01b68e8 | ||
|
|
ca695db3ba | ||
|
|
48acabac49 | ||
|
|
d7ee278b02 | ||
|
|
191a3628b5 | ||
|
|
80750b44dc | ||
|
|
25f3dcf9a5 | ||
|
|
c17e44e9f9 | ||
|
|
0b101dde3c | ||
|
|
4d20dae079 | ||
|
|
86e4fb7603 | ||
|
|
e8d081cc67 | ||
|
|
dab38c8013 | ||
|
|
c29ecac41c | ||
|
|
4187f5e7e8 | ||
|
|
2b3b2d7fd2 | ||
|
|
2783de5272 | ||
|
|
77727dff77 | ||
|
|
f009c90e5d | ||
|
|
f4cb4ca26a | ||
|
|
1cba51fbfd | ||
|
|
c5d9b93263 | ||
|
|
88a56794aa | ||
|
|
c51577098a | ||
|
|
3dff352399 | ||
|
|
6cb48647a8 | ||
|
|
d6c6c3435d | ||
|
|
6f4608ba23 | ||
|
|
10ba67fde1 | ||
|
|
83e22813f3 | ||
|
|
f8e7ace89f | ||
|
|
8bb46c5a6d | ||
|
|
6e79112f3a | ||
|
|
51e04e7331 | ||
|
|
9331c0af52 | ||
|
|
18744372b3 | ||
|
|
43d8b93953 | ||
|
|
b0c0b1a792 | ||
|
|
717f07a09a | ||
|
|
f6c1910be3 | ||
|
|
a6077599bb | ||
|
|
0905847ffa | ||
|
|
66439b3b17 | ||
|
|
916deff487 | ||
|
|
05788c2ed6 | ||
|
|
13d02a44e5 | ||
|
|
a2ff12a636 | ||
|
|
0a27e91de7 | ||
|
|
3c8b6e6fc1 | ||
|
|
61c84e18e4 | ||
|
|
a858b2409a | ||
|
|
bb204f3d85 | ||
|
|
38ce9c84ba | ||
|
|
57a8b8e2f6 | ||
|
|
4a3674feac | ||
|
|
e22dbb315e | ||
|
|
a339c096ef | ||
|
|
a8fa1f36f8 | ||
|
|
6edd587a33 | ||
|
|
a2331bc913 | ||
|
|
744bdb3170 | ||
|
|
aa9e3b3d1f | ||
|
|
99f2faa328 | ||
|
|
205102ff90 | ||
|
|
01b3cc42af | ||
|
|
6de6053eaa | ||
|
|
fdad61465c | ||
|
|
49a08cd576 | ||
|
|
60c4f6e6c1 | ||
|
|
57e7710f25 | ||
|
|
e41d1e1ad2 | ||
|
|
fbcf17d1c4 | ||
|
|
f4ed4fb8d8 | ||
|
|
25a90dd52c | ||
|
|
ed92919c0d | ||
|
|
b5309005e9 | ||
|
|
54c501e277 | ||
|
|
f36d0686a1 | ||
|
|
d6b44615a0 | ||
|
|
687d4aec08 | ||
|
|
18f75595da | ||
|
|
123d4155b4 | ||
|
|
b362f95790 | ||
|
|
34613a92c5 | ||
|
|
1766556c49 | ||
|
|
6bf7fc5655 | ||
|
|
7bfb08f524 | ||
|
|
c4e77acdee | ||
|
|
67c1bc6b1c | ||
|
|
4e6b098448 | ||
|
|
dbaddfb291 | ||
|
|
85942c5d00 | ||
|
|
fe460f7441 | ||
|
|
67365507b5 | ||
|
|
87a29baf8b | ||
|
|
2f4ac4e427 | ||
|
|
0056780dc4 | ||
|
|
013675d102 | ||
|
|
236d4a9427 | ||
|
|
22512833da | ||
|
|
dc231527f3 | ||
|
|
d4b0f2dc67 | ||
|
|
7723b2b698 | ||
|
|
682f299c8f | ||
|
|
c43bef544e | ||
|
|
c4424f30ec | ||
|
|
078837f276 | ||
|
|
6534692b73 | ||
|
|
20f82c4006 | ||
|
|
128f9950ec | ||
|
|
c2c329e00a | ||
|
|
5d3358ed91 | ||
|
|
d7f9157424 | ||
|
|
f464563dae | ||
|
|
828db2a8c8 | ||
|
|
bca865068a | ||
|
|
35245ca03f | ||
|
|
bcc183d5b9 | ||
|
|
433498eaed | ||
|
|
80334843c9 | ||
|
|
09a48ed064 | ||
|
|
bae51dd59c | ||
|
|
58175dce21 | ||
|
|
c4e4f649f5 | ||
|
|
bcd3c08faa | ||
|
|
0e656ea5ca | ||
|
|
d847c58d24 | ||
|
|
81f504f33e | ||
|
|
914838e367 | ||
|
|
1fc441670b | ||
|
|
a16ca716da | ||
|
|
d0b19752e1 | ||
|
|
9c63b31dfa | ||
|
|
9bdd3ff2f3 | ||
|
|
4429169166 | ||
|
|
3dbb74a1dc | ||
|
|
e7b72f5e99 | ||
|
|
5576fed590 | ||
|
|
aa0fd3cf48 | ||
|
|
56534800d8 | ||
|
|
f7708e0740 | ||
|
|
e36ba59d27 | ||
|
|
a99cee38a0 | ||
|
|
d3da2359de | ||
|
|
adda78f0c6 | ||
|
|
164757ee26 | ||
|
|
7e2840a00d | ||
|
|
caf37ba9fb | ||
|
|
042d3be4a9 | ||
|
|
18e91d54f1 | ||
|
|
84c59bd05a | ||
|
|
e0f7db8187 | ||
|
|
13e38c487f | ||
|
|
5b6911fd5c | ||
|
|
33cab26d3b | ||
|
|
c9201430ea | ||
|
|
48eeac6d88 | ||
|
|
a4c82a377b | ||
|
|
421e8d0763 | ||
|
|
66f4244779 | ||
|
|
7fb832028e | ||
|
|
54798f87da | ||
|
|
5ad5708e15 | ||
|
|
f356135722 | ||
|
|
f3abc21482 | ||
|
|
5103a07e5f | ||
|
|
3fc63b1934 | ||
|
|
4b9a0e6bab | ||
|
|
62617ec6bf | ||
|
|
1b4d973e7b | ||
|
|
811c8e1c92 | ||
|
|
54b1c03a8d | ||
|
|
5448100b3b | ||
|
|
1a24d39761 | ||
|
|
a7d094f0b6 | ||
|
|
b3a77a7f7e | ||
|
|
542fbee85e | ||
|
|
2076028697 | ||
|
|
b0692d78ac | ||
|
|
2e2d8a15ac | ||
|
|
5a3de19712 | ||
|
|
abfbb0f279 | ||
|
|
97d9f5e373 | ||
|
|
f62a64c021 | ||
|
|
67f5ea9de8 | ||
|
|
b6559331eb | ||
|
|
c5201e37ee | ||
|
|
156d1f2fbd | ||
|
|
306744f415 | ||
|
|
5cda0f741d | ||
|
|
eea74686c2 | ||
|
|
45715773f1 | ||
|
|
eb759a0dec | ||
|
|
5784178716 | ||
|
|
0d846c8871 | ||
|
|
e8740f74ce | ||
|
|
cd98b9d147 | ||
|
|
16de5e2a2c | ||
|
|
9dd3348535 | ||
|
|
5de26263d1 | ||
|
|
74214bc060 | ||
|
|
17feadbc15 | ||
|
|
78b1bd2e48 | ||
|
|
97c641af4e | ||
|
|
00b54b414d | ||
|
|
732fc98704 | ||
|
|
b5e308562e | ||
|
|
637669e3d1 | ||
|
|
f7d28a7f43 | ||
|
|
84f833ac31 | ||
|
|
114d7bdff4 | ||
|
|
6ab73bfd74 | ||
|
|
6edd62c337 | ||
|
|
3cf8776ca5 | ||
|
|
2943aea4d8 | ||
|
|
9150aaeed6 | ||
|
|
a6905e4664 | ||
|
|
b130e98430 | ||
|
|
463e0e1fe7 | ||
|
|
e15f00e086 | ||
|
|
0fc37e46d2 | ||
|
|
3db8b80164 | ||
|
|
b7fbcdec94 | ||
|
|
704a5ee8db | ||
|
|
cd187fac16 | ||
|
|
bb055e6ecc | ||
|
|
01b37f087f | ||
|
|
96e094ee88 | ||
|
|
85c73bad77 | ||
|
|
587c111449 | ||
|
|
43d239a6ae | ||
|
|
0fa36b17bf | ||
|
|
1a92cd79f7 | ||
|
|
527112d5da | ||
|
|
0d8c92aac9 | ||
|
|
b9556c9c86 | ||
|
|
8439631e2d | ||
|
|
cc63cc652a | ||
|
|
7c46bdd495 | ||
|
|
1d84830423 | ||
|
|
21a3bc44e6 | ||
|
|
b00b8f4a96 | ||
|
|
f1c9ac4207 | ||
|
|
0d95746689 | ||
|
|
430c7e124d | ||
|
|
153f28c494 | ||
|
|
a586413240 | ||
|
|
25e0575c2b | ||
|
|
acca75e2b5 | ||
|
|
5cbf122d6f | ||
|
|
08df432665 | ||
|
|
762b3984a3 | ||
|
|
505ff0767c | ||
|
|
9be80e2be9 | ||
|
|
e202e887f9 | ||
|
|
574c117ab0 | ||
|
|
d59a57f311 | ||
|
|
5e499c3685 | ||
|
|
17e5ce71b2 | ||
|
|
5352186319 | ||
|
|
e9ba02d65d | ||
|
|
39813d4461 | ||
|
|
829a285a2d | ||
|
|
a19a77e165 | ||
|
|
122dd3eaee | ||
|
|
18b219850e | ||
|
|
33a327a04b | ||
|
|
a46061e247 | ||
|
|
94e07ff23d | ||
|
|
4811befcf6 | ||
|
|
c455f02c66 | ||
|
|
efc5620a28 | ||
|
|
61123fdb6a | ||
|
|
3ec6911d46 | ||
|
|
2021093645 | ||
|
|
1c72dc202f | ||
|
|
1ef946fa77 | ||
|
|
3b6bbc39ff | ||
|
|
481c9feada | ||
|
|
953b3e9568 | ||
|
|
bdd2e68f49 | ||
|
|
e4cc349302 | ||
|
|
6547b93e55 | ||
|
|
bb9649d23b | ||
|
|
9e2eaef9d1 | ||
|
|
1c3ee75d3b | ||
|
|
15c9af8057 | ||
|
|
295573c1ef | ||
|
|
e93e8ace5c | ||
|
|
43af7ba777 | ||
|
|
0dad5b0d68 | ||
|
|
ae9b793318 | ||
|
|
fd8170f223 | ||
|
|
661b8b716b | ||
|
|
5ff076cac3 | ||
|
|
41c100ac4e | ||
|
|
c6e977f842 | ||
|
|
50b7f521b5 | ||
|
|
f0d0ee3acc | ||
|
|
7b3bdadd44 | ||
|
|
5deba6b90f | ||
|
|
a5afffc968 | ||
|
|
a239a5c593 | ||
|
|
e56e7333e3 | ||
|
|
d55e3c37cd | ||
|
|
97b78ea016 | ||
|
|
3e290b74dc | ||
|
|
65141207ae | ||
|
|
17dfeac1af | ||
|
|
4a9c428d69 | ||
|
|
333f252099 | ||
|
|
38232f258a | ||
|
|
582269cfaa | ||
|
|
0b646429fd | ||
|
|
fecef6c1cf | ||
|
|
73e5404c44 | ||
|
|
690d2bb3ed | ||
|
|
1dd935e1e9 | ||
|
|
8386230f33 | ||
|
|
5a68b06137 | ||
|
|
5918364cf5 | ||
|
|
df4d860d35 | ||
|
|
d9f0db6e3c | ||
|
|
7372b560b2 | ||
|
|
9d638c685c | ||
|
|
5da1acc38d | ||
|
|
c7c62e220d | ||
|
|
9edd652a2c | ||
|
|
cde760c1ea | ||
|
|
19c7f958e1 | ||
|
|
c7710afdbf | ||
|
|
ba18a3dadb | ||
|
|
496c29e569 | ||
|
|
98a72a4929 | ||
|
|
c4f0b48932 | ||
|
|
93abbab873 | ||
|
|
f7bbab08bd | ||
|
|
1e4ddf2bbf | ||
|
|
9b7879bff7 | ||
|
|
03d96d4dec | ||
|
|
1dfa034332 | ||
|
|
196a1d33e3 | ||
|
|
3d349c413f | ||
|
|
bd5babd37e | ||
|
|
fffe9080f3 | ||
|
|
5630b16e99 | ||
|
|
4bcf7ef45b | ||
|
|
9abc1d48ac | ||
|
|
ceaf5a3217 | ||
|
|
36d84fb98b | ||
|
|
3d80e9d77b | ||
|
|
1dc38ffacc | ||
|
|
ee210b5c68 | ||
|
|
3aae3cd3a1 | ||
|
|
f1a7f2f905 | ||
|
|
0b7e0319f1 | ||
|
|
10b8abf706 | ||
|
|
b163223ff1 | ||
|
|
b9f3eb85f9 | ||
|
|
285a65f018 | ||
|
|
815d56d334 | ||
|
|
27a9a233e2 | ||
|
|
22864105ac | ||
|
|
7cf47cbf8d | ||
|
|
502c588958 | ||
|
|
81792a7c2f | ||
|
|
784d326584 | ||
|
|
83dc7aa578 | ||
|
|
5a3b27fbf7 | ||
|
|
5ff83a9497 | ||
|
|
07cb39c756 | ||
|
|
fffd54995d | ||
|
|
5302176f0b | ||
|
|
efd7cf8acc | ||
|
|
52218c30f8 | ||
|
|
04c176fa8b | ||
|
|
af320684b4 | ||
|
|
b2ba14ce45 | ||
|
|
d776cc2f71 | ||
|
|
b4bed2f623 | ||
|
|
5c5a11fdca | ||
|
|
a22c62d893 | ||
|
|
90bc2f3724 | ||
|
|
8cdc794a3a | ||
|
|
250618df8b | ||
|
|
b62ae00c54 | ||
|
|
67d0a9e0e0 | ||
| b4425bc3bb | |||
| d77c145de3 | |||
|
|
6753f923d9 | ||
|
|
452f725332 | ||
|
|
7c1f45bcfb | ||
|
|
11ea54f6e8 | ||
|
|
5b623ee46f | ||
|
|
7ceec1c739 | ||
|
|
fc318536aa | ||
|
|
cd8f690ac6 | ||
|
|
240a8e86fd | ||
|
|
c557f0f1f0 | ||
|
|
86f56695e2 | ||
|
|
20da2d1cf6 | ||
|
|
372db86927 | ||
|
|
4c503a3177 | ||
|
|
57d46f5842 | ||
|
|
7f11d0ca91 | ||
|
|
bbd788699e | ||
|
|
e24add98ea | ||
|
|
506971b44b | ||
|
|
43a0bc8a2c | ||
|
|
baebdbc0bb | ||
|
|
1c24cae3b1 | ||
|
|
b9146aee5f | ||
|
|
09bfcb01f5 | ||
|
|
5d80b6dc21 | ||
|
|
140a38c349 | ||
|
|
6760c11881 | ||
|
|
2dcdbf9c37 | ||
|
|
3b958a02ef | ||
|
|
605242b399 | ||
|
|
299f257a01 | ||
|
|
0ad64ef5f4 | ||
|
|
3bfe1e8fdb | ||
|
|
7d992f4129 | ||
|
|
280032937f | ||
|
|
d93670842b | ||
|
|
dc187a9a3a | ||
|
|
5f89c6e14c | ||
|
|
9f10420eb9 | ||
|
|
9568370132 | ||
|
|
1c0c30be11 | ||
|
|
cdb7dcd6e9 | ||
|
|
8e4be06675 | ||
|
|
de7a8c756a | ||
|
|
65e2b72c6a | ||
|
|
523c36ecd4 | ||
|
|
5b5688438c | ||
|
|
4ca07631c7 | ||
|
|
ec4e7bc12a | ||
|
|
26d15c0a6f | ||
|
|
a484396db4 | ||
|
|
681db02784 | ||
|
|
e88554666c | ||
|
|
9f37ec4cff | ||
|
|
abd063a578 | ||
|
|
883e57ce1f | ||
|
|
ad04502a8c | ||
|
|
f65ed16842 | ||
|
|
1918dd4ad5 | ||
|
|
3983d3464f | ||
|
|
61daf5f037 | ||
|
|
eafa144104 | ||
|
|
60c151ff6a | ||
|
|
c97d18fcf9 | ||
|
|
e41f9fa937 | ||
|
|
56a7fb0ad9 | ||
|
|
e29cbc9fea | ||
|
|
08f725a0b6 | ||
|
|
b93a5715cb | ||
|
|
2018d5c298 | ||
|
|
87094a9498 | ||
|
|
53a1c697d0 | ||
|
|
f04eb72891 | ||
|
|
dfeb0c08cf | ||
|
|
9d7183ac69 | ||
|
|
2539e88f47 | ||
|
|
20d0d860d3 | ||
|
|
6b4aa64d74 | ||
|
|
c7b9ec7a4b | ||
|
|
e81864ebde | ||
|
|
0305a22a24 | ||
|
|
a406eb584d | ||
|
|
2be3ea9bbb | ||
|
|
0a8a7ff9a5 | ||
|
|
98c103c625 | ||
|
|
e0908a5f5e | ||
|
|
f0b7678444 | ||
|
|
64e9efe095 | ||
|
|
ab29ab053e | ||
|
|
a5081bc7c9 | ||
|
|
da9c628f9b | ||
|
|
26539b74a5 | ||
|
|
ccb99e278c | ||
|
|
a867817dc1 | ||
|
|
d1e05915b5 | ||
|
|
b764fdec85 | ||
|
|
8322d43b09 | ||
|
|
29b8c5e38e | ||
|
|
83dd233991 | ||
|
|
0864154a0e | ||
|
|
53357d4bd2 | ||
|
|
69bf98edf1 | ||
|
|
a22c4d5679 | ||
|
|
e5ad1648eb | ||
|
|
100a35b4e8 | ||
|
|
6c5d4389fe | ||
|
|
92f9ff4104 | ||
|
|
0e4fd12d70 | ||
|
|
9040285ce5 | ||
|
|
972b15e72d | ||
|
|
c1aea78496 | ||
|
|
49f891ba44 | ||
|
|
239057f1b6 | ||
|
|
167df35d37 | ||
|
|
b1b2ad2111 | ||
|
|
f1ff662be2 | ||
|
|
2418fec9c9 | ||
|
|
aaaa0a6afb | ||
|
|
afe22003e1 | ||
|
|
b6ad2903f3 | ||
|
|
6c298cd639 | ||
|
|
dbff3e9539 | ||
|
|
fcc6b33d07 | ||
|
|
0224c26ca0 | ||
|
|
294f15e694 | ||
|
|
522584711b | ||
|
|
ae40f33283 | ||
|
|
172e01c80e | ||
|
|
901acf1390 | ||
|
|
a316da3083 | ||
|
|
0b46e27497 | ||
|
|
b164c5dad7 | ||
|
|
2d6b285817 | ||
|
|
65c79567d2 | ||
|
|
d3633f31ac | ||
|
|
73a9a11aa6 | ||
|
|
c21bd8b01e | ||
|
|
14f4d24872 | ||
|
|
731abc79ee | ||
|
|
d542889827 | ||
|
|
8c5ef21459 | ||
|
|
7bfca9596d | ||
|
|
7bd858f96b | ||
|
|
b8657cb6e6 | ||
|
|
69a7e8f13d | ||
|
|
23537e0243 | ||
|
|
546f778b1b | ||
|
|
245f69a122 | ||
|
|
c6f3f7a239 | ||
|
|
f0a6e80e5a | ||
|
|
0cbb985945 | ||
|
|
bb384029ac | ||
|
|
85c6b581cb | ||
|
|
dd18644796 | ||
|
|
1628e41d09 | ||
|
|
a77d8f4cea | ||
|
|
0a4152b4b7 | ||
|
|
3fc4dc15df | ||
|
|
4ee0dcef9b | ||
|
|
011482ac9d | ||
|
|
6a8c9d89cb | ||
|
|
e0905ab8fc | ||
|
|
eb1f8f86fd | ||
|
|
959b5d9d0e | ||
|
|
0c19a026ef | ||
|
|
b24973eb19 | ||
|
|
4b18867883 | ||
|
|
5e292a0880 | ||
|
|
f00e37490c | ||
|
|
715e44cf21 | ||
|
|
25d1c1b229 | ||
|
|
094226eeb5 | ||
|
|
b08cb46ae5 | ||
|
|
6b88cf1040 | ||
|
|
aacfd1b29d | ||
|
|
0427e1e276 | ||
|
|
ee33bd8e63 | ||
|
|
25b8bd689e | ||
|
|
b6468b03a7 | ||
|
|
a848d6991b | ||
|
|
65c3053b49 | ||
|
|
1d686d7e40 | ||
|
|
488d1082e4 | ||
|
|
8967907893 | ||
|
|
e527a67dc1 | ||
|
|
6847ef690c | ||
|
|
96a2125248 | ||
|
|
c5e4310a6b | ||
|
|
23b41fc4f3 | ||
|
|
4fb41a4c35 | ||
|
|
12c0e8e828 | ||
|
|
dce27e985e | ||
|
|
0a343dfa98 | ||
|
|
729ca0f968 | ||
|
|
385dfb9f75 | ||
|
|
afbae24f43 | ||
|
|
eb7009832a | ||
|
|
d1480da076 | ||
|
|
10a2731caf | ||
|
|
ab1329dd67 | ||
|
|
e9a0700742 | ||
|
|
3f473589ad | ||
|
|
7a44c7aaaa | ||
|
|
bed329cd8c | ||
|
|
011bb4efa3 | ||
|
|
c979173422 | ||
|
|
42791c528e | ||
|
|
c76c8054b9 | ||
|
|
6107c7d0ef | ||
|
|
d0d045a2ab | ||
|
|
102e053021 | ||
|
|
ca0660c1cc | ||
|
|
a4a05232db | ||
|
|
0f8d5d4456 | ||
|
|
478a2c4b48 | ||
|
|
55e240e68d | ||
|
|
71b25774d0 | ||
|
|
1697728b2a | ||
|
|
4242efbd4c | ||
|
|
0b825a61bb | ||
|
|
7d974e6b89 | ||
|
|
ae1b9c0d73 | ||
|
|
91ebcace0a | ||
|
|
846b860c06 | ||
|
|
83ed793e39 | ||
|
|
3f55b90ab8 | ||
|
|
4806b0aa41 | ||
|
|
3b91493995 | ||
|
|
8bf9fff7dc | ||
|
|
eed563e06f | ||
|
|
fc1c2fc2f3 | ||
|
|
f8a3bf6a64 | ||
|
|
c5e74c33b7 | ||
|
|
95f3b1c03a | ||
|
|
0773a8019c | ||
|
|
1116e09af5 | ||
|
|
52e215d3bc | ||
|
|
7f25846d55 | ||
|
|
d36e52d5d1 | ||
|
|
da0cbced15 | ||
|
|
837fc98ad2 | ||
|
|
a0f41da80a | ||
|
|
4a2d2ad996 | ||
|
|
010da8954b | ||
|
|
e643e0a924 | ||
|
|
c386a9098f | ||
|
|
d17dbf1b36 | ||
|
|
3961f83ef6 | ||
|
|
d0648b5006 | ||
|
|
337b6c70f4 | ||
|
|
2cd007dae3 | ||
|
|
43e55446f7 | ||
|
|
f47be86df3 | ||
|
|
d5bf253011 | ||
|
|
093d447328 | ||
|
|
e12de5ec00 | ||
|
|
a64b25eb51 | ||
|
|
bbf058480f | ||
|
|
b2105c8fb0 | ||
|
|
8ff5a8c5e1 | ||
|
|
98624c9954 | ||
|
|
3b9e8e3cc3 | ||
|
|
193af9bab5 | ||
|
|
b2ad031c54 | ||
|
|
0419cc633b | ||
|
|
63143fb185 | ||
|
|
3f6ecfd92c | ||
|
|
a208c922f7 | ||
|
|
757d554e7b | ||
|
|
74afc55dc6 | ||
|
|
29b0451608 | ||
|
|
cfa1ed7a61 | ||
|
|
c70f500acc | ||
|
|
76a5ccf3f6 | ||
|
|
35c28dede2 | ||
|
|
11e043ca2e | ||
|
|
7ac64c57ae | ||
|
|
9ff70e5578 | ||
|
|
348aa91832 | ||
|
|
de5d104e1e | ||
|
|
565cf551f0 | ||
|
|
819d53fc2b | ||
|
|
67f22a6e08 | ||
|
|
eee47111a6 | ||
|
|
07643870cd | ||
|
|
bb949e0a3b | ||
|
|
a7cf3f689e | ||
|
|
d4919016b6 | ||
|
|
67af9f2ea2 | ||
|
|
bb9d6ee8fc | ||
|
|
e88cf4e3f4 | ||
|
|
5577e4fee5 | ||
|
|
489d253a48 | ||
|
|
06e6d3940b | ||
|
|
42a4fe581f | ||
|
|
292faa1e48 | ||
|
|
4bc6ff846d | ||
|
|
011f10fba8 | ||
|
|
d0e987a2aa | ||
|
|
6e8af52237 | ||
|
|
e301e2184c | ||
|
|
3b3f4a1f2d | ||
|
|
c8ac8d6564 | ||
|
|
626cbc4fc5 | ||
|
|
fe2004b3da | ||
|
|
fba4cbfb7b | ||
|
|
731a2792c5 | ||
|
|
f3d55806d1 | ||
|
|
f0265c2f5d | ||
|
|
cc27f202af | ||
|
|
41261adc76 | ||
|
|
1a9ded19c5 | ||
|
|
862a29bb6e | ||
|
|
0a92586c53 | ||
|
|
90b3d8a4d6 | ||
|
|
5a2e93e900 | ||
|
|
4e81a8a1d6 | ||
|
|
83d3621441 | ||
|
|
336b91c872 | ||
|
|
36a8adbd8c | ||
|
|
586ff6d4bd | ||
|
|
6fef87b0f1 | ||
|
|
0d7a03f3e5 | ||
|
|
1703e9a541 | ||
|
|
ece9569d66 | ||
|
|
3bebf5bf51 | ||
|
|
398161b03b | ||
|
|
1fb7d384fb | ||
|
|
7c7b38e869 | ||
|
|
8e06d465cb | ||
|
|
a0be8f0aa3 | ||
|
|
41d06f7e9d | ||
|
|
cb447da7d0 | ||
|
|
77b40817f2 | ||
|
|
e371e9725a | ||
|
|
816529b0ca | ||
|
|
99cfd3dc3f | ||
|
|
7c4b9063a7 | ||
|
|
e2e29a8dbb | ||
|
|
66ffa420f8 | ||
|
|
c33f193a0c | ||
|
|
00c06778ef | ||
|
|
1aab492f38 | ||
|
|
7f53f585c0 | ||
|
|
5db5d0c7ed | ||
|
|
74fcd24a8d | ||
|
|
6b8ed89566 | ||
|
|
0c115e78e2 | ||
|
|
c7b5611d68 | ||
|
|
18684a16eb | ||
|
|
a71752b18b | ||
|
|
6a9d725633 | ||
|
|
63ecd3b568 | ||
|
|
1f9963075c | ||
|
|
d60da3c99e | ||
|
|
f91437e03c | ||
|
|
44523609c1 | ||
|
|
de460f53b1 | ||
|
|
a275d0c855 | ||
|
|
35cd449e79 | ||
|
|
e67f029d53 | ||
|
|
3389dddd08 | ||
|
|
7522404abb | ||
|
|
44bb9b33d9 | ||
|
|
4a9adbf588 | ||
|
|
17e6f5a5da | ||
|
|
9ae113ab92 | ||
|
|
cd93615b39 | ||
|
|
fa30fe5169 | ||
|
|
0c98df232e | ||
|
|
254e933740 | ||
|
|
ed7bffd2d6 | ||
|
|
721e6494cf | ||
|
|
96f9c8f01d | ||
|
|
e9ed23abe4 | ||
|
|
4a963885bc | ||
|
|
5c6b5a0668 | ||
|
|
fc6de64311 | ||
|
|
d94e0ac8fc | ||
|
|
6742bf7d48 | ||
|
|
2cda689b3c | ||
|
|
7ae55db7f4 | ||
|
|
4d49737536 | ||
|
|
8ac8e21d78 | ||
|
|
21ec821b8c | ||
|
|
74e33303ed | ||
|
|
cdb47066cc | ||
|
|
cf4978b37f | ||
|
|
abe56d1207 | ||
|
|
370f0e784c | ||
|
|
780993eb63 | ||
|
|
9909bbeba5 | ||
|
|
c2779658c6 | ||
|
|
2f401765b6 | ||
|
|
0124561686 | ||
|
|
07bc49604e | ||
|
|
25ec52f53e | ||
|
|
e3b1934653 | ||
|
|
4e6f19d620 | ||
|
|
408066aba0 | ||
|
|
d6bebd8fec | ||
|
|
b64c7ddc96 | ||
|
|
c2ec4c15e3 | ||
|
|
357b0287b2 | ||
|
|
eca24a7c65 | ||
|
|
46a3906bde | ||
|
|
90ca08d8ac | ||
|
|
8eebcae85d | ||
|
|
e095d8317b | ||
|
|
c2a008afbe | ||
|
|
a45c5f8f37 | ||
|
|
e55bc1ef33 | ||
|
|
e60153ad01 | ||
|
|
cdea877024 | ||
|
|
2deed3a7eb | ||
|
|
162e5c2181 | ||
|
|
bb20659934 | ||
|
|
0eba0461c9 | ||
|
|
f018735052 | ||
|
|
0265ad35c9 | ||
|
|
4ca6c37cc8 | ||
|
|
5c028e75a7 | ||
|
|
34608fe0d7 | ||
|
|
772fef5ff8 | ||
|
|
8641651a55 | ||
|
|
20129eca5d | ||
|
|
16a5d92efe | ||
|
|
bb9fbc77a9 | ||
|
|
3310236767 | ||
|
|
1b3bf01ed7 | ||
|
|
85372581bd | ||
|
|
b4129891dc | ||
|
|
342d8da29b | ||
|
|
887bc003e6 | ||
|
|
2b76dcd15f | ||
|
|
1eb5451060 | ||
|
|
7818328378 | ||
|
|
3ad1f3d1e3 | ||
|
|
312c8903e4 | ||
|
|
fe59b23c84 | ||
|
|
07201c6563 | ||
|
|
6b2a66cf72 | ||
|
|
fe3f820d33 | ||
|
|
fb2217a733 | ||
|
|
af131f903e | ||
|
|
736a15958a | ||
|
|
ff862dbff9 | ||
|
|
fae288633c | ||
|
|
f44cb8bf4c | ||
|
|
c32a5d2930 | ||
|
|
2775b593ab | ||
|
|
50627f08b4 | ||
|
|
e6e163b733 | ||
|
|
39d8b0a17f | ||
|
|
29765f488b | ||
|
|
44c12a0654 | ||
|
|
2fa48abb62 | ||
|
|
2b5aac7633 | ||
|
|
c1829c64c2 | ||
|
|
e9603ecec9 | ||
|
|
37e39dc1ec | ||
|
|
9a65d8c0eb | ||
|
|
c1c58f659d | ||
|
|
b79e75349c | ||
|
|
c0347eed50 | ||
|
|
8a739893ea | ||
|
|
a39750d808 | ||
|
|
f310fec869 | ||
|
|
39e2abd80a | ||
|
|
3ad9a359f4 | ||
|
|
5e2909c531 | ||
|
|
58c01bdfcf | ||
|
|
c51cd080fa | ||
|
|
3469da674a | ||
|
|
67055bf920 | ||
|
|
b26a029f66 | ||
|
|
8a7baa02c1 | ||
|
|
e39afa8b39 | ||
|
|
372b5da704 | ||
|
|
f79505f3f6 | ||
|
|
4c306effb7 | ||
|
|
fbbbd99d3d | ||
|
|
24ea7e0c5c | ||
|
|
d80dd67ad0 | ||
|
|
a14227b588 | ||
|
|
42a2fd8800 | ||
|
|
098d2ef693 | ||
|
|
9aca5baa2b | ||
|
|
5ba2c0ebd3 | ||
|
|
23335f8bd9 | ||
|
|
b6022a3e90 | ||
|
|
b6b3def8fa | ||
|
|
6e2527e5c5 | ||
|
|
7ff222ce25 | ||
|
|
62ad786318 | ||
|
|
a6c7c60290 | ||
|
|
acc496be47 | ||
|
|
a04c7dda37 | ||
|
|
38f53d8de8 | ||
|
|
dcad0cbe8f | ||
|
|
fa57575cc3 | ||
|
|
73b28866ac | ||
|
|
998774fe5c | ||
|
|
0827ced0d7 | ||
|
|
1cf0e166bb | ||
|
|
df71bfb483 | ||
|
|
80b8fe3654 | ||
|
|
dbfbd1f04d | ||
|
|
b94a3e05bc | ||
|
|
368aa8a89f | ||
|
|
80fa953f60 | ||
|
|
a95a159978 | ||
|
|
6be787ecae | ||
|
|
7b482e6903 | ||
|
|
2db0cab892 | ||
|
|
457256e731 | ||
|
|
8aaf060979 | ||
|
|
688863d16e | ||
|
|
c9b774c498 | ||
|
|
3e813ca251 | ||
|
|
647e9bb186 | ||
|
|
28a68aa721 | ||
|
|
e0e584658e | ||
|
|
980f66fb33 | ||
|
|
3e0a4406eb | ||
|
|
5906ed5948 | ||
|
|
8902654c4e | ||
|
|
15cc970ee2 | ||
|
|
8af562e284 | ||
|
|
101f5a1453 | ||
|
|
4ae130a646 | ||
|
|
bd59bdd215 | ||
|
|
054ea6ac66 | ||
|
|
c5e1f2de2e | ||
|
|
4abfcaf9ce | ||
|
|
0b14f4ab5d | ||
|
|
5e12a1e1b1 | ||
|
|
456b240df8 | ||
|
|
f217b161b4 | ||
|
|
4594dbc763 | ||
|
|
98cae9270a | ||
|
|
91ba916884 | ||
|
|
315bf0fc89 | ||
|
|
733d17ae7a | ||
|
|
ff123b99b7 | ||
|
|
0b99e72924 | ||
|
|
2da5939648 | ||
|
|
79b51eca67 | ||
|
|
cd417f40a8 | ||
|
|
85d42dec03 | ||
|
|
8dabef57b6 | ||
|
|
2a51fc82fd | ||
|
|
11ad5f8bad | ||
|
|
e3dc989798 | ||
|
|
8ea3fccb61 | ||
|
|
97cfca74ad | ||
|
|
0c2e45141d | ||
|
|
824fb9ef37 | ||
|
|
a19f235684 | ||
|
|
6d93083581 | ||
|
|
8337ce8dbd | ||
|
|
92ba264cff | ||
|
|
4db9a34a34 | ||
|
|
251c3964bd | ||
|
|
1e43c0e4c3 | ||
|
|
696eb9a9d0 | ||
|
|
45badad8f8 | ||
|
|
2bd02a80a6 | ||
|
|
133aa065fb | ||
|
|
b856f81148 | ||
|
|
5988e9b1a8 | ||
|
|
0b7d7e0602 | ||
|
|
dc331637a5 | ||
|
|
3bbc5a5e87 | ||
|
|
55cadcfe82 | ||
|
|
c1124abde0 | ||
|
|
fddbafc2d5 | ||
|
|
63f43013c3 | ||
|
|
e4e0eb23dd | ||
|
|
89a729924d | ||
|
|
6364912aa8 | ||
|
|
ab83dd2e55 | ||
|
|
d5cdfb36a9 | ||
|
|
46c0b269c3 | ||
|
|
4b5cd50122 | ||
|
|
aade7490f8 | ||
|
|
97c088cfb4 | ||
|
|
bfb5006e95 | ||
|
|
d3d08b9c21 | ||
|
|
9535ab7953 | ||
|
|
b42bdc1d3e | ||
|
|
89956f3ad5 | ||
|
|
b58ceb85bc | ||
|
|
6938e88fbf | ||
|
|
1fc67704dc | ||
|
|
b7aaeada45 | ||
|
|
4d89256a4c | ||
|
|
7185c8dc08 | ||
|
|
b506a00e7d | ||
|
|
5a975ad0bf | ||
|
|
b80eca35d8 | ||
|
|
dba99a4170 | ||
|
|
5547ff7e76 | ||
|
|
dc98fcad5a | ||
|
|
41259eae5d | ||
|
|
d3703d81b7 | ||
|
|
24178e7b04 | ||
|
|
486dbc5613 | ||
|
|
e9cbf5dab2 | ||
|
|
b719a166d2 | ||
|
|
297f79f6e2 | ||
|
|
af59ad3d33 | ||
|
|
3573b84c97 | ||
|
|
e105d665ae | ||
|
|
714f70c9ce | ||
|
|
4151412156 | ||
|
|
f7f9862489 | ||
|
|
7e52f6d18d | ||
|
|
e1b52de7a3 | ||
|
|
0a0a3ddd7b | ||
|
|
fdb48f0d6d | ||
|
|
2f3eb0e16c | ||
|
|
18a1d74a9a | ||
|
|
0f29151200 | ||
|
|
0a7378feb4 | ||
|
|
59ba84b7b1 | ||
|
|
985b523031 | ||
|
|
40e0c92ec7 | ||
|
|
bd9b795516 | ||
|
|
130368ca70 | ||
|
|
611a2d66a0 | ||
|
|
b16cc26024 | ||
|
|
3babb9ee68 | ||
|
|
9388eb5993 | ||
|
|
0b1f5c06bc | ||
|
|
1c1b933438 | ||
|
|
0663109634 | ||
|
|
c329ffdf07 | ||
|
|
b89fe1805f | ||
|
|
ca8429150e | ||
|
|
a95e409366 | ||
|
|
f39270ee91 | ||
|
|
9debb1776b | ||
|
|
8183525961 | ||
|
|
6e8620fbbb | ||
|
|
5c8a6b3a70 | ||
|
|
46173cb6c3 | ||
|
|
bebf814577 | ||
|
|
7d1fb86e63 | ||
|
|
f9c6e6f0dc | ||
|
|
1238f90268 | ||
|
|
1dea94c0cf | ||
|
|
dd5284c55a | ||
|
|
8bc1fbf530 | ||
|
|
48f247a919 | ||
|
|
251bb9476d | ||
|
|
8387f676fc | ||
|
|
e1aa48f3c1 | ||
|
|
e3ef0a0d69 | ||
|
|
b9e4764516 | ||
|
|
7e78a39717 | ||
|
|
b8df8e6507 | ||
|
|
451ffdc48b | ||
|
|
4bbd9e8120 | ||
|
|
12c3f0d7b9 | ||
|
|
dbdf0fcc0b | ||
|
|
422b6c4252 | ||
|
|
39d149c728 | ||
|
|
cc64f2911f | ||
|
|
6fb8c77846 | ||
|
|
2bae6f693e | ||
|
|
8d8cdcd219 | ||
|
|
ae0efccb04 | ||
|
|
ef1d34e4de | ||
|
|
cdd4220cb9 | ||
|
|
bf814c0b9d | ||
|
|
f95c80f73f | ||
|
|
5d3e3b6cee | ||
|
|
52356f0f31 | ||
|
|
68aacb498a | ||
|
|
ad73c11cb4 | ||
|
|
e65828c729 | ||
|
|
db4e74fb99 | ||
|
|
e38922f372 | ||
|
|
e1d6c9e489 | ||
|
|
d2d124cccf | ||
|
|
9ca2ec6dd0 | ||
|
|
fd92e7e260 | ||
|
|
150988ecb9 | ||
|
|
bd3e1a0bde | ||
|
|
b791aaca5a | ||
|
|
a5eef66a1c | ||
|
|
df5a9c9fd9 | ||
|
|
be15e360c1 | ||
|
|
ca6478ca88 | ||
|
|
62ef041b35 | ||
|
|
ab83a42dfb | ||
|
|
cb4b5ce640 | ||
|
|
7bbb2f3557 | ||
|
|
f27af19670 | ||
|
|
c59f05a2f8 | ||
|
|
8739ec08cf | ||
|
|
70795a69c8 | ||
|
|
236d4fcde7 | ||
|
|
ba3b87471e | ||
|
|
91746c73e1 | ||
|
|
f0a90db912 | ||
|
|
4fd262dc60 | ||
|
|
8aabcd6443 | ||
|
|
af67d733ad | ||
|
|
cdc963c42c | ||
|
|
e807f049d8 | ||
|
|
a51a159886 | ||
|
|
770e5b75a5 | ||
|
|
71e76e359a | ||
|
|
a8f68f4993 | ||
|
|
92eed64fe8 | ||
|
|
13791be485 | ||
|
|
ba8a3036a5 | ||
|
|
b6bf043c48 | ||
|
|
361e8f1bd3 | ||
|
|
c7cb0e439d | ||
|
|
0f052a0631 | ||
|
|
0f88ae324e | ||
|
|
bc944c2373 | ||
|
|
5476597343 | ||
|
|
8dd10f7e77 | ||
|
|
442e69187b | ||
|
|
029099d4a5 | ||
|
|
1ec2b3ac36 | ||
|
|
6baa6b0802 | ||
|
|
679e09f27e | ||
|
|
b4f6373605 | ||
|
|
77ec2d3747 | ||
|
|
9c926a1d81 | ||
|
|
31af1ca9e6 | ||
|
|
1d1c9eae83 | ||
|
|
ded414577f | ||
|
|
f58c07137a | ||
|
|
a7e6f470f7 | ||
|
|
229d74d266 | ||
|
|
12f247a927 | ||
|
|
2e95e1e32b | ||
|
|
c503e12adb | ||
|
|
ced8f447a7 | ||
|
|
d50cfb8dd6 | ||
|
|
c1838d4390 | ||
|
|
a127dfb8af | ||
|
|
27e5583849 | ||
|
|
4a1faa0074 | ||
|
|
5f4039c5d4 | ||
|
|
cbcac0725d | ||
|
|
bd77d4347d | ||
|
|
be4d025505 | ||
|
|
17c9499ec4 | ||
|
|
67ed249239 | ||
|
|
2b808025f9 | ||
|
|
0d41fb48dc | ||
|
|
7bc4a955ba | ||
|
|
4ccd8bf07a | ||
|
|
ddf0958c04 | ||
|
|
78aa1ed724 | ||
|
|
0215216e34 | ||
|
|
02dc74e395 | ||
|
|
b8b58726ac | ||
|
|
9853bce90b | ||
|
|
116ba9c6d2 | ||
|
|
83f51219e4 | ||
|
|
5629190bf1 | ||
|
|
112970050c | ||
|
|
2e3a3fd53e | ||
|
|
5b16941ec5 | ||
|
|
5e7741afe8 | ||
|
|
aa8f1bb6be | ||
|
|
03915110cf | ||
|
|
d67dca60fc | ||
|
|
a3306ad4e7 | ||
|
|
cd8e810c35 | ||
|
|
d0f8e21466 | ||
|
|
9413bd5357 | ||
|
|
e6de8f0f9a | ||
|
|
cc83b832f1 | ||
|
|
6ed02933a6 | ||
|
|
61b8f62221 | ||
|
|
07f0249717 | ||
|
|
80b0f9ee0f | ||
|
|
71196688ae | ||
|
|
f0bec85ef8 | ||
|
|
2e0fba3de9 | ||
|
|
be1821b9eb | ||
|
|
f5939c81d3 | ||
|
|
2656e3adb0 | ||
|
|
bfbfa761ef | ||
|
|
6f19a8a642 | ||
|
|
bfbd2ddc00 | ||
|
|
eaa40190cc | ||
|
|
2758b90019 | ||
|
|
9a61d2305c | ||
|
|
71c884fe48 | ||
|
|
9a183c7ffb | ||
|
|
60485751e2 | ||
|
|
4e559f63e3 | ||
|
|
1b407254a7 | ||
|
|
0b86def315 | ||
|
|
6633ce78d0 | ||
|
|
54df9d0c78 | ||
|
|
980efbc93d | ||
|
|
711a9441a6 | ||
|
|
eae9ee3cbe | ||
|
|
8688c28d0f | ||
|
|
aa1bba84aa | ||
|
|
ca7c8f0afd | ||
|
|
d4c5da2a76 | ||
|
|
0633197793 | ||
|
|
3d427f7e1d | ||
|
|
6a5063cf32 | ||
|
|
081a5a1e8c | ||
|
|
b9b777c621 | ||
|
|
5d0fe44130 | ||
|
|
77f9193669 | ||
|
|
ecc90be12c | ||
|
|
d14ef90136 | ||
|
|
b952b758d7 | ||
|
|
df9a6eac05 | ||
|
|
b3a5d7f379 | ||
|
|
cc7c9f3b31 | ||
|
|
8a22ff07a6 | ||
|
|
2063d66550 | ||
|
|
e698146d94 | ||
|
|
4408507371 | ||
|
|
574f53c66d | ||
|
|
a3c18ca577 | ||
|
|
ec7acd46a0 | ||
|
|
6976eb337d | ||
|
|
994413c509 | ||
|
|
0078dba085 | ||
|
|
9a636b81a6 | ||
|
|
734de26559 | ||
|
|
aa5e9a9c8b | ||
|
|
8586817963 | ||
|
|
ccca6a7714 | ||
|
|
c1fffe5cdb | ||
|
|
7c11b2204e | ||
|
|
72859ede85 | ||
|
|
30c002d0f2 | ||
|
|
3855d96135 | ||
|
|
7974be05e9 | ||
|
|
39f8c037a5 | ||
|
|
4af7597441 | ||
|
|
c37d4ad01f | ||
|
|
2801732f57 | ||
|
|
b188bc5744 | ||
|
|
f4b1fb4831 | ||
|
|
8c553d5b3d | ||
|
|
e40d7ba181 | ||
|
|
4469376dd2 | ||
|
|
64a52fbb1e | ||
|
|
bf9b334b73 | ||
|
|
1869877178 | ||
|
|
209fe67bb0 | ||
|
|
7257776ba8 | ||
|
|
af7fa56e02 | ||
|
|
1d3ec96e8d | ||
|
|
99a7bfeb4c | ||
|
|
15810333b9 | ||
|
|
0027be65eb | ||
|
|
0e804db130 | ||
|
|
57a44d6643 | ||
|
|
7e3e0d8f30 | ||
|
|
07b94f1513 | ||
|
|
9619f7e7ed | ||
|
|
0bd7fca876 | ||
|
|
ef852f0191 | ||
|
|
6791053c83 | ||
|
|
47238b2969 | ||
|
|
9f3c686913 | ||
|
|
cefd91a7b9 | ||
|
|
ecdd6d8fb0 | ||
|
|
60eb599416 | ||
|
|
8e7b944b52 | ||
|
|
6b17f9d1f2 | ||
|
|
cb459d4cc7 | ||
|
|
d795266114 | ||
|
|
3e303e4b10 | ||
|
|
2f8fca0327 | ||
|
|
4a900cbbeb | ||
|
|
5bdbb5ec62 | ||
|
|
ce78e07444 | ||
|
|
593ce27312 | ||
|
|
2536405dba | ||
|
|
ca22aedaaa | ||
|
|
e6c52002f0 | ||
|
|
3d86e52b25 | ||
|
|
f38233053e | ||
|
|
99a4751c20 | ||
|
|
013e85cf2a | ||
|
|
7c856c267d | ||
|
|
8aefb8eddb | ||
|
|
3f843cc0fc | ||
|
|
566c20ea7e | ||
|
|
a9c1a91571 | ||
|
|
e78bfe4c22 | ||
|
|
aa265fc350 | ||
|
|
c94e1aaea9 | ||
|
|
d194d7107d | ||
|
|
3789ef51f2 | ||
|
|
88c16e096a | ||
|
|
3c9468b0f1 | ||
|
|
38b90b3d4c | ||
|
|
a4929819df | ||
|
|
53e8495d06 | ||
|
|
a9fa71e455 | ||
|
|
9c0efd7bf9 | ||
|
|
796a624d2b | ||
|
|
ab9d6666cf | ||
|
|
1a8de4fcf6 | ||
|
|
6d1f83bc40 | ||
|
|
0190ee9531 | ||
|
|
718abdfdba | ||
|
|
6fb15fb591 | ||
|
|
34e087098b | ||
|
|
a8c525f4fc | ||
|
|
5ef160c98d | ||
|
|
7c4dd03a8c | ||
|
|
7fd7005776 | ||
|
|
286d48c02b | ||
|
|
08edf70194 | ||
|
|
bc34c6edb4 | ||
|
|
def6e8792c | ||
|
|
ba7419d3b0 | ||
|
|
65d079eec0 | ||
|
|
beeaebbfb7 | ||
|
|
115e88cd93 | ||
|
|
b57b0a38f5 | ||
|
|
52a22b6eca | ||
|
|
2612c55c85 | ||
|
|
63e4c7d888 | ||
|
|
b791458cb8 | ||
|
|
62f5d5111a | ||
|
|
24fb267b40 | ||
|
|
4f29dd4f8c | ||
|
|
08db1d63bf | ||
|
|
0e3145a051 | ||
|
|
eb6337f6fb | ||
|
|
9499cd0265 | ||
|
|
471f8f2bec | ||
|
|
aa74c1c721 | ||
|
|
0e8024adf1 | ||
|
|
a833476437 | ||
|
|
bec097f14d | ||
|
|
196449fbd6 | ||
|
|
7f8704ee2c | ||
|
|
d8866172c1 | ||
|
|
5ee5b270ef | ||
|
|
89cb4f4770 | ||
|
|
88eeab410b | ||
|
|
cecc01d216 | ||
|
|
0d4893b13c | ||
|
|
d081b88af2 | ||
|
|
a285313bae | ||
|
|
860d88fe56 | ||
|
|
968aabf893 | ||
|
|
d46ac6206d | ||
|
|
6bb8d26561 | ||
|
|
2b7ace0356 | ||
|
|
ac66606135 | ||
|
|
528986cd4f | ||
|
|
dcaaa4e689 | ||
|
|
d1cdd60ee8 | ||
|
|
2d15da9a39 | ||
|
|
611eceff2b | ||
|
|
00f1fc39fa | ||
|
|
8af9879b08 | ||
|
|
501e980e73 | ||
|
|
8aaa88770f | ||
|
|
ac2b7e769d | ||
|
|
03ba35d65a | ||
|
|
f0c4f33eea | ||
|
|
7c6243cf33 | ||
|
|
5bf5be94bb | ||
|
|
c96e10b33d | ||
|
|
bba73c4f31 | ||
|
|
e90bb63a8f | ||
|
|
3ddba0816e | ||
|
|
5386f81cda | ||
|
|
3c84a814a8 | ||
|
|
bd04cfd898 | ||
|
|
c7c0d80cf0 | ||
|
|
21cc88dfea | ||
|
|
0f40141be7 | ||
|
|
40b065abd9 | ||
|
|
d3b0c1d82c | ||
|
|
c187a27123 | ||
|
|
f6353ca14c | ||
|
|
1bfdf4b232 | ||
|
|
95f57c9f5e | ||
|
|
fdfb0c7928 | ||
|
|
53b0101a12 | ||
|
|
8a21ce98b1 | ||
|
|
3ede565971 | ||
|
|
8611d738b0 | ||
|
|
bc51a91734 | ||
|
|
06988073d8 | ||
|
|
52f66e7982 | ||
|
|
621e40304f | ||
|
|
7fed5b7138 | ||
|
|
801774ab28 | ||
|
|
d8b8dfa299 | ||
|
|
fe5daefd61 | ||
|
|
42247449f8 | ||
|
|
c3d771c8fc | ||
|
|
278b74e78c | ||
|
|
3a5ea3dd9a | ||
|
|
b5b0792c90 | ||
|
|
9361f6bc53 | ||
|
|
5f5c48ea05 | ||
|
|
7c052fedfc | ||
|
|
ec3ea892af | ||
|
|
c7dc7de0c3 | ||
|
|
1c17cd1be5 | ||
|
|
4ec89e2cc8 | ||
|
|
552e6da392 | ||
|
|
501e764c21 | ||
|
|
2b101c2967 | ||
|
|
23cf5febec | ||
|
|
2835c66694 | ||
|
|
5fb84d153e | ||
|
|
5767bfb5a2 | ||
|
|
fd4477bc50 | ||
|
|
e896d52968 | ||
|
|
6bbe1b41c2 | ||
|
|
bd6396d7a8 | ||
|
|
b3435c97c3 | ||
|
|
d7974f057f | ||
|
|
50c5f921f5 | ||
|
|
e996a45bf5 | ||
|
|
b3f784686f | ||
|
|
77566eae0d | ||
|
|
59e2124407 | ||
|
|
f8c9b69f4b | ||
|
|
d14034d38b | ||
|
|
1d3b9a19bc | ||
|
|
7413d7db25 | ||
|
|
5cabeed19d | ||
|
|
40aed1086f | ||
|
|
dd1ea597d4 | ||
|
|
a7d5bef93f | ||
|
|
7bfa5a6cc4 | ||
|
|
b4f0501765 | ||
|
|
767437d9aa | ||
|
|
6c5a62353c | ||
|
|
bfd54e94e7 | ||
|
|
126fd5c0ff | ||
|
|
747c2e1637 | ||
|
|
23e4f87af0 | ||
|
|
9ef5ea8fb6 | ||
|
|
46c6c4dd21 | ||
|
|
9d89a38490 | ||
|
|
d56da74168 | ||
|
|
dff4d15872 | ||
|
|
939eba8e61 | ||
|
|
0e4c0d8fff | ||
|
|
5291a87587 | ||
|
|
5da29227e8 | ||
|
|
70bf00e844 | ||
|
|
cf999896d5 | ||
|
|
2bb511cd99 | ||
|
|
f147d0f3b3 | ||
|
|
1220bad26d | ||
|
|
689c701f34 | ||
|
|
a3d281192d | ||
|
|
f59e809713 |
0
.editorconfig
Normal file → Executable file
0
.eslintignore
Normal file → Executable file
30
.eslintrc
Normal file → Executable file
@@ -1,26 +1,34 @@
|
||||
{
|
||||
"root": true,
|
||||
"extends": ["airbnb-base", "plugin:vue/recommended"],
|
||||
"extends": ["airbnb-base"],
|
||||
"env": {
|
||||
"node": true
|
||||
},
|
||||
"parserOptions": {
|
||||
"parser": "babel-eslint",
|
||||
"ecmaVersion": 2019,
|
||||
"sourceType": "module"
|
||||
"parser": "@babel/eslint-parser",
|
||||
"ecmaVersion": 2024,
|
||||
"sourceType": "script"
|
||||
},
|
||||
"rules": {
|
||||
"indent": ["error", "tab"],
|
||||
"no-tabs": "off",
|
||||
"no-unused-vars": ["error", {"argsIgnorePattern": "^_"}],
|
||||
"no-unused-vars": ["error", {"argsIgnorePattern": "^_"}],
|
||||
"no-console": 0,
|
||||
"arrow-body-style": 0,
|
||||
"default-param-last": 0,
|
||||
"template-curly-spacing": "off",
|
||||
"max-len": 0,
|
||||
"vue/no-v-html": 0,
|
||||
"vue/html-indent": ["error", "tab"],
|
||||
"vue/multiline-html-element-content-newline": 0,
|
||||
"vue/singleline-html-element-content-newline": 0,
|
||||
"func-names": 0,
|
||||
"space-before-function-paren": 0,
|
||||
"strict": 0,
|
||||
"no-underscore-dangle": 0,
|
||||
"prefer-destructuring": "off",
|
||||
"object-curly-newline": "off",
|
||||
"require-await": "off",
|
||||
"no-param-reassign": ["error", {
|
||||
"props": true,
|
||||
"ignorePropertyModificationsFor": ["state", "acc"]
|
||||
}],
|
||||
"ignorePropertyModificationsFor": ["state", "acc", "req"]
|
||||
}]
|
||||
},
|
||||
"globals": {
|
||||
"CONFIG": true
|
||||
|
||||
13
.gitignore
vendored
Normal file → Executable file
@@ -2,9 +2,22 @@ node_modules/
|
||||
dist/
|
||||
log/
|
||||
media/
|
||||
html/
|
||||
data/
|
||||
tmp/*
|
||||
public/js/*
|
||||
public/css/*
|
||||
public/img/tags
|
||||
public/img/logos/
|
||||
public/banners
|
||||
config/*
|
||||
!config/default.js
|
||||
!config/analvids.json
|
||||
assets/js/config/
|
||||
!assets/js/config/default.js
|
||||
/export*
|
||||
/stashes*
|
||||
/alerts*
|
||||
*.heapprofile
|
||||
*.heapsnapshot
|
||||
.vscode
|
||||
|
||||
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "common"]
|
||||
path = common
|
||||
url = git@unknown.name:DebaucheryLibrarian/traxxx-common.git
|
||||
109
README.md
Normal file → Executable file
@@ -2,12 +2,12 @@
|
||||
**NSFW** - The latest releases from your favorite porn studios in one place.
|
||||
|
||||
## Install & run
|
||||
Use [nvm](https://github.com/creationix/nvm) to install a recent version of NodeJS. Download and unpack or clone this repository, and run the following in the root directory:
|
||||
Use [nvm](https://github.com/creationix/nvm) to install NodeJS v16.8.0 or newer. Download and unpack or clone this repository, and run the following in the root directory:
|
||||
|
||||
`npm install`
|
||||
|
||||
### Set up database
|
||||
Install PostgreSQL, make sure password authentication is enabled (scram-sha-256) and create a database with a privileged user. For optimal search engine performance, copy `traxxx.stop` to your PostgresQL text search directory, usually `/usr/share/postgresql/tsearch_data/ or `/usr/local/share/postgresql/tsearch_data/`.
|
||||
Install PostgreSQL, make sure password authentication is enabled (scram-sha-256). Create a database with a fully privileged user.
|
||||
|
||||
### Configuration
|
||||
Do not modify `config/default.js`, but instead create a copy at `config/local.js` containing the properties you wish to change. If you have set `NODE_ENV`, copy `assets/js/config/default.js` to `assets/js/config/[environment].js`. After setting up PostgreSQL and configuring the details, run the following commands to create and populate the tables, and build the project:
|
||||
@@ -18,12 +18,44 @@ Do not modify `config/default.js`, but instead create a copy at `config/local.js
|
||||
|
||||
You can also use `npm run flush` to run both steps at once, and wipe the database completely later.
|
||||
|
||||
#### Networks and channels
|
||||
To scrape the networks and channels available in the database, you can configure `include` and `exclude` lists. To include all available channels and only use the `exclude` list, leave the `include` parameter unconfigured. The `exclude` lists will exclude channels and child networks from networks on the `include` lists, but not vice versa. That is, if the `include` list includes a network and the `exclude` list excludes one of that network's channels, the channel will not be scraped. However, if the `include` list includes a channel, and the `exclude` list includes its parent network, the channel will be scraped.
|
||||
|
||||
This configuration will scrape Evil Angel and all XEmpire channels, except for LesbianX.
|
||||
```
|
||||
include: {
|
||||
networks: [
|
||||
'xempire',
|
||||
],
|
||||
channels: [
|
||||
'evilangel',
|
||||
],
|
||||
},
|
||||
exclude: {
|
||||
channels: [
|
||||
'lesbianx',
|
||||
],
|
||||
}
|
||||
```
|
||||
|
||||
This configuration will scrape all channels, except for BAM Visions, and except all channels part of the Vixen network.
|
||||
```
|
||||
exclude: {
|
||||
channels: [
|
||||
'bamvisions',
|
||||
],
|
||||
networks: [
|
||||
'vixen'
|
||||
],
|
||||
},
|
||||
```
|
||||
|
||||
### Building
|
||||
To build traxxx, run the following command:
|
||||
|
||||
`npm run build`
|
||||
|
||||
To generate the thumbnails for logos and tag photos, run:
|
||||
To generate thumbnails for new logos and tag photos, install ImageMagick and run:
|
||||
|
||||
`npm run logos-thumbs`
|
||||
|
||||
@@ -33,27 +65,62 @@ To generate the thumbnails for logos and tag photos, run:
|
||||
`./traxxx --option value` or `npm start -- --option value`
|
||||
|
||||
* `--server`: Run the web server
|
||||
* `--all`: Fetch updates from the channels and networks in the configuration file.
|
||||
* `--channel [slug] [slug]`: Fetch updates from specific channels. The slug is the channel's name in lowercase and without cases or special characters. For example, Teens Like It Big is teenslikeitbig.
|
||||
* `--network [slug] [slug]`: Fetch updates from all sites of a specific network. The network slug is composed similarly to the channel slug.
|
||||
|
||||
#### Channels
|
||||
* `--channels [slug] [slug]`: Fetch updates from specific channels. The slug is the channel's name in lowercase and without cases or special characters. For example, Teens Like It Big is teenslikeitbig. Overrides configured included networks and channels.
|
||||
* `--networks [slug] [slug]`: Fetch updates from all sites of a specific network. The network slug is composed similarly to the channel slug. Overrides configured included networks and channels.
|
||||
* `--exclude-channels [slug] [slug]`: Scrape every configured, specified or available channel, except for specified. Overrides configured excluded channels.
|
||||
* `--exclude-networks [slug] [slug]`: Scrape every configured, specified or available network, except for specified. Overrides configured excluded networks.
|
||||
* `--after "[time]"`: Do not fetch scenes older than this period or date. Example values are: `"1 month"`, `"3 years"`, `"2019-01-01"`.
|
||||
* `--scene [URL]`: Try to retrieve scene details from its official channel or network URL.
|
||||
* `--deep`: Follow each release link found running `--channel` or `--network` and scrape it for more details. Enabled by default ; use `--no-deep` to only save information found on the overview pages.
|
||||
|
||||
#### Actors
|
||||
* `--actors "[name]" "[name]"`: Fetch actor profiles. When no names are specified, actors without existing profiles are scraped
|
||||
* `--actors-file [filepath]`: Fetch all scenes for the actors specified in a file using a newline delimiter.
|
||||
* `--actors-sources [slug] [slug]`: Scrapers to use for actor profiles. Defaults to config.
|
||||
* `--actors-update [time]`: Update actors that don't have any profiles newer than period ("1 month") or date (2020-08-01). Using this argument without a value will default to 1900-01-01, practically updating all actors.
|
||||
* `--actors-scenes`: Fetch all scenes for scraped actors. Use with caution, as an actor may have many scenes.
|
||||
* `--scene-actors`: Fetch profiles for actors associated with scraped scenes. Use with caution, as scenes may have many actors, each with many profiles.
|
||||
|
||||
#### Developers
|
||||
* `--no-save`: Do not store retrieved information in local database, forcing re-fetch.
|
||||
* `--level`: Change log level to `silly`, `verbose`, `info`, `warn` or `error`.
|
||||
* `--delete-scenes`: Delete scenes and assets by ID.
|
||||
* `--delete-movies`: Delete movies and assets by ID.
|
||||
* `--flush-network`: Delete all scenes and movies with assets from all network channels
|
||||
* `--flush-channel`: Delete all scenes and movies with assets from a channel
|
||||
* `--flush-batch`: Delete all scenes and movies with assets from a batch ID
|
||||
* `--flush-media`: Delete temporary media directory and all unassociated media entries and files
|
||||
|
||||
### API
|
||||
A GraphQL API is available at `/graphql`, and a REST API is available at the following `GET` endpoints:
|
||||
|
||||
* `/api/scenes`: Fetch the latest releases. Supports search with `query` or `q` parameter;
|
||||
* `/api/scenes/{ID}`: Fetch scene by ID.
|
||||
* `/api/actors`: Fetch actors. Search `query` or `q` parameter required.
|
||||
* `/api/actors/{ID|slug}`: Fetch detailed actor by ID or slug.
|
||||
* `/api/entities`: Fetch networks and channels. Use the `type` parameter to filter for either `channel`s or `network`s.
|
||||
* `/api/entities/{ID|slug}`: Fetch detailed network or channel by ID. To fetch by slug, the `type` parameter must specify either `channel` or `network`.
|
||||
* `/api/channels`: Fetch channel entities. Supports the `q` or `query` parameter for searching.
|
||||
* `/api/channels/{ID|slug}`: Fetch detailed channel by ID or slug.
|
||||
* `/api/networks`: Fetch networks. Supports a `q` or `query` parameter for searching.
|
||||
* `/api/networks/{ID|slug}`: Fetch detailed network by ID or slug.
|
||||
* `/api/tags`: Fetch tags.
|
||||
* `/api/tags/{ID|slug|name}`: Fetch detailed tag by ID, slug or name.
|
||||
|
||||
## Supported networks & sites
|
||||
896 channels on 64 networks, continuously expanding!
|
||||
1121 channels on 83 networks, continuously expanding!
|
||||
|
||||
* 21Naturals
|
||||
* 21Sextreme
|
||||
* 21Sextury
|
||||
* Adult Time
|
||||
* Amateur Allure
|
||||
* Amateur Euro
|
||||
* American Pornstar
|
||||
* Assylum
|
||||
* Aziani
|
||||
* Aziani (Gangbang Creampies)
|
||||
* Babes
|
||||
* Bang!
|
||||
* Bang Bros
|
||||
@@ -61,24 +128,40 @@ To generate the thumbnails for logos and tag photos, run:
|
||||
* Brazzers
|
||||
* Burning Angel
|
||||
* Cherry Pimps
|
||||
* DDF Network
|
||||
* CzechAV
|
||||
* DDF Network / Porn World
|
||||
* Digital Playground
|
||||
* Dogfart Network
|
||||
* Dorcel
|
||||
* Elegant Angel
|
||||
* Evil Angel
|
||||
* Fake Hub
|
||||
* Fame Digital
|
||||
* Fantasy Massage
|
||||
* Full Porn Network
|
||||
* FCUK (Exploited College Girls)
|
||||
* First Anal Quest
|
||||
* ForBondage
|
||||
* Full Porn Network (Analized, James Deen)
|
||||
* Gaywire
|
||||
* Girlsway
|
||||
* Hitzefrei
|
||||
* Hookup Hotshot
|
||||
* Hush Pass
|
||||
* Hussie Pass
|
||||
* In The Crack
|
||||
* Insex
|
||||
* Interracial Pass
|
||||
* JayRock Productions
|
||||
* Jesse Loads Monster Facials
|
||||
* Jules Jordan
|
||||
* Karups
|
||||
* Kelly Madison Media (Teen Fidelity)
|
||||
* Killergram
|
||||
* Kink
|
||||
* LegalPorno
|
||||
* LetsDoeIt
|
||||
* Little Caprice Dreams
|
||||
* Mamacitaz
|
||||
* Men
|
||||
* Metro HD
|
||||
* Mike Adriano
|
||||
@@ -87,10 +170,13 @@ To generate the thumbnails for logos and tag photos, run:
|
||||
* Naughty America
|
||||
* New Sensations
|
||||
* Nubiles
|
||||
* Pascal's Sub Sluts
|
||||
* Perfect Gonzo
|
||||
* Perv City
|
||||
* Pimp.XXX
|
||||
* Pinky XXX
|
||||
* Porn Pros
|
||||
* PornCZ
|
||||
* Private
|
||||
* Pure Taboo
|
||||
* Reality Kings
|
||||
@@ -98,10 +184,13 @@ To generate the thumbnails for logos and tag photos, run:
|
||||
* Sexy Hub
|
||||
* Team Skeet
|
||||
* Teen Core Club
|
||||
* TransBella
|
||||
* Twistys
|
||||
* VIP Sex Vault
|
||||
* Vivid
|
||||
* Vixen
|
||||
* VogoV
|
||||
* Whale Member (Holed, POVD)
|
||||
* Wicked
|
||||
* XEmpire
|
||||
* ZTOD
|
||||
|
||||
138
assets/20240125011700_manticore.js
Normal file
@@ -0,0 +1,138 @@
|
||||
const config = require('config');
|
||||
const manticore = require('manticoresearch');
|
||||
|
||||
const mantiClient = new manticore.ApiClient();
|
||||
|
||||
mantiClient.basePath = `http://${config.database.manticore.host}:${config.database.manticore.httpPort}`;
|
||||
|
||||
const utilsApi = new manticore.UtilsApi(mantiClient);
|
||||
|
||||
const scenesFields = `
|
||||
id int,
|
||||
title text,
|
||||
title_filtered text,
|
||||
shoot_id text,
|
||||
channel_id int,
|
||||
channel_name text,
|
||||
channel_slug text,
|
||||
network_id int,
|
||||
network_name text,
|
||||
network_slug text,
|
||||
studio_id int,
|
||||
studio_name text,
|
||||
studio_slug text,
|
||||
entity_ids multi,
|
||||
actor_ids multi,
|
||||
actors text,
|
||||
tag_ids multi,
|
||||
tags text,
|
||||
movie_ids multi,
|
||||
movies text,
|
||||
serie_ids multi,
|
||||
series text,
|
||||
meta text,
|
||||
date timestamp,
|
||||
is_showcased bool,
|
||||
created_at timestamp,
|
||||
effective_date timestamp,
|
||||
stashed int,
|
||||
dupe_index int
|
||||
`;
|
||||
|
||||
const moviesFields = `
|
||||
id int,
|
||||
title text,
|
||||
title_filtered text,
|
||||
channel_id int,
|
||||
channel_name text,
|
||||
channel_slug text,
|
||||
network_id int,
|
||||
network_name text,
|
||||
network_slug text,
|
||||
entity_ids multi,
|
||||
actor_ids multi,
|
||||
actors text,
|
||||
tag_ids multi,
|
||||
tags text,
|
||||
meta text,
|
||||
date timestamp,
|
||||
has_cover bool,
|
||||
created_at timestamp,
|
||||
effective_date timestamp,
|
||||
stashed int,
|
||||
stashed_scenes int,
|
||||
stashed_total int,
|
||||
dupe_index int
|
||||
`;
|
||||
|
||||
const actorsFields = `
|
||||
id int,
|
||||
name text,
|
||||
slug string,
|
||||
gender string,
|
||||
date_of_birth timestamp,
|
||||
country string,
|
||||
has_avatar bool,
|
||||
mass int,
|
||||
height int,
|
||||
cup string,
|
||||
natural_boobs int,
|
||||
penis_length int,
|
||||
penis_girth int,
|
||||
stashed int,
|
||||
scenes int
|
||||
`;
|
||||
|
||||
exports.up = async () => {
|
||||
try {
|
||||
await utilsApi.sql(`create table if not exists scenes (${scenesFields})`);
|
||||
|
||||
await utilsApi.sql(`create table if not exists scenes_stashed (
|
||||
scene_id int,
|
||||
stash_id int,
|
||||
user_id int,
|
||||
created_at timestamp
|
||||
)`);
|
||||
|
||||
await utilsApi.sql(`create table if not exists movies (${moviesFields})`);
|
||||
|
||||
await utilsApi.sql(`create table if not exists movies_stashed (
|
||||
movie_id int,
|
||||
stash_id int,
|
||||
user_id int,
|
||||
created_at timestamp
|
||||
)`);
|
||||
|
||||
await utilsApi.sql(`create table if not exists actors (${actorsFields}) min_prefix_len='3'`);
|
||||
|
||||
await utilsApi.sql(`create table if not exists actors_stashed (
|
||||
actor_id int,
|
||||
stash_id int,
|
||||
user_id int,
|
||||
created_at timestamp
|
||||
)`);
|
||||
|
||||
/*
|
||||
await knex.schema.alterTable('stashes_scenes', (table) => table.increments('id'));
|
||||
await knex.schema.alterTable('stashes_movies', (table) => table.increments('id'));
|
||||
await knex.schema.alterTable('stashes_actors', (table) => table.increments('id'));
|
||||
await knex.schema.alterTable('stashes_series', (table) => table.increments('id'));
|
||||
*/
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await utilsApi.sql('drop table if exists scenes');
|
||||
await utilsApi.sql('drop table if exists scenes_stashed');
|
||||
await utilsApi.sql('drop table if exists movies');
|
||||
await utilsApi.sql('drop table if exists movies_stashed');
|
||||
await utilsApi.sql('drop table if exists actors');
|
||||
await utilsApi.sql('drop table if exists actors_stashed');
|
||||
|
||||
await knex.schema.alterTable('stashes_scenes', (table) => table.dropColumn('id'));
|
||||
await knex.schema.alterTable('stashes_movies', (table) => table.dropColumn('id'));
|
||||
await knex.schema.alterTable('stashes_actors', (table) => table.dropColumn('id'));
|
||||
await knex.schema.alterTable('stashes_series', (table) => table.dropColumn('id'));
|
||||
};
|
||||
@@ -1,715 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="actor"
|
||||
class="content actor"
|
||||
>
|
||||
<div class="actor-header">
|
||||
<h2 class="header-name">
|
||||
<span v-if="actor.entity">{{ actor.name }} ({{ actor.entity.name }})</span>
|
||||
<span v-else="">{{ actor.name }}</span>
|
||||
|
||||
<Gender
|
||||
:gender="actor.gender"
|
||||
class="header-gender"
|
||||
/>
|
||||
</h2>
|
||||
|
||||
<li
|
||||
v-if="actor.aliases.length"
|
||||
class="bio-item"
|
||||
>
|
||||
<dfn class="bio-label">Also known as</dfn>
|
||||
<span>{{ actor.aliases.join(', ') }}</span>
|
||||
</li>
|
||||
|
||||
<Social
|
||||
v-if="actor.social && actor.social.length > 0"
|
||||
:actor="actor"
|
||||
class="header-social"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="actor-inner">
|
||||
<div
|
||||
class="profile"
|
||||
:class="{ expanded: bioExpanded, 'with-avatar': !!actor.avatar }"
|
||||
>
|
||||
<a
|
||||
v-if="actor.avatar"
|
||||
:href="`/media/${actor.avatar.path}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="avatar-link"
|
||||
>
|
||||
<img
|
||||
:src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
||||
:title="actor.avatar.credit && `© ${actor.avatar.credit}`"
|
||||
class="avatar"
|
||||
>
|
||||
</a>
|
||||
|
||||
<Expand
|
||||
v-if="bioExpanded"
|
||||
:expanded="bioExpanded"
|
||||
class="expand expand-dark"
|
||||
@expand="(state) => bioExpanded = state"
|
||||
/>
|
||||
|
||||
<ul class="bio nolist">
|
||||
<li
|
||||
v-if="actor.realName"
|
||||
class="bio-item"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="vcard" />Real name</dfn>
|
||||
<span class="bio-value">{{ actor.realName }}</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.dateOfBirth"
|
||||
class="bio-item"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="cake" />Date of birth</dfn>
|
||||
|
||||
<span class="birthdate">{{ formatDate(actor.dateOfBirth, 'MMMM D, YYYY') }}<span
|
||||
v-if="!actor.dateOfDeath"
|
||||
class="age"
|
||||
>{{ actor.age }}</span></span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.dateOfDeath"
|
||||
class="bio-item"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="tombstone" />Date of death</dfn>
|
||||
|
||||
<span class="birthdate">{{ formatDate(actor.dateOfDeath, 'MMMM D, YYYY') }}<span
|
||||
v-if="actor.ageAtDeath"
|
||||
class="age"
|
||||
>{{ actor.ageAtDeath }}</span></span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.origin"
|
||||
class="bio-item birth"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="home2" />Born in</dfn>
|
||||
|
||||
<span>
|
||||
<span
|
||||
v-if="actor.origin.city"
|
||||
class="city"
|
||||
>{{ actor.origin.city }}</span><span
|
||||
v-if="actor.origin.state && (!actor.origin.city || (actor.origin.country && actor.origin.country.alpha2 === 'US'))"
|
||||
class="state"
|
||||
>{{ actor.origin.city ? `, ${actor.origin.state}` : actor.origin.state }}</span>
|
||||
|
||||
<span
|
||||
v-if="actor.origin.country"
|
||||
class="country birthcountry"
|
||||
>
|
||||
<img
|
||||
class="flag"
|
||||
:src="`/img/flags/${actor.origin.country.alpha2.toLowerCase()}.svg`"
|
||||
>{{ actor.origin.country.alias || actor.origin.country.name }}
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.residence"
|
||||
class="bio-item residence hideable"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="location" />Lives in</dfn>
|
||||
|
||||
<span>
|
||||
<span
|
||||
v-if="actor.residence.city"
|
||||
class="city"
|
||||
>{{ actor.residence.city }}</span><span
|
||||
v-if="actor.residence.state && actor.residence.country && actor.residence.country.alpha2 === 'US'"
|
||||
class="state"
|
||||
>{{ actor.residence.city ? `, ${actor.residence.state}` : actor.residence.state }}</span>
|
||||
|
||||
<span
|
||||
v-if="actor.residence.country"
|
||||
class="country"
|
||||
>
|
||||
<img
|
||||
class="flag"
|
||||
:src="`/img/flags/${actor.residence.country.alpha2.toLowerCase()}.svg`"
|
||||
>{{ actor.residence.country.alias || actor.residence.country.name }}
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.ethnicity"
|
||||
class="bio-item ethnicity hideable"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="earth2" />Ethnicity</dfn>
|
||||
<span>{{ actor.ethnicity }}</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.bust || actor.waist || actor.hip"
|
||||
title="bust-waist-hip"
|
||||
class="bio-item figure"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="ruler" />Figure</dfn>
|
||||
<span class="bio-value">
|
||||
<Icon
|
||||
v-if="actor.naturalBoobs === false"
|
||||
v-tooltip="'Enhanced boobs'"
|
||||
icon="magic-wand2"
|
||||
class="enhanced"
|
||||
/>{{ actor.bust || '??' }}{{ actor.cup || '?' }}-{{ actor.waist || '??' }}-{{ actor.hip || '??' }}
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.height"
|
||||
class="bio-item height"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="height" />Height</dfn>
|
||||
<span>
|
||||
<span class="height-metric">{{ actor.height.metric }} cm</span>
|
||||
<span class="height-imperial">{{ actor.height.imperial }}</span>
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.weight"
|
||||
class="bio-item weight hideable"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="scale" />Weight</dfn>
|
||||
|
||||
<span>
|
||||
<span class="weight-metric">{{ actor.weight.metric }} kg</span>
|
||||
<span class="weight-imperial">{{ actor.weight.imperial }} lbs</span>
|
||||
</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.eyes"
|
||||
class="bio-item eyes hideable"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="eye" />Eyes</dfn>
|
||||
<span>{{ actor.eyes }}</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.hairColor"
|
||||
class="bio-item hair hideable"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="haircut" />Hair</dfn>
|
||||
<span><span v-if="actor.hairLength">{{ actor.hairLength }}, </span>{{ actor.hairColor }}</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.hasTattoos"
|
||||
class="bio-item tattoos hideable"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="lotus" />Tattoos</dfn>
|
||||
|
||||
<span
|
||||
v-if="actor.tattoos"
|
||||
v-tooltip="actor.tattoos"
|
||||
class="bio-value"
|
||||
>{{ actor.tattoos }}</span>
|
||||
<span v-else>Yes</span>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-if="actor.hasPiercings"
|
||||
class="bio-item piercings hideable"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="trophy4" />Piercings</dfn>
|
||||
|
||||
<span
|
||||
v-if="actor.piercings"
|
||||
v-tooltip="actor.piercings"
|
||||
class="bio-value"
|
||||
>{{ actor.piercings }}</span>
|
||||
<span v-else>Yes</span>
|
||||
</li>
|
||||
|
||||
<li class="bio-item scraped hideable">Updated {{ formatDate(actor.updatedAt, 'YYYY-MM-DD HH:mm') }}, ID: {{ actor.id }}</li>
|
||||
</ul>
|
||||
|
||||
<div class="descriptions-container">
|
||||
<div
|
||||
v-if="actor.descriptions && actor.descriptions.length > 0"
|
||||
class="descriptions"
|
||||
>
|
||||
<p
|
||||
v-for="description in actor.descriptions"
|
||||
:key="`description-${description.entity.id}`"
|
||||
class="description"
|
||||
>
|
||||
{{ description.text }}
|
||||
<router-link :to="`/${description.entity.type}/${description.entity.slug}`">
|
||||
<img
|
||||
v-if="description.entity.type === 'network' || description.entity.independent"
|
||||
:src="`/img/logos/${description.entity.slug}/thumbs/network.png`"
|
||||
class="description-logo"
|
||||
>
|
||||
|
||||
<img
|
||||
v-else
|
||||
:src="`/img/logos/${description.entity.parent.slug}/thumbs/${description.entity.slug}.png`"
|
||||
class="description-logo"
|
||||
>
|
||||
</router-link>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Social
|
||||
v-if="actor.social && actor.social.length > 0"
|
||||
:actor="actor"
|
||||
class="profile-social"
|
||||
/>
|
||||
|
||||
<Expand
|
||||
:expanded="bioExpanded"
|
||||
class="expand expand-dark"
|
||||
@expand="(state) => bioExpanded = state"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="actor-content">
|
||||
<Scroll
|
||||
v-if="actor.avatar || (actor.photos && actor.photos.length > 0)"
|
||||
:expanded="photosExpanded"
|
||||
class="scroll-light"
|
||||
@expand="(state) => photosExpanded = state"
|
||||
>
|
||||
<Photos
|
||||
:actor="actor"
|
||||
:class="{ expanded: photosExpanded }"
|
||||
/>
|
||||
</Scroll>
|
||||
|
||||
<FilterBar
|
||||
:fetch-releases="fetchActor"
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
:available-tags="actor.tags"
|
||||
/>
|
||||
|
||||
<Releases :releases="releases" />
|
||||
|
||||
<Pagination
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
class="pagination-top"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Pagination from '../pagination/pagination.vue';
|
||||
import FilterBar from '../header/filter-bar.vue';
|
||||
import Releases from '../releases/releases.vue';
|
||||
import Photos from './photos.vue';
|
||||
import Expand from '../expand/expand.vue';
|
||||
import Scroll from '../scroll/scroll.vue';
|
||||
import Gender from './gender.vue';
|
||||
import Social from './social.vue';
|
||||
|
||||
async function fetchActor() {
|
||||
const { actor, releases, totalCount } = await this.$store.dispatch('fetchActorById', {
|
||||
actorId: Number(this.$route.params.actorId),
|
||||
limit: 10,
|
||||
pageNumber: Number(this.$route.params.pageNumber),
|
||||
range: this.$route.params.range,
|
||||
});
|
||||
|
||||
this.actor = actor;
|
||||
this.releases = releases;
|
||||
this.totalCount = totalCount;
|
||||
}
|
||||
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
async function route() {
|
||||
await this.fetchActor();
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
await this.fetchActor();
|
||||
|
||||
if (this.actor) {
|
||||
this.pageTitle = this.actor.name;
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
FilterBar,
|
||||
Pagination,
|
||||
Photos,
|
||||
Scroll,
|
||||
Expand,
|
||||
Releases,
|
||||
Gender,
|
||||
Social,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
actor: null,
|
||||
releases: null,
|
||||
totalCount: 0,
|
||||
limit: 10,
|
||||
pageTitle: null,
|
||||
bioExpanded: false,
|
||||
photosExpanded: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
sfw,
|
||||
},
|
||||
watch: {
|
||||
$route: route,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
fetchActor,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.header-gender .icon {
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.actor-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
color: var(--highlight-extreme);
|
||||
background: var(--profile);
|
||||
padding: .75rem 1rem;
|
||||
}
|
||||
|
||||
.header-name {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: inline-flex;
|
||||
justify-content: space-between;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.header-gender {
|
||||
display: inline-block;
|
||||
margin: 0 0 0 .5rem;
|
||||
transform: translate(0, .1rem);
|
||||
}
|
||||
|
||||
.header-social {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
margin: 0 1rem 0 0;
|
||||
}
|
||||
|
||||
.profile {
|
||||
background: var(--profile);
|
||||
color: var(--highlight-extreme);
|
||||
width: 100%;
|
||||
max-height: 18rem;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-shrink: 0;
|
||||
|
||||
&.with-avatar {
|
||||
height: 18rem; /* profile overlaps avatar in chrome */
|
||||
}
|
||||
|
||||
.avatar-link {
|
||||
padding: 0 0 1rem 1rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
height: 100%;
|
||||
flex-shrink: 0;
|
||||
border: solid 3px var(--lighten-hint);
|
||||
margin: 0 .5rem 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.bio {
|
||||
flex-grow: 1;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: wrap;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.bio-header {
|
||||
width: calc(50% - 2rem);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0 .5rem .5rem 0;
|
||||
margin: 0 0 0 1rem;
|
||||
}
|
||||
|
||||
.bio-item {
|
||||
width: calc(50% - 4rem);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
box-sizing: border-box;
|
||||
padding: .25rem 0 ;
|
||||
margin: 0 0 .25rem 1rem;
|
||||
line-height: 1.75;
|
||||
text-align: right;
|
||||
font-size: .9rem;
|
||||
font-weight: 600;
|
||||
overflow: hidden;
|
||||
|
||||
&:not(:last-of-type) {
|
||||
border-bottom: solid 1px var(--highlight-hint);
|
||||
}
|
||||
}
|
||||
|
||||
.bio-label,
|
||||
.bio-value {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.bio-label {
|
||||
color: var(--highlight);
|
||||
margin: 0 1rem 0 0;
|
||||
flex-shrink: 0;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
|
||||
.icon {
|
||||
fill: var(--highlight);
|
||||
margin: -.25rem .5rem 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.bio-value {
|
||||
margin: 0 0 0 2rem;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
|
||||
.icon {
|
||||
margin: -.25rem 0 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.flag {
|
||||
height: 1rem;
|
||||
margin: .25rem .25rem 0 0;
|
||||
}
|
||||
|
||||
.bio-name {
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.birthdate {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.age {
|
||||
font-weight: bold;
|
||||
padding: 0 0 0 .5rem;
|
||||
border-left: solid 1px var(--highlight-weak);
|
||||
margin: 0 0 0 .5rem;
|
||||
}
|
||||
|
||||
.country {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.figure .bio-label .icon {
|
||||
margin: -.5rem .5rem 0 0;
|
||||
}
|
||||
|
||||
.height-imperial,
|
||||
.weight-imperial {
|
||||
padding: 0 0 0 .5rem;
|
||||
border-left: solid 1px var(--highlight-weak);
|
||||
margin: 0 0 0 .5rem;
|
||||
}
|
||||
|
||||
.enhanced.icon {
|
||||
fill: var(--primary);
|
||||
padding: 0 .5rem;
|
||||
transform: scaleX(-1);
|
||||
}
|
||||
|
||||
.ethnicity,
|
||||
.hair,
|
||||
.eyes {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.scraped {
|
||||
color: var(--highlight-weak);
|
||||
font-size: .8rem;
|
||||
}
|
||||
|
||||
.descriptions-container {
|
||||
max-width: 30rem;
|
||||
max-height: 100%;
|
||||
position: relative;
|
||||
display: block;
|
||||
flex-grow: 1;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
width: 100%;
|
||||
height: 1.5rem;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
background: linear-gradient(transparent, 25%, var(--profile) 75%);
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.descriptions {
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
scrollbar-width: none;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.description {
|
||||
margin: 0;
|
||||
padding: 0 1rem;
|
||||
border-left: solid 3px var(--lighten-hint);
|
||||
line-height: 1.5;
|
||||
font-size: .9rem;
|
||||
}
|
||||
|
||||
.description-logo {
|
||||
display: block;
|
||||
width: 12rem;
|
||||
max-height: 1.5rem;
|
||||
margin: .5rem 0 1.5rem 0;
|
||||
object-fit: contain;
|
||||
object-position: 0 50%;
|
||||
}
|
||||
|
||||
.actor-content {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
flex-direction: column;
|
||||
background: var(--background-soft);
|
||||
}
|
||||
|
||||
.heading {
|
||||
padding: 0;
|
||||
margin: 0 0 1rem 0;
|
||||
}
|
||||
|
||||
.photos {
|
||||
background: var(--background-dim);
|
||||
}
|
||||
|
||||
.profile-social {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.expand {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scroll {
|
||||
border-bottom: solid 1px var(--shadow-hint);
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint4) {
|
||||
.descriptions-container {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint3) {
|
||||
.profile .avatar-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.actor-content {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint) {
|
||||
.profile {
|
||||
height: auto;
|
||||
max-height: none;
|
||||
flex-direction: column;
|
||||
|
||||
&.with-avatar {
|
||||
height: auto;
|
||||
max-height: none;
|
||||
}
|
||||
|
||||
&:not(.expanded) .hideable {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.bio {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: 0 1rem;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.bio-item {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.expanded .bio-value {
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.expand {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.header-social {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.expanded .profile-social {
|
||||
display: block;
|
||||
margin: 1rem 0 0 0;
|
||||
}
|
||||
|
||||
.header-name {
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,272 +0,0 @@
|
||||
<template>
|
||||
<div class="actors">
|
||||
<nav class="filter">
|
||||
<ul class="genders nolist">
|
||||
<li class="gender">
|
||||
<router-link
|
||||
:to="{ name: 'actors', params: { gender: 'female', letter, pageNumber: 1 } }"
|
||||
:class="{ selected: gender === 'female' }"
|
||||
class="gender-link female"
|
||||
><Gender gender="female" /></router-link>
|
||||
</li>
|
||||
<li class="gender">
|
||||
<router-link
|
||||
:to="{ name: 'actors', params: { gender: 'male', letter, pageNumber: 1 } }"
|
||||
:class="{ selected: gender === 'male' }"
|
||||
class="gender-link male"
|
||||
replace
|
||||
><Gender gender="male" /></router-link>
|
||||
</li>
|
||||
<li class="gender">
|
||||
<router-link
|
||||
:to="{ name: 'actors', params: { gender: 'trans', letter, pageNumber: 1 } }"
|
||||
:class="{ selected: gender === 'trans' }"
|
||||
class="gender-link transsexual"
|
||||
replace
|
||||
><Gender gender="transsexual" /></router-link>
|
||||
</li>
|
||||
<li class="gender">
|
||||
<router-link
|
||||
:to="{ name: 'actors', params: { gender: 'other', letter, pageNumber: 1 } }"
|
||||
:class="{ selected: gender === 'other' }"
|
||||
class="gender-link other"
|
||||
replace
|
||||
><Icon icon="question5" /></router-link>
|
||||
</li>
|
||||
<li class="gender">
|
||||
<router-link
|
||||
:to="{ name: 'actors', params: { gender: 'all', letter, pageNumber: 1 } }"
|
||||
:class="{ selected: gender === 'all' }"
|
||||
class="gender-link all"
|
||||
>all</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="letters nolist">
|
||||
<li
|
||||
v-for="letterX in letters"
|
||||
:key="letterX"
|
||||
class="letter"
|
||||
>
|
||||
<router-link
|
||||
:to="{ name: 'actors', params: { gender, letter: letterX, pageNumber: 1 } }"
|
||||
:class="{ selected: letterX === letter }"
|
||||
class="letter-link"
|
||||
replace
|
||||
>{{ letterX || 'All' }}</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<Pagination
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
/>
|
||||
|
||||
<div
|
||||
v-lazy-container="{ selector: '.lazy' }"
|
||||
class="tiles"
|
||||
>
|
||||
<Actor
|
||||
v-for="actor in actors"
|
||||
:key="`actor-${actor.id}`"
|
||||
:actor="actor"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Pagination
|
||||
v-if="totalCount > 0"
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
class="pagination-top"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Actor from './tile.vue';
|
||||
import Gender from './gender.vue';
|
||||
import Pagination from '../pagination/pagination.vue';
|
||||
|
||||
async function fetchActors() {
|
||||
const curatedGender = this.gender.replace('trans', 'transsexual');
|
||||
|
||||
const { actors, totalCount } = await this.$store.dispatch('fetchActors', {
|
||||
limit: this.limit,
|
||||
pageNumber: Number(this.$route.params.pageNumber) || 1,
|
||||
letter: this.letter.replace('all', ''),
|
||||
gender: curatedGender === 'other' ? null : curatedGender,
|
||||
});
|
||||
|
||||
this.actors = actors;
|
||||
this.totalCount = totalCount;
|
||||
}
|
||||
|
||||
function letter() {
|
||||
return this.$route.params.letter || 'all';
|
||||
}
|
||||
|
||||
function gender() {
|
||||
return this.$route.params.gender || 'female';
|
||||
}
|
||||
|
||||
async function route() {
|
||||
await this.fetchActors();
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
this.pageTitle = 'Actors';
|
||||
|
||||
await this.fetchActors();
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Actor,
|
||||
Gender,
|
||||
Pagination,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
actors: [],
|
||||
pageTitle: null,
|
||||
totalCount: 0,
|
||||
limit: 30,
|
||||
letters: ['all'].concat(Array.from({ length: 26 }, (value, index) => String.fromCharCode(index + 97).toUpperCase())),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
letter,
|
||||
gender,
|
||||
},
|
||||
watch: {
|
||||
$route: route,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
fetchActors,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.gender-link {
|
||||
&.selected .gender .icon {
|
||||
fill: var(--text-light);
|
||||
filter: none;
|
||||
}
|
||||
|
||||
&:hover:not(.selected) {
|
||||
.gender .icon {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
|
||||
.male .icon {
|
||||
filter: drop-shadow(0 0 1px var(--male));
|
||||
}
|
||||
|
||||
.female .icon {
|
||||
filter: drop-shadow(0 0 1px var(--female));
|
||||
}
|
||||
}
|
||||
|
||||
&:hover:not(.selected) .transsexual .icon {
|
||||
fill: var(--female);
|
||||
filter: drop-shadow(1px 0 0 var(--text-light)) drop-shadow(-1px 0 0 var(--text-light)) drop-shadow(0 1px 0 var(--text-light)) drop-shadow(0 -1px 0 var(--text-light)) drop-shadow(1px 0 0 var(--male)) drop-shadow(-1px 0 0 var(--male)) drop-shadow(0 1px 0 var(--male)) drop-shadow(0 -1px 0 var(--male)) drop-shadow(0 0 1px rgba(0, 0, 0, 0.5));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'breakpoints';
|
||||
|
||||
.actors {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.tiles {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
|
||||
grid-gap: .5rem;
|
||||
padding: 1rem;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.filter {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 0 1rem;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
.genders {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
padding: 0 .5rem 0 0;
|
||||
border-right: solid 1px var(--shadow-hint);
|
||||
margin: 0 1rem 0 0;
|
||||
}
|
||||
|
||||
.letter,
|
||||
.gender {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.letter-link,
|
||||
.gender-link {
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
margin: .25rem .5rem .25rem 0;
|
||||
color: var(--shadow);
|
||||
background: var(--background);
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
|
||||
.male,
|
||||
.female,
|
||||
.transsexual {
|
||||
padding: .2rem 0 0 0;
|
||||
}
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: var(--text);
|
||||
cursor: pointer;
|
||||
|
||||
.icon {
|
||||
fill: var(--text);
|
||||
}
|
||||
}
|
||||
|
||||
&.selected {
|
||||
background: var(--primary);
|
||||
color: var(--text-light);
|
||||
|
||||
&.other .icon {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint) {
|
||||
.genders {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint-micro) {
|
||||
.tiles {
|
||||
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,41 +0,0 @@
|
||||
<template>
|
||||
<span
|
||||
v-if="gender"
|
||||
class="gender"
|
||||
:class="{ [gender]: true }"
|
||||
><Icon :icon="gender" /></span>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
gender: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.gender {
|
||||
&.female .icon {
|
||||
fill: var(--female);
|
||||
filter: drop-shadow(0 0 1px var(--shadow));
|
||||
}
|
||||
|
||||
&.male .icon {
|
||||
fill: var(--male);
|
||||
filter: drop-shadow(0 0 1px var(--shadow));
|
||||
}
|
||||
|
||||
&.transsexual .icon {
|
||||
fill: var(--text-contrast);
|
||||
filter: drop-shadow(1px 0 0 var(--female)) drop-shadow(-1px 0 0 var(--female)) drop-shadow(0 1px 0 var(--female)) drop-shadow(0 -1px 0 var(--female))
|
||||
drop-shadow(1px 0 0 var(--male)) drop-shadow(-1px 0 0 var(--male)) drop-shadow(0 1px 0 var(--male)) drop-shadow(0 -1px 0 var(--male))
|
||||
drop-shadow(0 0 1px var(--shadow))
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,136 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-lazy-container
|
||||
class="photos"
|
||||
:class="{
|
||||
avatar: !!actor.avatar,
|
||||
empty: actor.photos.length === 0,
|
||||
}"
|
||||
>
|
||||
<a
|
||||
v-show="actor.avatar"
|
||||
:href="`/media/${actor.avatar.path}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="avatar-link photo-link"
|
||||
>
|
||||
<img
|
||||
:src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
||||
:data-src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
||||
:data-loading="sfw ? `/img/${actor.avatar.sfw.lazy}` : `/media/${actor.avatar.lazy}`"
|
||||
:title="actor.avatar.credit && `© ${actor.avatar.credit}`"
|
||||
class="avatar photo"
|
||||
@load="$parent.$emit('load')"
|
||||
>
|
||||
</a>
|
||||
|
||||
<a
|
||||
v-for="photo in actor.photos"
|
||||
:key="`photo-${photo.id}`"
|
||||
:href="`/media/${photo.path}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="photo-link"
|
||||
>
|
||||
<img
|
||||
:src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
||||
:data-src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
||||
:data-loading="sfw ? `/img/${photo.sfw.lazy}` : `/media/${photo.lazy}`"
|
||||
:title="`© ${photo.credit || photo.entity.name}`"
|
||||
class="photo"
|
||||
@load="$parent.$emit('load')"
|
||||
>
|
||||
</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
actor: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
sfw,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.photos {
|
||||
display: flex;
|
||||
box-sizing: border-box;
|
||||
padding: .5rem 1rem;
|
||||
margin: 0 1rem 0 0;
|
||||
font-size: 0;
|
||||
overflow-x: scroll;
|
||||
scroll-behavior: smooth;
|
||||
scrollbar-width: none;
|
||||
|
||||
&.expanded {
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
margin: 0;
|
||||
|
||||
.photo-link {
|
||||
margin: 0 .5rem .5rem 0;
|
||||
}
|
||||
|
||||
.photo {
|
||||
height: 18rem;
|
||||
}
|
||||
}
|
||||
|
||||
&.empty {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.avatar-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.photo-link {
|
||||
margin: 0 .5rem 0 0;
|
||||
}
|
||||
|
||||
.photo {
|
||||
height: 15rem;
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint3) {
|
||||
.photos {
|
||||
&.empty.avatar {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.avatar-link {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
&.expanded {
|
||||
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.photos.expanded {
|
||||
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,61 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="actor"
|
||||
class="social"
|
||||
>
|
||||
<a
|
||||
v-for="social in actor.social"
|
||||
:key="`social-${social.id}`"
|
||||
v-tooltip.bottom="social.url"
|
||||
:href="social.url"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="social-link"
|
||||
>
|
||||
<Icon
|
||||
v-if="social.platform"
|
||||
:icon="social.platform"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
v-else
|
||||
icon="link"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
actor: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.social {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.social-link {
|
||||
display: inline-block;
|
||||
padding: 0 0 0 1rem;
|
||||
|
||||
.icon {
|
||||
color: var(--highlight);
|
||||
fill: var(--highlight);
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
}
|
||||
|
||||
&:hover .icon {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,281 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="actor"
|
||||
class="actor"
|
||||
>
|
||||
<router-link
|
||||
:to="{ name: 'actor', params: { actorId: actor.id, actorSlug: actor.slug } }"
|
||||
class="link"
|
||||
>
|
||||
<span
|
||||
class="handle"
|
||||
>
|
||||
<span
|
||||
v-tooltip.top="actor.name"
|
||||
class="name"
|
||||
>{{ actor.name }}</span>
|
||||
|
||||
<router-link
|
||||
v-if="actor.network"
|
||||
v-tooltip="actor.network.name"
|
||||
:to="{ name: 'network', params: { networkSlug: actor.network.slug } }"
|
||||
class="favicon"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${actor.network.slug}/favicon.png`"
|
||||
class="favicon-icon"
|
||||
>
|
||||
</router-link>
|
||||
|
||||
<Icon
|
||||
v-if="alias"
|
||||
v-tooltip="`Alias of ${alias.name}`"
|
||||
icon="users3"
|
||||
class="favicon alias"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
v-if="actor.dateOfDeath"
|
||||
v-tooltip="`Died ${formatDate(actor.dateOfDeath, 'MMMM D, YYYY')}`"
|
||||
icon="tombstone"
|
||||
class="favicon died"
|
||||
/>
|
||||
</span>
|
||||
|
||||
<div class="avatar-container">
|
||||
<img
|
||||
v-if="actor.avatar"
|
||||
:data-src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
||||
:data-loading="sfw ? `/img/${actor.avatar.sfw.lazy}` : `/media/${actor.avatar.lazy}`"
|
||||
class="avatar lazy"
|
||||
>
|
||||
|
||||
<span
|
||||
v-else
|
||||
class="avatar"
|
||||
><img
|
||||
:src="`/img/avatar_${actor.gender || 'female'}.svg`"
|
||||
class="avatar-fallback"
|
||||
></span>
|
||||
|
||||
<span
|
||||
class="details"
|
||||
>
|
||||
<span class="gender-age">
|
||||
<Gender :gender="actor.gender" />
|
||||
|
||||
<span
|
||||
v-if="actor.ageAtDeath"
|
||||
v-tooltip="`Born ${formatDate(actor.dateOfBirth, 'MMMM D, YYYY')}<br>Died ${formatDate(actor.dateOfDeath, 'MMMM D, YYYY')}`"
|
||||
class="age-death"
|
||||
>{{ actor.ageAtDeath }}</span>
|
||||
|
||||
<span
|
||||
v-else-if="actor.age"
|
||||
v-tooltip="`Born on ${formatDate(actor.dateOfBirth, 'MMMM D, YYYY')}`"
|
||||
class="age-now"
|
||||
>{{ actor.age }}</span>
|
||||
|
||||
<span
|
||||
v-if="actor.ageThen && actor.ageThen < actor.age"
|
||||
v-tooltip="`${actor.ageThen} years old on release date`"
|
||||
class="age-then"
|
||||
>{{ actor.ageThen }}</span>
|
||||
</span>
|
||||
|
||||
<span
|
||||
v-if="actor.origin"
|
||||
v-tooltip="`Born in ${actor.origin.country.alias || actor.origin.country.name}`"
|
||||
class="country"
|
||||
>
|
||||
{{ actor.origin.country.alpha2 }}
|
||||
<img
|
||||
class="flag"
|
||||
:src="`/img/flags/${actor.origin.country.alpha2.toLowerCase()}.svg`"
|
||||
>
|
||||
</span>
|
||||
|
||||
<span
|
||||
v-else
|
||||
class="country"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
</router-link>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Gender from './gender.vue';
|
||||
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Gender,
|
||||
},
|
||||
props: {
|
||||
actor: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
alias: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
sfw,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.actor {
|
||||
width: 100%;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
background: var(--background);
|
||||
overflow: hidden;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
padding-bottom: 150%;
|
||||
}
|
||||
}
|
||||
|
||||
.link {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
color: var(--text);
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
color: var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
.handle {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
box-shadow: 0 0 3px var(--shadow);
|
||||
|
||||
.name {
|
||||
padding: .5rem;
|
||||
}
|
||||
|
||||
.alias {
|
||||
fill: var(--shadow);
|
||||
}
|
||||
}
|
||||
|
||||
.favicon {
|
||||
font-size: 0;
|
||||
padding: .5rem .25rem;
|
||||
|
||||
&:last-child {
|
||||
padding: .5rem;
|
||||
}
|
||||
|
||||
&.died {
|
||||
fill: var(--shadow);
|
||||
}
|
||||
}
|
||||
|
||||
.favicon-icon {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
}
|
||||
|
||||
.name {
|
||||
flex-grow: 1;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.avatar-container {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
background: var(--profile);
|
||||
}
|
||||
|
||||
.avatar {
|
||||
color: var(--darken-weak);
|
||||
background: var(--darken-hint);
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
object-fit: cover;
|
||||
object-position: 50% 0;
|
||||
}
|
||||
|
||||
.avatar-fallback {
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
opacity: .1;
|
||||
}
|
||||
|
||||
.details {
|
||||
background: var(--darken);
|
||||
color: var(--text-light);
|
||||
width: 100%;
|
||||
height: 1.75rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
box-sizing: border-box;
|
||||
padding: .5rem;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
font-size: .9rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.gender-age {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.gender {
|
||||
margin: .25rem .25rem 0 0;
|
||||
}
|
||||
|
||||
.country {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.flag {
|
||||
height: .75rem;
|
||||
margin: 0 0 0 .5rem;
|
||||
}
|
||||
|
||||
.age-now,
|
||||
.age-death {
|
||||
margin: 0 .25rem 0 0;
|
||||
}
|
||||
|
||||
.age-then {
|
||||
color: var(--lighten);
|
||||
}
|
||||
</style>
|
||||
@@ -1,91 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
class="container"
|
||||
:class="theme"
|
||||
>
|
||||
<Sidebar
|
||||
v-if="showSidebar"
|
||||
:toggle-sidebar="toggleSidebar"
|
||||
/>
|
||||
|
||||
<Header :toggle-sidebar="toggleSidebar" />
|
||||
|
||||
<div class="content">
|
||||
<!-- key forces rerender when new and old path use same component -->
|
||||
<router-view />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
|
||||
import EventBus from '../../js/event-bus';
|
||||
|
||||
import Header from '../header/header.vue';
|
||||
import Sidebar from '../sidebar/sidebar.vue';
|
||||
|
||||
function theme(state) {
|
||||
return state.ui.theme;
|
||||
}
|
||||
|
||||
function toggleSidebar(state) {
|
||||
this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar;
|
||||
}
|
||||
|
||||
function mounted() {
|
||||
document.addEventListener('click', () => {
|
||||
EventBus.$emit('blur');
|
||||
this.showSidebar = false;
|
||||
});
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Header,
|
||||
Sidebar,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showSidebar: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
theme,
|
||||
}),
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
toggleSidebar,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import 'theme';
|
||||
|
||||
.container {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
background: var(--background-soft);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.content-inner {
|
||||
flex-grow: 1;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
</style>
|
||||
@@ -1,66 +0,0 @@
|
||||
<template>
|
||||
<div class="children">
|
||||
<EntityTile
|
||||
v-for="child in entity.children"
|
||||
:key="`child-${child.id}`"
|
||||
:entity="child"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import EntityTile from './tile.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
EntityTile,
|
||||
},
|
||||
props: {
|
||||
entity: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.children {
|
||||
display: flex;
|
||||
box-sizing: border-box;
|
||||
padding: 1rem;
|
||||
margin: 0 1rem 0 0;
|
||||
border-bottom: solid 1px var(--darken-hint);
|
||||
overflow-x: auto;
|
||||
scroll-behavior: smooth;
|
||||
scrollbar-width: none;
|
||||
|
||||
.tile {
|
||||
width: 15rem;
|
||||
margin: 0 1rem 0 0;
|
||||
}
|
||||
|
||||
&.expanded {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
|
||||
grid-gap: 1rem;
|
||||
margin: 0;
|
||||
|
||||
.tile {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.children.expanded {
|
||||
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,261 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="entity"
|
||||
class="entity content"
|
||||
>
|
||||
<div class="info">
|
||||
<a
|
||||
:href="entity.url"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
class="link link-child"
|
||||
>
|
||||
<template v-if="entity.hasLogo">
|
||||
<img
|
||||
v-if="$route.name === 'network'"
|
||||
class="logo logo-child"
|
||||
:src="`/img/logos/${entity.slug}/thumbs/network.png`"
|
||||
>
|
||||
|
||||
<img
|
||||
v-else-if="entity.parent && !entity.independent"
|
||||
class="logo logo-child"
|
||||
:src="`/img/logos/${entity.parent.slug}/thumbs/${entity.slug}.png`"
|
||||
>
|
||||
|
||||
<img
|
||||
v-else
|
||||
class="logo logo-child"
|
||||
:src="`/img/logos/${entity.slug}/thumbs/${entity.slug}.png`"
|
||||
>
|
||||
</template>
|
||||
|
||||
<h2
|
||||
v-else
|
||||
class="name"
|
||||
>{{ entity.name }}</h2>
|
||||
|
||||
<Icon icon="share2" />
|
||||
</a>
|
||||
|
||||
<ul
|
||||
v-if="entity.tags.length > 0"
|
||||
class="tags"
|
||||
>
|
||||
<li
|
||||
v-for="tag in entity.tags"
|
||||
:key="`tag-${tag.slug}`"
|
||||
>{{ tag.name }}</li>
|
||||
</ul>
|
||||
|
||||
<router-link
|
||||
v-if="entity.parent"
|
||||
:to="`/${entity.parent.type}/${entity.parent.slug}`"
|
||||
class="link link-parent"
|
||||
>
|
||||
<img
|
||||
v-if="entity.parent.hasLogo"
|
||||
class="logo logo-parent"
|
||||
:src="`/img/logos/${entity.parent.slug}/thumbs/network.png`"
|
||||
>
|
||||
|
||||
<img
|
||||
v-if="entity.parent.hasLogo"
|
||||
class="favicon"
|
||||
:src="`/img/logos/${entity.parent.slug}/favicon.png`"
|
||||
>
|
||||
|
||||
<h3
|
||||
v-else
|
||||
class="name parent-name"
|
||||
>{{ entity.parent.name }}</h3>
|
||||
</router-link>
|
||||
</div>
|
||||
|
||||
<div
|
||||
ref="content"
|
||||
class="content-inner"
|
||||
>
|
||||
<Scroll
|
||||
v-if="entity.children.length > 0"
|
||||
:expanded="expanded"
|
||||
class="scroll-dark"
|
||||
@expand="(state) => expanded = state"
|
||||
>
|
||||
<Children
|
||||
:entity="entity"
|
||||
:class="{ expanded }"
|
||||
/>
|
||||
</Scroll>
|
||||
|
||||
<FilterBar
|
||||
:fetch-releases="fetchEntity"
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
/>
|
||||
|
||||
<div class="releases">
|
||||
<Releases :releases="entity.releases" />
|
||||
|
||||
<Pagination
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
class="pagination-top"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from 'vue';
|
||||
|
||||
import FilterBar from '../header/filter-bar.vue';
|
||||
import Pagination from '../pagination/pagination.vue';
|
||||
import Releases from '../releases/releases.vue';
|
||||
import Children from './children.vue';
|
||||
import Scroll from '../scroll/scroll.vue';
|
||||
|
||||
async function fetchEntity() {
|
||||
const { entity, totalCount } = await this.$store.dispatch('fetchEntityBySlugAndType', {
|
||||
entitySlug: this.$route.params.entitySlug,
|
||||
entityType: this.$route.name,
|
||||
limit: this.limit,
|
||||
range: this.$route.params.range,
|
||||
pageNumber: Number(this.$route.params.pageNumber),
|
||||
});
|
||||
|
||||
this.entity = entity;
|
||||
this.totalCount = totalCount;
|
||||
|
||||
this.pageTitle = entity.name;
|
||||
|
||||
Vue.nextTick(() => {
|
||||
this.$refs.content.scrollTop = 0;
|
||||
});
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
await this.fetchEntity();
|
||||
}
|
||||
|
||||
async function route() {
|
||||
await this.fetchEntity();
|
||||
this.expanded = false;
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
FilterBar,
|
||||
Pagination,
|
||||
Children,
|
||||
Releases,
|
||||
Scroll,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
entity: null,
|
||||
totalCount: null,
|
||||
limit: 20,
|
||||
expanded: false,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
$route: route,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
fetchEntity,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'breakpoints';
|
||||
|
||||
.info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
background: var(--profile);
|
||||
border-bottom: solid 1px var(--lighten-hint);
|
||||
}
|
||||
|
||||
.link {
|
||||
max-width: 20rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
padding: 1rem;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.link-child {
|
||||
.icon {
|
||||
fill: var(--lighten);
|
||||
margin: 0 0 0 1rem;
|
||||
}
|
||||
|
||||
&:hover .icon {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
}
|
||||
|
||||
.link-parent {
|
||||
flex-direction: row-reverse;
|
||||
margin: 0 0 0 3rem;
|
||||
}
|
||||
|
||||
.logo {
|
||||
height: 100%;
|
||||
max-width: 100%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.logo-child {
|
||||
height: 2.5rem;
|
||||
}
|
||||
|
||||
.logo-parent {
|
||||
height: 1.5rem;
|
||||
}
|
||||
|
||||
.favicon {
|
||||
height: 1rem;
|
||||
}
|
||||
|
||||
.name {
|
||||
color: var(--text-light);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
white-space: nowrap;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.favicon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint) {
|
||||
.tags {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint-micro) {
|
||||
.logo-parent {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.favicon {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint-nano) {
|
||||
.link-child .icon {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,79 +0,0 @@
|
||||
<template>
|
||||
<router-link
|
||||
:to="`/${entity.type}/${entity.slug}`"
|
||||
:title="entity.name"
|
||||
class="tile"
|
||||
>
|
||||
<template v-if="entity.hasLogo">
|
||||
<img
|
||||
v-if="entity.type === 'network' || entity.independent"
|
||||
:src="`/img/logos/${entity.slug}/thumbs/network.png`"
|
||||
:alt="entity.name"
|
||||
class="logo"
|
||||
>
|
||||
|
||||
<img
|
||||
v-else-if="entity.parent"
|
||||
:src="`/img/logos/${entity.parent.slug}/thumbs/${entity.slug}.png`"
|
||||
:alt="entity.name"
|
||||
class="logo"
|
||||
>
|
||||
|
||||
<img
|
||||
v-else
|
||||
:src="`/img/logos/${entity.slug}/thumbs/${entity.slug}.png`"
|
||||
:alt="entity.name"
|
||||
class="logo"
|
||||
>
|
||||
</template>
|
||||
|
||||
<span
|
||||
v-else
|
||||
class="name"
|
||||
>{{ entity.name }}</span>
|
||||
</router-link>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
entity: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.tile {
|
||||
height: 6rem;
|
||||
background: var(--tile);
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
padding: .5rem 1rem;
|
||||
border-radius: .25rem;
|
||||
box-shadow: 0 0 3px rgba(0, 0, 0, .25);
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.logo {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.name {
|
||||
color: var(--text-light);
|
||||
font-size: 1.25rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
@@ -1,34 +0,0 @@
|
||||
<template>
|
||||
<div class="errorpage">
|
||||
<h1 class="error">404 - Not Found</h1>
|
||||
|
||||
<a
|
||||
href="/"
|
||||
class="home"
|
||||
>Take me home</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.errorpage {
|
||||
background: var(--background);
|
||||
color: var(--primary);
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.error {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.home {
|
||||
color: var(--shadow);
|
||||
margin: 3rem 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,63 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<div
|
||||
v-show="expanded"
|
||||
class="expand-button expanded noselect"
|
||||
@click="$emit('expand', false)"
|
||||
><Icon icon="arrow-up3" /></div>
|
||||
|
||||
<div
|
||||
v-show="!expanded"
|
||||
class="expand-button noselect"
|
||||
@click="$emit('expand', true)"
|
||||
><Icon icon="arrow-down3" /></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
expanded: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.expand-button {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: .5rem;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
background: var(--shadow-hint);
|
||||
|
||||
.icon {
|
||||
fill: var(--text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.expand-dark {
|
||||
.icon {
|
||||
fill: var(--lighten);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: var(--lighten-hint);
|
||||
|
||||
.icon {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,169 +0,0 @@
|
||||
<template>
|
||||
<div class="filter-bar noselect">
|
||||
<span class="sort">
|
||||
<router-link
|
||||
:to="{ params: { range: 'latest', pageNumber: 1 } }"
|
||||
:class="{ active: $route.name === 'latest' || range === 'latest' }"
|
||||
class="range range-button"
|
||||
>Latest</router-link>
|
||||
|
||||
<router-link
|
||||
:to="{ params: { range: 'upcoming', pageNumber: 1 } }"
|
||||
:class="{ active: $route.name === 'upcoming' || range === 'upcoming' }"
|
||||
class="range-button"
|
||||
>Upcoming</router-link>
|
||||
|
||||
<router-link
|
||||
:to="{ params: { range: 'new', pageNumber: 1 } }"
|
||||
:class="{ active: $route.name === 'new' || range === 'new' }"
|
||||
class="range-button"
|
||||
>New</router-link>
|
||||
</span>
|
||||
|
||||
<Filters
|
||||
class="filters"
|
||||
:filter="filter"
|
||||
:available-tags="availableTags"
|
||||
@set-filter="setFilter"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
import Filters from './filters.vue';
|
||||
|
||||
function filter(state) {
|
||||
return state.ui.filter;
|
||||
}
|
||||
|
||||
function range() {
|
||||
return this.$route.params.range;
|
||||
}
|
||||
|
||||
function batch(state) {
|
||||
return state.ui.batch;
|
||||
}
|
||||
|
||||
async function setFilter(newFilter) {
|
||||
this.$store.dispatch('setFilter', newFilter);
|
||||
|
||||
await this.fetchReleases();
|
||||
}
|
||||
|
||||
async function setRange(newRange) {
|
||||
this.$store.dispatch('setRange', newRange);
|
||||
|
||||
await this.fetchReleases();
|
||||
}
|
||||
|
||||
async function setBatch(newBatch) {
|
||||
this.$store.dispatch('setBatch', newBatch);
|
||||
|
||||
await this.fetchReleases();
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Filters,
|
||||
},
|
||||
props: {
|
||||
fetchReleases: {
|
||||
type: Function,
|
||||
default: null,
|
||||
},
|
||||
isHome: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
itemsTotal: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
itemsPerPage: {
|
||||
type: Number,
|
||||
default: 10,
|
||||
},
|
||||
availableTags: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
filter,
|
||||
range,
|
||||
batch,
|
||||
}),
|
||||
},
|
||||
methods: {
|
||||
setFilter,
|
||||
setRange,
|
||||
setBatch,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.filter-bar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: .5rem 1rem 0 1rem;
|
||||
z-index: 1;
|
||||
background: var(--background-dim);
|
||||
font-size: 0;
|
||||
|
||||
.icon {
|
||||
margin: 0 .5rem 0 0;
|
||||
fill: var(--shadow);
|
||||
}
|
||||
}
|
||||
|
||||
.sort {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.range-button {
|
||||
color: var(--shadow);
|
||||
display: inline-block;
|
||||
padding: .8rem 1rem;
|
||||
border: none;
|
||||
position: relative;
|
||||
font-size: .8rem;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
border: solid 1px transparent;
|
||||
border-bottom: none;
|
||||
|
||||
&:hover:not(.active) {
|
||||
color: var(--shadow-strong);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: var(--primary);
|
||||
background: var(--background-soft);
|
||||
border-color: var(--crease);
|
||||
|
||||
&::after {
|
||||
/* hide grey border for tab effect, negative margin shows grey crease on mobile */
|
||||
content: '';
|
||||
width: 100%;
|
||||
height: 2px;
|
||||
background: var(--background-soft);
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: -2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.filters {
|
||||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,171 +0,0 @@
|
||||
<template>
|
||||
<v-popover class="filters-container">
|
||||
<div class="filters">
|
||||
<div
|
||||
v-if="selectedTags.length > 0"
|
||||
class="applied"
|
||||
>{{ selectedTags.length }} selected</div>
|
||||
|
||||
<div
|
||||
v-else
|
||||
class="applied empty"
|
||||
>Filter by tags</div>
|
||||
|
||||
<Icon icon="filter" />
|
||||
</div>
|
||||
|
||||
<div slot="popover">
|
||||
<ul class="tags nolist">
|
||||
<li
|
||||
v-for="tag in availableTags"
|
||||
:key="`tag-${tag.id}`"
|
||||
class="tag"
|
||||
:class="{ selected: selectedTags.includes(tag.slug) }"
|
||||
>
|
||||
<router-link :to="{ query: { ...getNewRange(tag.slug) } }">
|
||||
<Icon
|
||||
icon="checkmark"
|
||||
class="include"
|
||||
/>
|
||||
</router-link>
|
||||
|
||||
<router-link
|
||||
:to="{ query: { ...(selectedTags.length === 1 && selectedTags.includes(tag.slug) ? null : { tags: tag.slug }) } }"
|
||||
class="name"
|
||||
>{{ tag.name }}</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</v-popover>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
function getNewRange(tag) {
|
||||
if (this.selectedTags.includes(tag)) {
|
||||
if (this.selectedTags.length > 1) {
|
||||
return { tags: this.selectedTags.filter(selectedTag => selectedTag !== tag).join(',') };
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
return { tags: this.selectedTags.concat(tag).join(',') };
|
||||
}
|
||||
|
||||
function selectedTags() {
|
||||
return this.$route.query.tags ? this.$route.query.tags.split(',') : [];
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
filter: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
compact: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
availableTags: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
selectedTags,
|
||||
},
|
||||
methods: {
|
||||
getNewRange,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.filters {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
margin: 0 .5rem 0 0;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.applied {
|
||||
color: var(--shadow-strong);
|
||||
}
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow-strong);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.applied {
|
||||
flex-grow: 1;
|
||||
padding: .75rem .5rem;
|
||||
font-size: 1rem;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
text-align: right;
|
||||
|
||||
&.empty {
|
||||
color: var(--shadow);
|
||||
}
|
||||
}
|
||||
|
||||
.tags {
|
||||
padding: .5rem 0;
|
||||
}
|
||||
|
||||
.tag {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.include {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
padding: .5rem .75rem .5rem 1rem;
|
||||
fill: var(--darken-hint);
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.name {
|
||||
min-width: 8rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-grow: 1;
|
||||
padding: .5rem 1rem .5rem .75rem;
|
||||
color: var(--text);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: var(--darken-hint);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.include:hover,
|
||||
.name:hover {
|
||||
background: var(--darken-hint);
|
||||
}
|
||||
|
||||
&.selected .include {
|
||||
fill: var(--success);
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.applied {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,372 +0,0 @@
|
||||
<template>
|
||||
<header class="header">
|
||||
<div class="header-nav">
|
||||
<div
|
||||
class="sidebar-toggle"
|
||||
@click.stop="toggleSidebar"
|
||||
>
|
||||
<Icon icon="menu" />
|
||||
<div
|
||||
class="logo"
|
||||
v-html="logo"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<router-link
|
||||
to="/"
|
||||
class="logo-link"
|
||||
><h1 class="header-logo">
|
||||
<div
|
||||
class="logo"
|
||||
v-html="logo"
|
||||
/>
|
||||
</h1></router-link>
|
||||
|
||||
<nav class="nav">
|
||||
<ul class="nav-list nolist">
|
||||
<li class="nav-item">
|
||||
<router-link
|
||||
v-slot="{ href, isActive, navigate }"
|
||||
to="/actors"
|
||||
>
|
||||
<a
|
||||
class="nav-link"
|
||||
:href="href"
|
||||
:class="{ active: isActive }"
|
||||
@click="navigate"
|
||||
>Actors</a>
|
||||
</router-link>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<router-link
|
||||
v-slot="{ href, isActive, navigate }"
|
||||
to="/networks"
|
||||
>
|
||||
<a
|
||||
class="nav-link"
|
||||
:href="href"
|
||||
:class="{ active: isActive }"
|
||||
@click="navigate"
|
||||
>Channels</a>
|
||||
</router-link>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<router-link
|
||||
v-slot="{ href, isActive, navigate }"
|
||||
to="/tags"
|
||||
>
|
||||
<a
|
||||
class="nav-link"
|
||||
:href="href"
|
||||
:class="{ active: isActive }"
|
||||
@click="navigate"
|
||||
>Tags</a>
|
||||
</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<div class="header-section">
|
||||
<div class="header-toggles">
|
||||
<Icon
|
||||
v-show="!sfw"
|
||||
v-tooltip="'Hit S to enable safe mode'"
|
||||
icon="flower"
|
||||
class="toggle noselect"
|
||||
@click.native="setSfw(true)"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
v-show="sfw"
|
||||
v-tooltip="'Hit N to disable safe mode'"
|
||||
icon="evil2"
|
||||
class="toggle noselect"
|
||||
@click.native="setSfw(false)"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
v-show="theme === 'light'"
|
||||
v-tooltip="'Hit D to use dark theme'"
|
||||
icon="moon"
|
||||
class="toggle noselect"
|
||||
@click.native="setTheme('dark')"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
v-show="theme === 'dark'"
|
||||
v-tooltip="'Hit L to use light theme'"
|
||||
icon="sun"
|
||||
class="toggle noselect"
|
||||
@click.native="setTheme('light')"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Search class="search-full" />
|
||||
|
||||
<v-popover
|
||||
class="search-compact"
|
||||
:open="searching"
|
||||
@show="searching = true"
|
||||
@hide="searching = false"
|
||||
>
|
||||
<button
|
||||
type="button"
|
||||
class="search-button"
|
||||
><Icon
|
||||
icon="search"
|
||||
/></button>
|
||||
|
||||
<Search
|
||||
slot="popover"
|
||||
:searching="searching"
|
||||
class="compact"
|
||||
@search="searching = false"
|
||||
/>
|
||||
</v-popover>
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
|
||||
import Search from './search.vue';
|
||||
|
||||
import logo from '../../img/logo.svg';
|
||||
|
||||
function sfw(state) {
|
||||
return state.ui.sfw;
|
||||
}
|
||||
|
||||
function theme(state) {
|
||||
return state.ui.theme;
|
||||
}
|
||||
|
||||
function setTheme(newTheme) {
|
||||
this.$store.dispatch('setTheme', newTheme);
|
||||
}
|
||||
|
||||
function setSfw(enabled) {
|
||||
this.$store.dispatch('setSfw', enabled);
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Search,
|
||||
},
|
||||
props: {
|
||||
toggleSidebar: {
|
||||
type: Function,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
logo,
|
||||
searching: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
sfw,
|
||||
theme,
|
||||
}),
|
||||
},
|
||||
methods: {
|
||||
setSfw,
|
||||
setTheme,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'breakpoints';
|
||||
|
||||
.header {
|
||||
height: 3rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
z-index: 2;
|
||||
justify-content: space-between;
|
||||
background: var(--background);
|
||||
color: var(--primary);
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.header-nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.header-section {
|
||||
height: 100%;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.sidebar-toggle {
|
||||
display: none;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
|
||||
.logo {
|
||||
fill: var(--primary);
|
||||
padding: .5rem;
|
||||
}
|
||||
|
||||
.icon {
|
||||
display: inline-block;
|
||||
fill: var(--shadow-modest);
|
||||
padding: 0 1rem;
|
||||
width: 1.5rem;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.icon {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.logo-link {
|
||||
height: 100%;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
margin: 0 1rem 0 0;
|
||||
}
|
||||
|
||||
.header-logo {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 0 0 1rem;
|
||||
fill: var(--primary);
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 6rem;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.nav,
|
||||
.nav-list {
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 0 1rem;
|
||||
color: var(--shadow);
|
||||
text-decoration: none;
|
||||
font-size: .9rem;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
|
||||
&.active {
|
||||
color: var(--primary);
|
||||
|
||||
.icon {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
&:hover:not(.active) {
|
||||
color: var(--primary);
|
||||
|
||||
.icon {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.header-toggles {
|
||||
margin: 0 .5rem 0 0;
|
||||
|
||||
.icon {
|
||||
padding: 1rem .75rem;
|
||||
fill: var(--shadow);
|
||||
|
||||
&:hover {
|
||||
fill: var(--shadow-strong);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&.active {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.search-compact {
|
||||
display: none;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.search-button {
|
||||
height: 100%;
|
||||
padding: .25rem 1rem 0 1rem;
|
||||
background: none;
|
||||
border: none;
|
||||
outline: none;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow-strong);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint-kilo) {
|
||||
.search-full {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.search-compact {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.header-toggles {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint-micro) {
|
||||
.nav,
|
||||
.header-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar-toggle {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint-nano) {
|
||||
.header-toggles {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,148 +0,0 @@
|
||||
<template>
|
||||
<form
|
||||
class="search"
|
||||
@submit.prevent="search"
|
||||
>
|
||||
<input
|
||||
ref="search"
|
||||
v-model="query"
|
||||
type="search"
|
||||
class="search-input"
|
||||
placeholder="Search..."
|
||||
>
|
||||
<button
|
||||
type="submit"
|
||||
class="search-button"
|
||||
><Icon
|
||||
icon="search"
|
||||
/></button>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
async function search() {
|
||||
this.$router.push({ name: 'search', query: { q: this.query } });
|
||||
this.$emit('search');
|
||||
}
|
||||
|
||||
function searching(to) {
|
||||
if (to) {
|
||||
setTimeout(() => {
|
||||
// nextTick does not seem to work
|
||||
this.$refs.search.focus();
|
||||
}, 20);
|
||||
}
|
||||
}
|
||||
|
||||
function route(to) {
|
||||
if (to.name !== 'search') {
|
||||
this.query = null;
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
searching: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
query: this.$route.query ? this.$route.query.q : null,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
$route: route,
|
||||
searching,
|
||||
},
|
||||
methods: {
|
||||
search,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.search {
|
||||
height: 100%;
|
||||
max-width: 20rem;
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
padding: 0 1rem 0 0;
|
||||
border-left: solid 1px var(--shadow-hint);
|
||||
|
||||
&.compact {
|
||||
padding: 0;
|
||||
border: none;
|
||||
|
||||
.search-input {
|
||||
border: solid 1px var(--shadow-hint);
|
||||
}
|
||||
|
||||
.search-button {
|
||||
padding: 0 .5rem 0 1rem;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.search-input {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
padding: .5rem;
|
||||
border: none;
|
||||
color: var(--text);
|
||||
background: var(--background);
|
||||
outline: none;
|
||||
font-size: 1rem;
|
||||
outline: none;
|
||||
|
||||
&::placeholder {
|
||||
color: var(--shadow);
|
||||
}
|
||||
|
||||
&::-webkit-search-cancel-button {
|
||||
-webkit-appearance: none;
|
||||
padding: .5rem;
|
||||
position: relative;
|
||||
right: 0;
|
||||
color: var(--text);
|
||||
background: url('/img/cancel-circle2.svg');
|
||||
opacity: .25;
|
||||
|
||||
&:hover {
|
||||
opacity: .5;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
&:focus::placeholder {
|
||||
color: var(--shadow-weak);
|
||||
}
|
||||
}
|
||||
|
||||
.search-button {
|
||||
height: 100%;
|
||||
padding: 0 1rem;
|
||||
background: none;
|
||||
border: none;
|
||||
margin: .3rem 0 0 0;
|
||||
outline: none;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow-weak);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,79 +0,0 @@
|
||||
<template>
|
||||
<div class="content">
|
||||
<div
|
||||
ref="content"
|
||||
class="content-inner"
|
||||
>
|
||||
<FilterBar
|
||||
:fetch-releases="fetchReleases"
|
||||
:is-home="true"
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
:content="$refs.content"
|
||||
/>
|
||||
|
||||
<Releases :releases="releases" />
|
||||
|
||||
<Pagination
|
||||
v-if="totalCount > 0"
|
||||
:items-total="totalCount"
|
||||
:items-per-page="limit"
|
||||
class="pagination-bottom"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import FilterBar from '../header/filter-bar.vue';
|
||||
import Releases from '../releases/releases.vue';
|
||||
import Pagination from '../pagination/pagination.vue';
|
||||
|
||||
async function fetchReleases() {
|
||||
const { releases, totalCount } = await this.$store.dispatch('fetchReleases', {
|
||||
limit: this.limit,
|
||||
range: this.$route.params.range,
|
||||
pageNumber: Number(this.$route.params.pageNumber) || 1,
|
||||
});
|
||||
|
||||
this.totalCount = totalCount;
|
||||
this.releases = releases;
|
||||
|
||||
this.$refs.content.scrollTop = 0;
|
||||
}
|
||||
|
||||
async function route() {
|
||||
await this.fetchReleases();
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
this.pageTitle = '';
|
||||
|
||||
await this.fetchReleases();
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
FilterBar,
|
||||
Releases,
|
||||
Pagination,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
releases: [],
|
||||
networks: [],
|
||||
pageTitle: null,
|
||||
limit: 20,
|
||||
totalCount: 0,
|
||||
from: null,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
$route: route,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
fetchReleases,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -1,60 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
:class="{ active }"
|
||||
class="icon"
|
||||
v-html="svg"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
icon: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
active: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
svg: null,
|
||||
};
|
||||
},
|
||||
beforeMount() {
|
||||
this.svg = require(`../../img/icons/${this.icon}.svg`).default;
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '../../css/theme';
|
||||
|
||||
.icon {
|
||||
fill: var(--text);
|
||||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
|
||||
svg {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
&.active {
|
||||
fill: var(--shadow);
|
||||
|
||||
&:hover {
|
||||
fill: var(--text);
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,158 +0,0 @@
|
||||
<template>
|
||||
<div class="networks">
|
||||
<form
|
||||
class="search"
|
||||
@submit.prevent="searchEntities"
|
||||
>
|
||||
<input
|
||||
v-model="query"
|
||||
:placeholder="`Find ${channelCount} channels in ${entities.length} networks`"
|
||||
class="query"
|
||||
@input="searchEntities"
|
||||
>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
class="search-button"
|
||||
><Icon icon="search" /></button>
|
||||
</form>
|
||||
|
||||
<div
|
||||
v-if="query.length"
|
||||
class="entity-tiles"
|
||||
>
|
||||
<Entity
|
||||
v-for="entity in searchResults"
|
||||
:key="`${entity.type}-tile-${entity.slug}`"
|
||||
:entity="entity"
|
||||
/>
|
||||
|
||||
<span v-if="searchResults.length === 0">No results for "{{ query }}"</span>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="query.length === 0"
|
||||
class="entity-tiles"
|
||||
>
|
||||
<Entity
|
||||
v-for="entity in entities"
|
||||
:key="`entity-tile-${entity.slug}`"
|
||||
:entity="entity"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Entity from '../entities/tile.vue';
|
||||
|
||||
async function searchEntities() {
|
||||
this.searchResults = await this.$store.dispatch('searchEntities', {
|
||||
query: this.query,
|
||||
limit: 50,
|
||||
});
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
this.entities = await this.$store.dispatch('fetchEntities', {
|
||||
type: 'network',
|
||||
entitySlugs: [],
|
||||
});
|
||||
|
||||
this.pageTitle = 'Networks';
|
||||
}
|
||||
|
||||
function channelCount() {
|
||||
return this.entities.reduce((acc, entity) => acc + entity.childrenTotal, 0);
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Entity,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
query: '',
|
||||
pageTitle: null,
|
||||
entities: [],
|
||||
searchResults: [],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
channelCount,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
searchEntities,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.networks {
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.search {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
max-width: 40rem;
|
||||
}
|
||||
|
||||
.query {
|
||||
color: var(--text);
|
||||
background: var(--background);
|
||||
flex-grow: 1;
|
||||
box-sizing: border-box;
|
||||
padding: 1rem;
|
||||
border: none;
|
||||
box-sizing: border-box;
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
margin: 1rem 0;
|
||||
font-size: 1rem;
|
||||
outline: none;
|
||||
|
||||
&:focus {
|
||||
box-shadow: 0 0 3px var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
.search-button {
|
||||
padding: 1rem;
|
||||
background: none;
|
||||
border: none;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
|
||||
.icon {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.entity-tiles {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
|
||||
grid-gap: 1rem;
|
||||
padding: 1rem 0;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint2) {
|
||||
.entity-tiles {
|
||||
grid-gap: .5rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.entity-tiles {
|
||||
grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,188 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="itemsTotal > 0 || !hideEmpty"
|
||||
class="pagination"
|
||||
>
|
||||
<span
|
||||
v-show="pageNumber > 1"
|
||||
class="cursors"
|
||||
>
|
||||
<router-link
|
||||
class="pagination-button cursor"
|
||||
:to="{ params: { pageNumber: 1 } }"
|
||||
><Icon icon="first2" /></router-link>
|
||||
|
||||
<router-link
|
||||
class="pagination-button cursor"
|
||||
:to="{ params: { pageNumber: pageNumber - 1 } }"
|
||||
><Icon icon="arrow-left" /></router-link>
|
||||
</span>
|
||||
|
||||
<span
|
||||
v-show="pageNumber === 1"
|
||||
class="cursors"
|
||||
>
|
||||
<span class="pagination-button cursor disabled"><Icon icon="first2" /></span>
|
||||
<span class="pagination-button cursor disabled"><Icon icon="arrow-left" /></span>
|
||||
</span>
|
||||
|
||||
<span class="pages pages-before">
|
||||
<router-link
|
||||
v-for="pageX in pageNumber - 1"
|
||||
:key="`page-${pageX}`"
|
||||
:to="{ params: { pageNumber: pageNumber - pageX } }"
|
||||
class="pagination-button page"
|
||||
> {{ pageNumber - pageX }} </router-link>
|
||||
</span>
|
||||
|
||||
<router-link
|
||||
:key="`page-${pageNumber}`"
|
||||
:to="{ params: { pageNumber } }"
|
||||
class="pagination-button page active"
|
||||
> {{ pageNumber }} </router-link>
|
||||
|
||||
<span class="pages pages-after">
|
||||
<router-link
|
||||
v-for="pageX in (pageCount - pageNumber)"
|
||||
:key="`page-${pageX + pageNumber}`"
|
||||
:to="{ params: { pageNumber: pageX + pageNumber } }"
|
||||
class="pagination-button page"
|
||||
> {{ pageX + pageNumber }} </router-link>
|
||||
</span>
|
||||
|
||||
<span
|
||||
v-show="pageNumber < pageCount"
|
||||
class="cursors"
|
||||
>
|
||||
<router-link
|
||||
class="pagination-button cursor"
|
||||
:to="{ params: { pageNumber: pageNumber + 1 } }"
|
||||
><Icon icon="arrow-right" /></router-link>
|
||||
|
||||
<router-link
|
||||
class="pagination-button cursor"
|
||||
:to="{ params: { pageNumber: pageCount } }"
|
||||
><Icon icon="last2" /></router-link>
|
||||
</span>
|
||||
|
||||
<span
|
||||
v-show="pageNumber === pageCount"
|
||||
class="cursors"
|
||||
>
|
||||
<span class="pagination-button cursor disabled"><Icon icon="arrow-right" /></span>
|
||||
<span class="pagination-button cursor disabled"><Icon icon="last2" /></span>
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
function pageNumber() {
|
||||
return Number(this.$route.params.pageNumber) || 1;
|
||||
}
|
||||
|
||||
function pageCount() {
|
||||
const count = Math.max(Math.ceil(this.itemsTotal / this.itemsPerPage), 1);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
itemsTotal: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
itemsPerPage: {
|
||||
type: Number,
|
||||
default: 10,
|
||||
},
|
||||
hideEmpty: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
pageNumber,
|
||||
pageCount,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.pagination {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
height: 3rem;
|
||||
}
|
||||
|
||||
.pagination-top {
|
||||
margin: 0 0 1rem 0;
|
||||
}
|
||||
|
||||
.pagination-bottom {
|
||||
margin: .5rem 0 1rem 0;
|
||||
}
|
||||
|
||||
.pagination-button {
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
display: inline-flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin: .1rem 0 2rem 0;
|
||||
background: var(--background);
|
||||
color: var(--shadow);
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
box-shadow: 0 0 3px var(--shadow-hint);
|
||||
|
||||
.icon {
|
||||
width: .8rem;
|
||||
height: .8rem;
|
||||
margin: 0 0 .125rem 0;
|
||||
fill: var(--shadow);
|
||||
}
|
||||
|
||||
&:hover:not(.active):not(.disabled) {
|
||||
color: var(--shadow-strong);
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow-strong);
|
||||
}
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: var(--shadow-weak);
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow-weak);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.pages {
|
||||
max-width: 10rem;
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.pages-before {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
.cursors {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.cursors {
|
||||
margin: 0 .75rem;
|
||||
font-size: 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,277 +0,0 @@
|
||||
<template>
|
||||
<div class="media">
|
||||
<div
|
||||
v-if="release.trailer || release.teaser"
|
||||
class="trailer-container"
|
||||
>
|
||||
<video
|
||||
v-if="release.trailer"
|
||||
:src="`/media/${release.trailer.path}`"
|
||||
:poster="release.poster && (sfw ? `/img/${release.poster.sfw.thumbnail}` : `/media/${release.poster.thumbnail}`)"
|
||||
:alt="release.title"
|
||||
:class="{ sfw: sfw && paused }"
|
||||
class="item trailer"
|
||||
controls
|
||||
@playing="playing = true; paused = false;"
|
||||
@pause="playing = false; paused = true;"
|
||||
>Sorry, the tailer cannot be played in your browser</video>
|
||||
|
||||
<video
|
||||
v-else-if="release.teaser && /^video\//.test(release.teaser.mime)"
|
||||
:src="`/media/${release.teaser.path}`"
|
||||
:poster="release.poster && (sfw ? `/img/${release.poster.sfw.thumbnail}` : `/media/${release.poster.thumbnail}`)"
|
||||
:alt="release.title"
|
||||
:class="{ sfw: sfw && paused }"
|
||||
class="item trailer"
|
||||
controls
|
||||
@playing="playing = true; paused = false;"
|
||||
@pause="playing = false; paused = true;"
|
||||
>Sorry, the tailer cannot be played in your browser</video>
|
||||
|
||||
<img
|
||||
v-else-if="release.teaser && /^image\//.test(release.teaser.mime)"
|
||||
:src="sfw ? `/img/${release.teaser.sfw.thumbnail}` : `/media/${release.teaser.path}`"
|
||||
:alt="release.title"
|
||||
class="item trailer"
|
||||
>
|
||||
|
||||
<a
|
||||
v-if="release.poster"
|
||||
v-tooltip="'View poster'"
|
||||
:href="`/media/${release.poster.path}`"
|
||||
:class="{ playing }"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="poster-link"
|
||||
><Icon icon="image" /></a>
|
||||
|
||||
<span
|
||||
v-if="sfw && !playing"
|
||||
class="warning"
|
||||
>
|
||||
<Icon icon="warning2" />NSFW
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<template v-if="release.covers && release.covers.length > 0">
|
||||
<a
|
||||
v-for="cover in release.covers"
|
||||
:key="`cover-${cover.id}`"
|
||||
:href="`/media/${cover.path}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<img
|
||||
:src="`/media/${cover.thumbnail}`"
|
||||
class="item cover"
|
||||
@load="$parent.$emit('load')"
|
||||
>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<div
|
||||
v-for="photo in photos"
|
||||
:key="`media-${photo.index}`"
|
||||
class="item-container"
|
||||
>
|
||||
<a
|
||||
:href="`/media/${photo.path}`"
|
||||
:class="{ sfw }"
|
||||
class="item-link"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<img
|
||||
:src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
||||
:alt="`Photo ${photo.index + 1}`"
|
||||
class="item"
|
||||
@load="$parent.$emit('load')"
|
||||
>
|
||||
|
||||
<span
|
||||
v-if="sfw"
|
||||
class="warning"
|
||||
>
|
||||
<Icon icon="warning2" />NSFW
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
function photos() {
|
||||
if (this.release.trailer || this.release.teaser) {
|
||||
// poster will be on trailer video
|
||||
return this.release.photos;
|
||||
}
|
||||
|
||||
if (this.release.poster) {
|
||||
// no trailer, add poster to photos
|
||||
return [this.release.poster].concat(this.release.photos);
|
||||
}
|
||||
|
||||
// no poster available
|
||||
return this.release.photos;
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
release: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
expanded: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
playing: false,
|
||||
paused: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
photos,
|
||||
sfw,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.media {
|
||||
flex-shrink: 0;
|
||||
white-space: nowrap;
|
||||
overflow-x: auto;
|
||||
scrollbar-width: none;
|
||||
scroll-behavior: smooth;
|
||||
font-size: 0;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&.expanded {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(32rem, 1fr));
|
||||
grid-gap: 1rem;
|
||||
justify-content: center;
|
||||
margin: 0 0 1rem 0;
|
||||
}
|
||||
}
|
||||
|
||||
.poster-link {
|
||||
position: absolute;
|
||||
top: .5rem;
|
||||
right: .5rem;
|
||||
transition: opacity .1s ease;
|
||||
|
||||
.icon {
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
fill: var(--lighten-strong);
|
||||
filter: drop-shadow(0 0 1px var(--darken-weak));
|
||||
}
|
||||
|
||||
&.playing {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
opacity: 1;
|
||||
|
||||
.icon {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.item-container,
|
||||
.trailer-container {
|
||||
max-width: 100%;
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
|
||||
.warning {
|
||||
display: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: absolute;
|
||||
background: var(--darken-weak);
|
||||
color: var(--text-light);
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 0 3px var(--darken-strong);
|
||||
pointer-events: none;
|
||||
animation: alert .5s ease infinite .1s;
|
||||
|
||||
.icon {
|
||||
display: block;
|
||||
fill: var(--text-light);
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
margin: 0 0 .25rem 0;
|
||||
filter: drop-shadow(0 0 3px var(--darken));
|
||||
animation: alert .5s ease infinite .1s;
|
||||
}
|
||||
}
|
||||
|
||||
&:hover .warning {
|
||||
display: inline-flex;
|
||||
}
|
||||
}
|
||||
|
||||
.item {
|
||||
height: 18rem;
|
||||
max-width: 100%;
|
||||
box-shadow: 0 0 3px var(--shadow-weak);
|
||||
}
|
||||
|
||||
.trailer-container {
|
||||
height: 18rem;
|
||||
width: 32rem;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.trailer {
|
||||
width: 100%;
|
||||
max-height: 100%;
|
||||
object-fit: cover;
|
||||
|
||||
&.sfw {
|
||||
filter: blur(2rem);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes alert {
|
||||
0% {
|
||||
color: var(--text-light);
|
||||
fill: var(--text-light);
|
||||
}
|
||||
50% {
|
||||
color: var(--alert);
|
||||
fill: var(--alert);
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.media:not(.expanded) .item,
|
||||
.trailer-container {
|
||||
height: 56vw; /* 16:9 ratio for full-width video */
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,550 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="release"
|
||||
class="content"
|
||||
>
|
||||
<Expand
|
||||
v-if="expanded"
|
||||
class="expand"
|
||||
:expanded="expanded"
|
||||
@expand="(state) => expanded = state"
|
||||
/>
|
||||
|
||||
<Scroll
|
||||
class="scroll-light"
|
||||
:expandable="false"
|
||||
>
|
||||
<Media
|
||||
:release="release"
|
||||
:class="{ expanded }"
|
||||
/>
|
||||
</Scroll>
|
||||
|
||||
<div class="details">
|
||||
<div class="column">
|
||||
<div class="tidbits">
|
||||
<a
|
||||
v-if="release.date"
|
||||
:title="release.url && `View scene on ${release.entity.name}`"
|
||||
:href="release.url"
|
||||
:class="{ link: release.url }"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="tidbit date"
|
||||
>
|
||||
<span class="showable">{{ formatDate(release.date, 'MMM D, YYYY', release.datePrecision) }}</span>
|
||||
<span class="hideable">{{ formatDate(release.date, 'MMMM D, YYYY', release.datePrecision) }}</span>
|
||||
|
||||
<Icon
|
||||
v-if="release.url"
|
||||
icon="share2"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="site">
|
||||
<template v-if="release.entity.parent && !release.entity.independent">
|
||||
<a
|
||||
v-if="release.entity.parent.hasLogo"
|
||||
:href="`/network/${release.entity.parent.slug}`"
|
||||
class="logo-link"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${release.entity.parent.slug}/thumbs/network.png`"
|
||||
:title="release.entity.parent.name"
|
||||
:alt="release.entity.parent.name"
|
||||
class="logo logo-parent"
|
||||
>
|
||||
</a>
|
||||
|
||||
<a
|
||||
v-else
|
||||
:href="`/network/${release.entity.parent.slug}`"
|
||||
class="logo-link logo-name"
|
||||
>{{ release.entity.parent.name }}</a>
|
||||
|
||||
<span class="chain">presents</span>
|
||||
|
||||
<a
|
||||
v-if="release.entity.hasLogo"
|
||||
:href="`/${release.entity.type}/${release.entity.slug}`"
|
||||
class="logo-link"
|
||||
>
|
||||
<img
|
||||
v-if="release.entity.type === 'network'"
|
||||
:src="`/img/logos/${release.entity.slug}/thumbs/network.png`"
|
||||
:title="release.entity.name"
|
||||
class="logo logo-site"
|
||||
>
|
||||
|
||||
<img
|
||||
v-else
|
||||
:src="`/img/logos/${release.entity.parent.slug}/thumbs/${release.entity.slug}.png`"
|
||||
:title="release.entity.name"
|
||||
class="logo logo-site"
|
||||
>
|
||||
</a>
|
||||
|
||||
<a
|
||||
v-else
|
||||
:href="`/${release.entity.type}/${release.entity.slug}`"
|
||||
class="logo-link logo-name"
|
||||
>{{ release.entity.name }}</a>
|
||||
</template>
|
||||
|
||||
<a
|
||||
v-else
|
||||
:href="`/${release.entity.type}/${release.entity.slug}`"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${release.entity.slug}/thumbs/network.png`"
|
||||
:title="release.entity.name"
|
||||
class="logo logo-site"
|
||||
>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Expand
|
||||
v-if="release.photos.length > 0"
|
||||
class="expand-bottom"
|
||||
:expanded="expanded"
|
||||
@expand="(state) => expanded = state"
|
||||
/>
|
||||
|
||||
<div class="info column">
|
||||
<div class="row">
|
||||
<h2
|
||||
v-if="release.title"
|
||||
class="title"
|
||||
>{{ release.title }}</h2>
|
||||
|
||||
<h2
|
||||
v-else-if="release.actors.length > 0"
|
||||
class="title title-composed"
|
||||
>
|
||||
{{ release.actors.map(actor => actor.name).join(', ') }} for {{ release.entity.name }}
|
||||
<Icon
|
||||
v-tooltip="`This scene has no known official title`"
|
||||
icon="question2"
|
||||
/>
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.tags.length > 0"
|
||||
class="row"
|
||||
>
|
||||
<ul class="tags nolist">
|
||||
<li
|
||||
v-for="tag in release.tags"
|
||||
:key="`tag-${tag.slug}`"
|
||||
class="tag"
|
||||
>
|
||||
<a
|
||||
:href="`/tag/${tag.slug}`"
|
||||
class="link"
|
||||
>{{ tag.name }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="row associations">
|
||||
<ul
|
||||
v-lazy-container="{ selector: '.lazy' }"
|
||||
class="actors nolist"
|
||||
>
|
||||
<li
|
||||
v-for="actor in release.actors"
|
||||
:key="actor.id"
|
||||
>
|
||||
<Actor :actor="actor" />
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div
|
||||
v-if="release.movies && release.movies.length > 0"
|
||||
class="movies"
|
||||
>
|
||||
<Release :release="release.movies[0]" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.scenes && release.scenes.length > 0"
|
||||
class="scenes"
|
||||
>
|
||||
<h3>Scenes</h3>
|
||||
<Releases
|
||||
:releases="release.scenes"
|
||||
class="row"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.description"
|
||||
class="row"
|
||||
>
|
||||
<span class="row-label">Description</span>
|
||||
<p class="description">{{ release.description }}</p>
|
||||
</div>
|
||||
|
||||
<div class="row row-tidbits">
|
||||
<div
|
||||
v-if="release.duration"
|
||||
class="row-tidbit"
|
||||
>
|
||||
<span class="row-label">Duration</span>
|
||||
|
||||
<div class="duration">
|
||||
<span
|
||||
v-if="release.duration >= 3600"
|
||||
class="duration-segment"
|
||||
>{{ Math.floor(release.duration / 3600).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ Math.floor((release.duration % 3600) / 60).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ (release.duration % 60).toString().padStart(2, '0') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.shootId"
|
||||
class="row-tidbit"
|
||||
>
|
||||
<span class="row-label">Shoot #</span>
|
||||
{{ release.shootId }}
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.studio"
|
||||
class="row-tidbit"
|
||||
>
|
||||
<span class="row-label">Studio</span>
|
||||
|
||||
<router-link
|
||||
:to="`/studio/${release.studio.slug}`"
|
||||
class="link studio"
|
||||
>{{ release.studio.name }}</router-link>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.productionDate"
|
||||
class="row-tidbit"
|
||||
>
|
||||
<span class="row-label">Shoot date</span>
|
||||
{{ formatDate(release.productionDate, 'MMMM D, YYYY') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.comment"
|
||||
class="row"
|
||||
>
|
||||
<span class="row-label">Comment</span>
|
||||
<span>{{ release.comment }}</span>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<span class="row-label">Added</span>
|
||||
|
||||
<router-link
|
||||
:to="`/added/${formatDate(release.createdAt, 'YYYY/MM/DD')}`"
|
||||
:title="`Added on ${formatDate(release.createdAt, 'MMMM D, YYYY HH:mm')}`"
|
||||
class="link added"
|
||||
>{{ formatDate(release.createdAt, 'MMMM D, YYYY HH:mm') }}</router-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Media from './media.vue';
|
||||
import Actor from '../actors/tile.vue';
|
||||
import Release from './tile.vue';
|
||||
import Releases from './releases.vue';
|
||||
import Scroll from '../scroll/scroll.vue';
|
||||
import Expand from '../expand/expand.vue';
|
||||
|
||||
function pageTitle() {
|
||||
return this.release
|
||||
&& (this.release.title
|
||||
|| (this.release.actors.length > 0 ? `${this.release.actors.map(actor => actor.name).join(', ')} for ${this.release.entity.name}` : null));
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
this.release = await this.$store.dispatch('fetchReleaseById', this.$route.params.releaseId);
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Actor,
|
||||
Media,
|
||||
Release,
|
||||
Releases,
|
||||
Scroll,
|
||||
Expand,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
release: null,
|
||||
expanded: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
pageTitle,
|
||||
},
|
||||
mounted,
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
.column {
|
||||
width: 1200px;
|
||||
max-width: 100%;
|
||||
padding: 0 1rem;
|
||||
margin: 0 auto;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.details {
|
||||
background: var(--profile);
|
||||
color: var(--text-light);
|
||||
box-shadow: 0 0 3px var(--shadow-weak);
|
||||
cursor: default;
|
||||
|
||||
.column {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.link {
|
||||
color: var(--text-light);
|
||||
|
||||
.icon {
|
||||
fill: var(--lighten);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: var(--text-light);
|
||||
|
||||
.icon {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tidbits {
|
||||
flex-shrink: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.tidbit {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
|
||||
&.date {
|
||||
flex-shrink: 0;
|
||||
padding: 0 2rem 0 0;
|
||||
font-weight: bold;
|
||||
|
||||
.icon {
|
||||
fill: var(--lighten);
|
||||
margin: -.2rem 0 0 .75rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.site {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding: .25rem 0;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.logo {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.logo-link {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.logo-site {
|
||||
height: 2.5rem;
|
||||
max-width: 15rem;
|
||||
margin: .25rem 0;
|
||||
object-fit: contain;
|
||||
object-position: 100% 50%;
|
||||
}
|
||||
|
||||
.logo-parent {
|
||||
height: 1.5rem;
|
||||
max-width: 10rem;
|
||||
object-fit: contain;
|
||||
object-position: 100% 50%;
|
||||
}
|
||||
|
||||
.logo-name {
|
||||
padding: .5rem 0;
|
||||
color: var(--text-light);
|
||||
font-size: 1.25rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.chain {
|
||||
color: var(--lighten);
|
||||
padding: 0 .5rem;
|
||||
font-weight: bold;
|
||||
font-size: .8rem;
|
||||
}
|
||||
|
||||
.expand-bottom {
|
||||
border-bottom: solid 1px var(--shadow-hint);
|
||||
}
|
||||
|
||||
.info {
|
||||
padding: 1rem;
|
||||
border-left: solid 1px var(--shadow-hint);
|
||||
border-right: solid 1px var(--shadow-hint);
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.row {
|
||||
margin: 0 0 1.5rem 0;
|
||||
|
||||
&.associations {
|
||||
align-items: start;
|
||||
}
|
||||
}
|
||||
|
||||
.row-label {
|
||||
display: block;
|
||||
margin: 0 0 .5rem 0;
|
||||
color: var(--shadow);
|
||||
font-weight: bold;
|
||||
|
||||
.icon {
|
||||
margin: 0 .5rem 0 0;
|
||||
fill: var(--shadow);
|
||||
}
|
||||
}
|
||||
|
||||
.row-tidbit {
|
||||
display: inline-block;
|
||||
margin: 0 2rem 0 0;
|
||||
}
|
||||
|
||||
.title {
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
padding: .25rem;
|
||||
|
||||
&:hover {
|
||||
fill: var(--primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title-composed {
|
||||
color: var(--shadow);
|
||||
}
|
||||
|
||||
.title-shoot {
|
||||
margin: 0 0 0 .5rem;
|
||||
color: var(--shadow);
|
||||
font-size: .9rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.description {
|
||||
line-height: 1.5;
|
||||
margin: -.25rem 0 0 0;
|
||||
}
|
||||
|
||||
.duration {
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.duration-segment {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.actors {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
||||
grid-gap: .5rem;
|
||||
flex-grow: 1;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.link {
|
||||
display: inline-flex;
|
||||
color: var(--link);
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
color: var(--primary);
|
||||
|
||||
.icon {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tag .link {
|
||||
background: var(--background);
|
||||
display: inline-block;
|
||||
padding: .5rem;
|
||||
margin: 0 .25rem .25rem 0;
|
||||
box-shadow: 0 0 2px var(--shadow-weak);
|
||||
text-decoration: none;
|
||||
text-transform: capitalize;
|
||||
|
||||
&:hover {
|
||||
color: var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
.showable {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint3) {
|
||||
.logo-parent,
|
||||
.chain {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.logo-site {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint) {
|
||||
.hideable {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.row .showable {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.tidbit .showable {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.actors {
|
||||
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,125 +0,0 @@
|
||||
<template>
|
||||
<div class="releases">
|
||||
<h3
|
||||
v-if="context"
|
||||
class="heading"
|
||||
><span class="range">{{ range }}</span> releases for '{{ context }}'</h3>
|
||||
|
||||
<ul
|
||||
v-if="releases.length > 0"
|
||||
:key="sfw"
|
||||
v-lazy-container="{ selector: '.thumbnail' }"
|
||||
class="nolist tiles"
|
||||
>
|
||||
<li
|
||||
v-for="(release, index) in releases"
|
||||
:key="`release-${release.id}`"
|
||||
>
|
||||
<ReleaseTile
|
||||
:release="release"
|
||||
:referer="referer"
|
||||
:index="index"
|
||||
/>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<span
|
||||
v-if="releases.length === 0 && range !== 'all'"
|
||||
class="empty"
|
||||
>No {{ range }} releases</span>
|
||||
|
||||
<span
|
||||
v-else-if="releases.length === 0"
|
||||
class="empty"
|
||||
>No recent or upcoming releases</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ReleaseTile from './tile.vue';
|
||||
|
||||
function range() {
|
||||
return this.$route.params.range;
|
||||
}
|
||||
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ReleaseTile,
|
||||
},
|
||||
props: {
|
||||
releases: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
context: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
referer: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
range,
|
||||
sfw,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.heading {
|
||||
padding: 0;
|
||||
margin: 0 0 1rem 0;
|
||||
|
||||
.range {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
}
|
||||
|
||||
.releases {
|
||||
border-top: solid 1px var(--crease);
|
||||
|
||||
&.embedded {
|
||||
border: none;
|
||||
|
||||
.tiles {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tiles {
|
||||
width: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(22rem, 1fr));
|
||||
grid-gap: 1rem;
|
||||
box-sizing: border-box;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.empty {
|
||||
display: inline-block;
|
||||
padding: 1rem;
|
||||
color: var(--shadow-strong);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint3) {
|
||||
.tiles {
|
||||
grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint2) {
|
||||
.tiles {
|
||||
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,129 +0,0 @@
|
||||
<template>
|
||||
<span
|
||||
class="details"
|
||||
:class="{ new: release.isNew }"
|
||||
>
|
||||
<span
|
||||
v-if="release.entity.type !== 'network' && !release.entity.independent && release.entity.parent"
|
||||
class="site"
|
||||
>
|
||||
<router-link
|
||||
v-tooltip.bottom="`Part of ${release.entity.parent.name}`"
|
||||
:title="`Part of ${release.entity.parent.name}`"
|
||||
:to="`/${release.entity.parent.type}/${release.entity.parent.slug}`"
|
||||
class="site-link"
|
||||
><img
|
||||
:src="`/img/logos/${release.entity.parent.slug}/favicon.png`"
|
||||
class="favicon"
|
||||
></router-link>
|
||||
|
||||
<router-link
|
||||
v-tooltip.bottom="`More from ${release.entity.name}`"
|
||||
:title="`More from ${release.entity.name}`"
|
||||
:to="`/${release.entity.type}/${release.entity.slug}`"
|
||||
class="site-link"
|
||||
>{{ release.entity.name }}</router-link>
|
||||
</span>
|
||||
|
||||
<router-link
|
||||
v-else
|
||||
:to="`/${release.entity.type}/${release.entity.slug}`"
|
||||
class="site site-link"
|
||||
><img
|
||||
:src="`/img/logos/${release.entity.slug}/favicon.png`"
|
||||
class="favicon"
|
||||
>{{ release.entity.name }}</router-link>
|
||||
|
||||
<a
|
||||
v-if="release.date"
|
||||
v-tooltip.bottom="release.url && `View scene on ${release.entity.name}`"
|
||||
:title="release.url && `View scene on ${release.entity.name}`"
|
||||
:href="release.url"
|
||||
:class="{ upcoming: isAfter(release.date, new Date()) }"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="date"
|
||||
>{{ formatDate(release.date, 'MMMM D, YYYY', release.datePrecision) }}</a>
|
||||
|
||||
<a
|
||||
v-else
|
||||
:href="release.url"
|
||||
:class="{ upcoming: isAfter(release.date, new Date()), new: release.isNew }"
|
||||
title="Scene date N/A, showing date added"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="date"
|
||||
>{{ `(${formatDate(release.dateAdded, 'MMMM D, YYYY')})` }}</a>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
release: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.details {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
background: var(--profile);
|
||||
font-size: 0;
|
||||
font-weight: bold;
|
||||
box-shadow: 0 0 3px var(--darken);
|
||||
|
||||
.favicon {
|
||||
width: 1rem;
|
||||
margin: 0 .25rem 0 0;
|
||||
}
|
||||
|
||||
/*
|
||||
&.new .date::before {
|
||||
content: '';
|
||||
width: .5rem;
|
||||
height: .5rem;
|
||||
border-radius: 50%;
|
||||
margin: 0 .25rem 0 0;
|
||||
background: var(--primary);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
.site,
|
||||
.date {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
font-size: .8rem;
|
||||
padding: .5rem;
|
||||
color: var(--text-light);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/*
|
||||
.date {
|
||||
&.new:before {
|
||||
content: '';
|
||||
background: var(--primary);
|
||||
width: .5rem;
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: -.5rem;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
.site-link {
|
||||
display: flex;
|
||||
color: var(--text-light);
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
@@ -1,295 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
:id="`${release.type}-${release.id}`"
|
||||
:class="{ new: release.isNew }"
|
||||
class="tile"
|
||||
>
|
||||
<span class="poster">
|
||||
<a
|
||||
:href="`/scene/${release.id}/${release.slug}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="link"
|
||||
>
|
||||
<img
|
||||
v-if="release.poster"
|
||||
:data-src="sfw ? `/img/${release.poster.sfw.thumbnail}` : `/media/${release.poster.thumbnail}`"
|
||||
:data-loading="sfw ? `/img/${release.poster.sfw.lazy}` : `/media/${release.poster.lazy}`"
|
||||
:alt="release.title"
|
||||
class="thumbnail"
|
||||
>
|
||||
|
||||
<span
|
||||
v-else-if="release.covers && release.covers.length > 0"
|
||||
class="covers"
|
||||
>
|
||||
<img
|
||||
v-for="cover in release.covers"
|
||||
:key="cover.id"
|
||||
:data-src="sfw ? `/img/${cover.sfw.thumbnail}` : `/media/${cover.thumbnail}`"
|
||||
:data-loading="sfw ? `/img/${cover.sfw.lazy}` : `/media/${cover.lazy}`"
|
||||
:alt="release.title"
|
||||
class="thumbnail cover"
|
||||
>
|
||||
</span>
|
||||
|
||||
<div
|
||||
v-else
|
||||
:title="release.title"
|
||||
class="thumbnail"
|
||||
>No thumbnail available</div>
|
||||
</a>
|
||||
|
||||
<Details :release="release" />
|
||||
</span>
|
||||
|
||||
<div class="info">
|
||||
<a
|
||||
:href="`/scene/${release.id}/${release.slug}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="row link"
|
||||
>
|
||||
<h3
|
||||
v-if="release.title"
|
||||
v-tooltip.top="release.title"
|
||||
:title="release.title"
|
||||
class="title"
|
||||
>{{ release.title }}</h3>
|
||||
|
||||
<h3
|
||||
v-else-if="release.actors.length > 0"
|
||||
class="title title-composed"
|
||||
>{{ release.actors[0].name }} for {{ release.entity.name }}</h3>
|
||||
|
||||
<h3
|
||||
v-else
|
||||
class="title title-empty"
|
||||
>{{ release.entity.name }}</h3>
|
||||
</a>
|
||||
|
||||
<span class="row">
|
||||
<ul
|
||||
class="actors nolist"
|
||||
:title="release.actors.map(actor => actor.name).join(', ')"
|
||||
>
|
||||
<li
|
||||
v-for="actor in release.actors"
|
||||
:key="actor.id"
|
||||
class="actor"
|
||||
>
|
||||
<router-link
|
||||
:to="{ name: 'actor', params: { actorId: actor.id, actorSlug: actor.slug } }"
|
||||
class="actor-link"
|
||||
>{{ actor.name }}</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
|
||||
<div class="labels">
|
||||
<span
|
||||
v-if="release.shootId"
|
||||
:title="release.studio && release.studio.name"
|
||||
class="shoot"
|
||||
>{{ release.shootId }}</span>
|
||||
|
||||
<ul
|
||||
v-if="release.tags.length > 0"
|
||||
:title="release.tags.map(tag => tag.name).join(', ')"
|
||||
class="tags nolist"
|
||||
>
|
||||
<li
|
||||
v-for="tag in release.tags"
|
||||
:key="`tag-${tag.slug}`"
|
||||
class="tag"
|
||||
>
|
||||
<router-link
|
||||
:to="`/tag/${tag.slug}`"
|
||||
class="tag-link"
|
||||
>{{ tag.name }}</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Details from './tile-details.vue';
|
||||
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Details,
|
||||
},
|
||||
props: {
|
||||
release: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
sfw,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.tile {
|
||||
background: var(--background);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
padding: 0 0 .5rem 0;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
height: 100%;
|
||||
|
||||
&.new .poster::after {
|
||||
content: 'new';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
padding: .15rem .25rem .15rem .35rem;
|
||||
border-radius: 0 0 0 .5rem;
|
||||
color: var(--text-light);
|
||||
background: var(--primary);
|
||||
font-size: .8rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
.poster {
|
||||
position: relative;
|
||||
margin: 0 0 .6rem 0;
|
||||
}
|
||||
|
||||
.covers {
|
||||
background: var(--profile);
|
||||
display: flex;
|
||||
|
||||
.cover {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.thumbnail {
|
||||
width: 100%;
|
||||
height: 14rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
object-fit: cover;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
background-color: var(--shadow-hint);
|
||||
color: var(--shadow);
|
||||
text-shadow: 1px 1px 0 var(--highlight);
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
padding: 0 .5rem;
|
||||
margin: 0 0 .25rem 0;
|
||||
}
|
||||
|
||||
.info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.link {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.title {
|
||||
margin: 0 .25rem .25rem 0;
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
line-height: 1.5;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.title-composed,
|
||||
.title-empty {
|
||||
color: var(--shadow);
|
||||
}
|
||||
|
||||
.network {
|
||||
color: #555;
|
||||
margin: 0 .25rem 0 0;
|
||||
font-size: .8rem;
|
||||
}
|
||||
|
||||
.actors {
|
||||
word-wrap: break-word;
|
||||
overflow: hidden;
|
||||
max-height: 1.5rem;
|
||||
line-height: 1.5rem;
|
||||
margin: 0 0 .25rem 0;
|
||||
}
|
||||
|
||||
.actor:not(:last-of-type)::after {
|
||||
content: ",";
|
||||
margin: 0 .25rem 0 0;
|
||||
}
|
||||
|
||||
.actor-link {
|
||||
color: var(--link);
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
color: var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
.labels {
|
||||
padding: .25rem .5rem 1rem .5rem;
|
||||
max-height: .5rem;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.shoot {
|
||||
display: inline;
|
||||
padding: .25rem;
|
||||
background: var(--shadow-hint);
|
||||
color: var(--shadow);
|
||||
font-size: 0.8rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.tags {
|
||||
display: inline;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.tag {
|
||||
margin: 0 .25rem .25rem 0;
|
||||
}
|
||||
|
||||
.tag-link {
|
||||
color: var(--shadow);
|
||||
display: inline-block;
|
||||
padding: .25rem;
|
||||
font-size: .75rem;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
line-height: 1;
|
||||
border: solid 1px var(--shadow-hint);
|
||||
|
||||
&:hover {
|
||||
color: var(--primary);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,257 +0,0 @@
|
||||
<template>
|
||||
<div class="scroll">
|
||||
<Expand
|
||||
v-if="expanded"
|
||||
:expanded="expanded"
|
||||
class="expand-dark"
|
||||
@expand="(state) => $emit('expand', state)"
|
||||
/>
|
||||
|
||||
<div class="scrollable">
|
||||
<Expand
|
||||
v-if="expanded"
|
||||
:expanded="expanded"
|
||||
class="expand-light"
|
||||
@expand="(state) => $emit('expand', state)"
|
||||
/>
|
||||
|
||||
<div
|
||||
v-show="enabled && !expanded"
|
||||
class="scroll-button scroll-left noselect"
|
||||
:class="{ 'scroll-start': scrollAtStart }"
|
||||
@click="scroll('left')"
|
||||
><Icon icon="arrow-left3" /></div>
|
||||
|
||||
<slot />
|
||||
|
||||
<div
|
||||
v-show="enabled && !expanded"
|
||||
class="scroll-button scroll-right noselect"
|
||||
:class="{ 'scroll-end': scrollAtEnd }"
|
||||
@click="scroll('right')"
|
||||
><Icon icon="arrow-right3" /></div>
|
||||
</div>
|
||||
|
||||
<Expand
|
||||
v-if="expanded || (expandable && scrollable)"
|
||||
:expanded="expanded"
|
||||
class="expand-dark"
|
||||
@expand="(state) => $emit('expand', state)"
|
||||
/>
|
||||
|
||||
<Expand
|
||||
v-if="expanded || (expandable && scrollable)"
|
||||
:expanded="expanded"
|
||||
class="expand-light"
|
||||
@expand="(state) => $emit('expand', state)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Expand from '../expand/expand.vue';
|
||||
|
||||
function updateScroll() {
|
||||
this.scrollable = this.target.scrollWidth > this.target.clientWidth;
|
||||
this.scrollAtStart = this.target.scrollLeft === 0;
|
||||
this.scrollAtEnd = this.target.scrollWidth - this.target.clientWidth === this.target.scrollLeft;
|
||||
}
|
||||
|
||||
function scroll(direction) {
|
||||
if (direction === 'right') {
|
||||
this.target.scrollLeft = this.target.scrollLeft + this.target.clientWidth - 100;
|
||||
}
|
||||
|
||||
if (direction === 'left') {
|
||||
this.target.scrollLeft = this.target.scrollLeft - this.target.clientWidth + 100;
|
||||
}
|
||||
}
|
||||
|
||||
function mounted() {
|
||||
this.target = this.$slots.default[0].elm;
|
||||
|
||||
this.target.addEventListener('scroll', () => this.updateScroll());
|
||||
window.addEventListener('resize', this.updateScroll);
|
||||
|
||||
// typically triggered by slotted component when an image loads, affecting scrollWidth
|
||||
this.$on('load', () => this.updateScroll());
|
||||
this.updateScroll();
|
||||
}
|
||||
|
||||
function beforeDestroy() {
|
||||
this.target.removeEventListener('scroll', this.updateScroll);
|
||||
|
||||
window.removeEventListener('resize', this.updateScroll);
|
||||
}
|
||||
|
||||
function updated() {
|
||||
this.updateScroll();
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Expand,
|
||||
},
|
||||
props: {
|
||||
enabled: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
expandable: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
expanded: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
target: null,
|
||||
scrollable: true,
|
||||
scrollAtStart: true,
|
||||
scrollAtEnd: false,
|
||||
};
|
||||
},
|
||||
mounted,
|
||||
updated,
|
||||
beforeDestroy,
|
||||
methods: {
|
||||
scroll,
|
||||
updateScroll,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.scroll {
|
||||
background: var(--profile);
|
||||
|
||||
&.expanded {
|
||||
padding: 0;
|
||||
|
||||
.scroll {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.scrollable {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.expand-light {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scroll-light {
|
||||
background: var(--background-dim);
|
||||
|
||||
.scroll-button {
|
||||
.icon {
|
||||
fill: var(--darken);
|
||||
}
|
||||
|
||||
&.scroll-start .icon,
|
||||
&.scroll-end .icon {
|
||||
fill: var(--darken-weak);
|
||||
}
|
||||
|
||||
&:hover:not(.scroll-start):not(.scroll-end) .icon {
|
||||
fill: var(--text-dark);
|
||||
}
|
||||
}
|
||||
|
||||
.scroll-left {
|
||||
background: linear-gradient(to right, var(--background-dim) 50%, transparent);
|
||||
}
|
||||
|
||||
.scroll-right {
|
||||
background: linear-gradient(to left, var(--background-dim) 50%, transparent);
|
||||
}
|
||||
|
||||
.expand-dark {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.expand-light {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.scroll-dark {
|
||||
background: var(--profile);
|
||||
|
||||
.scroll-button {
|
||||
.icon {
|
||||
fill: var(--lighten);
|
||||
}
|
||||
|
||||
&.scroll-start .icon,
|
||||
&.scroll-end .icon {
|
||||
fill: var(--darken-weak);
|
||||
}
|
||||
|
||||
&:hover:not(.scroll-start):not(.scroll-end) .icon {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
}
|
||||
|
||||
.scroll-left {
|
||||
background: linear-gradient(to right, var(--profile) 50%, transparent);
|
||||
}
|
||||
|
||||
.scroll-right {
|
||||
background: linear-gradient(to left, var(--profile) 50%, transparent);
|
||||
}
|
||||
|
||||
.expand-light {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.expand-dark {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.scroll-button {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
|
||||
&.scroll-start,
|
||||
&.scroll-end {
|
||||
/* use over v-show so button stays visible while still hovered */
|
||||
display: none;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.scroll-left {
|
||||
left: 0;
|
||||
padding: 1rem 2rem 1rem .5rem;
|
||||
}
|
||||
|
||||
.scroll-right {
|
||||
right: 0;
|
||||
padding: 1rem .5rem 1rem 2rem;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint) {
|
||||
.scroll-button {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,121 +0,0 @@
|
||||
<template>
|
||||
<div class="content-inner">
|
||||
<span
|
||||
v-if="loading"
|
||||
class="summary"
|
||||
>Searching...</span>
|
||||
|
||||
<span
|
||||
v-if="!loading"
|
||||
class="summary"
|
||||
>Found {{ actors.length }} actors for '{{ query }}'</span>
|
||||
|
||||
<div
|
||||
v-if="!loading && actors.length > 0"
|
||||
v-lazy-container="{ selector: '.lazy' }"
|
||||
class="tiles"
|
||||
>
|
||||
<Actor
|
||||
v-for="actor in actors"
|
||||
:key="`actor-${actor.id}`"
|
||||
:actor="actor.aliasFor || actor"
|
||||
:alias="actor.aliasFor && actor"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<span
|
||||
v-if="!loading"
|
||||
class="summary"
|
||||
>Found {{ releases.length }} releases for '{{ query }}'</span>
|
||||
|
||||
<Releases
|
||||
v-if="!loading && releases.length > 0"
|
||||
class="embedded"
|
||||
:releases="releases"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Actor from '../actors/tile.vue';
|
||||
import Releases from '../releases/releases.vue';
|
||||
|
||||
async function search() {
|
||||
const results = await this.$store.dispatch('search', {
|
||||
query: this.query,
|
||||
limit: 100,
|
||||
});
|
||||
|
||||
this.loading = false;
|
||||
|
||||
if (results) {
|
||||
this.actors = results.actors;
|
||||
this.releases = results.releases;
|
||||
}
|
||||
}
|
||||
|
||||
function query() {
|
||||
return this.$route.query.query || this.$route.query.q;
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
await this.search();
|
||||
}
|
||||
|
||||
async function watchQuery() {
|
||||
await this.search();
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Actor,
|
||||
Releases,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: true,
|
||||
actors: [],
|
||||
releases: [],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
query,
|
||||
},
|
||||
watch: {
|
||||
query: watchQuery,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
search,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.content-inner {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.summary {
|
||||
display: block;
|
||||
margin: 0 0 1rem 0;
|
||||
color: var(--shadow);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.tiles {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
|
||||
grid-gap: 0 .5rem;
|
||||
flex-grow: 1;
|
||||
margin: 0 0 1rem 0;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.tiles {
|
||||
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,300 +0,0 @@
|
||||
<template>
|
||||
<div class="sidebar-container">
|
||||
<div
|
||||
class="sidebar"
|
||||
@click.stop
|
||||
>
|
||||
<div class="sidebar-section">
|
||||
<div class="sidebar-header">
|
||||
<Icon
|
||||
icon="cross2"
|
||||
class="sidebar-close"
|
||||
@click.native="toggleSidebar(false)"
|
||||
/>
|
||||
|
||||
<router-link
|
||||
to="/updates"
|
||||
class="logo-link"
|
||||
@click.native="toggleSidebar(false)"
|
||||
>
|
||||
<h1 class="sidebar-logo">
|
||||
<div
|
||||
class="logo"
|
||||
v-html="logo"
|
||||
/>
|
||||
</h1>
|
||||
</router-link>
|
||||
</div>
|
||||
|
||||
<nav class="nav">
|
||||
<ul class="nolist">
|
||||
<li class="nav-item">
|
||||
<router-link
|
||||
v-slot="{ href, isActive, navigate }"
|
||||
to="/updates"
|
||||
@click.native="toggleSidebar(false)"
|
||||
>
|
||||
<a
|
||||
class="nav-link"
|
||||
:href="href"
|
||||
:class="{ active: isActive }"
|
||||
@click="navigate"
|
||||
>Home</a>
|
||||
</router-link>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<router-link
|
||||
v-slot="{ href, isActive, navigate }"
|
||||
to="/actors"
|
||||
@click.native="toggleSidebar(false)"
|
||||
>
|
||||
<a
|
||||
class="nav-link"
|
||||
:href="href"
|
||||
:class="{ active: isActive }"
|
||||
@click="navigate"
|
||||
>Actors</a>
|
||||
</router-link>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<router-link
|
||||
v-slot="{ href, isActive, navigate }"
|
||||
to="/networks"
|
||||
@click.native="toggleSidebar(false)"
|
||||
>
|
||||
<a
|
||||
class="nav-link"
|
||||
:href="href"
|
||||
:class="{ active: isActive }"
|
||||
@click="navigate"
|
||||
>Channels</a>
|
||||
</router-link>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<router-link
|
||||
v-slot="{ href, isActive, navigate }"
|
||||
to="/tags"
|
||||
@click.native="toggleSidebar(false)"
|
||||
>
|
||||
<a
|
||||
class="nav-link"
|
||||
:href="href"
|
||||
:class="{ active: isActive }"
|
||||
@click="navigate"
|
||||
>Tags</a>
|
||||
</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-section toggles noselect">
|
||||
<label
|
||||
v-show="sfw"
|
||||
class="toggle"
|
||||
@click="setSfw(false)"
|
||||
><Icon icon="evil2" />Disable safe mode</label>
|
||||
|
||||
<label
|
||||
v-show="!sfw"
|
||||
class="toggle"
|
||||
@click="setSfw(true)"
|
||||
><Icon icon="flower" />Enable safe mode</label>
|
||||
|
||||
<label
|
||||
v-show="theme === 'dark'"
|
||||
class="toggle"
|
||||
@click="setTheme('light')"
|
||||
><Icon icon="sun" />Use light theme</label>
|
||||
|
||||
<label
|
||||
v-show="theme === 'light'"
|
||||
class="toggle"
|
||||
@click="setTheme('dark')"
|
||||
><Icon icon="moon" />Use dark theme</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
|
||||
import logo from '../../img/logo.svg';
|
||||
|
||||
function sfw(state) {
|
||||
return state.ui.sfw;
|
||||
}
|
||||
|
||||
function theme(state) {
|
||||
return state.ui.theme;
|
||||
}
|
||||
|
||||
function setTheme(newTheme) {
|
||||
this.$store.dispatch('setTheme', newTheme);
|
||||
}
|
||||
|
||||
function setSfw(enabled) {
|
||||
this.$store.dispatch('setSfw', enabled);
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
toggleSidebar: {
|
||||
type: Function,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
logo,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
sfw,
|
||||
theme,
|
||||
}),
|
||||
},
|
||||
methods: {
|
||||
setTheme,
|
||||
setSfw,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.sidebar-container {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
background: var(--darken-hint);
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
width: 15rem;
|
||||
height: 100%;
|
||||
color: var(--text);
|
||||
background: var(--background);
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
}
|
||||
|
||||
.sidebar-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
height: 3rem;
|
||||
border-bottom: solid 1px var(--shadow-hint);
|
||||
margin: 0 0 .5rem 0;
|
||||
}
|
||||
|
||||
.sidebar-close {
|
||||
width: 1.25rem;
|
||||
height: 100%;
|
||||
padding: 0 1.125rem;
|
||||
fill: var(--shadow-modest);
|
||||
|
||||
&:hover {
|
||||
fill: var(--primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-logo {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.logo-link {
|
||||
display: block;
|
||||
height: 100%;
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 6rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 0;
|
||||
fill: var(--primary);
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
color: var(--shadow);
|
||||
display: block;
|
||||
padding: 1rem;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
|
||||
&:hover {
|
||||
color: var(--shadow-strong);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
.toggles {
|
||||
border-top: solid 1px var(--shadow-hint);
|
||||
margin: .5rem 0 0 0;
|
||||
}
|
||||
|
||||
.toggle {
|
||||
display: flex;
|
||||
align-self: flex-end;
|
||||
padding: 1rem;
|
||||
color: var(--shadow);
|
||||
font-weight: bold;
|
||||
|
||||
.icon {
|
||||
fill: var(--shadow);
|
||||
margin: 0 1rem 0 0;
|
||||
}
|
||||
|
||||
&.active .icon {
|
||||
fill: var(--primary);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
color: var(--shadow-strong);
|
||||
|
||||
&:not(.active) .icon {
|
||||
fill: var(--shadow-strong);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dark .sidebar {
|
||||
background: var(--profile);
|
||||
|
||||
.nav-link {
|
||||
color: var(--shadow);
|
||||
|
||||
&.active {
|
||||
color: var(--text-light);
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-close {
|
||||
fill: var(--lighten);
|
||||
|
||||
&:hover {
|
||||
fill: var(--text-light);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,109 +0,0 @@
|
||||
<template>
|
||||
<div class="photos">
|
||||
<a
|
||||
v-if="tag.poster"
|
||||
:href="`/img/${poster.path}`"
|
||||
:title="poster.comment"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="photo-link"
|
||||
>
|
||||
<img
|
||||
:src="`/img/${poster.thumbnail}`"
|
||||
:alt="tag.poster.comment"
|
||||
class="poster"
|
||||
>
|
||||
</a>
|
||||
|
||||
<a
|
||||
v-for="photo in photos"
|
||||
:key="`photo-${photo.id}`"
|
||||
:title="photo.comment"
|
||||
:href="`/img/${photo.path}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="photo-link"
|
||||
>
|
||||
<img
|
||||
:src="`/img/${photo.thumbnail}`"
|
||||
:alt="photo.comment"
|
||||
class="photo"
|
||||
>
|
||||
</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
function poster() {
|
||||
if (this.$store.state.ui.sfw) {
|
||||
return this.tag.poster.sfw;
|
||||
}
|
||||
|
||||
return this.tag.poster;
|
||||
}
|
||||
|
||||
function photos() {
|
||||
if (this.$store.state.ui.sfw) {
|
||||
return this.tag.photos.map(photo => photo.sfw);
|
||||
}
|
||||
|
||||
return this.tag.photos;
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
tag: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
poster,
|
||||
photos,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.photos {
|
||||
width: 100%;
|
||||
padding: 1rem 1rem 0 1rem;
|
||||
box-sizing: border-box;
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
scrollbar-width: none;
|
||||
scroll-behavior: smooth;
|
||||
font-size: 0;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&.expanded {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
padding: 0 0 0 1rem;
|
||||
|
||||
.photo-link {
|
||||
margin: 0 .5rem .5rem 0;
|
||||
}
|
||||
|
||||
.poster,
|
||||
.photo {
|
||||
max-height: 18rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.photo-link:not(:last-child) {
|
||||
margin: 0 .5rem 0 0;
|
||||
}
|
||||
|
||||
.poster,
|
||||
.photo {
|
||||
max-height: 15rem;
|
||||
max-width: 100%;
|
||||
box-shadow: 0 0 3px var(--shadow-weak);
|
||||
}
|
||||
</style>
|
||||
@@ -1,144 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="tag"
|
||||
class="tag content"
|
||||
>
|
||||
<div class="header">
|
||||
<h2 class="title">
|
||||
<Icon icon="price-tag4" />
|
||||
{{ tag.name }}
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div class="content-inner">
|
||||
<div
|
||||
v-if="description"
|
||||
class="description header-description"
|
||||
v-html="description"
|
||||
/>
|
||||
|
||||
<Scroll
|
||||
v-if="hasMedia"
|
||||
:expanded="expanded"
|
||||
class="scroll-light"
|
||||
@expand="(state) => expanded = state"
|
||||
>
|
||||
<Photos
|
||||
:tag="tag"
|
||||
:class="{ expanded }"
|
||||
/>
|
||||
</Scroll>
|
||||
|
||||
<FilterBar :fetch-releases="fetchReleases" />
|
||||
<Releases :releases="tag.releases" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/* eslint-disable no-v-html */
|
||||
import { Converter } from 'showdown';
|
||||
|
||||
import escapeHtml from '../../../src/utils/escape-html';
|
||||
|
||||
import FilterBar from '../header/filter-bar.vue';
|
||||
import Photos from './photos.vue';
|
||||
import Releases from '../releases/releases.vue';
|
||||
import Scroll from '../scroll/scroll.vue';
|
||||
|
||||
const converter = new Converter();
|
||||
|
||||
async function fetchReleases() {
|
||||
this.tag = await this.$store.dispatch('fetchTagBySlug', {
|
||||
tagSlug: this.$route.params.tagSlug,
|
||||
range: this.$route.params.range,
|
||||
});
|
||||
|
||||
this.hasMedia = this.tag.poster || this.tag.photos.length > 0;
|
||||
this.description = this.tag.description && converter.makeHtml(escapeHtml(this.tag.description));
|
||||
}
|
||||
|
||||
async function route() {
|
||||
await this.fetchReleases();
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
await this.fetchReleases();
|
||||
this.pageTitle = this.tag.name;
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
FilterBar,
|
||||
Releases,
|
||||
Photos,
|
||||
Scroll,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tag: null,
|
||||
description: null,
|
||||
releases: null,
|
||||
pageTitle: null,
|
||||
hasMedia: false,
|
||||
expanded: false,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
$route: route,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
fetchReleases,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import 'theme';
|
||||
|
||||
.description a {
|
||||
color: var(--link);
|
||||
text-decoration: inherit;
|
||||
|
||||
&:hover {
|
||||
color: var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
.description,
|
||||
.description p {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.header {
|
||||
background: var(--profile);
|
||||
color: var(--text-light);
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: .75rem 1rem;
|
||||
margin: 0;
|
||||
flex-shrink: 0;
|
||||
text-transform: capitalize;
|
||||
|
||||
.icon {
|
||||
fill: var(--text-light);
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
.description {
|
||||
padding: 0 1rem .5rem 1rem;
|
||||
line-height: 1.5;
|
||||
color: var(--text-light);
|
||||
background: var(--profile);
|
||||
}
|
||||
</style>
|
||||
@@ -1,179 +0,0 @@
|
||||
<template>
|
||||
<div class="tags">
|
||||
<div
|
||||
v-for="(tags, category) in categories"
|
||||
:key="category"
|
||||
>
|
||||
<h3 class="heading">{{ category }}</h3>
|
||||
|
||||
<div
|
||||
:key="sfw"
|
||||
v-lazy-container
|
||||
class="tiles"
|
||||
>
|
||||
<Tag
|
||||
v-for="tag in tags"
|
||||
:key="`tag-${tag.id}`"
|
||||
:tag="tag"
|
||||
:lazy="true"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Tag from './tile.vue';
|
||||
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
const tagSlugsByCategory = {
|
||||
popular: [
|
||||
'anal',
|
||||
'lesbian',
|
||||
'interracial',
|
||||
'mff',
|
||||
'mfm',
|
||||
'teen',
|
||||
'milf',
|
||||
'blowjob',
|
||||
'orgy',
|
||||
'gangbang',
|
||||
'dp',
|
||||
'facial',
|
||||
'creampie',
|
||||
'squirting',
|
||||
],
|
||||
appearance: [
|
||||
'asian',
|
||||
'ebony',
|
||||
'latina',
|
||||
'caucasian',
|
||||
'indian',
|
||||
'natural-boobs',
|
||||
'fake-boobs',
|
||||
'blonde',
|
||||
'brunette',
|
||||
'redhead',
|
||||
'tattoos',
|
||||
'piercings',
|
||||
],
|
||||
oral: [
|
||||
'blowjob',
|
||||
'deepthroat',
|
||||
'facefucking',
|
||||
'double-blowjob',
|
||||
'blowbang',
|
||||
'pussy-eating',
|
||||
'ass-eating',
|
||||
'atm',
|
||||
],
|
||||
extreme: [
|
||||
'airtight',
|
||||
'dap',
|
||||
'dvp',
|
||||
'da-tp',
|
||||
'dv-tp',
|
||||
'tap',
|
||||
],
|
||||
cumshot: [
|
||||
'facial',
|
||||
'bukkake',
|
||||
'creampie',
|
||||
'anal-creampie',
|
||||
'cum-in-mouth',
|
||||
'cum-on-butt',
|
||||
],
|
||||
roleplay: [
|
||||
'family',
|
||||
'schoolgirl',
|
||||
'nurse',
|
||||
'maid',
|
||||
],
|
||||
fetish: [
|
||||
'bdsm',
|
||||
'femdom',
|
||||
],
|
||||
toys: [
|
||||
'double-dildo',
|
||||
'double-dildo-blowjob',
|
||||
],
|
||||
misc: [
|
||||
'gaping',
|
||||
'squirting',
|
||||
'oil',
|
||||
],
|
||||
};
|
||||
|
||||
const tags = await this.$store.dispatch('fetchTags', {
|
||||
slugs: Object.values(tagSlugsByCategory).flat(),
|
||||
});
|
||||
|
||||
const tagsBySlug = tags.reduce((acc, tag) => ({ ...acc, [tag.slug]: tag }), {});
|
||||
|
||||
this.categories = Object.entries(tagSlugsByCategory).reduce((acc, [category, tagSlugs]) => ({
|
||||
...acc,
|
||||
[category]: tagSlugs.map(tagSlug => tagsBySlug[tagSlug]),
|
||||
}), {});
|
||||
|
||||
this.pageTitle = 'Tags';
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Tag,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
categories: {},
|
||||
pageTitle: null,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
sfw,
|
||||
},
|
||||
mounted,
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.tags {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.tiles {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(23rem, .33fr));
|
||||
grid-gap: 1rem;
|
||||
margin: 0 0 1.5rem 0;
|
||||
}
|
||||
|
||||
.heading {
|
||||
font-size: 1.3rem;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint3) {
|
||||
.tiles {
|
||||
grid-template-columns: repeat(auto-fill, minmax(20rem, .5fr));
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint) {
|
||||
.tiles {
|
||||
grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
|
||||
grid-gap: .5rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint0) {
|
||||
.tiles {
|
||||
grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,120 +0,0 @@
|
||||
<template>
|
||||
<router-link
|
||||
:to="{ name: 'tag', params: { tagSlug: tag.slug, range: 'latest' } }"
|
||||
:title="tag.name"
|
||||
class="tile"
|
||||
>
|
||||
<template v-if="tag.poster">
|
||||
<img
|
||||
v-if="!lazy && !sfw"
|
||||
:src="`/img/${tag.poster.thumbnail}`"
|
||||
:title="tag.poster.comment"
|
||||
:alt="tag.name"
|
||||
class="poster"
|
||||
>
|
||||
|
||||
<img
|
||||
v-if="!lazy && sfw"
|
||||
:src="`/img/${tag.poster.sfw.thumbnail}`"
|
||||
:title="tag.poster.sfw.comment"
|
||||
:alt="tag.name"
|
||||
class="poster"
|
||||
>
|
||||
|
||||
<img
|
||||
v-if="lazy && !sfw"
|
||||
:data-src="`/img/${tag.poster.thumbnail}`"
|
||||
:data-loading="`/img/${tag.poster.lazy}`"
|
||||
:title="tag.poster.comment"
|
||||
:alt="tag.name"
|
||||
class="poster"
|
||||
>
|
||||
|
||||
<img
|
||||
v-if="lazy && sfw"
|
||||
:data-src="`/img/${tag.poster.sfw.thumbnail}`"
|
||||
:data-loading="`/img/${tag.poster.sfw.lazy}`"
|
||||
:title="tag.poster.sfw.comment"
|
||||
:alt="tag.name"
|
||||
class="poster"
|
||||
>
|
||||
</template>
|
||||
|
||||
<span class="title">{{ tag.name }}</span>
|
||||
</router-link>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
function sfw() {
|
||||
return this.$store.state.ui.sfw;
|
||||
}
|
||||
|
||||
export default {
|
||||
props: {
|
||||
tag: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
lazy: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
sfw,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import 'theme';
|
||||
|
||||
.tile {
|
||||
color: var(--text-light);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
text-decoration: none;
|
||||
box-shadow: 0 0 3px var(--darken-weak);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.poster {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
object-position: 50% 100%;
|
||||
}
|
||||
|
||||
.title {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
box-sizing: border-box;
|
||||
padding: .5rem 1rem;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
background: var(--darken);
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
text-transform: capitalize;
|
||||
text-shadow: 0 0 3px var(--darken-strong);
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint) {
|
||||
.tile {
|
||||
position: initial;
|
||||
}
|
||||
|
||||
.title {
|
||||
position: initial;
|
||||
color: var(--text);
|
||||
background: var(--background);
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,6 +0,0 @@
|
||||
$breakpoint-nano: 320px;
|
||||
$breakpoint-micro: 540px;
|
||||
$breakpoint: 720px;
|
||||
$breakpoint-kilo: 900px;
|
||||
$breakpoint-mega: 1200px;
|
||||
$breakpoint-giga: 1500px;
|
||||
@@ -1,8 +0,0 @@
|
||||
.select {
|
||||
color: var(--shadow-strong);
|
||||
background: var(--background);
|
||||
padding: .5rem;
|
||||
font-size: 1rem;
|
||||
border: solid 1px var(--shadow-weak);
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
.noselect {
|
||||
user-select: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
|
||||
.nolist {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
li {
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
border: 0;
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
$breakpoint0: 540px;
|
||||
$breakpoint: 720px;
|
||||
$breakpoint2: 900px;
|
||||
$breakpoint3: 1200px;
|
||||
$breakpoint4: 1500px;
|
||||
|
||||
:root {
|
||||
/* --primary: #ff886c; */
|
||||
--primary: #ff6c88;
|
||||
|
||||
--text-dark: #222;
|
||||
--text-light: #fff;
|
||||
|
||||
--darken: rgba(0, 0, 0, .5);
|
||||
--darken-strong: rgba(0, 0, 0, .7);
|
||||
--darken-extreme: rgba(0, 0, 0, .9);
|
||||
--darken-weak: rgba(0, 0, 0, .2);
|
||||
--darken-hint: rgba(0, 0, 0, .1);
|
||||
|
||||
--lighten: rgba(255, 255, 255, .5);
|
||||
--lighten-strong: rgba(255, 255, 255, .7);
|
||||
--lighten-extreme: rgba(255, 255, 255, .9);
|
||||
--lighten-weak: rgba(255, 255, 255, .2);
|
||||
--lighten-hint: rgba(255, 255, 255, .05);
|
||||
|
||||
--logo-shadow: drop-shadow(1px 0 0 $shadow-weak) drop-shadow(-1px 0 0 $shadow-weak) drop-shadow(0 1px 0 $shadow-weak) drop-shadow(0 -1px 0 $shadow-weak);
|
||||
--logo-highlight: drop-shadow(0 0 1px $highlight);
|
||||
|
||||
--male: #0af;
|
||||
--female: #f0a;
|
||||
|
||||
--alert: #f00;
|
||||
--warn: #fa0;
|
||||
--success: #5c2;
|
||||
}
|
||||
|
||||
.light {
|
||||
--text: #222;
|
||||
--text-contrast: #fff;
|
||||
|
||||
--background: #fff;
|
||||
--background-dim: #fafafa;
|
||||
--background-soft: #fdfdfd;
|
||||
|
||||
--profile: #222;
|
||||
--tile: #2a2a2a;
|
||||
|
||||
--link: #dd6688;
|
||||
--empty: #333;
|
||||
|
||||
--crease: #eaeaea;
|
||||
|
||||
--shadow: rgba(0, 0, 0, .5);
|
||||
--shadow-extreme: rgba(0, 0, 0, .9);
|
||||
--shadow-strong: rgba(0, 0, 0, .7);
|
||||
--shadow-modest: rgba(0, 0, 0, .3);
|
||||
--shadow-weak: rgba(0, 0, 0, .2);
|
||||
--shadow-hint: rgba(0, 0, 0, .1);
|
||||
|
||||
--highlight: rgba(255, 255, 255, .5);
|
||||
--highlight-extreme: rgba(255, 255, 255, .9);
|
||||
--highlight-strong: rgba(255, 255, 255, .7);
|
||||
--highlight-modest: rgba(255, 255, 255, .3);
|
||||
--highlight-weak: rgba(255, 255, 255, .2);
|
||||
--highlight-hint: rgba(255, 255, 255, .075);
|
||||
}
|
||||
|
||||
.dark {
|
||||
--text: #fff;
|
||||
--text-contrast: #222;
|
||||
|
||||
--background: #222;
|
||||
--background-dim: #181818;
|
||||
--background-soft: #111;
|
||||
|
||||
--profile: #222;
|
||||
--tile: #2a2a2a;
|
||||
|
||||
--link: #dd6688;
|
||||
--empty: #333;
|
||||
|
||||
--crease: #222;
|
||||
|
||||
--shadow: rgba(255, 255, 255, .5);
|
||||
--shadow-extreme: rgba(255, 255, 255, .9);
|
||||
--shadow-strong: rgba(255, 255, 255, .7);
|
||||
--shadow-modest: rgba(255, 255, 255, .3);
|
||||
--shadow-weak: rgba(255, 255, 255, .2);
|
||||
--shadow-hint: rgba(255, 255, 255, .075);
|
||||
|
||||
--highlight: rgba(0, 0, 0, .5);
|
||||
--highlight-extreme: rgba(0, 0, 0, .9);
|
||||
--highlight-strong: rgba(0, 0, 0, .7);
|
||||
--highlight-modest: rgba(0, 0, 0, .3);
|
||||
--highlight-weak: rgba(0, 0, 0, .2);
|
||||
--highlight-hint: rgba(0, 0, 0, .1);
|
||||
}
|
||||
@@ -1,112 +0,0 @@
|
||||
.tooltip {
|
||||
display: block !important;
|
||||
z-index: 10000;
|
||||
|
||||
.tooltip-inner {
|
||||
max-width: 20rem;
|
||||
background: #222;
|
||||
color: white;
|
||||
border-radius: 16px;
|
||||
}
|
||||
|
||||
&:not(.popover) .tooltip-inner {
|
||||
padding: .5rem 1rem;
|
||||
}
|
||||
|
||||
.tooltip-arrow {
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-style: solid;
|
||||
position: absolute;
|
||||
margin: 5px;
|
||||
border-color: #222;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
&[x-placement^="top"] {
|
||||
margin-bottom: 5px;
|
||||
|
||||
.tooltip-arrow {
|
||||
border-width: 5px 5px 0 5px;
|
||||
border-left-color: transparent !important;
|
||||
border-right-color: transparent !important;
|
||||
border-bottom-color: transparent !important;
|
||||
bottom: -5px;
|
||||
left: calc(50% - 5px);
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&[x-placement^="bottom"] {
|
||||
margin-top: 5px;
|
||||
|
||||
.tooltip-arrow {
|
||||
border-width: 0 5px 5px 5px;
|
||||
border-left-color: transparent !important;
|
||||
border-right-color: transparent !important;
|
||||
border-top-color: transparent !important;
|
||||
top: -5px;
|
||||
left: calc(50% - 5px);
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&[x-placement^="right"] {
|
||||
margin-left: 5px;
|
||||
|
||||
.tooltip-arrow {
|
||||
border-width: 5px 5px 5px 0;
|
||||
border-left-color: transparent !important;
|
||||
border-top-color: transparent !important;
|
||||
border-bottom-color: transparent !important;
|
||||
left: -5px;
|
||||
top: calc(50% - 5px);
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&[x-placement^="left"] {
|
||||
margin-right: 5px;
|
||||
|
||||
.tooltip-arrow {
|
||||
border-width: 5px 0 5px 5px;
|
||||
border-top-color: transparent !important;
|
||||
border-right-color: transparent !important;
|
||||
border-bottom-color: transparent !important;
|
||||
right: -5px;
|
||||
top: calc(50% - 5px);
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&.popover {
|
||||
$color: #fff;
|
||||
|
||||
.popover-inner {
|
||||
background: $color;
|
||||
color: black;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 5px 30px rgba(black, .1);
|
||||
}
|
||||
|
||||
.popover-arrow {
|
||||
border-color: $color;
|
||||
}
|
||||
}
|
||||
|
||||
&[aria-hidden='true'] {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
/* transition: opacity .15s, visibility .15s; */
|
||||
}
|
||||
|
||||
&[aria-hidden='false'] {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
/* transition: opacity .15s; */
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
@import 'theme';
|
||||
@import 'inputs';
|
||||
@import 'states';
|
||||
@import 'tooltip';
|
||||
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
.nolist {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
li {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
.heading {
|
||||
color: var(--shadow);
|
||||
padding: 0;
|
||||
margin: 0 0 1rem 0;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.icon.icon-href {
|
||||
fill: var(--shadow);
|
||||
|
||||
:hover {
|
||||
fill: var(--primary);
|
||||
}
|
||||
}
|
||||
0
assets/img/avatars/Ace Rockwood - outline - hardon.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
0
assets/img/avatars/Ace Rockwood - outline.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
0
assets/img/avatars/Ace Rockwood.jpg
Normal file → Executable file
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
0
assets/img/avatars/Ace Rockwood.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
0
assets/img/avatars/Athena Rayne.jpg
Normal file → Executable file
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.8 MiB |
0
assets/img/avatars/Athena Rayne.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.5 MiB |
0
assets/img/avatars/Gianna Dior - outline.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
0
assets/img/avatars/Gianna Dior.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 956 KiB After Width: | Height: | Size: 956 KiB |
0
assets/img/avatars/Megan Snow - outline.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
0
assets/img/avatars/Megan Snow.jpg
Normal file → Executable file
|
Before Width: | Height: | Size: 643 KiB After Width: | Height: | Size: 643 KiB |
0
assets/img/avatars/Megan Snow.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 891 KiB After Width: | Height: | Size: 891 KiB |
0
assets/img/avatars/Tan.jpg
Normal file → Executable file
|
Before Width: | Height: | Size: 1016 KiB After Width: | Height: | Size: 1016 KiB |
0
assets/img/avatars/avatar_female1.png
Normal file → Executable file
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
0
assets/img/avatars/avatar_female2.png
Normal file → Executable file
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
BIN
assets/img/favicon/2021-03/favicon-180.png
Executable file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
assets/img/favicon/2021-03/favicon-192.png
Executable file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
assets/img/favicon/2021-03/favicon-32.png
Executable file
|
After Width: | Height: | Size: 635 B |
BIN
assets/img/favicon/2021-03/favicon-512.png
Executable file
|
After Width: | Height: | Size: 3.3 KiB |
69
assets/img/favicon/2021-03/favicon.svg
Executable file
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="26.528891mm"
|
||||
height="26.528891mm"
|
||||
viewBox="0 0 26.528891 26.528891"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="favicon.svg"
|
||||
inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="-25.862887"
|
||||
inkscape:cy="46.089189"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="text835"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1024"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="32"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-41.157469,-57.836902)">
|
||||
<g
|
||||
aria-label="t"
|
||||
id="text835"
|
||||
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:35.2778px;line-height:1.25;font-family:Orbitron;-inkscape-font-specification:'Orbitron Heavy';fill:#ff2280;fill-opacity:1;stroke:none;stroke-width:0.264583">
|
||||
<path
|
||||
d="m 53.328303,69.30218 v 9.666111 h 7.584722 v 5.3975 h -7.831667 q -1.058333,0 -2.010833,-0.388055 -0.9525,-0.423334 -1.658056,-1.128889 -0.670277,-0.705556 -1.093611,-1.622778 -0.388055,-0.917222 -0.388055,-1.975556 V 57.836902 h 5.3975 v 6.067778 h 7.584722 v 5.3975 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:35.2778px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Heavy';fill:#ff2280;fill-opacity:1;stroke-width:0.264583"
|
||||
id="path858" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
0
assets/img/favicon/border/android-chrome-192x192.png
Normal file → Executable file
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
0
assets/img/favicon/border/android-chrome-512x512.png
Normal file → Executable file
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
0
assets/img/favicon/border/apple-touch-icon.png
Normal file → Executable file
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
0
assets/img/favicon/border/browserconfig.xml
Normal file → Executable file
0
assets/img/favicon/border/favicon-16x16.png
Normal file → Executable file
|
Before Width: | Height: | Size: 850 B After Width: | Height: | Size: 850 B |
0
assets/img/favicon/border/favicon-32x32.png
Normal file → Executable file
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
0
assets/img/favicon/border/favicon.ico
Normal file → Executable file
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
0
assets/img/favicon/border/mstile-150x150.png
Normal file → Executable file
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
0
assets/img/favicon/border/safari-pinned-tab.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
0
assets/img/favicon/border/site.webmanifest
Normal file → Executable file
0
assets/img/favicon/favicon.png
Normal file → Executable file
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
0
assets/img/favicon/favicon.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
0
assets/img/favicon/favicon_border.png
Normal file → Executable file
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
0
assets/img/favicon/old/favicon-16x16.ico
Normal file → Executable file
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
0
assets/img/favicon/old/favicon-32x32.ico
Normal file → Executable file
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
0
assets/img/favicon/old/favicon-64x64.ico
Normal file → Executable file
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
0
assets/img/favicon/old/favicon-64x64.png
Normal file → Executable file
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
0
assets/img/favicon/old/favicon-dark-16x16.ico
Normal file → Executable file
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
0
assets/img/favicon/old/favicon-dark-32x32.ico
Normal file → Executable file
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
0
assets/img/favicon/old/favicon-dark-64x64.ico
Normal file → Executable file
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
0
assets/img/favicon/old/favicon.png
Normal file → Executable file
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
0
assets/img/flags/png/ao.png
Normal file → Executable file
|
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 428 B |
0
assets/img/flags/png/catalonia.png
Normal file → Executable file
|
Before Width: | Height: | Size: 398 B After Width: | Height: | Size: 398 B |
0
assets/img/flags/png/cd.png
Normal file → Executable file
|
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 528 B |
0
assets/img/flags/png/europeanunion.png
Normal file → Executable file
|
Before Width: | Height: | Size: 479 B After Width: | Height: | Size: 479 B |
0
assets/img/flags/png/gb.png
Normal file → Executable file
|
Before Width: | Height: | Size: 599 B After Width: | Height: | Size: 599 B |
0
assets/img/flags/png/lc.png
Normal file → Executable file
|
Before Width: | Height: | Size: 520 B After Width: | Height: | Size: 520 B |
0
assets/img/flags/png/me.png
Normal file → Executable file
|
Before Width: | Height: | Size: 448 B After Width: | Height: | Size: 448 B |
0
assets/img/flags/png/rs.png
Normal file → Executable file
|
Before Width: | Height: | Size: 423 B After Width: | Height: | Size: 423 B |
0
assets/img/flags/png/xk.png
Normal file → Executable file
|
Before Width: | Height: | Size: 816 B After Width: | Height: | Size: 816 B |
0
assets/img/flags/svg-basic/ad.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
0
assets/img/flags/svg-basic/ae.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
0
assets/img/flags/svg-basic/af.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
0
assets/img/flags/svg-basic/ag.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |