Separated some actor edit types into dedicated components.

This commit is contained in:
DebaucheryLibrarian 2024-11-03 06:30:09 +01:00
parent 94ebc92789
commit 89c55cea93
19 changed files with 1096 additions and 737 deletions

View File

@ -31,3 +31,15 @@ body {
margin: 0 0 1rem 0; margin: 0 0 1rem 0;
color: var(--primary); color: var(--primary);
} }
.icon.icon-twitter {
fill: #008ad8;
}
.icon.icon-onlyfans {
fill: #00adef;
}
.icon.icon-fansly {
fill: #2699f6;
}

View File

@ -0,0 +1,33 @@
<?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"
viewBox="0 0 725.59998 198.3"
version="1.1"
id="svg6"
width="725.59998"
height="198.3">
<metadata
id="metadata12">
<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>
<defs
id="defs10" />
<path
d="m 105.9,83.2 c -5.7,0 -10.2,4.9 -10.2,11 0,6.1 4.6,11 10.2,11 5.7,0 10.2,-4.9 10.2,-11 0,-6.1 -4.6,-11 -10.2,-11 z m -36.5,0 c -5.7,0 -10.2,4.9 -10.2,11 0,6.1 4.6,11 10.2,11 5.7,0 10.2,-4.9 10.2,-11 0.1,-6.1 -4.5,-11 -10.2,-11 z"
id="path2" />
<path
d="M 154.5,0 H 20.5 C 9.2,0 0,9.2 0,20.5 v 134 C 0,165.8 9.2,175 20.5,175 h 113.4 l -5.3,-18.3 12.8,11.8 12.1,11.1 21.6,18.7 V 20.5 C 175,9.2 165.8,0 154.5,0 Z m -38.6,129.5 c 0,0 -3.6,-4.3 -6.6,-8 13.1,-3.7 18.1,-11.8 18.1,-11.8 -4.1,2.7 -8,4.6 -11.5,5.9 -5,2.1 -9.8,3.4 -14.5,4.3 -9.6,1.8 -18.4,1.3 -25.9,-0.1 -5.7,-1.1 -10.6,-2.6 -14.7,-4.3 -2.3,-0.9 -4.8,-2 -7.3,-3.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.5 -0.2,-0.1 -0.3,-0.2 -0.4,-0.2 -1.8,-1 -2.8,-1.7 -2.8,-1.7 0,0 4.8,7.9 17.5,11.7 -3,3.8 -6.7,8.2 -6.7,8.2 C 38.1,128.9 29.7,114.5 29.7,114.5 29.7,82.6 44.1,56.7 44.1,56.7 58.5,46 72.1,46.3 72.1,46.3 l 1,1.2 c -18,5.1 -26.2,13 -26.2,13 0,0 2.2,-1.2 5.9,-2.8 10.7,-4.7 19.2,-5.9 22.7,-6.3 0.6,-0.1 1.1,-0.2 1.7,-0.2 6.1,-0.8 13,-1 20.2,-0.2 9.5,1.1 19.7,3.9 30.1,9.5 0,0 -7.9,-7.5 -24.9,-12.6 l 1.4,-1.6 c 0,0 13.7,-0.3 28,10.4 0,0 14.4,25.9 14.4,57.8 0,-0.1 -8.4,14.3 -30.5,15 z m 151,-86.7 H 233.7 V 80.1 L 255.8,100 V 63.8 h 11.8 c 7.5,0 11.2,3.6 11.2,9.4 v 27.7 c 0,5.8 -3.5,9.7 -11.2,9.7 h -34 v 21.1 h 33.2 c 17.8,0.1 34.5,-8.8 34.5,-29.2 V 72.7 C 301.4,51.9 284.7,42.8 266.9,42.8 Z m 174,59.7 V 71.9 c 0,-11 19.8,-13.5 25.8,-2.5 L 485,62 C 477.8,46.2 464.7,41.6 453.8,41.6 436,41.6 418.4,51.9 418.4,71.9 v 30.6 c 0,20.2 17.6,30.3 35,30.3 11.2,0 24.6,-5.5 32,-19.9 l -19.6,-9 c -4.8,12.3 -24.9,9.3 -24.9,-1.4 z M 380.4,76.1 c -6.9,-1.5 -11.5,-4 -11.8,-8.3 0.4,-10.3 16.3,-10.7 25.6,-0.8 l 14.7,-11.3 c -9.2,-11.2 -19.6,-14.2 -30.3,-14.2 -16.3,0 -32.1,9.2 -32.1,26.6 0,16.9 13,26 27.3,28.2 7.3,1 15.4,3.9 15.2,8.9 -0.6,9.5 -20.2,9 -29.1,-1.8 l -14.2,13.3 c 8.3,10.7 19.6,16.1 30.2,16.1 16.3,0 34.4,-9.4 35.1,-26.6 C 412,84.5 396.2,79 380.4,76.1 Z m -67,55.5 h 22.4 V 42.8 H 313.4 Z M 691.1,42.8 H 657.9 V 80.1 L 680,100 V 63.8 h 11.8 c 7.5,0 11.2,3.6 11.2,9.4 v 27.7 c 0,5.8 -3.5,9.7 -11.2,9.7 h -34 v 21.1 h 33.3 c 17.8,0.1 34.5,-8.8 34.5,-29.2 V 72.7 c 0,-20.8 -16.7,-29.9 -34.5,-29.9 z M 528.2,41.6 c -18.4,0 -36.7,10 -36.7,30.5 v 30.3 c 0,20.3 18.4,30.5 36.9,30.5 18.4,0 36.7,-10.2 36.7,-30.5 V 72.1 c 0,-20.4 -18.5,-30.5 -36.9,-30.5 z m 14.4,60.8 c 0,6.4 -7.2,9.7 -14.3,9.7 -7.2,0 -14.4,-3.1 -14.4,-9.7 V 72.1 c 0,-6.5 7,-10 14,-10 7.3,0 14.7,3.1 14.7,10 z M 645.5,72.1 C 645,51.3 630.8,42.9 612.5,42.9 H 577 v 88.8 h 22.7 v -28.2 h 4 l 20.6,28.2 h 28 l -24.2,-30.5 c 10.7,-3.4 17.4,-12.7 17.4,-29.1 z m -32.6,12 H 599.7 V 63.8 h 13.2 c 14.1,0 14.1,20.3 0,20.3 z"
id="path4" />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

