Migrating data from JS to YAML.

This commit is contained in:
Alexis Werefox 2021-06-11 08:10:41 +00:00
parent 0f55c85ac0
commit 042679198a
20 changed files with 9058 additions and 7181 deletions

View File

@ -1,17 +1,16 @@
import CLink from "./contacts-link";
import { CONTACTS } from "../js/variables";
export default function ContactsBlock({}) {
export default function ContactsBlock({ contacts }) {
return (
<div className="p-4 space-y-4">
{Object.keys(CONTACTS).map((contact) => (
{Object.keys(contacts).map((contact) => (
<CLink
key={contact}
src={CONTACTS[contact].src}
alt={CONTACTS[contact].alt}
url={CONTACTS[contact].url}
src={contacts[contact].src}
alt={contacts[contact].alt}
url={contacts[contact].url}
description={contact}
url_text={CONTACTS[contact].url_text}
url_text={contacts[contact].url_text}
/>
))}
</div>

View File

@ -1,18 +1,17 @@
import IDButton from "./identity-button";
import { IDENTITIES } from "../js/variables";
export default function IdentityBlock() {
export default function IdentityBlock({ identities }) {
return (
<nav>
<div className="grid xl:grid-rows-2 xl:grid-cols-5 sm:grid-rows-3 sm:grid-cols-3 grid-rows-9 grid-cols-1 sm:gap-2 gap-0">
{Object.keys(IDENTITIES).map((ids) => (
{Object.keys(identities).map((ids) => (
<IDButton
key={ids}
innerText={ids}
url={IDENTITIES[ids].url}
locator={IDENTITIES[ids].locator}
imageObj={IDENTITIES[ids].images}
extraClasses={IDENTITIES[ids].extra_classes}
url={identities[ids].url}
locator={identities[ids].locator}
imageObj={identities[ids].images}
extraClasses={identities[ids].extra_classes}
/>
))}
</div>

View File

@ -17,7 +17,7 @@ export function renderPossibleURLField(field) {
if (validURL(field)) {
return (
<Link href={field}>
<a className="p-2 text-center overflow-clip overflow-auto ring-2 ring-werefox-grey dark:ring-werefox-grey-darker rounded-lg bg-werefox-grey-lighter dark:bg-werefox-grey-dark hover:text-werefox-blue-dark dark:hover:text-werefox-blue">
<a className="p-2 overflow-clip overflow-auto text-center ring-2 ring-werefox-grey dark:ring-werefox-grey-darker rounded-lg bg-werefox-grey-lighter dark:bg-werefox-grey-dark hover:text-werefox-blue-dark dark:hover:text-werefox-blue">
{field}
</a>
</Link>
@ -37,6 +37,9 @@ export default function LoveCard({ src, alt, url, fields, bio, user }) {
user == "Shadow8t4"
? "text-werefox-blue-dark dark:text-werefox-blue"
: "text-werefox-pink-dark dark:text-werefox-pink";
let bioarray = bio.split("\n");
bioarray = bioarray.slice(0, bioarray.length - 1);
const biodict = Object.assign({}, bioarray);
return (
<div className="rounded-lg min-w-full flex ring-2 ring-werefox-grey dark:ring-werefox-grey-darker bg-werefox-grey-lighter dark:bg-werefox-grey-dark">
@ -63,14 +66,22 @@ export default function LoveCard({ src, alt, url, fields, bio, user }) {
))}
</div>
<div className="ring-2 ring-werefox-grey dark:ring-werefox-grey-darker rounded-lg p-2 bg-werefox-grey-light dark:bg-werefox-grey">
<p className="overflow-auto">
{bio}
<br />
{"- "}
<Link href={url}>
<a className="hover:text-werefox-blue-dark dark:hover:text-werefox-blue" target="_blank">{`@${user}`}</a>
</Link>
</p>
<div className="p-2 ring-2 ring-werefox-grey dark:ring-werefox-grey-darker rounded-lg bg-werefox-grey-lighter dark:bg-werefox-grey-dark">
{Object.keys(biodict).map((bio) => (
<p className="overflow-auto" key={bio}>
{biodict[bio] == "" ? <br /> : biodict[bio]}
</p>
))}
<p className="overflow-auto">
{"- "}
<Link href={url}>
<a
className="hover:text-werefox-blue-dark dark:hover:text-werefox-blue"
target="_blank"
>{`@${user}`}</a>
</Link>
</p>
</div>
</div>
</div>
</div>

View File

@ -1,16 +1,15 @@
import PButton from "./page-button";
import { PAGES } from "../js/variables";
export default function ProjectBlock() {
export default function ProjectBlock({ pages }) {
return (
<nav>
<div className="flow space-y-2">
{Object.keys(PAGES).map((page) => (
{Object.keys(pages).map((page) => (
<PButton
key={page}
title={page}
images={PAGES[page].images}
url={PAGES[page].url}
images={pages[page].images}
url={pages[page].url}
/>
))}
</div>

View File

@ -10,6 +10,9 @@ export default function TestimonialCard({ src, alt, url, innerText, user }) {
user == "Shadow8t4"
? "hover:text-werefox-pink-dark dark:hover:text-werefox-pink"
: "hover:text-werefox-blue-dark dark:hover:text-werefox-blue";
let testimonialarray = innerText.split("\n");
testimonialarray = testimonialarray.slice(0, testimonialarray.length - 1);
const testimonialdict = Object.assign({}, testimonialarray);
return (
<div className="rounded-lg min-w-full flex overflow-hidden ring-2 ring-werefox-grey dark:ring-werefox-grey-darker bg-werefox-grey-light dark:bg-werefox-grey">
@ -25,20 +28,25 @@ export default function TestimonialCard({ src, alt, url, innerText, user }) {
</div>
</a>
</Link>{" "}
<div
className={`flex items-center justify-center animate-wiggle flex-5 p-4 sm:text-lg text-xs text-center min-h-full ${isMe}`}
>
<p>
{innerText}
<br />
{"- "}
<Link href={url}>
<a
target="_blank"
className={`transition ${isMeLink}`}
>{`@${user}`}</a>
</Link>
</p>
<div className="flex flex-5 p-4 items-center justify-center min-h-full">
<div
className={`animate-wiggle sm:text-lg text-xs text-center ${isMe}`}
>
{Object.keys(testimonialdict).map((t) => (
<p className="overflow-auto" key={t}>
{testimonialdict[t] == "" ? <br /> : testimonialdict[t]}
</p>
))}
<p>
{"- "}
<Link href={url}>
<a
target="_blank"
className={`transition ${isMeLink}`}
>{`@${user}`}</a>
</Link>
</p>
</div>
</div>
</div>
);

View File

@ -0,0 +1,25 @@
--- # Contacts YAML
"My public Mastodon":
url: "https://vulpine.club/@shadow8t4"
src: "/emoji/mastodon-logo.png"
alt: "The Mastodon logo"
url_text: "@shadow8t4@vulpine.club"
"My Twitter":
url: "https://twitter.com/alexis_werefox"
src: "/emoji/twitter-logo.png"
alt: "The Twitter logo"
url_text: "@alexis_werefox"
"My Twitch":
url: "https://twitch.tv/alexis_werefox"
src: "/emoji/twitch-logo.png"
alt: "The Twitch logo"
url_text: "@Alexis_Werefox"
"My e-mail":
url: "mailto:adh9694@gmail.com"
src: "/emoji/inbox.svg"
alt: "An inbox emoji"
url_text: "adh9694@gmail.com"

37
src/info/data/faq.yml Normal file
View File

@ -0,0 +1,37 @@
--- # FAQ YAML
q1:
question: "So is Werefox like a species or...?"
answer: >
That's a good question! No, my fursona's full name is Alexis Werefox,
so Werefox is just a last name. I am just a fox!
src: "/images/alexis_heart.png"
alt: "Alexis giving a heart emoji"
q2:
question: "How can you be Pansexual and a Lesbian?"
answer: >
I believe I've been told the proper term is "sapphic",
it just means I *am* Pansexual, but I prefer those who identify more femme."
src: "/images/alexis_wink.png"
alt: "Alexis winking and giving a peace sign"
q3:
question: "How do I get those Xenia stickers?"
answer: >
Yeah, about that. So, I've made a few posts about this, but when
I first started giving those out, I was in a good financial position, among
other things. Now I'm not! I will get to it when I do.
src: "/images/alexis_annoyed.png"
alt: "Alexis looking annoyed and crossing her arms"
q4:
question: "What do you do?"
answer: >
Lots of things! Lately, though, I've been focusing on myself and my
transition. I could use some financial support (since I'm currently
unemployed) if you're feeling up to it and can afford it! If you want to
know more about what I do, you can check out "Stuff I do!" from the main
page, and "Support Me?" if you wanna toss me some funds!
src: "/images/alexis_shrug.png"
alt: "Alexis shrugging"

View File

@ -0,0 +1,59 @@
--- # Identity YAML
"26":
url: ""
images:
- { src: "/emoji/18_plus.svg", alt: "Over 18 emoji" }
extra_classes: "pointer-events-none"
"Trans-femme":
url: "/identities/gender"
images:
- { src: "/emoji/transgender_flag.svg", alt: "Transgender flag emoji" }
- { src: "/emoji/female_symbol.svg", alt: "Female symbol emoji" }
extra_classes: "xl:pt-1 xl:align-text-bottom xl:text-sm xl:min-h-full"
"She/Her":
url: "/identities/pronouns"
images:
- { src: "/emoji/speech_bubble_left.svg", alt: "A speech bubble emoji" }
extra_classes: ""
Polyam:
url: "/identities/sexuality"
locator: "Polyam"
images:
- { src: "/emoji/polyamory_flag.svg", alt: "Polyamory flag emoji" }
extra_classes: ""
Pansexual:
url: "/identities/sexuality"
locator: "Pansexual"
images:
- { src: "/emoji/pansexual_flag.svg", alt: "Pansexual flag emoji" }
extra_classes: ""
Lesbian:
url: "/identities/sexuality"
locator: "Lesbian"
images:
- { src: "/emoji/lesbian_flag.svg", alt: "Lesbian flag emoji" }
extra_classes: ""
"Taken(1)":
url: "/identities/partners"
images: [{ src: "/emoji/blue_heart.svg", alt: "Blue heart emoji" }]
extra_classes: ""
ADHD:
url: "/identities/neuro"
images:
- { src: "/emoji/neurodiversity.svg", alt: "Neurodiversity symbol emoji" }
extra_classes: ""
"Fox witch":
url: "/identities/fursona"
images:
- { src: "/emoji/fox.svg", alt: "Fox emoji" }
- { src: "/emoji/magic_wand.svg", alt: "Magic wand emoji" }
extra_classes: "xl:pt-1 xl:align-text-bottom xl:text-sm xl:min-h-full"

31
src/info/data/pages.yml Normal file
View File

@ -0,0 +1,31 @@
--- # Pages YAML
"Stuff I do!":
url: "/projects"
images:
- { src: "/emoji/crt_prompt.svg", alt: "CRT prompt emoji" }
"See Testimonials!":
url: "/testimonials"
images:
- { src: "/emoji/awoo.svg", alt: "Awoo emoji" }
"HRT Tracker!":
url: "/hrt"
images:
- { src: "/emoji/trans_heart.png", alt: "Transgender heart emoji" }
FAQ:
url: "/faq"
images:
- { src: "/emoji/red_question_mark.svg", alt: "Red question mark emoji" }
Servers:
url: "/servers"
images:
- { src: "/emoji/computer.svg", alt: "Computer emoji" }
"Support Me?":
url: "/support"
images:
- { src: "/emoji/green_money.svg", alt: "Green money emoji" }

View File

@ -0,0 +1,27 @@
--- # Partners YAML
Gumby:
url: "https://puppy.cafe/@Gumby"
avi: "/images/gumby.jpeg"
fields:
Pronouns: "She/They/It"
Gallery: "vsco.co/the-goon"
"Ko-fi": "ko-fi.com/gumbyrat"
Music: "https://soundcloud.com/oorrggaanniissmm"
bio: |
tiny trans rat
21
Demigirl
ND
Hapa/white
Ive got a bad brain :(
ADHD
Makes Vaporwave, Noise, and plays synths
Photographer
💙Alexis @alexis
“gumby good”
ko-fi.com/gumbyrat
CashApp: $GumbyRat
🔞

View File

@ -0,0 +1,84 @@
--- # Testimonial YAML
colabunny:
json: "https://yiff.life/@colabunny.json"
url: "https://yiff.life/@colabunny"
content: |
"please stay your jokes are funny and smart"
ElfLord:
url: "https://freedom.horse/@ElfLord"
json: "https://freedom.horse/@ElfLord.json"
content: |
"Someday I'm gonna visit you in Texas, and when I get there, I'm going to realize you don't live in Texas at all, and I'm in the wrong state"
Decimal:
url: "https://plush.city/@Decimal"
json: "https://plush.city/@Decimal.json"
content: |
"I will appreciate the heck out of you any day"
Drako_Fenris:
url: "https://yiff.life/@Drako_Fenris"
json: "https://yiff.life/@Drako_Fenris.json"
content: |
"[Alexis' future wife] lives in the ether yet to be revealed. she awaits the day her big tiddie goth gf rides in on her unicorn and rescues her."
"00dani":
url: "https://vulpine.club/@00dani"
json: "https://vulpine.club/@00dani.json"
content: |
"*falls in love with you* haha whoopsies 😳"
Gumby:
url: "https://puppy.cafe/@Gumby"
json: "https://puppy.cafe/@Gumby.json"
content: |
"im love alexis a lot 💚 🐀"
AshBunny:
url: "https://vulpine.club/@AshBunny"
json: "https://vulpine.club/@AshBunny.json"
content: |
"heck. I don't think I can take all of this support."
heatherhorns:
url: "https://plush.city/@heatherhorns"
json: "https://plush.city/@heatherhorns.json"
content: |
";~;
gpsd gosh"
MutoShack:
url: "https://functional.cafe/@MutoShack"
json: "https://functional.cafe/@MutoShack.json"
content: |
"yess w'all say nice things! usually "alexis is the good" and "alexis is the gay"
because it is the truth"
immychan:
url: "https://antabaka.me/@immychan"
json: "https://antabaka.me/@immychan.json"
content: |
"Oh damn you're cute 😳"
nautilee:
url: "https://dragon.style/@nautilee"
json: "https://dragon.style/@nautilee.json"
content: |
"...how are you so goshdarn cute"
holly:
url: "https://lotor.tech/users/holly"
json: "https://lotor.tech/users/holly.json"
content: |
"wait there's still an opportunity to be in [the Testimonials page]?"
lindsays:
url: "https://hackers.town/@lindsays"
json: "https://hackers.town/@lindsays.json"
content: |
"@alexis :
Absolutely just as much of a walking, talking shitpost as she is online. Also incredibly gay incredibly girl."

View File

@ -1,222 +1,3 @@
// An object listing my different identity aspects
export const IDENTITIES = {
26: {
url: "",
images: [
{
src: "/emoji/18_plus.svg",
alt: "Over 18 emoji",
},
],
extra_classes: "pointer-events-none",
},
"Trans-femme": {
url: "/identities/gender",
images: [
{
src: "/emoji/transgender_flag.svg",
alt: "Transgender flag emoji",
},
{
src: "/emoji/female_symbol.svg",
alt: "Female symbol emoji",
},
],
extra_classes: "xl:pt-1 xl:align-text-bottom xl:text-sm xl:min-h-full",
},
"She/Her": {
url: "/identities/pronouns",
images: [
{
src: "/emoji/speech_bubble_left.svg",
alt: "A speech bubble emoji",
},
],
extra_classes: "",
},
Polyam: {
url: "/identities/sexuality",
locator: "Polyam",
images: [
{
src: "/emoji/polyamory_flag.svg",
alt: "Polyamory flag emoji",
},
],
extra_classes: "",
},
Pansexual: {
url: "/identities/sexuality",
locator: "Pansexual",
images: [
{
src: "/emoji/pansexual_flag.svg",
alt: "Pansexual flag emoji",
},
],
extra_classes: "",
},
Lesbian: {
url: "/identities/sexuality",
locator: "Lesbian",
images: [
{
src: "/emoji/lesbian_flag.svg",
alt: "Lesbian flag emoji",
},
],
extra_classes: "",
},
"Taken(1)": {
url: "/identities/partners",
images: [
{
src: "/emoji/blue_heart.svg",
alt: "Blue heart emoji",
},
],
extra_classes: "",
},
ADHD: {
url: "/identities/neuro",
images: [
{
src: "/emoji/neurodiversity.svg",
alt: "Neurodiversity symbol emoji",
},
],
extra_classes: "",
},
"Fox witch": {
url: "/identities/fursona",
images: [
{
src: "/emoji/fox.svg",
alt: "Fox emoji",
},
{
src: "/emoji/magic_wand.svg",
alt: "Magic wand emoji",
},
],
extra_classes: "xl:pt-1 xl:align-text-bottom xl:text-sm xl:min-h-full",
},
};
// An object listing pages folks can visit
export const PAGES = {
"Stuff I do!": {
url: "/projects",
images: [
{
src: "/emoji/crt_prompt.svg",
alt: "CRT prompt emoji",
},
],
},
"See Testimonials!": {
url: "/testimonials",
images: [{ src: "/emoji/awoo.svg", alt: "Awoo emoji" }],
},
"HRT Tracker!": {
url: "/hrt",
images: [
{
src: "/emoji/trans_heart.png",
alt: "Transgender heart emoji",
},
],
},
FAQ: {
url: "/faq",
images: [
{
src: "/emoji/red_question_mark.svg",
alt: "Red question mark emoji",
},
],
},
Servers: {
url: "/servers",
images: [
{
src: "/emoji/computer.svg",
alt: "Computer emoji",
},
],
},
"Support Me?": {
url: "/support",
images: [
{
src: "/emoji/green_money.svg",
alt: "Green money emoji",
},
],
},
};
// An object listing pages folks can visit
export const CONTACTS = {
"My public Mastodon": {
url: "https://vulpine.club/@shadow8t4",
src: "/emoji/mastodon-logo.png",
alt: "The Mastodon logo",
url_text: "@shadow8t4@vulpine.club",
},
"My Twitter": {
url: "https://twitter.com/alexis_werefox",
src: "/emoji/twitter-logo.png",
alt: "The Twitter logo",
url_text: "@alexis_werefox",
},
"My Twitch": {
url: "https://twitch.tv/alexis_werefox",
src: "/emoji/twitch-logo.png",
alt: "The Twitch logo",
url_text: "@Alexis_Werefox",
},
"My e-mail": {
url: "mailto:adh9694@gmail.com",
src: "/emoji/inbox.svg",
alt: "An inbox emoji",
url_text: "adh9694@gmail.com",
},
};
// Use this to list out partners on the partners page. >w>
export const PARTNERS = {
Gumby: {
url: "https://puppy.cafe/@Gumby",
avi: "/images/gumby.jpeg",
fields: {
Pronouns: "She/They/It",
Gallery: "vsco.co/the-goon",
"Ko-fi": "ko-fi.com/gumbyrat",
Music: "https://soundcloud.com/oorrggaanniissmm",
},
bio: `tiny trans rat
21
Demigirl
ND
Hapa/white
Ive got a bad brain :(
Makes Vaporwave, Noise, and plays synths
Photographer
💙Alexis @shadow8t4
gumby good
ko-fi.com/gumbyrat
CashApp: $GumbyRat
🔞`,
},
};
// This is where you put the testimonial users' info
export const TESTIMONIALS = {

11730
src/info/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -10,12 +10,14 @@
"dependencies": {
"autoprefixer": "^10.2.5",
"axios": "^0.21.1",
"foo": "^0.0.7",
"next": "10.1.3",
"foo": "^1.0.0",
"js-yaml": "^4.1.0",
"next": "^10.2.3",
"npm": "^7.17.0",
"postcss": "^8.2.13",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-iframe": "^1.8.0",
"tailwindcss": "^2.1.2"
"tailwindcss": "^2.0.4"
}
}

View File

@ -2,14 +2,33 @@ import BasicPage from "../../components/basic-page";
import WCard from "../../components/werefox-card";
import CBlock from "../../components/contacts-block";
export default function Contacts() {
// An object listing pages folks can visit
export async function getStaticProps() {
const fs = require("fs");
const yaml = require("js-yaml");
let CONTACTS = {};
try {
const fileContent = fs.readFileSync("./data/contacts.yml", "utf8");
CONTACTS = yaml.load(fileContent);
} catch (e) {
console.log(e);
}
return {
props: {
CONTACTS,
},
};
}
export default function Contacts({ CONTACTS }) {
return (
<BasicPage
page_title="Where To Find Me"
card_title={`"Do you have a [Social Media]?"`}
>
<WCard innerText="You can find me in quite a few places!">
<CBlock />
<CBlock contacts={CONTACTS} />
</WCard>
</BasicPage>
);

View File

@ -1,10 +1,29 @@
import BasicPage from "../../components/basic-page";
import FBlock from "../../components/faq-block";
export default function FAQ() {
// An object listing pages folks can visit
export async function getStaticProps() {
const fs = require("fs");
const yaml = require("js-yaml");
let FAQ = {};
try {
let fileContent = fs.readFileSync("./data/faq.yml", "utf8");
FAQ = yaml.load(fileContent);
} catch (e) {
console.log(e);
}
return {
props: {
FAQ,
},
};
}
export default function FAQ({ FAQ }) {
return (
<BasicPage page_title="FAQ" card_title="Frequently Asked Questions!">
<FBlock />
<FBlock faq={FAQ} />
</BasicPage>
);
}

View File

@ -1,9 +1,27 @@
import BasicPage from "../../../components/basic-page";
import IDCard from "../../../components/identity-card";
import LCard from "../../../components/love-card";
import { PARTNERS } from "../../../js/variables";
export default function Partners() {
// An object listing pages folks can visit
export async function getStaticProps() {
const fs = require("fs");
const yaml = require("js-yaml");
let PARTNERS = {};
try {
let fileContent = fs.readFileSync("./data/partners.yml", "utf8");
PARTNERS = yaml.load(fileContent);
} catch (e) {
console.log(e);
}
return {
props: {
PARTNERS,
},
};
}
export default function Partners({ PARTNERS }) {
if (Object.keys(PARTNERS).length) {
return (
<BasicPage page_title="Partners" card_title="Partners!">

View File

@ -3,7 +3,30 @@ import IDBlock from "../components/identity-block";
import WCard from "../components/werefox-card";
import PBlock from "../components/page-block";
export default function Home() {
// An object listing pages folks can visit
export async function getStaticProps() {
const fs = require("fs");
const yaml = require("js-yaml");
let IDENTITIES = {};
let PAGES = {};
try {
let fileContent = fs.readFileSync("./data/identities.yml", "utf8");
IDENTITIES = yaml.load(fileContent);
fileContent = fs.readFileSync("./data/pages.yml", "utf8");
PAGES = yaml.load(fileContent);
} catch (e) {
console.log(e);
}
return {
props: {
IDENTITIES,
PAGES,
},
};
}
export default function Home({ IDENTITIES, PAGES }) {
return (
<BasicPage
is_home="true"
@ -11,7 +34,7 @@ export default function Home() {
card_title="Hi! I'm Alexis Werefox!"
>
<WCard innerText="Basic Info">
<IDBlock />
<IDBlock identities={IDENTITIES} />
</WCard>
<WCard innerText="Welcome to my little info site!">
<p className="p-4 text-lg text-center text-werefox-blue-dark dark:text-werefox-blue">
@ -31,7 +54,7 @@ export default function Home() {
</p>
</WCard>
<WCard innerText="Neat Pages!">
<PBlock />
<PBlock pages={PAGES} />
</WCard>
</BasicPage>
);

View File

@ -1,7 +1,6 @@
import BasicPage from "../../components/basic-page";
import WCard from "../../components/werefox-card";
import TCard from "../../components/testimonial-card";
import { TESTIMONIALS } from "../../js/variables";
import axios from "axios";
// Async functions to grab user avatars server-side
@ -16,6 +15,16 @@ export const getIcon = async ({ json, name }) =>
);
export const getStaticProps = async () => {
const fs = require("fs");
const yaml = require("js-yaml");
let TESTIMONIALS = {};
try {
let fileContent = fs.readFileSync("./data/testimonials.yml", "utf8");
TESTIMONIALS = yaml.load(fileContent);
} catch (e) {
console.log(e);
}
const promises = Object.entries(TESTIMONIALS).map(([name, { json }]) =>
getIcon({ name, json })
);
@ -26,11 +35,12 @@ export const getStaticProps = async () => {
(acc, [name, url]) => ({ ...acc, [name]: url }),
{}
),
TESTIMONIALS,
},
};
};
export default function Testimonials({ iconUrls }) {
export default function Testimonials({ iconUrls, TESTIMONIALS }) {
return (
<BasicPage page_title="Werefox Testimonials" card_title="Testimonials!">
<WCard

File diff suppressed because it is too large Load Diff