-
+
-
+
+ v{{ version }} © {{ new Date().getFullYear() }} Sebin Nyshkim
+
+ Background Pattern ©
+ SVG Backgrounds
+
+
+
diff --git a/src/assets/fonts/dosis/dosis-bold-latin.woff2 b/src/assets/fonts/dosis/dosis-bold-latin.woff2
new file mode 100644
index 0000000..dc48a49
Binary files /dev/null and b/src/assets/fonts/dosis/dosis-bold-latin.woff2 differ
diff --git a/src/assets/fonts/dosis/dosis-regular-latin.woff2 b/src/assets/fonts/dosis/dosis-regular-latin.woff2
new file mode 100644
index 0000000..558cbdb
Binary files /dev/null and b/src/assets/fonts/dosis/dosis-regular-latin.woff2 differ
diff --git a/src/assets/fonts/dosis/dosis.css b/src/assets/fonts/dosis/dosis.css
new file mode 100644
index 0000000..396a50c
--- /dev/null
+++ b/src/assets/fonts/dosis/dosis.css
@@ -0,0 +1,19 @@
+/* dosis-regular-latin */
+@font-face {
+ font-family: Dosis;
+ font-style: normal;
+ font-weight: 400;
+ src: local("Dosis Regular"), local("Dosis-Regular"), url(dosis-regular-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+/* dosis-bold-latin */
+@font-face {
+ font-family: Dosis;
+ font-style: normal;
+ font-weight: 700;
+ src: local("Dosis Bold"), local("Dosis-Bold"), url(dosis-bold-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+
diff --git a/src/assets/fonts/exo/exo-black-italic-latin.woff2 b/src/assets/fonts/exo/exo-black-italic-latin.woff2
new file mode 100644
index 0000000..678c0dd
Binary files /dev/null and b/src/assets/fonts/exo/exo-black-italic-latin.woff2 differ
diff --git a/src/assets/fonts/exo/exo-black-latin.woff2 b/src/assets/fonts/exo/exo-black-latin.woff2
new file mode 100644
index 0000000..8029631
Binary files /dev/null and b/src/assets/fonts/exo/exo-black-latin.woff2 differ
diff --git a/src/assets/fonts/exo/exo-light-italic-latin.woff2 b/src/assets/fonts/exo/exo-light-italic-latin.woff2
new file mode 100644
index 0000000..2813532
Binary files /dev/null and b/src/assets/fonts/exo/exo-light-italic-latin.woff2 differ
diff --git a/src/assets/fonts/exo/exo-light-latin.woff2 b/src/assets/fonts/exo/exo-light-latin.woff2
new file mode 100644
index 0000000..0d07ce5
Binary files /dev/null and b/src/assets/fonts/exo/exo-light-latin.woff2 differ
diff --git a/src/assets/fonts/exo/exo.css b/src/assets/fonts/exo/exo.css
new file mode 100644
index 0000000..988fd76
--- /dev/null
+++ b/src/assets/fonts/exo/exo.css
@@ -0,0 +1,37 @@
+/* exo-light-latin */
+@font-face {
+ font-family: Exo;
+ font-style: normal;
+ font-weight: 300;
+ src: local("Exo Light"), local("Exo-Light"), url(exo-light-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+/* exo-black-latin */
+@font-face {
+ font-family: Exo;
+ font-style: normal;
+ font-weight: 900;
+ src: local("Exo Black"), local("Exo-Black"), url(exo-black-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+/* exo-light-italic-latin */
+@font-face {
+ font-family: Exo;
+ font-style: italic;
+ font-weight: 300;
+ src: local("Exo Light Italic"), local("Exo-LightItalic"), url(exo-light-italic-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+/* exo-black-italic-latin */
+@font-face {
+ font-family: Exo;
+ font-style: italic;
+ font-weight: 900;
+ src: local("Exo Black Italic"), local("Exo-BlackItalic"), url(exo-black-italic-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+
diff --git a/src/assets/fonts/permanent-marker/permanent-marker-regular-latin.woff2 b/src/assets/fonts/permanent-marker/permanent-marker-regular-latin.woff2
new file mode 100644
index 0000000..3178e94
Binary files /dev/null and b/src/assets/fonts/permanent-marker/permanent-marker-regular-latin.woff2 differ
diff --git a/src/assets/fonts/permanent-marker/permanent-marker.css b/src/assets/fonts/permanent-marker/permanent-marker.css
new file mode 100644
index 0000000..4cb9429
--- /dev/null
+++ b/src/assets/fonts/permanent-marker/permanent-marker.css
@@ -0,0 +1,10 @@
+/* permanent-marker-regular-latin */
+@font-face {
+ font-family: Permanent Marker;
+ font-style: normal;
+ font-weight: 400;
+ src: local("Permanent Marker Regular"), local("PermanentMarker-Regular"), url(permanent-marker-regular-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+
diff --git a/src/assets/fonts/zilla-slab/zilla-slab-bold-latin.woff2 b/src/assets/fonts/zilla-slab/zilla-slab-bold-latin.woff2
new file mode 100644
index 0000000..c359847
Binary files /dev/null and b/src/assets/fonts/zilla-slab/zilla-slab-bold-latin.woff2 differ
diff --git a/src/assets/fonts/zilla-slab/zilla-slab.css b/src/assets/fonts/zilla-slab/zilla-slab.css
new file mode 100644
index 0000000..dfb96c0
--- /dev/null
+++ b/src/assets/fonts/zilla-slab/zilla-slab.css
@@ -0,0 +1,10 @@
+/* zilla-slab-bold-latin */
+@font-face {
+ font-family: Zilla Slab;
+ font-style: normal;
+ font-weight: 700;
+ src: local("Zilla Slab Bold"), local("ZillaSlab-Bold"), url(zilla-slab-bold-latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2212,U+2215;
+ font-display: swap;
+}
+
diff --git a/src/assets/img/clothes-ref/cold/boots.jpg b/src/assets/img/clothes-ref/cold/boots.jpg
deleted file mode 100644
index 83fa86b..0000000
Binary files a/src/assets/img/clothes-ref/cold/boots.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/cold/coat.jpg b/src/assets/img/clothes-ref/cold/coat.jpg
deleted file mode 100644
index 28a7293..0000000
Binary files a/src/assets/img/clothes-ref/cold/coat.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/cold/hoodie.jpg b/src/assets/img/clothes-ref/cold/hoodie.jpg
deleted file mode 100644
index 186f5b6..0000000
Binary files a/src/assets/img/clothes-ref/cold/hoodie.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/cold/jeans.jpg b/src/assets/img/clothes-ref/cold/jeans.jpg
deleted file mode 100644
index 3de4bac..0000000
Binary files a/src/assets/img/clothes-ref/cold/jeans.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/cold/scarf.jpg b/src/assets/img/clothes-ref/cold/scarf.jpg
deleted file mode 100644
index 717a0eb..0000000
Binary files a/src/assets/img/clothes-ref/cold/scarf.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/lazy/pants.jpg b/src/assets/img/clothes-ref/lazy/pants.jpg
deleted file mode 100644
index a1fc86f..0000000
Binary files a/src/assets/img/clothes-ref/lazy/pants.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/lazy/undies.jpg b/src/assets/img/clothes-ref/lazy/undies.jpg
deleted file mode 100644
index 72314b1..0000000
Binary files a/src/assets/img/clothes-ref/lazy/undies.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/warm/hoodie.jpg b/src/assets/img/clothes-ref/warm/hoodie.jpg
deleted file mode 100644
index 4d261fe..0000000
Binary files a/src/assets/img/clothes-ref/warm/hoodie.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/warm/shorts.jpg b/src/assets/img/clothes-ref/warm/shorts.jpg
deleted file mode 100644
index 5e38f89..0000000
Binary files a/src/assets/img/clothes-ref/warm/shorts.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/warm/sneakers.jpg b/src/assets/img/clothes-ref/warm/sneakers.jpg
deleted file mode 100644
index c1e9a45..0000000
Binary files a/src/assets/img/clothes-ref/warm/sneakers.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/warm/tank-top.jpg b/src/assets/img/clothes-ref/warm/tank-top.jpg
deleted file mode 100644
index 6464439..0000000
Binary files a/src/assets/img/clothes-ref/warm/tank-top.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/workout/apple-watch.jpg b/src/assets/img/clothes-ref/workout/apple-watch.jpg
deleted file mode 100644
index 99aecf0..0000000
Binary files a/src/assets/img/clothes-ref/workout/apple-watch.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/workout/gloves.jpg b/src/assets/img/clothes-ref/workout/gloves.jpg
deleted file mode 100644
index 69a2f2d..0000000
Binary files a/src/assets/img/clothes-ref/workout/gloves.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/workout/hoodie.jpg b/src/assets/img/clothes-ref/workout/hoodie.jpg
deleted file mode 100644
index 57bea54..0000000
Binary files a/src/assets/img/clothes-ref/workout/hoodie.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/workout/shorts.jpg b/src/assets/img/clothes-ref/workout/shorts.jpg
deleted file mode 100644
index d62f573..0000000
Binary files a/src/assets/img/clothes-ref/workout/shorts.jpg and /dev/null differ
diff --git a/src/assets/img/clothes-ref/workout/tank-top.jpg b/src/assets/img/clothes-ref/workout/tank-top.jpg
deleted file mode 100644
index 5698427..0000000
Binary files a/src/assets/img/clothes-ref/workout/tank-top.jpg and /dev/null differ
diff --git a/src/assets/img/fullbody-ref.jpg b/src/assets/img/fullbody-ref.jpg
deleted file mode 100644
index d37b649..0000000
Binary files a/src/assets/img/fullbody-ref.jpg and /dev/null differ
diff --git a/src/assets/img/head-ref.jpg b/src/assets/img/head-ref.jpg
deleted file mode 100644
index a3870f0..0000000
Binary files a/src/assets/img/head-ref.jpg and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref1.png b/src/assets/img/muscle-ref/muscle-ref1.png
deleted file mode 100644
index fcdc060..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref1.png and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref10.png b/src/assets/img/muscle-ref/muscle-ref10.png
deleted file mode 100644
index 49e1e80..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref10.png and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref11.jpeg b/src/assets/img/muscle-ref/muscle-ref11.jpeg
deleted file mode 100644
index dcd5b5f..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref11.jpeg and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref2.png b/src/assets/img/muscle-ref/muscle-ref2.png
deleted file mode 100644
index c557415..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref2.png and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref3.png b/src/assets/img/muscle-ref/muscle-ref3.png
deleted file mode 100644
index e3136dd..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref3.png and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref4.png b/src/assets/img/muscle-ref/muscle-ref4.png
deleted file mode 100644
index 7f92390..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref4.png and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref5.jpeg b/src/assets/img/muscle-ref/muscle-ref5.jpeg
deleted file mode 100644
index 3233206..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref5.jpeg and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref6.png b/src/assets/img/muscle-ref/muscle-ref6.png
deleted file mode 100644
index b50ca61..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref6.png and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref7.png b/src/assets/img/muscle-ref/muscle-ref7.png
deleted file mode 100644
index 509c6db..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref7.png and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref8.jpeg b/src/assets/img/muscle-ref/muscle-ref8.jpeg
deleted file mode 100644
index 6eab260..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref8.jpeg and /dev/null differ
diff --git a/src/assets/img/muscle-ref/muscle-ref9.jpeg b/src/assets/img/muscle-ref/muscle-ref9.jpeg
deleted file mode 100644
index 6e3e9bf..0000000
Binary files a/src/assets/img/muscle-ref/muscle-ref9.jpeg and /dev/null differ
diff --git a/src/assets/img/penis-ref.jpg b/src/assets/img/penis-ref.jpg
deleted file mode 100644
index 71e35df..0000000
Binary files a/src/assets/img/penis-ref.jpg and /dev/null differ
diff --git a/src/assets/img/upper-body-ref.png b/src/assets/img/upper-body-ref.png
deleted file mode 100644
index d7eaac1..0000000
Binary files a/src/assets/img/upper-body-ref.png and /dev/null differ
diff --git a/src/assets/refs/attacks/sebin-burning_twister-hires.png b/src/assets/refs/attacks/sebin-burning_twister-hires.png
new file mode 100644
index 0000000..9f163c5
Binary files /dev/null and b/src/assets/refs/attacks/sebin-burning_twister-hires.png differ
diff --git a/src/assets/refs/attacks/sebin-fire_breath-hires.png b/src/assets/refs/attacks/sebin-fire_breath-hires.png
new file mode 100644
index 0000000..695a168
Binary files /dev/null and b/src/assets/refs/attacks/sebin-fire_breath-hires.png differ
diff --git a/src/assets/refs/attacks/sebin-flame_toss-hires.png b/src/assets/refs/attacks/sebin-flame_toss-hires.png
new file mode 100644
index 0000000..25d2fee
Binary files /dev/null and b/src/assets/refs/attacks/sebin-flame_toss-hires.png differ
diff --git a/src/assets/refs/attacks/sebin-kindled_fist-hires.png b/src/assets/refs/attacks/sebin-kindled_fist-hires.png
new file mode 100644
index 0000000..9063104
Binary files /dev/null and b/src/assets/refs/attacks/sebin-kindled_fist-hires.png differ
diff --git a/src/assets/refs/clothes/casual/fullbody.png b/src/assets/refs/clothes/casual/fullbody.png
new file mode 100644
index 0000000..bfe5dd3
Binary files /dev/null and b/src/assets/refs/clothes/casual/fullbody.png differ
diff --git a/src/assets/refs/clothes/cold/fullbody.png b/src/assets/refs/clothes/cold/fullbody.png
new file mode 100755
index 0000000..1123ea8
Binary files /dev/null and b/src/assets/refs/clothes/cold/fullbody.png differ
diff --git a/src/assets/refs/clothes/lazy/fullbody.png b/src/assets/refs/clothes/lazy/fullbody.png
new file mode 100644
index 0000000..e0eac9b
Binary files /dev/null and b/src/assets/refs/clothes/lazy/fullbody.png differ
diff --git a/src/assets/refs/clothes/lazy/undies.png b/src/assets/refs/clothes/lazy/undies.png
new file mode 100644
index 0000000..f230c12
Binary files /dev/null and b/src/assets/refs/clothes/lazy/undies.png differ
diff --git a/src/assets/refs/clothes/workout/closeup.png b/src/assets/refs/clothes/workout/closeup.png
new file mode 100644
index 0000000..4ba1f43
Binary files /dev/null and b/src/assets/refs/clothes/workout/closeup.png differ
diff --git a/src/assets/refs/clothes/workout/fullbody.png b/src/assets/refs/clothes/workout/fullbody.png
new file mode 100644
index 0000000..f21c32e
Binary files /dev/null and b/src/assets/refs/clothes/workout/fullbody.png differ
diff --git a/src/assets/refs/muscle/muscle-ref1.png b/src/assets/refs/muscle/muscle-ref1.png
new file mode 100644
index 0000000..feb6374
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref1.png differ
diff --git a/src/assets/refs/muscle/muscle-ref10.jpg b/src/assets/refs/muscle/muscle-ref10.jpg
new file mode 100644
index 0000000..6279e5c
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref10.jpg differ
diff --git a/src/assets/refs/muscle/muscle-ref11.png b/src/assets/refs/muscle/muscle-ref11.png
new file mode 100644
index 0000000..40d8157
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref11.png differ
diff --git a/src/assets/refs/muscle/muscle-ref12.png b/src/assets/refs/muscle/muscle-ref12.png
new file mode 100644
index 0000000..ae87466
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref12.png differ
diff --git a/src/assets/refs/muscle/muscle-ref2.png b/src/assets/refs/muscle/muscle-ref2.png
new file mode 100644
index 0000000..da40954
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref2.png differ
diff --git a/src/assets/refs/muscle/muscle-ref3.png b/src/assets/refs/muscle/muscle-ref3.png
new file mode 100644
index 0000000..eb71d35
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref3.png differ
diff --git a/src/assets/refs/muscle/muscle-ref4.png b/src/assets/refs/muscle/muscle-ref4.png
new file mode 100644
index 0000000..9aea9ae
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref4.png differ
diff --git a/src/assets/refs/muscle/muscle-ref5.jpg b/src/assets/refs/muscle/muscle-ref5.jpg
new file mode 100644
index 0000000..7ebd590
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref5.jpg differ
diff --git a/src/assets/refs/muscle/muscle-ref6.png b/src/assets/refs/muscle/muscle-ref6.png
new file mode 100644
index 0000000..818b4eb
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref6.png differ
diff --git a/src/assets/refs/muscle/muscle-ref7.tiff b/src/assets/refs/muscle/muscle-ref7.tiff
new file mode 100644
index 0000000..c9b5ce6
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref7.tiff differ
diff --git a/src/assets/refs/muscle/muscle-ref8.png b/src/assets/refs/muscle/muscle-ref8.png
new file mode 100644
index 0000000..30e5f42
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref8.png differ
diff --git a/src/assets/refs/muscle/muscle-ref9.jpg b/src/assets/refs/muscle/muscle-ref9.jpg
new file mode 100644
index 0000000..105bfbb
Binary files /dev/null and b/src/assets/refs/muscle/muscle-ref9.jpg differ
diff --git a/src/assets/img/sebin-hairstyle-short.jpg b/src/assets/refs/sebin-hairstyle-short.jpg
similarity index 100%
rename from src/assets/img/sebin-hairstyle-short.jpg
rename to src/assets/refs/sebin-hairstyle-short.jpg
diff --git a/src/assets/img/sebin-overdrive_ref-hires.jpg b/src/assets/refs/sebin-overdrive_ref-hires.jpg
similarity index 100%
rename from src/assets/img/sebin-overdrive_ref-hires.jpg
rename to src/assets/refs/sebin-overdrive_ref-hires.jpg
diff --git a/src/assets/refs/sebin-ref-body-NSFW.png b/src/assets/refs/sebin-ref-body-NSFW.png
new file mode 100644
index 0000000..f364c57
Binary files /dev/null and b/src/assets/refs/sebin-ref-body-NSFW.png differ
diff --git a/src/assets/refs/sebin-ref-body-SFW.png b/src/assets/refs/sebin-ref-body-SFW.png
new file mode 100644
index 0000000..9ba857f
Binary files /dev/null and b/src/assets/refs/sebin-ref-body-SFW.png differ
diff --git a/src/assets/refs/sebin-ref-expressions.png b/src/assets/refs/sebin-ref-expressions.png
new file mode 100644
index 0000000..b8bb9b5
Binary files /dev/null and b/src/assets/refs/sebin-ref-expressions.png differ
diff --git a/src/assets/refs/sebin-ref-penis.png b/src/assets/refs/sebin-ref-penis.png
new file mode 100644
index 0000000..ed0f227
Binary files /dev/null and b/src/assets/refs/sebin-ref-penis.png differ
diff --git a/src/assets/img/sebin-smug-icon.png b/src/assets/refs/sebin-smug-icon.png
similarity index 100%
rename from src/assets/img/sebin-smug-icon.png
rename to src/assets/refs/sebin-smug-icon.png
diff --git a/src/assets/refs/upper-body-ref.png b/src/assets/refs/upper-body-ref.png
new file mode 100644
index 0000000..1670811
Binary files /dev/null and b/src/assets/refs/upper-body-ref.png differ
diff --git a/src/assets/sebin-smug-icon.png b/src/assets/sebin-smug-icon.png
new file mode 100644
index 0000000..8dcce6e
Binary files /dev/null and b/src/assets/sebin-smug-icon.png differ
diff --git a/src/assets/subtle-prism.svg b/src/assets/subtle-prism.svg
new file mode 100644
index 0000000..4b4e092
--- /dev/null
+++ b/src/assets/subtle-prism.svg
@@ -0,0 +1,78 @@
+๏ปฟ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/AttackItem.vue b/src/components/AttackItem.vue
new file mode 100644
index 0000000..125b659
--- /dev/null
+++ b/src/components/AttackItem.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/AttackList.vue b/src/components/AttackList.vue
new file mode 100644
index 0000000..153c1a4
--- /dev/null
+++ b/src/components/AttackList.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/src/components/ButtonGroup.vue b/src/components/ButtonGroup.vue
new file mode 100644
index 0000000..8671295
--- /dev/null
+++ b/src/components/ButtonGroup.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ColorTable.vue b/src/components/ColorTable.vue
new file mode 100644
index 0000000..de5c01e
--- /dev/null
+++ b/src/components/ColorTable.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ Body part
+ Value
+ Color
+
+
+
+
+ {{ color.name }}
+ {{ color.value }}
+
+
+
+
+
+
+
diff --git a/src/components/DataTable.vue b/src/components/DataTable.vue
index 537706c..69fb8e3 100644
--- a/src/components/DataTable.vue
+++ b/src/components/DataTable.vue
@@ -1,95 +1,37 @@
+
+
-
-
-
-
- {{ header }}
+
+
+
+
+ {{ heading }}
-
-
-
+
+
+
{{ cell }}
-
-
-
diff --git a/src/components/Figure.vue b/src/components/Figure.vue
deleted file mode 100644
index 7a3ef22..0000000
--- a/src/components/Figure.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/FilterButton.vue b/src/components/FilterButton.vue
new file mode 100644
index 0000000..f040486
--- /dev/null
+++ b/src/components/FilterButton.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+ {{ Ratings[value] }}
+
+
+
+
+
diff --git a/src/components/FilterListTag.vue b/src/components/FilterListTag.vue
new file mode 100644
index 0000000..1c6acee
--- /dev/null
+++ b/src/components/FilterListTag.vue
@@ -0,0 +1,77 @@
+
+
+
+
+ {{ type }}
+
+
+
+
diff --git a/src/components/FilteredList.vue b/src/components/FilteredList.vue
new file mode 100644
index 0000000..f570fe9
--- /dev/null
+++ b/src/components/FilteredList.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ Select one of the categories above
+
+
+
+
+
+
diff --git a/src/components/Footer.vue b/src/components/Footer.vue
deleted file mode 100644
index 41bbe25..0000000
--- a/src/components/Footer.vue
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/components/Gallery.vue b/src/components/Gallery.vue
deleted file mode 100644
index b42d625..0000000
--- a/src/components/Gallery.vue
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
- {{ images.indexOf(bigImage) + 1 }} / {{ images.length }}
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/Header.vue b/src/components/Header.vue
deleted file mode 100644
index 5873cc3..0000000
--- a/src/components/Header.vue
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
- This page contains materials considered NSFW. Do you wish to see such
- content?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue
deleted file mode 100644
index def5338..0000000
--- a/src/components/Navbar.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/components/NsfwSwitch.vue b/src/components/NsfwSwitch.vue
deleted file mode 100644
index c3b3557..0000000
--- a/src/components/NsfwSwitch.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
- ๐
-
- ๐
-
-
-
-
-
-
diff --git a/src/components/QuickFacts.vue b/src/components/QuickFacts.vue
new file mode 100644
index 0000000..aadd06d
--- /dev/null
+++ b/src/components/QuickFacts.vue
@@ -0,0 +1,95 @@
+
+
+
+
+ Quickfacts
+
+
+
+
+
+
+
diff --git a/src/components/RefButton.vue b/src/components/RefButton.vue
new file mode 100644
index 0000000..865e952
--- /dev/null
+++ b/src/components/RefButton.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/RefFigure.vue b/src/components/RefFigure.vue
new file mode 100644
index 0000000..e6b752f
--- /dev/null
+++ b/src/components/RefFigure.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/RefGallery.vue b/src/components/RefGallery.vue
new file mode 100644
index 0000000..1822116
--- /dev/null
+++ b/src/components/RefGallery.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
diff --git a/src/components/RefModal.vue b/src/components/RefModal.vue
new file mode 100644
index 0000000..d21ed1f
--- /dev/null
+++ b/src/components/RefModal.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/RefToggle.vue b/src/components/RefToggle.vue
new file mode 100644
index 0000000..06f7a6f
--- /dev/null
+++ b/src/components/RefToggle.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/SiteFooter.vue b/src/components/SiteFooter.vue
new file mode 100644
index 0000000..398cac7
--- /dev/null
+++ b/src/components/SiteFooter.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/src/components/SiteHeader.vue b/src/components/SiteHeader.vue
new file mode 100644
index 0000000..6cdf318
--- /dev/null
+++ b/src/components/SiteHeader.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/src/components/SiteNavigation.vue b/src/components/SiteNavigation.vue
new file mode 100644
index 0000000..6ee13dd
--- /dev/null
+++ b/src/components/SiteNavigation.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+ {{ route.name }}
+
+
+
+
+
+
+
+
diff --git a/src/components/WelcomeHeader.vue b/src/components/WelcomeHeader.vue
new file mode 100644
index 0000000..a870d50
--- /dev/null
+++ b/src/components/WelcomeHeader.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/helpers.ts b/src/helpers.ts
new file mode 100644
index 0000000..dc0e1ed
--- /dev/null
+++ b/src/helpers.ts
@@ -0,0 +1,67 @@
+const debounce = (fn: Function, delay: number = 300): any => {
+ let timer = 0
+ const debounced = (...args: any[]): void => {
+ if (!args) args = []
+ clearTimeout(timer)
+
+ timer = setTimeout(() => {
+ fn.apply(fn, args)
+ }, delay)
+ }
+
+ return debounced
+}
+
+const getClientLocale = (): string => {
+ return navigator.languages.length > 0 ? navigator.languages[0] : 'en-US'
+}
+
+const getAge = (dateOfBirth: Date): number => {
+ const today = new Date()
+
+ const thisYear = today.getFullYear()
+ const thisMonth = today.getMonth()
+ const thisDay = today.getDate()
+
+ const dobYear = dateOfBirth.getFullYear()
+ const dobMonth = dateOfBirth.getMonth()
+ const dobDay = dateOfBirth.getDate()
+
+ let age = thisYear - dobYear
+
+ if (thisMonth < dobMonth) age--
+ if (thisMonth === dobMonth && thisDay < dobDay) age--
+
+ return age
+}
+
+const toImperial = (cm: number): string => {
+ const realFeet = (cm * 0.3937) / 12
+ const feet = Math.floor(realFeet)
+ const inches = Math.round((realFeet - feet) * 12)
+
+ return `${feet}'${inches}"`
+}
+
+const toInch = (cm: number): string => {
+ return `${Math.round(cm / 2.45)} in`
+}
+
+const toLbs = (kg: number): number => {
+ const nearExact = kg / 0.45359237
+ const lbs = Math.floor(nearExact)
+
+ return lbs
+}
+
+const toFahrenheit = (celsius: number): number => {
+ return celsius * 1.8 + 32
+}
+
+const dateFormat = new Intl.DateTimeFormat(getClientLocale(), {
+ year: 'numeric',
+ month: 'long',
+ day: '2-digit'
+})
+
+export { debounce, getClientLocale, getAge, toImperial, toInch, toLbs, toFahrenheit, dateFormat }
diff --git a/src/interfaces.ts b/src/interfaces.ts
new file mode 100644
index 0000000..626e015
--- /dev/null
+++ b/src/interfaces.ts
@@ -0,0 +1,25 @@
+interface ColorDict {
+ name: string
+ value: string
+}
+
+interface Kink {
+ name: string
+ rating: number
+ role?: Role
+}
+
+export enum Ratings {
+ Love,
+ Yes,
+ Maybe,
+ No
+}
+
+export enum Role {
+ Give = 1,
+ Receive = 2,
+ Both = Give | Receive
+}
+
+export type { ColorDict, Kink }
diff --git a/src/keys.ts b/src/keys.ts
new file mode 100644
index 0000000..3f3c949
--- /dev/null
+++ b/src/keys.ts
@@ -0,0 +1,5 @@
+import type { InjectionKey, Ref } from 'vue'
+
+export const nsfwKey: InjectionKey[> = Symbol('nsfwKey')
+export const showModalKey: InjectionKey] = Symbol('showModalKey')
+export const modalResultKey: InjectionKey = Symbol('modalResultKey')
diff --git a/src/main.js b/src/main.js
deleted file mode 100644
index 23d4647..0000000
--- a/src/main.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import Vue from "vue";
-import VueScrollTo from "vue-scrollto";
-import App from "./App.vue";
-
-Vue.config.productionTip = false;
-
-Vue.use(VueScrollTo, { offset: -55 });
-
-new Vue({
- render: h => h(App)
-}).$mount("#app");
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..6dd7082
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,12 @@
+import { createApp } from 'vue'
+import App from './App.vue'
+import router from './router'
+
+import 'normalize.css'
+import '@/scss/main.scss'
+
+const app = createApp(App)
+
+app.use(router)
+
+app.mount('body')
diff --git a/src/mixins/Helper.js b/src/mixins/Helper.js
deleted file mode 100644
index f8a2f18..0000000
--- a/src/mixins/Helper.js
+++ /dev/null
@@ -1,34 +0,0 @@
-export default {
- methods: {
- getClientLocale() {
- if (navigator.language) {
- return navigator.languages[0];
- } else if (navigator.userLanguage) {
- return navigator.userLanguage; // IE < 11
- } else if (navigator.browserLanguage) {
- return navigator.userLanguage;
- } else if (navigator.systemLanguage) {
- return navigator.systemLanguage;
- }
- },
-
- toImperial(cm) {
- const realFeet = (cm * 0.3937) / 12;
- const feet = Math.floor(realFeet);
- const inches = Math.round((realFeet - feet) * 12);
-
- return `${feet}'${inches}"`;
- },
-
- toInch(cm) {
- return `${Math.round(cm / 2.45)} in`;
- },
-
- toLbs(kg) {
- const nearExact = kg / 0.45359237;
- const lbs = Math.floor(nearExact);
-
- return lbs;
- }
- }
-};
diff --git a/src/mixins/Sebin.js b/src/mixins/Sebin.js
deleted file mode 100644
index 27318c8..0000000
--- a/src/mixins/Sebin.js
+++ /dev/null
@@ -1,93 +0,0 @@
-export default {
- data() {
- return {
- firstName: "Sebin",
- middleName: "Antario",
- lastName: "Nyshkim",
- dateOfBirth: new Date("1988-04-25"),
- gender: "male โ๏ธ",
- height: 210, // cm
- weight: 124, // kg
- wingspan: 350, // cm
- colors: {
- hairPrimary: "#4b608f",
- hairSecondary: "#6684c0",
- eyes: "#31c215",
- scalesPrimary: "#c64c35",
- scalesSecondary: "#eda958",
- eyebrows: "#eda958",
- tailspikes: "#7f4539",
- horns: "#413a3a",
- claws: "#413a3a",
- nipples: "#413a3a",
- penis: "#413a3a"
- },
- penis: {
- shape: "humanoid",
- type: "grower",
- special: "ridged",
- size: 20, // cm
- girth: 5 // cm
- }
- };
- },
-
- computed: {
- fullName() {
- return `${this.firstName} ${this.middleName} ${this.lastName}`;
- },
- birthdate() {
- const locale = this.getClientLocale();
-
- return this.dateOfBirth.toLocaleDateString(locale, {
- year: "numeric",
- month: "long",
- day: "2-digit"
- });
- },
- getSebinData() {
- const generic = {
- headers: ["Key", "Value"],
- data: [
- ["Full Name", this.fullName],
- ["Date of Birth", this.birthdate],
- ["Sex/Gender", this.gender],
- ["Height", `${this.height} cm (${this.toImperial(this.height)})`],
- ["Weight", `${this.weight} kg (${this.toLbs(this.weight)} lbs)`],
- [
- "Wingspan",
- `${this.wingspan / 100} m (${this.toImperial(this.wingspan)})`
- ]
- ]
- };
-
- const colors = {
- headers: ["Body Part", "Color (hex)", "Color"],
- data: [
- ["Scale Color", this.colors.scalesPrimary],
- ["Chestplate Color", this.colors.scalesSecondary],
- ["Hair Color", this.colors.hairPrimary],
- ["Hair Streaks", this.colors.hairSecondary],
- ["Eyes", this.colors.eyes],
- ["Facial Spikes", this.colors.eyebrows],
- ["Horns/Claws/Nipples", this.colors.horns],
- ["Tail Spikes", this.colors.tailspikes]
- ]
- };
-
- const penis = {
- headers: ["Key", "Value", "Color"],
- data: [
- ["Shape", this.penis.shape],
- ["Type", this.penis.type],
- ["Special Traits", this.penis.special],
- ["Color", this.colors.penis],
- ["Length", `${this.penis.size} cm (${this.toInch(this.penis.size)})`],
- ["Girth", `${this.penis.girth} cm (${this.toInch(this.penis.girth)})`]
- ]
- };
-
- return { generic, colors, penis };
- }
- }
-};
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..632abc2
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,43 @@
+import { createRouter, createWebHistory } from 'vue-router'
+import HomeView from '@/views/HomeView.vue'
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.BASE_URL),
+ scrollBehavior() {
+ return { top: 0, behavior: 'smooth' }
+ },
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: HomeView
+ },
+ {
+ path: '/general',
+ name: 'general',
+ component: () => import('@/views/GeneralView.vue')
+ },
+ {
+ path: '/anatomy',
+ name: 'anatomy',
+ component: () => import('@/views/AnatomyView.vue')
+ },
+ {
+ path: '/clothing',
+ name: 'clothing',
+ component: () => import('@/views/ClothingView.vue')
+ },
+ {
+ path: '/abilities',
+ name: 'abilities',
+ component: () => import('@/views/AbilitiesView.vue')
+ },
+ {
+ path: '/overdrive',
+ name: 'overdrive',
+ component: () => import('@/views/OverdriveView.vue')
+ }
+ ]
+})
+
+export default router
diff --git a/src/scss/_flex.scss b/src/scss/_flex.scss
deleted file mode 100644
index bc23266..0000000
--- a/src/scss/_flex.scss
+++ /dev/null
@@ -1,67 +0,0 @@
-.flex {
- display: flex;
- flex-flow: row wrap;
-
- &--row {
- flex-direction: row;
- }
-
- &--column {
- flex-direction: column;
- }
-
- &--nowrap {
- flex-wrap: nowrap;
- }
-
- &--center {
- justify-content: center;
-
- &-v {
- align-items: center;
- }
- }
-
- &--end {
- justify-content: flex-end;
-
- &-v {
- align-items: flex-end;
- }
- }
-
- > .col {
- flex: 1 0 0;
- max-width: 100%;
-
- &--center {
- text-align: center;
-
- &-v {
- align-self: center;
- }
- }
-
- @for $i from 1 through 12 {
- &-#{$i} {
- $width: percentage(($i / 12));
- flex: 0 0 $width;
- max-width: $width;
- }
- @include mq-desktop {
- &-d-#{$i} {
- $width: percentage(($i / 12));
- flex: 0 0 $width;
- max-width: $width;
- }
- }
- @include mq-mobile {
- &-m-#{$i} {
- $width: percentage(($i / 12));
- flex: 0 0 $width;
- max-width: $width;
- }
- }
- }
- }
-}
diff --git a/src/scss/_mixins.scss b/src/scss/_mixins.scss
deleted file mode 100644
index 5e31260..0000000
--- a/src/scss/_mixins.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-@mixin mq-desktop() {
- @media (min-width: 35em) {
- @content
- }
-};
-
-@mixin mq-mobile() {
- @media (max-width: 34.9em) {
- @content
- }
-};
diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss
deleted file mode 100644
index 82ffdfc..0000000
--- a/src/scss/_variables.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-$bg-color-light: #e74c3c;
-$bg-color-dark: #2c3e50;
-$bg-color-warning: #ec9b00;
-$copy-color: #fff;
-$copy-color-grey: #dedede;
-$copy-color-darkgrey: #303030;
diff --git a/src/scss/base.scss b/src/scss/base.scss
index a3367bb..170ecd2 100644
--- a/src/scss/base.scss
+++ b/src/scss/base.scss
@@ -1,53 +1,293 @@
-@import url("https://fonts.googleapis.com/css?family=Exo:300,300i,900,900i|Fira+Sans+Extra+Condensed:300,700&display=swap");
-@import "variables";
-@import "mixins";
-@import "flex";
-
-* {
- box-sizing: border-box;
-}
+@import 'fontfaces';
+/* theme colors */
:root {
- font-family: "Fira Sans Extra Condensed", sans-serif;
- font-size: 16px;
- line-height: 1.5;
- text-size-adjust: 100%;
+ --theme-c-dull-red: #c64c35;
+ --theme-c-indian-yellow: #eda958;
+ --theme-c-dusky-blue: #4b608f;
+ --theme-c-glaucous: #6684c0;
+ --theme-c-kelly-green: #31c215;
+ --theme-c-iridium: #413a3a;
+ --theme-c-ironstone: #7f4539;
+
+ --theme-c-dull-red-darker: #762d1f;
+ --theme-c-dull-red-darkest: #39160f;
+ --theme-c-indian-yellow-darker: #c97716;
+ --theme-c-indian-yellow-darkest: #844e0e;
+
+ --theme-c-muted-blue: #22759d;
+ --theme-c-amaranth: #e93f3f;
+ --theme-c-deep-purple: #33124a;
+ --theme-c-charcoal: #303030;
+
+ --theme-c-muted-blue-darker: #195673;
+ --theme-c-amaranth-darker: #800f0f;
+ --theme-c-amaranth-darkest: #690c0c;
+ --theme-c-deep-purple-darker: #170821;
+
+ --theme-c-white: #ffffff;
+ --theme-c-black: #000000;
+
+ --theme-c-love: #e00f60;
+ --theme-c-yes: #2faf2a;
+ --theme-c-maybe: #daa520;
+ --theme-c-no: #8b0000;
+ --theme-c-receive: #448dc9;
+ --theme-c-give: #4a7d91;
+
+ --theme-c-love-dark: #9b0a41;
+ --theme-c-yes-dark: #1f771c;
+ --theme-c-maybe-dark: #997416;
+ --theme-c-no-dark: #530000;
+
+ --theme-c-dull-red-translucent: #c64c35bf;
+ --theme-c-indian-yellow-translucent: #eda958bf;
+ --theme-c-dusky-blue-translucent: #4b608fbf;
+ --theme-c-glaucous-translucent: #6684c0bf;
+ --theme-c-kelly-green-translucent: #31c215bf;
+ --theme-c-iridium-translucent: #413a3abf;
+ --theme-c-ironstone-translucent: #7f4539bf;
+
+ --theme-c-muted-blue-translucent: #22759dbf;
+ --theme-c-amaranth-translucent: #e93f3fbf;
+ --theme-c-deep-purple-translucent: #33124abf;
+ --theme-c-charcoal-translucent: #303030bf;
+
+ --theme-b-mix-blend-mode: multiply;
+
+ --theme-b-page-background-light: radial-gradient(
+ circle at bottom right,
+ var(--theme-c-amaranth) 5%,
+ transparent 50%
+ ),
+ radial-gradient(
+ circle at top left,
+ var(--theme-c-muted-blue) 5%,
+ var(--theme-c-deep-purple) 100%
+ );
+ --theme-b-page-background-dark: radial-gradient(
+ circle at bottom right,
+ var(--theme-c-amaranth-darker) 5%,
+ transparent 50%
+ ),
+ radial-gradient(
+ circle at top left,
+ var(--theme-c-muted-blue-darker) 5%,
+ var(--theme-c-deep-purple-darker) 100%
+ );
+
+ --theme-b-navigation-background-light: radial-gradient(
+ circle at bottom right,
+ var(--theme-c-amaranth-darker) 20%,
+ transparent 80%
+ ),
+ radial-gradient(
+ circle at top left,
+ var(--theme-c-indian-yellow-darker) 5%,
+ var(--theme-c-dull-red-darker) 100%
+ );
+ --theme-b-navigation-background-dark: radial-gradient(
+ circle at bottom right,
+ var(--theme-c-amaranth-darkest) 20%,
+ transparent 80%
+ ),
+ radial-gradient(
+ circle at top left,
+ var(--theme-c-indian-yellow-darkest) 5%,
+ var(--theme-c-dull-red-darkest) 100%
+ );
+ --theme-b-modal-background-light: radial-gradient(
+ circle at top left,
+ var(--theme-c-muted-blue) 5%,
+ var(--theme-c-deep-purple) 100%
+ )
+ fixed no-repeat;
+ --theme-b-modal-background-dark: radial-gradient(
+ circle at top left,
+ var(--theme-c-muted-blue-darker) 5%,
+ var(--theme-c-deep-purple-darker) 100%
+ )
+ fixed no-repeat;
}
-a {
- color: $copy-color;
+/* general purpose variables */
+:root {
+ --font-family-copy: 'Dosis', sans-serif;
+ --font-family-headings: 'Zilla Slab', sans-serif;
+
+ --font-size: 18px;
+ --font-size-h1: 3rem;
+ --font-size-h2: 1.825rem;
+ --font-size-h3: 1.225rem;
+
+ --text-line-height: 1.5;
+
+ --paragraph-margin: 1rem;
+
+ --textblock-max-width: 36rem;
+ --refimage-max-width: 50rem;
+
+ --page-background-radial-gradient: var(--theme-b-radial-gradient-light);
+
+ --container-spacing-top-safe: max(1rem, env(safe-area-inset-top));
+ --container-spacing-right-safe: max(1rem, env(safe-area-inset-right));
+ --container-spacing-bottom-safe: max(1rem, env(safe-area-inset-bottom));
+ --container-spacing-left-safe: max(1rem, env(safe-area-inset-left));
+
+ --container-box-shadow: 0.125rem 0.125rem 0.5rem rgba(0, 0, 0, 0.7);
+
+ --section-max-width: 100%;
+
+ --page-background: var(--theme-b-page-background-light);
+ --header-background: var(--theme-b-navigation-background-light);
+ --header-margin: 1rem var(--container-spacing-right-safe) 1rem var(--container-spacing-left-safe);
+ --navigation-justify-content: flex-start;
+
+ --quickfacts-background: var(--theme-b-page-background-light);
+ --quickfacts-cols-double: auto;
+ --quickfacts-cols-triple: auto;
+ --quickfacts-cols-quadruple: auto;
+
+ --modal-background: var(--theme-b-modal-background-light);
+ --modal-width: 100%;
+
+ --welcome-header-headings-flex-basis: 100%;
+ --welcome-header-headings-margin: 1.5rem 0 0 0;
+ --welcome-header-mainline-font-size: 2rem;
+ --welcome-header-subline-font-size: 1rem;
+
+ --button-group-flex: 1 0 100%;
+
+ --figure-cencor-background-color: var(--theme-c-amaranth);
+ --figure-cencor-width: 50vw;
+ --figure-cencor-height: 35vh;
+
+ --gallery-size: 1rem;
+ --gallery-arrow-position: 1.5rem;
+ --gallery-image-padding: 0 3rem;
+
+ --table-max-width: 45rem;
+ --table-border: 0.0625rem solid var(--theme-c-indian-yellow);
+ --table-cell-padding: 0.25rem 0.5rem;
+
+ --attack-list-max-width: 100%;
+
+ --attack-item-flex: 0 1 100%;
+ --attack-item-flex-flow: row wrap;
+ --attack-item-nth-child-even-text-align: left;
+ --attack-item-first-child-order: auto;
+ --attack-item-illustration-size: auto;
+ --attack-item-illustration-flex: 1 1 var(--attack-item-illustration-size);
+ --attack-item-text-padding: auto;
+
+ --social-links-flex-flow: row wrap;
+ --social-links-flex: 1 1 50%;
+
+ --footer-padding: var(--container-spacing-top-safe) 0 var(--container-spacing-bottom-safe) 0;
}
-.bubbles {
- background-color: $bg-color-dark;
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- overflow: hidden;
- z-index: -1;
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--theme-c-deep-purple);
+ --color-background-footer: var(--theme-c-deep-purple);
- &::before,
- &::after {
- content: "";
- position: absolute;
- border-radius: 100%;
- }
+ --color-heading: var(--theme-c-white);
+ --color-text: var(--theme-c-white);
+ --color-link-text: var();
+ --color-link-text-hover: var();
+ --color-link-text-underline: var();
- &::before {
- background-color: rgba(lighten($bg-color-dark, 10%), 0.7);
- height: 80vw;
- width: 80vw;
- bottom: -45vw;
- right: -25vw;
- }
+ --color-button: var(--theme-c-muted-blue);
+ --color-button-box-shadow: var(--theme-c-muted-blue-darker);
+ --color-toggle: var(--theme-c-dull-red);
+ --color-quickfacts-border: var(--theme-c-indian-yellow);
+ --color-modal-border: var(--theme-c-indian-yellow);
+ --color-figure-polaroid-text: var(--theme-c-charcoal);
+}
- &::after {
- background-color: rgba(lighten($bg-color-dark, 10%), 0.7);
- height: 80vw;
- width: 80vw;
- bottom: -25vw;
- right: -50vw;
+@media (prefers-color-scheme: dark) {
+ :root {
+ --page-background: var(--theme-b-page-background-dark);
+ --header-background: var(--theme-b-navigation-background-dark);
+ --quickfacts-background: var(--theme-b-page-background-dark);
+ --modal-background: var(--theme-b-modal-background-dark);
+
+ --color-button: var(--theme-c-deep-purple);
+ --color-button-box-shadow: var(--theme-c-deep-purple-darker);
+ }
+}
+
+/* desktop */
+@media (min-width: 35em) {
+ :root {
+ --font-size: 20px;
+ --font-size-h2: 2.25rem;
+ --font-size-h3: 1.5rem;
+ --navigation-justify-content: center;
+
+ --modal-width: 30rem;
+
+ --welcome-header-headings-flex-basis: 23rem;
+ --welcome-header-headings-margin: 0;
+ --welcome-header-mainline-font-size: var(--font-size-h1);
+
+ --quickfacts-cols-double: 2 auto;
+ --quickfacts-cols-triple: 3 auto;
+ --quickfacts-cols-quadruple: 4 auto;
+
+ --section-max-width: 34rem;
+
+ --button-group-flex: 0 0 auto;
+
+ --table-cell-padding: 0.5rem 1rem;
+
+ --figure-cencor-width: max(50vw, 20rem);
+ --figure-cencor-height: max(50vh, 30rem);
+
+ --gallery-size: 1.5rem;
+ --gallery-arrow-position: 2rem;
+ --gallery-image-padding: 0 3.5rem;
+
+ --social-links-flex-flow: row nowrap;
+ --social-links-flex: 1 1 auto;
+ }
+}
+
+@media (min-width: 45em) {
+ :root {
+ --attack-list-max-width: 55rem;
+
+ --attack-item-flex-flow: row nowrap;
+ --attack-item-nth-child-even-text-align: right;
+ --attack-item-first-child-order: 1;
+ --attack-item-illustration-size: 20rem;
+ --attack-item-illustration-flex: 0 0 var(--attack-item-illustration-size);
+ --attack-item-text-padding: 0 1rem;
+ }
+}
+
+@media (min-width: 90em) {
+ :root {
+ --header-margin: 1rem auto;
+
+ --attack-list-max-width: 80rem;
+
+ --attack-item-flex: 0 1 50%;
+ --attack-item-nth-child-even-text-align: left;
+ --attack-item-first-child-order: 0;
+ }
+}
+
+/* bigscreen */
+@media (min-width: 120em) {
+ :root {
+ --font-size: 24px;
+ }
+}
+
+/* hyooj */
+@media (min-width: 130em) {
+ :root {
+ --font-size: 28px;
}
}
diff --git a/src/scss/fontfaces.scss b/src/scss/fontfaces.scss
new file mode 100644
index 0000000..7616f3c
--- /dev/null
+++ b/src/scss/fontfaces.scss
@@ -0,0 +1,4 @@
+@import "@/assets/fonts/dosis/dosis";
+@import "@/assets/fonts/exo/exo";
+@import "@/assets/fonts/permanent-marker/permanent-marker";
+@import "@/assets/fonts/zilla-slab/zilla-slab";
diff --git a/src/scss/main.scss b/src/scss/main.scss
new file mode 100644
index 0000000..472f7b8
--- /dev/null
+++ b/src/scss/main.scss
@@ -0,0 +1,176 @@
+@import "@/scss/base";
+
+:root {
+ font-family: var(--font-family-copy);
+ font-size: var(--font-size);
+ text-size-adjust: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: border-box;
+ margin: 0;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+
+ background-color: var(--color-background);
+ color: var(--color-text);
+
+ line-height: var(--text-line-height);
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ transition: color 0.5s, background-color 0.5s;
+
+ &:before,
+ &:after {
+ content: "";
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ &:before {
+ background: url(@/assets/subtle-prism.svg);
+ mix-blend-mode: multiply;
+ z-index: -1;
+ }
+
+ &:after {
+ background: var(--page-background);
+ z-index: -2;
+ }
+
+ &.scroll-lock {
+ overflow: hidden;
+ }
+}
+
+main {
+ min-height: 100vh;
+ padding: 1rem 0;
+ transition: 0.4s;
+}
+
+section {
+ margin: auto;
+ padding: 0 var(--container-spacing-right-safe) 0
+ var(--container-spacing-left-safe);
+ max-width: var(--section-max-width);
+
+ h1:first-child {
+ margin-top: 0;
+ }
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: var(--font-family-headings);
+}
+
+h1 {
+ font-size: var(--font-size-h1);
+ margin: 1.625rem 0;
+ text-transform: capitalize;
+}
+
+h2 {
+ font-size: var(--font-size-h2);
+ margin: 1.875rem 0;
+}
+
+h3 {
+ font-size: var(--font-size-h3);
+ margin: 1.5rem 0;
+}
+
+p {
+ margin: 1rem 0;
+ text-align: justify;
+ hyphens: auto;
+}
+
+a {
+ color: var(--color-link-text);
+}
+
+blockquote {
+ font-style: italic;
+ background: linear-gradient(90deg, rgba(#000, 0.5), transparent);
+ margin: 0;
+ border-left: 0.125rem solid var(--theme-c-indian-yellow);
+ padding: 1rem;
+}
+
+.social {
+ > * {
+ &:before {
+ margin: 0 0.375rem 0 0;
+ }
+
+ &.twitter:before {
+ content: "๐ฆ";
+ }
+
+ &.mastodon:before {
+ content: "๐";
+ }
+
+ &.telegram:before {
+ content: "๐จ";
+ }
+
+ &.furaffinity:before {
+ content: "๐พ";
+ }
+ }
+}
+
+table {
+ border-collapse: collapse;
+ width: 100%;
+ max-width: var(--table-max-width);
+ margin: auto;
+
+ thead {
+ border-top: var(--table-border);
+ }
+
+ tbody {
+ border-top: var(--table-border);
+ border-bottom: var(--table-border);
+
+ tr:hover {
+ background: rgba(0, 0, 0, 0.3);
+ }
+ }
+
+ th,
+ td {
+ padding: var(--table-cell-padding);
+ }
+
+ th {
+ font-weight: bold;
+ }
+}
+
+.nav-logo {
+ display: block;
+ margin: 0 0.5rem 0 0.25rem;
+ height: 2rem;
+ border: 0.125rem solid #fff;
+ border-radius: 100%;
+ box-shadow: var(--container-box-shadow);
+}
diff --git a/src/sebin.ts b/src/sebin.ts
new file mode 100644
index 0000000..f8d8ebc
--- /dev/null
+++ b/src/sebin.ts
@@ -0,0 +1,82 @@
+import { Ratings, Role } from '@/interfaces'
+
+export const firstName = 'Sebin',
+ middleName = 'Antario',
+ lastName = 'Nyshkim',
+ dateOfBirth = new Date('1993-10-17'),
+ gender = 'male โ๏ธ',
+ orientation = 'gay',
+ position = 'vers, prefers top',
+ height = 210, // cm
+ weight = 124, // kg
+ tailLength = 104, // cm
+ wingspan = 417, // cm
+ colors = {
+ hairPrimary: '#4b608f',
+ hairSecondary: '#6684c0',
+ eyes: '#31c215',
+ scalesPrimary: '#c64c35',
+ scalesSecondary: '#eda958',
+ eyebrows: '#eda958',
+ tailspikes: '#7f4539',
+ horns: '#413a3a',
+ claws: '#413a3a',
+ nipples: '#413a3a',
+ penis: '#413a3a'
+ },
+ hobbies = ['working out', 'travels', 'camping', 'video games', 'tech'],
+ penis = {
+ shape: 'humanoid',
+ type: 'grower',
+ special: 'ridged, no foreskin',
+ size: 20, // cm
+ girth: 5 // cm
+ },
+ kinks = [
+ { name: 'Absorption', rating: Ratings.No },
+ { name: 'Anal', rating: Ratings.Love, role: Role.Both },
+ { name: 'Auto-Fellatio', rating: Ratings.Yes },
+ { name: 'Biting', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Bukkake', rating: Ratings.Yes, role: Role.Give },
+ { name: 'Chastity', rating: Ratings.No },
+ { name: 'Chubby', rating: Ratings.Maybe },
+ { name: 'Clothed Sex', rating: Ratings.Yes },
+ { name: 'Cock Slapping', rating: Ratings.Yes, role: Role.Give },
+ { name: 'Coiling', rating: Ratings.Maybe, role: Role.Give },
+ { name: 'Competition', rating: Ratings.Maybe, role: Role.Give },
+ { name: 'Creampie', rating: Ratings.Yes, role: Role.Give },
+ { name: 'Crushing (Living/Objects)', rating: Ratings.No },
+ { name: 'Cum From Mouth/Nose', rating: Ratings.Yes, role: Role.Give },
+ { name: 'Cum Inflation (Light/Medium)', rating: Ratings.Yes },
+ { name: 'Deep-throat', rating: Ratings.Yes, role: Role.Receive },
+ { name: 'Dirty Talking', rating: Ratings.Yes },
+ { name: 'Excessive Cum', rating: Ratings.Love, role: Role.Both },
+ { name: 'Face-Fucking', rating: Ratings.Yes, role: Role.Give },
+ { name: 'Facial', rating: Ratings.Yes, role: Role.Give },
+ { name: 'Feet', rating: Ratings.No },
+ { name: 'Filled Condoms', rating: Ratings.Yes },
+ { name: 'Foreplay', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Frotting', rating: Ratings.Yes },
+ { name: 'Gangbangs', rating: Ratings.Yes },
+ { name: 'Growth', rating: Ratings.Love, role: Role.Receive },
+ { name: 'Handjobs', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Hotdogging', rating: Ratings.Yes, role: Role.Give },
+ { name: 'Kissing', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Macro', rating: Ratings.Love },
+ { name: 'Milking', rating: Ratings.Yes },
+ { name: 'Muscle Growth', rating: Ratings.Love, role: Role.Both },
+ { name: 'Muscle Worship', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Nipple Play', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Oral', rating: Ratings.Love, role: Role.Both },
+ { name: 'Rough', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Sheath Play', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Size Difference', rating: Ratings.Love },
+ { name: 'Slime/Goo Characters', rating: Ratings.Yes },
+ { name: 'Spanking', rating: Ratings.Maybe, role: Role.Give },
+ { name: 'Tailsex', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Toys', rating: Ratings.Yes, role: Role.Both },
+ { name: 'Underwear', rating: Ratings.Love },
+ { name: 'Unsanitary', rating: Ratings.No },
+ { name: 'Verbal Abuse', rating: Ratings.Maybe, role: Role.Give },
+ { name: 'Vore', rating: Ratings.No }
+ ]
diff --git a/src/views/AbilitiesView.vue b/src/views/AbilitiesView.vue
new file mode 100644
index 0000000..4ea42bd
--- /dev/null
+++ b/src/views/AbilitiesView.vue
@@ -0,0 +1,168 @@
+
+
+
+
+ {{ $route.name }}
+
+
+ Since Sebin is a fire dragon there's a myriad of abilities he has at his disposal to defend
+ himself.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fire Breath
+
+ Like most fire dragons, Sebin can breathe fire. In order to do this, he takes a deep breath
+ to enrich the oxygen in his lungs with gases, which, together with special glands in his
+ mouth, produce a combustible mixture. The resulting jet of fire, reaching several hundred
+ degrees Celsius, spreads out on its way to its target, scorching everything in its path.
+
+
+
+
+
+
+
+
+
+
+
+
+ Flame Toss
+
+ By spitting fire into his hands, Sebin can form it into a ball and use it as a projectile.
+ His scales are fireproof and can withstand the high temperatures. Due to their high
+ concentration, the projectiles explode upon impact. By combining two fireballs the explosion
+ radius increases dramatically.
+
+
+
+
+
+
+
+
+
+
+
+
+ Kindled Fist
+
+ Apart from throwing projectiles, Sebin can also use the fireballs to wrap his fists in fire.
+ This allows him to inflict severe burns on his opponent with each blow. In addition, he can
+ release the fire from his fists with aimed blows and hurl it at his opponents.
+
+
+
+
+
+
+
+
+
+
+
+
+ Burning Twister
+
+ A technique used in aerial combat, Sebin uses his fire breath to engulf his body in flames
+ while spinning to become a fire tornado that singes opponents.
+
+
+
+
+
+
diff --git a/src/views/AnatomyView.vue b/src/views/AnatomyView.vue
new file mode 100644
index 0000000..a1a6588
--- /dev/null
+++ b/src/views/AnatomyView.vue
@@ -0,0 +1,842 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ๐
+ ๐
+
+
+ Sebin Full Body Reference
+
+
+
+ draftgon
+
+
+
+
+
+
+
+
+ Bipedal plantigrade
+ Red and yellow scales
+ Yellow scales under chin, torso, underside of tail
+ Athletic to body builder physique
+ Sharp, black claws on fingers and toes
+ Brown blunt spikes running over back and top-side of tail
+ Tail about {{ tailLength / 100 }} meter ({{ toImperial(tailLength) }}) in length
+
+
+
+
+ As the offspring of a union between human and dragon, Sebin is a bipedal plantigrade. The
+ majority of his body is covered in red scales. A strip of yellow scales runs from the
+ underside of his jaw, extending down his chest through his legs to the underside of the tip of
+ his tail. The scales on his chest are characterized by a special toughness to better protect
+ vital organs. He also has an athletic to muscular physique that he continuously tends to keep
+ in shape. Finger and toe tips are armed with sharp, black claws, which serve him equally as
+ tools and weapons. Brown spines run from head to spine to tip of tail, though they are too
+ blunt to pose a risk of injury. His tail is about
+ {{ tailLength / 100 }} meters ({{ toImperial(tailLength) }}) in length.
+
+
+
+
+ Wings
+
+
+
+ Wingspan {{ wingspan / 100 }} meters ({{ toImperial(wingspan) }})
+ Closed when on the ground
+ Function like a second pair of arms
+ Pointy talon on end of "hand"
+
+
+
+
+ Sebin's wings have a span of about {{ wingspan / 100 }} meters ({{ toImperial(wingspan) }}).
+ They function very much like a second pair of arms: two interconnected limbs that form a
+ bendable arm, at the end of which sits a hand-like structure, adorned with a talon in exchange
+ for a thumb, with a sturdy membrane stretched between its long fingers. On solid ground, he
+ keeps his wings closed so as not to accidentally bump into anything with them. Sebin also pays
+ a lot of attention to his wings when working out, so that they can keep carrying him reliably
+ through the air. Though, he only travels short to medium distances through the air before he
+ has to take a rest - as long as the airspace in the area has been declared open for wing
+ bearers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin's Expressions
+
+ draftgon
+
+
+
+
+
+
+ Round pupils, green iris
+ Yellow spikes for eyebrows
+ Yellow spikes on cheeks
+ Black horns with slight curve downwards
+ Blue, medium long hair
+ Long, pointy, movable ears
+ Very sharp teeth
+ Tongue with pointy tip
+
+
+
+
+ Despite what one might expect with reptilians, Sebin's pupils are rounded instead of
+ slit-shaped. Yellow spikes running above his eyelids serve as eyebrows. These spikes are also
+ found along his jaw bone. Two pointed, slightly curved, black horns protrude from his head. He
+ usually wears his medium-length, blue hair loose. His long, pointed ears are very flexible,
+ allowing him to hear sounds around him without having to turn his head. They are also used for
+ non-verbal communication, to express emotions through body language. His hearing perceives a
+ wider range of frequencies, making it superior to that of a human. His jaws are equipped with
+ razor-sharp teeth that effortlessly sink into anything he manages to bite, be it nourishment
+ or adversaries. Embedded between them lies his tongue, which is typically pointed for
+ reptilians. Glands in his throat produce a mixture which he uses to spit fire, which can reach
+ up to around 100 ยฐC ({{ toFahrenheit(100) }} ยฐF).
+
+
+
+
+ Upper Body
+
+
+
+ Strong upper body
+ Big pecs
+ Defined abs
+ Black nipples
+
+ Any muscle mass from athletic to body builder is fine, with a preference towards body
+ builder
+
+
+
+
+
+ At the age of 17, Sebin gradually began to keep his body in shape on a regular basis. His
+ favorite exercises include weightlifting (with both dumbbells and barbells), lat pulldown, leg
+ press and cable curls. He works out three days a week with one day off between training days,
+ rotating the body regions he trains each day.
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin's upper body closeup
+
+ NidtheDragon
+
+
+
+
+
+ Sebin is very concerned with an even distribution of muscle mass, but pays particular
+ attention to his back, chest and arms. A strong chest with strong arms helps to throw fire
+ projectiles as far as possible. A strong back guarantees a longer stay in the air.
+
+
+
+
+ Additional Muscle References
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin flexing
+
+ Chirros
+
+
+
+
+
+
+
+
+
+
+
+ Sebin beckons
+
+ Grisser
+
+
+
+
+
+
+
+
+
+
+
+ Sebin jamming out to some tunes
+
+ Valentina Paz
+
+
+
+
+
+
+
+
+
+
+
+ Sebin flexing
+
+ Marsel-Defender
+
+
+
+
+
+
+
+
+
+
+
+ Sebin soaping up
+
+ (o)reo
+
+
+
+
+
+
+
+
+
+
+
+ Sebin bulging out
+
+ SexMuffin
+
+
+
+
+
+
+
+
+
+
+
+ Sebin showing you his rings
+
+ Knuxlight
+
+
+
+
+
+
+
+
+
+
+
+ Sebin ready to throw down
+
+ ShoNuff44
+
+
+
+
+
+
+
+
+
+
+
+ Sebin looking aloof (but chill)
+
+ Usurp
+
+
+
+
+
+
+
+
+
+
+
+ Sebin getting out of the pool
+
+ j-cock
+
+
+
+
+
+
+
+
+
+
+
+ Sebin getting frisky on the train
+
+ Winty
+
+
+
+
+
+
+
+
+
+
+
+ Sebin getting ready to lift
+
+ Eda
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin's manly parts
+
+
+ draftgon
+
+
+
+
+
+
+
+
+ Human-shaped with ridges
+ Ring-like sheath surrounding shaft
+ Extends from sheath when erect, lives inside sheath when not erect
+ External balls
+
+
+
+
+ Despite his reptilian appearance, Sebin has nipples, a feature of the human side of his
+ family. Furthermore, his external testicles represent another humanized feature. Where
+ relatives of his ilk possess a slit in which the penis lies protectively, Sebin possesses a
+ pouch-like sheath from which the tip of the penis protrudes slightly. The shape of his shaft
+ is predominantly humanoid, but it is surrounded by ridges and has no equivalent of a
+ foreskin. When aroused, the coal-black shaft swells and pushes out of the sheath until fully
+ erect, the sheath wrapping around the root of the shaft like a ring. However, he can also
+ push it out in a flaccid state, e.g. when needing to pass water.
+
+
+
+
+
+
+ But, wait! There's more...
+
+
+ Sebin like you haven't seen him yet! Flip the switch to reveal his naughty secrets. If you
+ dare...! Don't say I didn't warn you!!
+
+
+
+
+ ๐
+ ๐
+
+
+
+
+
+
+
diff --git a/src/views/ClothingView.vue b/src/views/ClothingView.vue
new file mode 100644
index 0000000..81c267c
--- /dev/null
+++ b/src/views/ClothingView.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin in his casual outfit
+
+
+ coffeerelated
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin in his cold weather outfit
+
+
+ Lara Belรฉm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin in his workout outfit (full body)
+
+
+ Atlas
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin in his workout outfit (close-up)
+
+
+ Rei
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin in leisure tracksuit pants
+
+
+ Leolynx
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin in his favorite boxers
+
+
+ Retroslime69
+
+
+
+
+
+
diff --git a/src/views/GeneralView.vue b/src/views/GeneralView.vue
new file mode 100644
index 0000000..1e196f0
--- /dev/null
+++ b/src/views/GeneralView.vue
@@ -0,0 +1,223 @@
+
+
+
+
+ {{ $route.name }}
+
+
+
+
+
+ Personality
+
+
+
+ warm-hearted
+ caring
+ quick to offer help
+ devestated when not being able to help
+ sociable
+ goofball who likes to laugh
+ open and honest about his feelings
+ confrontative and foul-mouthed when provoked
+
+
+
+
+ Sebin is a warm-hearted guy who cares a lot about the well-being of his loved ones. Bad vibes
+ rarely escape him and he offers his help without hesitation. He also won't avoid difficult
+ conversations in the process. Not being able to help a friend in need is synonymous with
+ failing them, a realization that can leave him feeling uneasy long after the fact.
+
+
+
+ At the same time, he is very open and honest about his feelings. He does not mince words and
+ finds clear words when speaking his mind. Unfortunately, Sebin sometimes forgets his good
+ manners in the heat of the moment, once he gets invested into a quarrel โ especially when it
+ comes to topics that are near and dear to his heart. Anyone looking to have a bad time can try
+ their luck at pissing him off even once. This includes an equally vulgar vocabulary. It is not
+ uncommon to hear him swear.
+
+
+
+ Nevertheless, Sebin strives to put his best foot forward at all times. He is of the sociable
+ type and likes to laugh a lot, as he is easily amused. Sometimes to a degree where it can
+ become very childish and immature very quickly.
+
+
+
+ Physical strength is not the only thing that plays a big role for Sebin. He is of a firm
+ believe that a healthy body must also have a healthy mind in order to find a balance. But he
+ only came to this realization at the end of a rocky road. While a setback in the past could
+ easily throw him off track, today he stands much more firmly in life. Not only for his own
+ sake, but also to be a kind of anchor for others. He always keeps his cool, so he can be a
+ tower of strenth for others.
+
+
+
+
+ Hobbies
+
+
+
+
+
+
+ Sebin is passionate about his hobbies. If he notices even the smallest spark of interest in
+ his hobbies you should bring a lot of time, as he will chew your ear off first. Patience is
+ known to be a virtue โ one unknown to this dragon.
+
+
+
+ When he indulges in his hobbies, he does so with devotion. Every move has to be right and
+ everything has to be in perfect harmony. Once he is in his flow, he must not be disturbed,
+ otherwise he can sometimes become quite eccentric in expressing his dismay of being disrupted,
+ possibly losing a very important train of thought.
+
+
+
+
+ Food & Drink
+
+
+
+ sweets
+ savory food
+ spicy food
+ coffee
+ beer
+ cocktails
+ cheese
+ sausage
+ pancakes
+ chicken
+ beef
+ spaghetti/pasta
+
+
+
+
+ Sebin's day starts with a strong cup of black coffee and sandwiches. He's also a massive sweet
+ tooth which sounds like a big detriment to his fitness routine. That's because it is and it's
+ often very hard for him to resist.
+
+
+
+ Besides snacking, Sebin also likes to eat hearty and savory things. He doesn't disdain a
+ cheese platter with a wide selection, nor a medium-rare steak.
+
+
+
+ Sebin rarely says no to a good beer with friends, just as he rarely says no to a bar tour to
+ try new and interesting cocktails.
+
+
+
+
+
+ Sexual Preferences
+
+
+
+
+
+ Supremely horny
+ Confident, knows what he's got
+ Dominant lover, likes it rough but is no brute
+ Service top
+ Depending on partner also bottoms
+ Likes to wear bottomless undies, esp. jockstraps
+ Enjoys the attention from flaunting
+
+
+
+
+ But above all Sebin is a very naughty hornball. He knows what he's got and he's not afraid
+ to flaunt it. He is a generally dominant lover who likes to have it rough. But he is not
+ lacking in tenderness. He considers himself somewhat of a "service top", who doesn't only
+ have his own fun in mind. His job is only done if he's benn able to satisfy. However, that
+ doesn't mean that he doesn't let others have their fun with him too from time to time. It
+ always depends on his playmates, which makes him effectively a switch. He loves to wear
+ bottomless jockstraps and boxer briefs to direct the attention of onlookers exactly where he
+ wants it. After all he is well endowed enough to peddle it around.
+
+
+ Kinks
+
+
+
+
+
+ But, wait! There's more...
+
+
+ Let's... get... scandalous!
+
+
+
+
+ ๐
+ ๐
+
+
+
+
+
+
+
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
new file mode 100644
index 0000000..81a9bfc
--- /dev/null
+++ b/src/views/HomeView.vue
@@ -0,0 +1,64 @@
+
+
+
+
+ Sebin Nyshkim
+ Character Reference Page
+
+
+
+ Welcome to Sebin's Ref Page
+ On this page your can learn all about Sebin, your friendly neighborhood dragon!
+
+
+ I started this page to have a single point of truth with all the info artists I commission can
+ possibly need. If you're missing some crucial info, or you would like to give me some general
+ feedback about this page, feel free to reach out!
+
+
+
+
+ Mastodon
+ Telegram
+
+ Fur Affinity
+
+
+
+
+ Note: This page is still under heavy construction, as indicated by the 0.x.x
+ version number in the footer. I'm continously updating the site and adding details and
+ information to it. In case you run into something weird, definitely let me know!
+
+
+ Complete Ref Sheet
+
+ Just here to fetch the ref sheet? Click the button with the ref sheet you need and get
+ started!
+
+
+
+
+ SFW Refsheet (3,3 MB) โฌ๏ธ
+
+
+ NSFW Refsheet (3,4 MB) โฌ๏ธ
+
+
+
+
+ ๐
+ ๐
+
+
+
diff --git a/src/views/OverdriveView.vue b/src/views/OverdriveView.vue
new file mode 100644
index 0000000..ff8ecd2
--- /dev/null
+++ b/src/views/OverdriveView.vue
@@ -0,0 +1,317 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sebin in Overdrive
+
+ CVictorrosso
+
+
+
+
+
+ Sebin can enter an Overdrive Form which greatly increases his strength and abilities but it
+ comes at a cost.
+
+
+
+ He enters Overdrive by engulfing himself in a pillar of flames which transforms his exterior
+ physique. During Overdrive transformation his hair ignites and flickers with blue flames. The
+ corners of his eyes flicker with long green flames. His arms and legs become part carbon black
+ and are crossed by several glowing veins which pulsate like flowing lava. Fire in this form
+ burns several degrees hotter than usual because his body becomes a living blast furnace, which
+ is why his limbs have to be of more fire-proof material to withstand the increased heat.
+
+
+
+ To complete the transformation he inhales the flames from the pillar surrounding him which
+ heats up his body from within. Even if Sebin is a fire dragon who can sustain high degrees of
+ heat he is essentially overheating himself from the inside. Because of this he can't maintain
+ this form for more than a few hours before he does permanent damage to his own body.
+
+
+
+ Direct body contact with Sebin during overdrive causes 3rd degree burns as he emits an extreme
+ temperature, although less than he keeps inside his body. His immediate surroundings are
+ likely to burn or melt.
+
+
+ Attacks
+
+
+
+
+ Name
+ Description
+
+
+
+
+ Fire Breath (improved)
+
+ The reach of Sebin's Fire Breath increases as well as the frequency at which he can fire
+ shots from his mouth.
+
+
+
+ Flame Toss (improved)
+
+ Overdrive Form eliminates the need for Sebin to spit fire into his palms. It instead
+ enables him to fire the shots directly from the palm palm of his hands, as the firey
+ veins crossing his arms act as an orifice to do so. The explosion radius of the burning
+ projectiles that explode on impact is greatly increased.
+
+
+
+ Kindled Fist (improved)
+
+ As his arms and legs are infused with fire his punches and kicks exert trails of flames
+ while doing so. Landing a punch or kick sears enemies.
+
+
+
+ Searing Discus
+
+ Overdrive allows Sebin to form rings of fire by igniting flames from his fingertips and
+ swirling them in a circle motion. He can use them for both close quarters or ranged
+ combat.
+
+
+
+ Combustion Flare
+
+ Clinking both of his wrists against each other like flints unleashes a devestating fire
+ blast from both of his fire-infused hands. A secure foothold is needed to prevent Sebin
+ from being thrown back by the recoil of the attack. Using this technique in the air is
+ therefore highly risky.
+
+
+
+ Blazing Pandemonium
+
+ A heavy impact into the ground from a great height with both fists, tearing deep cracks
+ in the ground around the impact crater. Combined with
+ Kindled Fist
+ the heat in Sebin's arms are forced through the newly created furrows, transforming the
+ scene into an inferno.
+
+
+
+ Scorching Edge
+
+ A fiery blade towering several meters into the air that Sebin sends careening towards
+ his enemies from his fire-infused legs with a backflip kick, leaving a swath of
+ destruction in its wake. Upon impact the force of the attack is distributed sideways.
+
+
+
+ Circling Fire Shield
+
+ A rather defensive technique. By spinning around with stretched out arms Sebin creates
+ fire balls, which he usually hurls towards enemies, that circle around his body
+ diagonally. They act as a shield while he can still move his arms relatively freely.
+ Enemies would be well advised to keep their distance to this spinning shield, as the
+ fire balls will still explode on contact.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 0000000..849c201
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,14 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.dom.json",
+ "include": ["globals.d.ts", "env.d.ts", "src/**/*", "src/**/*.vue", "package.json"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..66b5e57
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.node.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ }
+ ]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..fee7441
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,20 @@
+{
+ "extends": "@tsconfig/node20/tsconfig.json",
+ "include": [
+ "globals.d.ts",
+ "vite.config.*",
+ "vitest.config.*",
+ "cypress.config.*",
+ "nightwatch.conf.*",
+ "playwright.config.*"
+ ],
+ "compilerOptions": {
+ "composite": true,
+ "noEmit": true,
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "types": ["node"]
+ }
+}
diff --git a/vite.config.mts b/vite.config.mts
new file mode 100644
index 0000000..b4b0851
--- /dev/null
+++ b/vite.config.mts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import { imagetools } from 'vite-imagetools'
+import autoprefixer from 'autoprefixer'
+import vue from '@vitejs/plugin-vue'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ base: '/sebin/',
+ plugins: [vue(), imagetools()],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ },
+ css: {
+ devSourcemap: true,
+ postcss: {
+ plugins: [autoprefixer({})]
+ }
+ }
+})
diff --git a/vue.config.js b/vue.config.js
deleted file mode 100644
index 3c42c24..0000000
--- a/vue.config.js
+++ /dev/null
@@ -1,87 +0,0 @@
-const path = require("path");
-
-module.exports = {
- publicPath: "",
- css: {
- sourceMap: process.env.NODE_ENV !== "production"
- },
- configureWebpack: {
- resolve: {
- alias: {
- "@fonts": path.resolve(__dirname, "src/assets/fonts/"),
- "@img": path.resolve(__dirname, "src/assets/img/"),
- "@scss": path.resolve(__dirname, "src/scss/"),
- "@data": path.resolve(__dirname, "src/data/"),
- "@mixins": path.resolve(__dirname, "src/mixins/"),
- "@components": path.resolve(__dirname, "src/components/")
- }
- }
- },
- chainWebpack: config => {
- config.plugin("html").tap(args => {
- const meta = {
- title: "Sebin Nyshkim - Reference Page",
- desc: "The official reference Page for Sebin Nyshkim",
- type: "website",
- url: "https://ref.sebin-nyshkim.net",
- image: "favicon.png",
- twitter: {
- card: "summary",
- creator: "@SebinNyshkim"
- }
- };
-
- const links = {
- icon: {
- rel: "icon",
- href: meta.image,
- type: "image/png"
- },
- favicon: {
- rel: "favicon",
- href: meta.image,
- type: "image/png"
- }
- };
-
- args[0].title = meta.title;
- args[0].links = links;
- args[0].meta = {
- "twitter:card": meta.twitter.card,
- "twitter:creator": meta.twitter.creator,
- "twitter:description": meta.desc,
- "twitter:text:title": meta.title,
- "twitter:image": meta.image,
- "og:title": meta.title,
- "og:type": meta.type,
- "og:url": meta.url,
- "og:image": meta.image,
- "og:description": meta.desc
- };
-
- return args;
- });
-
- config.module
- .rule("images")
- .test(/\.(png|jpe?g|gif|webp|svg)(\?.*)?$/i)
- .use("image-webpack-loader")
- .loader("image-webpack-loader")
- .tap(options => {
- const newOpts = {
- mozjpeg: {
- progressive: true,
- quality: 75
- },
- pngquant: {
- quality: [0.65, 0.9],
- speed: 4
- },
- gifsicle: {
- interlaced: false
- }
- };
- return { ...options, ...newOpts };
- });
- }
-};