21
assets/img/icons/discord.svg Executable file → Normal file
View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 200 200"
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"
viewBox="0 0 725.59998 198.3"
version="1.1" version="1.1"
id="svg6" id="svg6"
width="725.59998" width="200"
height="198.3"> height="200"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata <metadata
id="metadata12"> id="metadata12">
<rdf:RDF> <rdf:RDF>
@ -18,16 +18,15 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work> </cc:Work>
</rdf:RDF> </rdf:RDF>
</metadata> </metadata>
<defs <defs
id="defs10" /> id="defs10" />
<path <path
d="m 105.9,83.2 c -5.7,0 -10.2,4.9 -10.2,11 0,6.1 4.6,11 10.2,11 5.7,0 10.2,-4.9 10.2,-11 0,-6.1 -4.6,-11 -10.2,-11 z m -36.5,0 c -5.7,0 -10.2,4.9 -10.2,11 0,6.1 4.6,11 10.2,11 5.7,0 10.2,-4.9 10.2,-11 0.1,-6.1 -4.5,-11 -10.2,-11 z" d="m 118.35,84.05 c -5.7,0 -10.2,4.9 -10.2,11 0,6.1 4.6,11 10.2,11 5.7,0 10.2,-4.9 10.2,-11 0,-6.1 -4.6,-11 -10.2,-11 z m -36.5,0 c -5.7,0 -10.2,4.9 -10.2,11 0,6.1 4.6,11 10.2,11 5.7,0 10.2,-4.9 10.2,-11 0.1,-6.1 -4.5,-11 -10.2,-11 z"
id="path2" /> id="path2" />
<path <path
d="M 154.5,0 H 20.5 C 9.2,0 0,9.2 0,20.5 v 134 C 0,165.8 9.2,175 20.5,175 h 113.4 l -5.3,-18.3 12.8,11.8 12.1,11.1 21.6,18.7 V 20.5 C 175,9.2 165.8,0 154.5,0 Z m -38.6,129.5 c 0,0 -3.6,-4.3 -6.6,-8 13.1,-3.7 18.1,-11.8 18.1,-11.8 -4.1,2.7 -8,4.6 -11.5,5.9 -5,2.1 -9.8,3.4 -14.5,4.3 -9.6,1.8 -18.4,1.3 -25.9,-0.1 -5.7,-1.1 -10.6,-2.6 -14.7,-4.3 -2.3,-0.9 -4.8,-2 -7.3,-3.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.5 -0.2,-0.1 -0.3,-0.2 -0.4,-0.2 -1.8,-1 -2.8,-1.7 -2.8,-1.7 0,0 4.8,7.9 17.5,11.7 -3,3.8 -6.7,8.2 -6.7,8.2 C 38.1,128.9 29.7,114.5 29.7,114.5 29.7,82.6 44.1,56.7 44.1,56.7 58.5,46 72.1,46.3 72.1,46.3 l 1,1.2 c -18,5.1 -26.2,13 -26.2,13 0,0 2.2,-1.2 5.9,-2.8 10.7,-4.7 19.2,-5.9 22.7,-6.3 0.6,-0.1 1.1,-0.2 1.7,-0.2 6.1,-0.8 13,-1 20.2,-0.2 9.5,1.1 19.7,3.9 30.1,9.5 0,0 -7.9,-7.5 -24.9,-12.6 l 1.4,-1.6 c 0,0 13.7,-0.3 28,10.4 0,0 14.4,25.9 14.4,57.8 0,-0.1 -8.4,14.3 -30.5,15 z m 151,-86.7 H 233.7 V 80.1 L 255.8,100 V 63.8 h 11.8 c 7.5,0 11.2,3.6 11.2,9.4 v 27.7 c 0,5.8 -3.5,9.7 -11.2,9.7 h -34 v 21.1 h 33.2 c 17.8,0.1 34.5,-8.8 34.5,-29.2 V 72.7 C 301.4,51.9 284.7,42.8 266.9,42.8 Z m 174,59.7 V 71.9 c 0,-11 19.8,-13.5 25.8,-2.5 L 485,62 C 477.8,46.2 464.7,41.6 453.8,41.6 436,41.6 418.4,51.9 418.4,71.9 v 30.6 c 0,20.2 17.6,30.3 35,30.3 11.2,0 24.6,-5.5 32,-19.9 l -19.6,-9 c -4.8,12.3 -24.9,9.3 -24.9,-1.4 z M 380.4,76.1 c -6.9,-1.5 -11.5,-4 -11.8,-8.3 0.4,-10.3 16.3,-10.7 25.6,-0.8 l 14.7,-11.3 c -9.2,-11.2 -19.6,-14.2 -30.3,-14.2 -16.3,0 -32.1,9.2 -32.1,26.6 0,16.9 13,26 27.3,28.2 7.3,1 15.4,3.9 15.2,8.9 -0.6,9.5 -20.2,9 -29.1,-1.8 l -14.2,13.3 c 8.3,10.7 19.6,16.1 30.2,16.1 16.3,0 34.4,-9.4 35.1,-26.6 C 412,84.5 396.2,79 380.4,76.1 Z m -67,55.5 h 22.4 V 42.8 H 313.4 Z M 691.1,42.8 H 657.9 V 80.1 L 680,100 V 63.8 h 11.8 c 7.5,0 11.2,3.6 11.2,9.4 v 27.7 c 0,5.8 -3.5,9.7 -11.2,9.7 h -34 v 21.1 h 33.3 c 17.8,0.1 34.5,-8.8 34.5,-29.2 V 72.7 c 0,-20.8 -16.7,-29.9 -34.5,-29.9 z M 528.2,41.6 c -18.4,0 -36.7,10 -36.7,30.5 v 30.3 c 0,20.3 18.4,30.5 36.9,30.5 18.4,0 36.7,-10.2 36.7,-30.5 V 72.1 c 0,-20.4 -18.5,-30.5 -36.9,-30.5 z m 14.4,60.8 c 0,6.4 -7.2,9.7 -14.3,9.7 -7.2,0 -14.4,-3.1 -14.4,-9.7 V 72.1 c 0,-6.5 7,-10 14,-10 7.3,0 14.7,3.1 14.7,10 z M 645.5,72.1 C 645,51.3 630.8,42.9 612.5,42.9 H 577 v 88.8 h 22.7 v -28.2 h 4 l 20.6,28.2 h 28 l -24.2,-30.5 c 10.7,-3.4 17.4,-12.7 17.4,-29.1 z m -32.6,12 H 599.7 V 63.8 h 13.2 c 14.1,0 14.1,20.3 0,20.3 z" d="m 166.95,0.85 h -134 c -11.3,0 -20.5,9.2 -20.5,20.5 v 134 c 0,11.3 9.2,20.5 20.5,20.5 h 113.4 l -5.3,-18.3 12.8,11.8 12.1,11.1 21.6,18.7 V 21.35 c -0.1,-11.3 -9.3,-20.5 -20.6,-20.5 z m -38.6,129.5 c 0,0 -3.6,-4.3 -6.6,-8 13.1,-3.7 18.1,-11.8 18.1,-11.8 -4.1,2.7 -8,4.6 -11.5,5.9 -5,2.1 -9.8,3.4 -14.5,4.3 -9.6,1.8 -18.4,1.3 -25.9,-0.1 -5.7,-1.1 -10.6,-2.6 -14.7,-4.3 -2.3,-0.9 -4.8,-2 -7.3,-3.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.5 -0.2,-0.1 -0.3,-0.2 -0.4,-0.2 -1.8,-1 -2.8,-1.7 -2.8,-1.7 0,0 4.8,7.9 17.5,11.7 -3,3.8 -6.7,8.2 -6.7,8.2 -22.1,-0.7 -30.5,-15.1 -30.5,-15.1 0,-31.9 14.4,-57.8 14.4,-57.8 14.4,-10.7 28,-10.4 28,-10.4 l 1,1.2 c -18,5.1 -26.2,13 -26.2,13 0,0 2.2,-1.2 5.9,-2.8 10.7,-4.7 19.2,-5.9 22.7,-6.3 0.6,-0.1 1.1,-0.2 1.7,-0.2 6.1,-0.8 13,-1 20.2,-0.2 9.5,1.1 19.7,3.9 30.1,9.5 0,0 -7.9,-7.5 -24.9,-12.6 l 1.4,-1.6 c 0,0 13.7,-0.3 28,10.4 0,0 14.4,25.9 14.4,57.8 0,-0.1 -8.4,14.3 -30.5,15 z"
id="path4" /> id="path4" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="250mm"
height="250mm"
viewBox="0 0 250 250"
version="1.1"
id="svg1"
xml:space="preserve"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs1" /><g
id="layer1"
transform="translate(24.386144,-19.654193)"><path
d="m 97.694468,246.49306 c -3.29163,-0.77463 -0.47054,1.91978 -54.511619,-52.06397 -50.6807564,-50.62701 -53.322727,-53.34287 -56.39996,-57.97743 -27.178147,-40.932394 2.576397,-95.055377 51.592389,-93.845613 18.803333,0.464085 29.67869,5.96299 47.82344,24.180963 l 8.13594,8.168766 v 1.17671 1.17671 l -9.5952,9.5952 -9.59519,9.59519 h -1.17012 -1.17011 l -8.747713,-8.68541 C 53.42233,77.255906 51.16241,75.641266 44.558703,73.883746 22.440946,67.99732 2.0677986,88.370466 7.9542296,110.48822 c 1.854298,6.96737 3.0461774,8.54843 17.0298114,22.59053 L 36.775364,144.91938 80.437818,101.307 C 104.45218,77.320186 125.11232,56.891924 126.34924,55.910863 c 41.54647,-32.952327 102.5948,-0.905053 98.18473,51.541997 -1.50182,17.86043 -6.90484,27.66745 -25.34204,45.99828 l -6.85255,6.81302 h -1.30245 -1.30245 l -9.23084,-9.19427 c -5.23119,-5.21045 -9.3927,-9.56782 -9.60439,-10.05639 -0.68655,-1.5845 -0.44769,-1.89305 8.34481,-10.77954 10.07564,-10.18335 11.76153,-12.45408 13.61891,-18.34331 7.36307,-23.346184 -14.7662,-45.211633 -37.93595,-37.483684 -6.11717,2.04029 -7.63165,3.23438 -21.10859,16.64299 l -11.71311,11.653724 31.35842,31.36255 c 34.29087,34.29538 32.03326,31.83093 30.97951,33.81784 -0.76337,1.4394 -76.38158,76.6301 -77.82527,77.3853 -2.61462,1.36771 -6.21408,1.86131 -8.923512,1.22369 z m 6.844022,-50.26472 c 24.80444,-3.44998 34.77631,-34.05871 16.6922,-51.23684 -18.69981,-17.76299 -49.500062,-5.18911 -50.373192,20.56433 -0.6271,18.49668 15.51714,33.19887 33.680992,30.67251 z m -8.748622,-11.08611 c -19.05073,-5.06896 -18.95399,-32.29299 0.13229,-37.22612 3.38201,-0.87413 10.621562,-0.39034 10.164072,0.67923 -1.05639,2.46975 -1.14575,3.85862 -0.37986,5.90421 1.62525,4.34083 6.42005,6.18157 10.40675,3.9952 l 1.53784,-0.84338 0.53717,1.24025 c 6.33111,14.61762 -7.07381,30.32809 -22.398262,26.25061 z"
id="path1" /></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

69
assets/img/icons/onlyfans.svg Executable file → Normal file
View File

@ -1,66 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 400 400"
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"
id="icon-logo"
viewBox="0 0 92.400002 92.399879"
version="1.1" version="1.1"
sodipodi:docname="onlyfans.svg" id="svg2"
width="92.400002" xmlns="http://www.w3.org/2000/svg"
height="92.399879" xmlns:svg="http://www.w3.org/2000/svg">
inkscape:version="0.92.4 5da689c313, 2019-01-14">
<metadata
id="metadata21">
<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>
<defs <defs
id="defs19" /> id="defs2" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1026"
id="namedview17"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="6.1429902"
inkscape:cx="26.40336"
inkscape:cy="24.398909"
inkscape:window-x="1047"
inkscape:window-y="930"
inkscape:window-maximized="1"
inkscape:current-layer="icon-logo" />
<path <path
class="svg-logo-color-1" d="M137.5 75a125 125 0 1 0 125 125 125 125 0 0 0-125-125zm0 162.5A37.5 37.5 0 1 1 175 200a37.45 37.45 0 0 1-37.5 37.5z"
d="M 46.07999,3.9024059e-5 A 46.2,46.2 0 1 0 92.39999,46.170039 46.26,46.26 0 0 0 46.07999,3.9024059e-5 Z m 0,87.569999975941 a 41.38,41.38 0 1 1 41.48,-41.4 41.44,41.44 0 0 1 -41.48,41.38 z" opacity=".7"
id="path2" id="path1" />
inkscape:connector-curvature="0"
style="fill-rule:evenodd" />
<path <path
d="m 65.28999,43.190039 v -3.77 a 16.75,16.75 0 0 0 -5.08,-12 17.31,17.31 0 0 0 -12.19,-5 h -3.1 a 17.31,17.31 0 0 0 -12.18,5 16.7,16.7 0 0 0 -5.07,12 v 3.77 l -2.14,3.86 v 5.56 a 18.64,18.64 0 0 0 5.64,13.33 19.37,19.37 0 0 0 13.59,5.54 h 3.45 a 19.33,19.33 0 0 0 13.55,-5.54 18.61,18.61 0 0 0 5.65,-13.33 v -5.56 z m -16.8,17.06 v 4.45 a 1.93,1.93 0 0 1 -0.89,1.64 h -0.84 a 1,1 0 0 1 -0.3,0 h -0.2 a 1.18,1.18 0 0 1 -0.25,0 h -0.38 a 2,2 0 0 1 -0.92,-1.67 v -4.42 a 5.3,5.3 0 0 1 2,-10.24 h 0.11 a 5.3,5.3 0 0 1 2,10.24 z m 9.09,-16.94 h -22.21 v -3.89 a 9.27,9.27 0 0 1 2.81,-6.63 9.62,9.62 0 0 1 6.74,-2.79 h 3.1 a 9.61,9.61 0 0 1 6.74,2.79 9.31,9.31 0 0 1 2.81,6.63 z" d="M278 168.75c31.76 9.14 69.25 0 69.25 0-10.88 47.5-45.38 77.25-95.13 80.87A124.73 124.73 0 0 1 137.5 325L175 205.81C213.55 83.3 233.31 75 324.73 75h62.77c-10.5 46.25-46.69 81.58-109.5 93.75z"
class="svg-logo-color-2" id="path2" />
id="path14"
inkscape:connector-curvature="0" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 626 B

View File

@ -0,0 +1,66 @@
<?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"
id="icon-logo"
viewBox="0 0 92.400002 92.399879"
version="1.1"
sodipodi:docname="onlyfans.svg"
width="92.400002"
height="92.399879"
inkscape:version="0.92.4 5da689c313, 2019-01-14">
<metadata
id="metadata21">
<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>
<defs
id="defs19" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1026"
id="namedview17"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="6.1429902"
inkscape:cx="26.40336"
inkscape:cy="24.398909"
inkscape:window-x="1047"
inkscape:window-y="930"
inkscape:window-maximized="1"
inkscape:current-layer="icon-logo" />
<path
class="svg-logo-color-1"
d="M 46.07999,3.9024059e-5 A 46.2,46.2 0 1 0 92.39999,46.170039 46.26,46.26 0 0 0 46.07999,3.9024059e-5 Z m 0,87.569999975941 a 41.38,41.38 0 1 1 41.48,-41.4 41.44,41.44 0 0 1 -41.48,41.38 z"
id="path2"
inkscape:connector-curvature="0"
style="fill-rule:evenodd" />
<path
d="m 65.28999,43.190039 v -3.77 a 16.75,16.75 0 0 0 -5.08,-12 17.31,17.31 0 0 0 -12.19,-5 h -3.1 a 17.31,17.31 0 0 0 -12.18,5 16.7,16.7 0 0 0 -5.07,12 v 3.77 l -2.14,3.86 v 5.56 a 18.64,18.64 0 0 0 5.64,13.33 19.37,19.37 0 0 0 13.59,5.54 h 3.45 a 19.33,19.33 0 0 0 13.55,-5.54 18.61,18.61 0 0 0 5.65,-13.33 v -5.56 z m -16.8,17.06 v 4.45 a 1.93,1.93 0 0 1 -0.89,1.64 h -0.84 a 1,1 0 0 1 -0.3,0 h -0.2 a 1.18,1.18 0 0 1 -0.25,0 h -0.38 a 2,2 0 0 1 -0.92,-1.67 v -4.42 a 5.3,5.3 0 0 1 2,-10.24 h 0.11 a 5.3,5.3 0 0 1 2,10.24 z m 9.09,-16.94 h -22.21 v -3.89 a 9.27,9.27 0 0 1 2.81,-6.63 9.62,9.62 0 0 1 6.74,-2.79 h 3.1 a 9.61,9.61 0 0 1 6.74,2.79 9.31,9.31 0 0 1 2.81,6.63 z"
class="svg-logo-color-2"
id="path14"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,4 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<path d="M13.937 8.034c-0.283 0-0.552 0.055-0.798 0.154-0.164-1.787-1.723-3.188-3.625-3.188-0.465 0-0.917 0.088-1.317 0.237-0.156 0.058-0.197 0.117-0.197 0.233v6.292c0 0.121 0.098 0.222 0.221 0.234 0.005 0.001 5.68 0.003 5.717 0.003 1.139 0 2.062-0.888 2.062-1.983s-0.924-1.983-2.063-1.983zM6.25 12h0.5l0.25-3.503-0.25-3.497h-0.5l-0.25 3.497zM4.75 12h-0.5l-0.25-2.543 0.25-2.457h0.5l0.25 2.5zM2.25 12h0.5l0.25-2-0.25-2h-0.5l-0.25 2zM0.25 11h0.5l0.25-1-0.25-1h-0.5l-0.25 1z"></path>
</svg>

After

Width:  |  Height:  |  Size: 620 B

View File

@ -0,0 +1,4 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<path d="M14.5 0h-13c-0.825 0-1.5 0.675-1.5 1.5v13c0 0.825 0.675 1.5 1.5 1.5h13c0.825 0 1.5-0.675 1.5-1.5v-13c0-0.825-0.675-1.5-1.5-1.5zM2.75 11h-0.5l-0.25-1.5 0.25-1.5h0.5l0.25 1.5-0.25 1.5zM4.75 11h-0.5l-0.25-2 0.25-2h0.5l0.25 2-0.25 2zM6.75 11h-0.5l-0.25-3 0.25-3h0.5l0.25 3-0.25 3zM12.894 11c-0.031 0-4.706-0.003-4.709-0.003-0.1-0.009-0.181-0.097-0.184-0.2v-5.394c0-0.1 0.034-0.15 0.162-0.2 0.331-0.128 0.703-0.203 1.088-0.203 1.566 0 2.85 1.2 2.987 2.734 0.203-0.084 0.425-0.131 0.656-0.131 0.938 0 1.7 0.762 1.7 1.7s-0.762 1.697-1.7 1.697z"></path>
</svg>

After

Width:  |  Height:  |  Size: 693 B

4
assets/img/icons/telegram.svg Executable file
View File

@ -0,0 +1,4 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<path d="M8 0c-4.419 0-8 3.581-8 8s3.581 8 8 8 8-3.581 8-8-3.581-8-8-8zM11.931 5.484l-1.313 6.184c-0.091 0.441-0.356 0.544-0.725 0.341l-2-1.478-0.959 0.934c-0.112 0.109-0.2 0.2-0.4 0.2-0.259 0-0.216-0.097-0.303-0.344l-0.681-2.237-1.978-0.616c-0.428-0.131-0.431-0.425 0.097-0.634l7.706-2.975c0.35-0.159 0.691 0.084 0.556 0.625z"></path>
</svg>

After

Width:  |  Height:  |  Size: 474 B

6
assets/img/icons/twitch.svg Executable file
View File

@ -0,0 +1,6 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<path d="M1.5 0l-1.5 2.5v11.5h4v2h2l2-2h2.5l4.5-4.5v-9.5h-13.5zM13 8.5l-2.5 2.5h-2.5l-2 2v-2h-3v-9h10v6.5z"></path>
<path d="M9.5 4h1.5v4h-1.5v-4z"></path>
<path d="M6.5 4h1.5v4h-1.5v-4z"></path>
</svg>

After

Width:  |  Height:  |  Size: 334 B

4
assets/img/icons/whatsapp.svg Executable file
View File

@ -0,0 +1,4 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<path d="M13.641 2.325c-1.497-1.5-3.488-2.325-5.609-2.325-4.369 0-7.925 3.556-7.925 7.928 0 1.397 0.366 2.763 1.059 3.963l-1.125 4.109 4.203-1.103c1.159 0.631 2.463 0.966 3.787 0.966h0.003c0 0 0 0 0 0 4.369 0 7.928-3.556 7.928-7.928 0-2.119-0.825-4.109-2.322-5.609zM8.034 14.525v0c-1.184 0-2.344-0.319-3.356-0.919l-0.241-0.144-2.494 0.653 0.666-2.431-0.156-0.25c-0.663-1.047-1.009-2.259-1.009-3.506 0-3.634 2.956-6.591 6.594-6.591 1.759 0 3.416 0.688 4.659 1.931 1.244 1.247 1.928 2.9 1.928 4.662-0.003 3.637-2.959 6.594-6.591 6.594zM11.647 9.588c-0.197-0.1-1.172-0.578-1.353-0.644s-0.313-0.1-0.447 0.1c-0.131 0.197-0.512 0.644-0.628 0.778-0.116 0.131-0.231 0.15-0.428 0.050s-0.838-0.309-1.594-0.984c-0.588-0.525-0.987-1.175-1.103-1.372s-0.013-0.306 0.088-0.403c0.091-0.088 0.197-0.231 0.297-0.347s0.131-0.197 0.197-0.331c0.066-0.131 0.034-0.247-0.016-0.347s-0.447-1.075-0.609-1.472c-0.159-0.388-0.325-0.334-0.447-0.341-0.116-0.006-0.247-0.006-0.378-0.006s-0.347 0.050-0.528 0.247c-0.181 0.197-0.694 0.678-0.694 1.653s0.709 1.916 0.809 2.050c0.1 0.131 1.397 2.134 3.384 2.991 0.472 0.203 0.841 0.325 1.128 0.419 0.475 0.15 0.906 0.128 1.247 0.078 0.381-0.056 1.172-0.478 1.338-0.941s0.166-0.859 0.116-0.941c-0.047-0.088-0.178-0.137-0.378-0.238z"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

2
common

@ -1 +1 @@
Subproject commit 97d7e9cfd0bbf8e507e8fdb87fb2cc78aef6a1a6 Subproject commit dc00c3d58af2c23530b8b3cb6704f3860fdd7d0f

View File

@ -0,0 +1,229 @@
<template>
<div
class="figure augmentation"
>
<div class="value-section">
<span class="value-label">Natural boobs</span>
<select
v-model="augmentation.naturalBoobs"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
<div
v-if="augmentation.naturalBoobs === false"
class="value-section"
>
<span class="value-label">Implant CC</span>
<input
v-model="augmentation.boobsVolume"
type="number"
class="volume input"
placeholder="CC"
min="50"
max="10000"
:disabled="!editing.has('augmentation')"
>
</div>
<div
v-if="augmentation.naturalBoobs === false"
class="value-section"
>
<span class="value-label">Implant type</span>
<select
v-model="augmentation.boobsImplant"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option value="saline">Saline</option>
<option value="silicone">Silicone</option>
<option value="gummy">Gummy</option>
<option value="fat">Fat transfer</option>
</select>
</div>
<div
v-if="augmentation.naturalBoobs === false"
class="value-section"
>
<span class="value-label">Implant placement</span>
<select
v-model="augmentation.boobsPlacement"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option value="over">Over muscle</option>
<option value="under">Under muscle</option>
</select>
</div>
<div
v-if="augmentation.naturalBoobs === false"
class="value-section"
>
<span class="value-label">Incision</span>
<select
v-model="augmentation.boobsIncision"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option value="mammary">Under breast</option>
<option value="areolar">Areola</option>
<option value="crescent">Crescent</option>
<option value="lollipop">Lollipop</option>
<option value="anchor">Anchor</option>
<option value="axillary">Armpit</option>
<option value="umbilical">Navel</option>
</select>
</div>
<div
v-if="augmentation.naturalBoobs === false"
class="value-section value-divide"
>
<span class="value-label">Surgeon</span>
<input
v-model="augmentation.boobsSurgeon"
class="volume input"
placeholder="Surgeon"
list="surgeons"
:disabled="!editing.has('augmentation')"
>
<datalist id="surgeons">
<option value="Dr. Revis" />
</datalist>
</div>
<div class="value-section">
<span class="value-label">Natural butt</span>
<select
v-model="augmentation.naturalButt"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
<div
v-if="augmentation.naturalButt === false"
class="value-section"
>
<span class="value-label">Implant CC</span>
<input
v-model="augmentation.buttVolume"
type="number"
class="volume input"
placeholder="CC"
min="50"
max="10000"
:disabled="!editing.has('augmentation')"
>
</div>
<div
v-if="augmentation.naturalButt === false"
class="value-section"
>
<span class="value-label">Implant type</span>
<select
v-model="augmentation.buttImplant"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option value="bbl">BBL (fat transfer)</option>
<option value="lift">Direct lift</option>
<option value="filler">Filler (Sculptra)</option>
<option value="mms">MMS (CoolTone)</option>
<option value="lipo">Lipo without BBL</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Natural lips</span>
<select
v-model="augmentation.naturalLips"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
<div
v-if="augmentation.naturalLips === false"
class="value-section"
>
<span class="value-label">Filler CC</span>
<input
v-model="augmentation.lipsVolume"
type="number"
class="volume input"
placeholder="CC"
min="50"
max="10000"
:disabled="!editing.has('augmentation')"
>
</div>
<div class="value-section">
<span class="value-label">Natural labia</span>
<select
v-model="augmentation.naturalLabia"
class="input"
:disabled="!editing.has('augmentation')"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
</div>
</template>
<script setup>
import { reactive, watch } from 'vue';
const props = defineProps({
edits: {
type: Object,
default: null,
},
editing: {
type: Set,
default: null,
},
});
const emit = defineEmits(['augmentation']);
const augmentation = reactive(props.edits.augmentation);
watch(augmentation, () => emit('augmentation', augmentation));
</script>

147
components/edit/figure.vue Normal file
View File

@ -0,0 +1,147 @@
<template>
<div class="figure">
<div class="value-section">
<span class="value-label">Units</span>
<select
:value="units"
class="input"
:disabled="!editing.has('figure')"
@change="emit('units', $event.target.value)"
>
<option value="us">USA</option>
<option value="uk">UK</option>
<option value="eu">Europe/Asia</option>
<option value="jp">Japan</option>
<option value="au">Australia</option>
<option value="it">Italy</option>
<option value="fr">France</option>
</select>
</div>
<span class="figure-bust">
<div class="value-section">
<span class="value-label">Bust</span>
<select
v-model="figure.bust"
class="select input"
placeholder="Bust"
:disabled="!editing.has('figure')"
>
<option
:key="`figure-bust-unknown`"
:value="null"
/>
<option
v-for="bust in bustSizes[units]"
:key="`figure-bust-${bust}`"
:value="Array.isArray(bust) ? bust[0] : bust"
>{{ Array.isArray(bust) ? bust.join('/') : bust }}</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Cup</span>
<select
v-model="figure.cup"
class="select input"
placeholder="Cup"
:disabled="!editing.has('figure')"
>
<option
:key="`figure-cup-unknown`"
:value="null"
/>
<option
v-for="cup in cupSizes[units]"
:key="`figure-cup-${cup}`"
:value="Array.isArray(cup) ? cup[0] : cup"
>{{ Array.isArray(cup) ? cup.join('/') : cup }}</option>
</select>
</div>
</span>
<div class="value-section">
<span class="value-label">Waist</span>
<span>
<input
v-model="figure.waist"
type="number"
class="input"
:disabled="!editing.has('figure')"
>
<template v-if="['us', 'uk'].includes(units)">&nbsp;inch</template>
<template v-else>&nbsp;cm</template>
</span>
</div>
<div class="value-section">
<span class="value-label">Hip</span>
<span>
<input
v-model="figure.hip"
type="number"
class="input"
:disabled="!editing.has('figure')"
>
<template v-if="['us', 'uk'].includes(units)">&nbsp;inch</template>
<template v-else>&nbsp;cm</template>
</span>
</div>
</div>
</template>
<script setup>
import { reactive, watch } from 'vue';
const props = defineProps({
edits: {
type: Object,
default: null,
},
editing: {
type: Set,
default: null,
},
units: {
type: String,
default: 'us',
},
});
const emit = defineEmits(['figure', 'units']);
const figure = reactive(props.edits.figure);
watch(figure, () => emit('figure', figure));
const cupSizes = {
us: ['AA', 'A', 'B', 'C', 'D', ['DD', 'E'], ['DDD', 'F'], 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'], // United States
uk: ['AA', 'A', 'B', 'C', 'D', 'DD', 'E', 'F', 'FF', 'G', 'GG', 'H', 'HH', 'J', 'JJ', 'K', 'KK'], // United Kingdom
eu: ['AA', 'A', 'B', 'C', 'D', 'E', 'F', 'G', ' H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'], // Europe
jp: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q'], // Japan
};
cupSizes.fr = cupSizes.eu; // France
cupSizes.it = cupSizes.uk; // Italy
cupSizes.au = cupSizes.uk; // Australia
// bra band sizes
const bustSizes = {
us: [28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56],
eu: [60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130],
fr: [75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145],
it: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
au: [6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34],
};
bustSizes.uk = bustSizes.us;
bustSizes.jp = bustSizes.eu;
</script>

109
components/edit/penis.vue Normal file
View File

@ -0,0 +1,109 @@
<template>
<div
class="figure penis"
>
<div class="value-section">
<span class="value-label">Units</span>
<select
:value="units"
class="input"
:disabled="!editing.has('penis')"
@change="emit('units', $event.target.value)"
>
<option value="imperial">Imperial</option>
<option value="metric">Metric</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Penis length</span>
<span v-if="units === 'metric'">
<input
v-model="penis.metricLength"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has('penis')"
> cm
</span>
<span v-if="units === 'imperial'">
<input
v-model="penis.imperialLength"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has('penis')"
> inch
</span>
</div>
<div class="value-section">
<span class="value-label">Penis girth</span>
<span v-if="units === 'metric'">
<input
v-model="penis.metricGirth"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has('penis')"
> cm
</span>
<span v-if="units === 'imperial'">
<input
v-model="penis.imperialGirth"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has('penis')"
> inch
</span>
</div>
<div class="value-section">
<span class="value-label">Circumcised</span>
<select
v-model="penis.isCircumcised"
class="input"
:disabled="!editing.has('penis')"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
</div>
</template>
<script setup>
import { reactive, watch } from 'vue';
const props = defineProps({
edits: {
type: Object,
default: null,
},
editing: {
type: Set,
default: null,
},
units: {
type: String,
default: null,
},
});
const emit = defineEmits(['penis', 'units']);
const penis = reactive(props.edits.penis);
watch(penis, () => emit('penis', penis));
</script>

77
components/edit/place.vue Normal file
View File

@ -0,0 +1,77 @@
<template>
<div
class="place"
>
<div class="value-section">
<span class="value-label">Country</span>
<select
v-model="place.country"
class="select input"
placeholder="Country"
:disabled="!editing.has(item.key)"
>
<option
:key="`${item.key}-country-unknown`"
:value="null"
/>
<option
v-for="country in sortedCountries"
:key="`${item.key}-country-${country.alpha2}`"
:value="country.alpha2"
>{{ country.alias || country.name }}</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Place</span>
<input
v-model="place.place"
class="string input"
:disabled="!editing.has(item.key)"
>
</div>
</div>
</template>
<script setup>
import { reactive, watch, inject } from 'vue';
const props = defineProps({
item: {
type: Object,
default: null,
},
edits: {
type: Object,
default: null,
},
editing: {
type: Set,
default: null,
},
});
const pageContext = inject('pageContext');
const countries = pageContext.pageProps.countries;
const emit = defineEmits(['place']);
const place = reactive(props.edits[props.item.key]);
watch(place, () => emit('place', place));
const topCountries = [
'AU',
'BR',
'CZ',
'DE',
'JP',
'RU',
'GB',
'US',
];
const sortedCountries = countries.toSorted((countryA, countryB) => topCountries.indexOf(countryB.alpha2) - topCountries.indexOf(countryA.alpha2));
</script>

View File

@ -8,7 +8,7 @@
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
class="footer-segment footer-link nolink discord" class="footer-segment footer-link nolink discord"
><Icon icon="discord" /></a> ><Icon icon="discord-full" /></a>
<a <a
v-if="env.links.content" v-if="env.links.content"

View File

@ -217,436 +217,80 @@
</span> </span>
</div> </div>
<div <ul
v-if="item.type === 'list'"
class="list nolist"
:class="{ disabled: !editing.has(item.key) }"
>
<li
v-for="(value, index) in item.value"
:key="`${item.type}-${value}`"
class="list-item"
:class="{ deleted: !edits[item.key].some((listItem) => listItem.value === value.value || listItem.url === value.url) }"
>
<Icon
v-if="value.icon"
:icon="value.icon"
:class="`icon-social icon-${value.icon}`"
/>
<a
v-if="value.url"
:href="value.url"
target="_blank"
class="link"
>{{ value.url }}</a>
<template v-else>{{ value.value || value }}</template>
<Icon
v-if="!edits[item.key].some((listItem) => listItem.value === value.value || listItem.url === value.url)"
icon="checkmark"
class="add noselect"
@click="edits[item.key] = edits[item.key].concat(value)"
/>
<Icon
v-else
icon="cross2"
class="remove noselect"
@click="edits[item.key] = edits[item.key].filter((listItem, listIndex) => listIndex !== index)"
/>
</li>
</ul>
<EditPlace
v-if="item.type === 'place'" v-if="item.type === 'place'"
class="place" :item="item"
> :edits="edits"
<div class="value-section"> :editing="editing"
<span class="value-label">Country</span> @place="(place) => edits[item.key] = place"
<select
v-model="edits[item.key].country"
class="select input"
placeholder="Country"
:disabled="!editing.has(item.key)"
>
<option
:key="`${item.key}-country-unknown`"
:value="null"
/> />
<option <EditFigure
v-for="country in sortedCountries"
:key="`${item.key}-country-${country.alpha2}`"
:value="country.alpha2"
>{{ country.alias || country.name }}</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Place</span>
<input
v-model="edits[item.key].place"
class="string input"
:disabled="!editing.has(item.key)"
>
</div>
</div>
<div
v-if="item.type === 'figure'" v-if="item.type === 'figure'"
class="figure" :edits="edits"
> :editing="editing"
<div class="value-section"> :units="figureUnits"
<span class="value-label">Units</span> @figure="(figure) => edits.figure = figure"
@units="(units) => figureUnits = units"
<select
v-model="figureUnits"
class="input"
:disabled="!editing.has(item.key)"
>
<option value="us">USA</option>
<option value="uk">UK</option>
<option value="eu">Europe/Asia</option>
<option value="jp">Japan</option>
<option value="au">Australia</option>
<option value="it">Italy</option>
<option value="fr">France</option>
</select>
</div>
<span class="figure-bust">
<div class="value-section">
<span class="value-label">Bust</span>
<select
v-model="edits[item.key].bust"
class="select input"
placeholder="Bust"
:disabled="!editing.has(item.key)"
>
<option
:key="`${item.key}-bust-unknown`"
:value="null"
/> />
<option <EditAugmentation
v-for="bust in bustSizes[figureUnits]"
:key="`${item.key}-bust-${bust}`"
:value="Array.isArray(bust) ? bust[0] : bust"
>{{ Array.isArray(bust) ? bust.join('/') : bust }}</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Cup</span>
<select
v-model="edits[item.key].cup"
class="select input"
placeholder="Cup"
:disabled="!editing.has(item.key)"
>
<option
:key="`${item.key}-cup-unknown`"
:value="null"
/>
<option
v-for="cup in cupSizes[figureUnits]"
:key="`${item.key}-cup-${cup}`"
:value="Array.isArray(cup) ? cup[0] : cup"
>{{ Array.isArray(cup) ? cup.join('/') : cup }}</option>
</select>
</div>
</span>
<div class="value-section">
<span class="value-label">Waist</span>
<span>
<input
v-model="edits[item.key].waist"
type="number"
class="input"
:disabled="!editing.has(item.key)"
>
<template v-if="['us', 'uk'].includes(figureUnits)">&nbsp;inch</template>
<template v-else>&nbsp;cm</template>
</span>
</div>
<div class="value-section">
<span class="value-label">Hip</span>
<span>
<input
v-model="edits[item.key].hip"
type="number"
class="input"
:disabled="!editing.has(item.key)"
>
<template v-if="['us', 'uk'].includes(figureUnits)">&nbsp;inch</template>
<template v-else>&nbsp;cm</template>
</span>
</div>
</div>
<div
v-if="item.type === 'augmentation'" v-if="item.type === 'augmentation'"
class="figure augmentation" :edits="edits"
> :editing="editing"
<div class="value-section"> @augmentation="(augmentation) => edits.augmentation = augmentation"
<span class="value-label">Natural boobs</span> />
<select <EditPenis
v-model="edits[item.key].naturalBoobs"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
<div
v-if="edits[item.key].naturalBoobs === false"
class="value-section"
>
<span class="value-label">Implant CC</span>
<input
v-model="edits[item.key].boobsVolume"
type="number"
class="volume input"
placeholder="CC"
min="50"
max="10000"
:disabled="!editing.has(item.key)"
>
</div>
<div
v-if="edits[item.key].naturalBoobs === false"
class="value-section"
>
<span class="value-label">Implant type</span>
<select
v-model="edits[item.key].boobsImplant"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option value="saline">Saline</option>
<option value="silicone">Silicone</option>
<option value="gummy">Gummy</option>
<option value="fat">Fat transfer</option>
</select>
</div>
<div
v-if="edits[item.key].naturalBoobs === false"
class="value-section"
>
<span class="value-label">Implant placement</span>
<select
v-model="edits[item.key].boobsPlacement"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option value="over">Over muscle</option>
<option value="under">Under muscle</option>
</select>
</div>
<div
v-if="edits[item.key].naturalBoobs === false"
class="value-section"
>
<span class="value-label">Incision</span>
<select
v-model="edits[item.key].boobsIncision"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option value="mammary">Under breast</option>
<option value="areolar">Areola</option>
<option value="crescent">Crescent</option>
<option value="lollipop">Lollipop</option>
<option value="anchor">Anchor</option>
<option value="axillary">Armpit</option>
<option value="umbilical">Navel</option>
</select>
</div>
<div
v-if="edits[item.key].naturalBoobs === false"
class="value-section value-divide"
>
<span class="value-label">Surgeon</span>
<input
v-model="edits[item.key].boobsSurgeon"
class="volume input"
placeholder="Surgeon"
list="surgeons"
:disabled="!editing.has(item.key)"
>
<datalist id="surgeons">
<option value="Dr. Revis" />
</datalist>
</div>
<div class="value-section">
<span class="value-label">Natural butt</span>
<select
v-model="edits[item.key].naturalButt"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
<div
v-if="edits[item.key].naturalButt === false"
class="value-section"
>
<span class="value-label">Implant CC</span>
<input
v-model="edits[item.key].buttVolume"
type="number"
class="volume input"
placeholder="CC"
min="50"
max="10000"
:disabled="!editing.has(item.key)"
>
</div>
<div
v-if="edits[item.key].naturalButt === false"
class="value-section"
>
<span class="value-label">Implant type</span>
<select
v-model="edits[item.key].buttImplant"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option value="bbl">BBL (fat transfer)</option>
<option value="lift">Direct lift</option>
<option value="filler">Filler (Sculptra)</option>
<option value="mms">MMS (CoolTone)</option>
<option value="lipo">Lipo without BBL</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Natural lips</span>
<select
v-model="edits[item.key].naturalLips"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
<div
v-if="edits[item.key].naturalLips === false"
class="value-section"
>
<span class="value-label">Filler CC</span>
<input
v-model="edits[item.key].lipsVolume"
type="number"
class="volume input"
placeholder="CC"
min="50"
max="10000"
:disabled="!editing.has(item.key)"
>
</div>
<div class="value-section">
<span class="value-label">Natural labia</span>
<select
v-model="edits[item.key].naturalLabia"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
</div>
<div
v-if="item.type === 'penis'" v-if="item.type === 'penis'"
class="figure penis" :edits="edits"
> :editing="editing"
<div class="value-section"> :units="penisUnits"
<span class="value-label">Units</span> @penis="(penis) => edits.penis = penis"
@units="(units) => penisUnits = units"
<select />
v-model="penisUnits"
class="input"
:disabled="!editing.has(item.key)"
>
<option value="imperial">Imperial</option>
<option value="metric">Metric</option>
</select>
</div>
<div class="value-section">
<span class="value-label">Penis length</span>
<span v-if="penisUnits === 'metric'">
<input
v-model="edits[item.key].metricLength"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has(item.key)"
> cm
</span>
<span v-if="penisUnits === 'imperial'">
<input
v-model="edits[item.key].imperialLength"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has(item.key)"
> inch
</span>
</div>
<div class="value-section">
<span class="value-label">Penis girth</span>
<span v-if="penisUnits === 'metric'">
<input
v-model="edits[item.key].metricGirth"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has(item.key)"
> cm
</span>
<span v-if="penisUnits === 'imperial'">
<input
v-model="edits[item.key].imperialGirth"
type="number"
class="volume input"
min="1"
max="30"
:disabled="!editing.has(item.key)"
> inch
</span>
</div>
<div class="value-section">
<span class="value-label">Circumcised</span>
<select
v-model="edits[item.key].isCircumcised"
class="input"
:disabled="!editing.has(item.key)"
>
<option :value="null" />
<option :value="true">Yes</option>
<option :value="false">No</option>
</select>
</div>
</div>
<div <div
v-if="item.type === 'has'" v-if="item.type === 'has'"
@ -729,6 +373,10 @@
import { ref, computed, inject } from 'vue'; import { ref, computed, inject } from 'vue';
import { format } from 'date-fns'; import { format } from 'date-fns';
import EditPlace from '#/components/edit/place.vue';
import EditFigure from '#/components/edit/figure.vue';
import EditAugmentation from '#/components/edit/augmentation.vue';
import EditPenis from '#/components/edit/penis.vue';
import Avatar from '#/components/edit/avatar.vue'; import Avatar from '#/components/edit/avatar.vue';
import Checkbox from '#/components/form/checkbox.vue'; import Checkbox from '#/components/form/checkbox.vue';
import Ellipsis from '#/components/loading/ellipsis.vue'; import Ellipsis from '#/components/loading/ellipsis.vue';
@ -741,47 +389,10 @@ import {
const pageContext = inject('pageContext'); const pageContext = inject('pageContext');
const user = pageContext.user; const user = pageContext.user;
const countries = pageContext.pageProps.countries;
const actor = ref(pageContext.pageProps.actor); const actor = ref(pageContext.pageProps.actor);
// console.log(actor.value); // console.log(actor.value);
const topCountries = [
'AU',
'BR',
'CZ',
'DE',
'JP',
'RU',
'GB',
'US',
];
const sortedCountries = countries.toSorted((countryA, countryB) => topCountries.indexOf(countryB.alpha2) - topCountries.indexOf(countryA.alpha2));
const cupSizes = {
us: ['AA', 'A', 'B', 'C', 'D', ['DD', 'E'], ['DDD', 'F'], 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'], // United States
uk: ['AA', 'A', 'B', 'C', 'D', 'DD', 'E', 'F', 'FF', 'G', 'GG', 'H', 'HH', 'J', 'JJ', 'K', 'KK'], // United Kingdom
eu: ['AA', 'A', 'B', 'C', 'D', 'E', 'F', 'G', ' H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'], // Europe
jp: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q'], // Japan
};
cupSizes.fr = cupSizes.eu; // France
cupSizes.it = cupSizes.uk; // Italy
cupSizes.au = cupSizes.uk; // Australia
// bra band sizes
const bustSizes = {
us: [28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56],
eu: [60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130],
fr: [75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145],
it: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
au: [6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34],
};
bustSizes.uk = bustSizes.us;
bustSizes.jp = bustSizes.eu;
const fields = computed(() => [ const fields = computed(() => [
...(actor.value.photos.length > 0 ? [{ ...(actor.value.photos.length > 0 ? [{
key: 'avatar', key: 'avatar',
@ -812,18 +423,16 @@ const fields = computed(() => [
: null, : null,
inline: true, inline: true,
}, },
/*
{ {
key: 'ethnicity', key: 'socials',
type: 'string', type: 'list',
value: actor.value.ethnicity, value: actor.value.socials.map((social) => ({
suggestions: [ url: social.url,
'Asian', icon: social.platform,
'Black', })),
'Indian',
'Latina',
'White',
],
}, },
*/
{ {
key: 'origin', key: 'origin',
type: 'place', type: 'place',
@ -840,6 +449,18 @@ const fields = computed(() => [
place: [actor.value.residence?.city, actor.value.residence?.state].filter(Boolean).join(', '), place: [actor.value.residence?.city, actor.value.residence?.state].filter(Boolean).join(', '),
}, },
}, },
{
key: 'ethnicity',
type: 'string',
value: actor.value.ethnicity,
suggestions: [
'Asian',
'Black',
'Indian',
'Latina',
'White',
],
},
{ {
key: 'size', key: 'size',
type: 'size', type: 'size',
@ -935,6 +556,7 @@ const fields = computed(() => [
suggestions: [ suggestions: [
'101 Modeling', '101 Modeling',
'Adult Talent Managers (ATMLA)', 'Adult Talent Managers (ATMLA)',
'AMA Modeling',
'The Bakery Talent', 'The Bakery Talent',
'Coxxx Models', 'Coxxx Models',
'East Coast Talent (ECT)', 'East Coast Talent (ECT)',
@ -1000,6 +622,14 @@ const keyMap = {
country: 'residenceCountry', country: 'residenceCountry',
place: 'residencePlace', place: 'residencePlace',
}, },
tattoos: {
has: 'hasTattoos',
description: 'tattoos',
},
piercings: {
has: 'hasPiercings',
description: 'piercings',
},
}; };
const groupMap = { const groupMap = {
@ -1062,24 +692,23 @@ async function submit() {
} }
</script> </script>
<style scoped> <style>
.editor { .editor {
flex-grow: 1; flex-grow: 1;
background: var(--background-dark-10); background: var(--background-dark-10);
}
.editor-header { .editor-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
padding: 1rem; padding: 1rem;
} }
.heading { .heading {
margin: 0; margin: 0;
} }
.row { .row {
display: flex; display: flex;
align-items: center; align-items: center;
padding: .25rem 1rem; padding: .25rem 1rem;
@ -1093,34 +722,34 @@ async function submit() {
width: auto; width: auto;
} }
} }
} }
.key { .key {
width: 10rem; width: 10rem;
text-transform: capitalize; text-transform: capitalize;
font-weight: bold; font-weight: bold;
} }
.input { .input {
background: var(--background); background: var(--background);
} }
.row .input { .row .input {
height: 2.5rem; height: 2.5rem;
flex-shrink: 0; flex-shrink: 0;
min-width: 7rem; min-width: 7rem;
} }
.select { .select {
text-transform: capitalize; text-transform: capitalize;
} }
.item-header { .item-header {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.value { .value {
display: flex; display: flex;
align-items: center; align-items: center;
flex-grow: 1; flex-grow: 1;
@ -1156,39 +785,39 @@ async function submit() {
&.disabled { &.disabled {
pointer-events: none; pointer-events: none;
} }
} }
.value-section { .value-section {
max-width: 100%; max-width: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.value-label { .value-label {
padding: 0 .25rem; padding: 0 .25rem;
margin-bottom: .25rem; margin-bottom: .25rem;
color: var(--shadow-strong-10); color: var(--shadow-strong-10);
font-size: .8rem; font-size: .8rem;
font-weight: bold; font-weight: bold;
} }
.value-divide { .value-divide {
padding-right: 1rem; padding-right: 1rem;
border-right: solid 1px var(--shadow-weak-30); border-right: solid 1px var(--shadow-weak-30);
margin-right: .5rem; margin-right: .5rem;
} }
.place, .place,
.has, .has,
.figure { .figure {
display: flex; display: flex;
align-items: center; align-items: center;
flex-wrap: wrap; flex-wrap: wrap;
gap: .5rem; gap: .5rem;
overflow: hidden; overflow: hidden;
} }
.figure { .figure {
.input[type="number"] { .input[type="number"] {
width: 5rem; width: 5rem;
} }
@ -1196,14 +825,14 @@ async function submit() {
.input[type="number"].volume { .input[type="number"].volume {
width: 6rem; width: 6rem;
} }
} }
.figure-bust { .figure-bust {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.has { .has {
flex-grow: 1; flex-grow: 1;
.select { .select {
@ -1213,9 +842,64 @@ async function submit() {
.description { .description {
flex-grow: 1; flex-grow: 1;
} }
} }
.avatars { .list {
&.disabled {
opacity: .5;
}
}
.list-item {
display: flex;
align-items: center;
border-radius: .25rem;
background: var(--background);
box-shadow: 0 0 3px var(--shadow-weak-30);
.icon-social {
margin: 0 .5rem;
}
&.deleted {
color: var(--glass);
text-decoration: line-through;
.icon.icon-social {
fill: var(--glass-weak-10);
}
}
.add,
.remove {
padding: .25rem .3rem;
margin-left: .5rem;
border-radius: .25rem;
&:hover {
fill: var(--text-light);
cursor: pointer;
}
}
.add {
fill: var(--success);
&:hover {
background: var(--success);
}
}
.remove {
fill: var(--error);
&:hover {
background: var(--error);
}
}
}
.avatars {
width: 100%; width: 100%;
display: flex; display: flex;
gap: .25rem; gap: .25rem;
@ -1225,9 +909,9 @@ async function submit() {
&.disabled { &.disabled {
opacity: .5; opacity: .5;
} }
} }
.item-actions { .item-actions {
.icon { .icon {
padding: .25rem 1rem; padding: .25rem 1rem;
fill: var(--glass); fill: var(--glass);
@ -1242,9 +926,9 @@ async function submit() {
fill: var(--primary); fill: var(--primary);
} }
} }
} }
.editor-footer { .editor-footer {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
@ -1252,9 +936,9 @@ async function submit() {
padding: 1rem 1rem 0 1rem; padding: 1rem 1rem 0 1rem;
border-top: solid 1px var(--primary-light-30); border-top: solid 1px var(--primary-light-30);
margin: 1rem 0; margin: 1rem 0;
} }
.comment { .comment {
width: 100%; width: 100%;
flex-shrink: 0; flex-shrink: 0;
@ -1262,9 +946,9 @@ async function submit() {
width: 100%; width: 100%;
resize: vertical; resize: vertical;
} }
} }
.editor-actions { .editor-actions {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
@ -1275,15 +959,16 @@ async function submit() {
padding: .5rem 1rem; padding: .5rem 1rem;
font-size: 1.1rem; font-size: 1.1rem;
} }
} }
.submitted { .submitted {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
padding: 1rem; padding: 1rem;
font-weight: bold; font-weight: bold;
line-height: 1.5; line-height: 1.5;
}
} }
@media(--small) { @media(--small) {

View File

@ -114,6 +114,10 @@ export function curateActor(actor, context = {}) {
}, },
agency: actor.agency, agency: actor.agency,
avatar: curateMedia(actor.avatar), avatar: curateMedia(actor.avatar),
socials: context.socials?.map((social) => ({
url: social.url,
platform: social.platform,
})),
profiles: context.profiles?.map((profile) => ({ profiles: context.profiles?.map((profile) => ({
id: profile.id, id: profile.id,
description: profile.description, description: profile.description,
@ -165,7 +169,7 @@ export function sortActorsByGender(actors, context = {}) {
} }
export async function fetchActorsById(actorIds, options = {}, reqUser) { export async function fetchActorsById(actorIds, options = {}, reqUser) {
const [actors, profiles, photos, stashes] = await Promise.all([ const [actors, profiles, photos, socials, stashes] = await Promise.all([
knex('actors') knex('actors')
.select( .select(
'actors.*', 'actors.*',
@ -212,6 +216,8 @@ export async function fetchActorsById(actorIds, options = {}, reqUser) {
.leftJoin('media', 'media.id', 'actors_avatars.media_id') .leftJoin('media', 'media.id', 'actors_avatars.media_id')
.groupBy('media.id', 'actors_avatars.actor_id') .groupBy('media.id', 'actors_avatars.actor_id')
.orderBy(knex.raw('max(actors_avatars.created_at)'), 'desc'), .orderBy(knex.raw('max(actors_avatars.created_at)'), 'desc'),
knex('actors_social')
.whereIn('actor_id', actorIds),
reqUser reqUser
? knex('stashes_actors') ? knex('stashes_actors')
.leftJoin('stashes', 'stashes.id', 'stashes_actors.stash_id') .leftJoin('stashes', 'stashes.id', 'stashes_actors.stash_id')
@ -239,6 +245,7 @@ export async function fetchActorsById(actorIds, options = {}, reqUser) {
stashes: stashes.filter((stash) => stash.actor_id === actor.id), stashes: stashes.filter((stash) => stash.actor_id === actor.id),
profiles: profiles.filter((profile) => profile.actor_id === actor.id), profiles: profiles.filter((profile) => profile.actor_id === actor.id),
photos: photos.filter((photo) => photo.actor_id === actor.id), photos: photos.filter((photo) => photo.actor_id === actor.id),
socials: socials.filter((social) => social.actor_id === actor.id),
append: options.append, append: options.append,
}); });
}).filter(Boolean); }).filter(Boolean);
@ -829,12 +836,17 @@ export async function createActorRevision(actorId, {
return null; return null;
} }
if (key === 'residenceCountry' && edits.residenceCountry) { if (key === 'residenceCountry' && edits.residencePlace) {
// place overrides country // place overrides country
return null; return null;
} }
if (['originPlace', 'residencePlace'].includes(key)) { if (['originPlace', 'residencePlace'].includes(key)) {
if (!value && !baseActor[key]) {
// don't pollute deltas if value is already unset
return null;
}
if (!value) { if (!value) {
return [ return [
// { key: key.includes('origin') ? 'originCountry' : 'residenceCountry', value: null }, // { key: key.includes('origin') ? 'originCountry' : 'residenceCountry', value: null },