├── .gitignore
├── .prettierignore
├── .prettierrc
├── README.md
├── astro.config.mjs
├── package-lock.json
├── package.json
├── public
├── favicon.svg
├── favicon
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── apple-touch-icon.png
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ └── site.webmanifest
└── images
│ ├── bobatan-logo.png
│ ├── og-card.png
│ └── roster-with-names.png
├── src
├── components
│ ├── CharacterCard.astro
│ ├── FAQs.astro
│ ├── Header.astro
│ ├── Nav.astro
│ ├── OgTags.astro
│ ├── SalesSignup.astro
│ ├── Socials.astro
│ └── TeamMemberCard.astro
├── content
│ ├── characters
│ │ ├── aria.md
│ │ ├── boba-tan.md
│ │ ├── css.md
│ │ ├── git.md
│ │ ├── github.md
│ │ ├── html.md
│ │ ├── icons
│ │ │ ├── aria.png
│ │ │ ├── boba-tan.png
│ │ │ ├── css.png
│ │ │ ├── git.png
│ │ │ ├── github.png
│ │ │ ├── html.png
│ │ │ └── terminal.png
│ │ ├── profiles
│ │ │ ├── aria.png
│ │ │ ├── boba-tan.png
│ │ │ ├── css.png
│ │ │ ├── git.png
│ │ │ ├── github.png
│ │ │ ├── html.png
│ │ │ └── terminal.png
│ │ └── terminal.md
│ ├── config.ts
│ └── team
│ │ ├── avatars
│ │ ├── 8190.png
│ │ ├── brokemycrown.jpg
│ │ ├── citro.webp
│ │ ├── cmdonovann.png
│ │ ├── default.png
│ │ ├── elendraug.png
│ │ ├── elf-herself.png
│ │ ├── enigmalea.png
│ │ ├── ererifan195.jpg
│ │ ├── essential-randomness.png
│ │ ├── foxinboots.png
│ │ ├── ikam177.jpg
│ │ ├── kiwipon.png
│ │ ├── leedie.png
│ │ ├── merelydovely.png
│ │ ├── michelle.png
│ │ ├── pamuya.png
│ │ ├── riazaia.png
│ │ ├── rudy-tuesday.png
│ │ ├── secret-final-boss.png
│ │ ├── sgt-spank.jpg
│ │ ├── slogbait.png
│ │ ├── spillingdown.png
│ │ ├── the-bi-ballerina.png
│ │ ├── thunder-the-wolf.jpg
│ │ ├── tovanish.png
│ │ ├── vcat.jpg
│ │ ├── wiredferret.png
│ │ ├── ymkse.jpg
│ │ └── yuu.png
│ │ ├── brokemycrown.yaml
│ │ ├── candle.yaml
│ │ ├── citro.yaml
│ │ ├── cmdonovann.yaml
│ │ ├── codeargent.yaml
│ │ ├── elendraug.yaml
│ │ ├── elf-herself.yaml
│ │ ├── enigmalea.yaml
│ │ ├── ererifan195.yaml
│ │ ├── essential-randomness.yaml
│ │ ├── foxinboots.yaml
│ │ ├── ikam177.yaml
│ │ ├── kiwipon.yaml
│ │ ├── leedie.yaml
│ │ ├── marinehaddock.yaml
│ │ ├── merelydovely.yaml
│ │ ├── michelle.yaml
│ │ ├── moon.yaml
│ │ ├── mori.yaml
│ │ ├── pamuya.yaml
│ │ ├── playerprophet.yaml
│ │ ├── ria.yaml
│ │ ├── rudy-tuesday.yaml
│ │ ├── secret-final-boss.yaml
│ │ ├── sgt-spank.yaml
│ │ ├── slogbait.yaml
│ │ ├── spillingdown.yaml
│ │ ├── the-bi-ballerina.yaml
│ │ ├── thunder-the-wolf.yaml
│ │ ├── tovanish.yaml
│ │ ├── vcat.yaml
│ │ ├── wiredferret.yaml
│ │ ├── ymkse.yaml
│ │ ├── yuu.yaml
│ │ └── zzz8190.yaml
├── env.d.ts
├── images
│ ├── bobawip.png
│ ├── characterx.png
│ ├── charactery.png
│ ├── error.png
│ └── git-intro.png
├── layouts
│ └── PageLayout.astro
├── lib
│ └── socials-transformer.ts
└── pages
│ ├── 404.astro
│ ├── characters.astro
│ ├── index.astro
│ ├── team
│ ├── [member].astro
│ ├── [project].astro
│ └── index.astro
│ └── volume-0.astro
└── tsconfig.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # build output
2 | dist/
3 | # generated types
4 | .astro/
5 |
6 | # dependencies
7 | node_modules/
8 |
9 | # logs
10 | npm-debug.log*
11 | yarn-debug.log*
12 | yarn-error.log*
13 | pnpm-debug.log*
14 |
15 |
16 | # environment variables
17 | .env
18 | .env.production
19 |
20 | # macOS-specific files
21 | .DS_Store
22 | .vscode
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | .astro
2 | node_modules
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "arrowParens": "always",
3 | "bracketSpacing": true,
4 | "endOfLine": "lf",
5 | "htmlWhitespaceSensitivity": "css",
6 | "printWidth": 80,
7 | "proseWrap": "preserve",
8 | "quoteProps": "as-needed",
9 | "semi": true,
10 | "singleQuote": false,
11 | "tabWidth": 2,
12 | "trailingComma": "es5",
13 | "useTabs": false,
14 |
15 | "plugins": ["prettier-plugin-astro"],
16 | "overrides": [
17 | {
18 | "files": "*.astro",
19 | "options": {
20 | "parser": "astro"
21 | }
22 | }
23 | ]
24 | }
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Astro Starter Kit: Minimal
2 |
3 | ```
4 | npm create astro@latest -- --template minimal
5 | ```
6 |
7 | [](https://stackblitz.com/github/withastro/astro/tree/latest/examples/minimal)
8 | [](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/minimal)
9 | [](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/minimal/devcontainer.json)
10 |
11 | > 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
12 |
13 | ## 🚀 Project Structure
14 |
15 | Inside of your Astro project, you'll see the following folders and files:
16 |
17 | ```
18 | /
19 | ├── public/
20 | ├── src/
21 | │ └── pages/
22 | │ └── index.astro
23 | └── package.json
24 | ```
25 |
26 | Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
27 |
28 | There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
29 |
30 | Any static assets, like images, can be placed in the `public/` directory.
31 |
32 | ## 🧞 Commands
33 |
34 | All commands are run from the root of the project, from a terminal:
35 |
36 | | Command | Action |
37 | | :------------------------ | :----------------------------------------------- |
38 | | `npm install` | Installs dependencies |
39 | | `npm run dev` | Starts local dev server at `localhost:3000` |
40 | | `npm run build` | Build your production site to `./dist/` |
41 | | `npm run preview` | Preview your build locally, before deploying |
42 | | `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
43 | | `npm run astro -- --help` | Get help using the Astro CLI |
44 |
45 | ## 👀 Want to learn more?
46 |
47 | Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
48 |
--------------------------------------------------------------------------------
/astro.config.mjs:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "astro/config";
2 |
3 | import icon from "astro-icon";
4 |
5 | // https://astro.build/config
6 | export default defineConfig({
7 | integrations: [icon()],
8 | redirects: {
9 | "/streams": {
10 | destination: "https://www.essentialrandomness.com/streams",
11 | status: 307,
12 | },
13 | },
14 | });
15 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "fujowebdev",
3 | "version": "0.0.1",
4 | "type": "module",
5 | "scripts": {
6 | "astro": "astro",
7 | "build": "astro check && astro build",
8 | "dev": "astro dev",
9 | "preview": "astro preview",
10 | "start": "astro dev"
11 | },
12 | "dependencies": {
13 | "@astrojs/check": "^0.9.4",
14 | "@iconify-json/fa6-brands": "^1.2.5",
15 | "@iconify-json/fa6-solid": "^1.1.20",
16 | "@iconify-json/logos": "^1.1.42",
17 | "@iconify-json/lucide": "^1.1.177",
18 | "@iconify-json/pixelarticons": "^1.1.10",
19 | "@iconify-json/simple-icons": "^1.1.96",
20 | "astro": "^4.15.12",
21 | "astro-icon": "^1.1.0",
22 | "marked": "^12.0.1",
23 | "typescript": "^5.6.2"
24 | },
25 | "devDependencies": {
26 | "prettier": "^3.2.5",
27 | "prettier-plugin-astro": "^0.14.1",
28 | "social-links": "^1.14.0"
29 | },
30 | "engines": {
31 | "node": ">=20.0.0"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/public/favicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/public/favicon/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/favicon/android-chrome-192x192.png
--------------------------------------------------------------------------------
/public/favicon/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/favicon/android-chrome-512x512.png
--------------------------------------------------------------------------------
/public/favicon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/favicon/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/favicon/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/favicon/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/favicon/favicon-32x32.png
--------------------------------------------------------------------------------
/public/favicon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/favicon/favicon.ico
--------------------------------------------------------------------------------
/public/favicon/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "",
3 | "short_name": "",
4 | "icons": [
5 | {
6 | "src": "/favicon/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/favicon/android-chrome-512x512.png",
12 | "sizes": "512x512",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/public/images/bobatan-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/images/bobatan-logo.png
--------------------------------------------------------------------------------
/public/images/og-card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/images/og-card.png
--------------------------------------------------------------------------------
/public/images/roster-with-names.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/public/images/roster-with-names.png
--------------------------------------------------------------------------------
/src/components/CharacterCard.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 |
4 | import { Icon } from "astro-icon/components";
5 |
6 | interface Props {
7 | name: string;
8 | imageSrc: ImageMetadata;
9 | likes: string[];
10 | dislikes: string[];
11 | tropes: (string | { url: string; name: string })[];
12 | trivia: string;
13 | }
14 |
15 | const { name, likes, dislikes, tropes, trivia, imageSrc } = Astro.props;
16 | ---
17 |
18 |
19 |
20 |
21 | Learn More
22 |
23 |
Likes
24 |
25 | {
26 | likes.map((like) => (
27 |
28 |
29 | {like}
30 |
31 | ))
32 | }
33 |
34 |
35 |
36 |
Dislikes
37 |
38 | {
39 | dislikes.map((dislike) => (
40 |
41 |
42 | {dislike}
43 |
44 | ))
45 | }
46 |
47 |
48 |
49 |
About
50 |
51 |
52 |
53 |
Tropes
54 |
55 | {
56 | tropes.map((trope) => (
57 |
58 |
59 | {typeof trope === "object" ? (
60 | {trope.name}
61 | ) : (
62 | trope
63 | )}
64 |
65 | ))
66 | }
67 |
68 |
69 |
70 |
Trivia
71 |
72 |
73 |
74 |
75 |
84 |
85 |
259 |
--------------------------------------------------------------------------------
/src/components/FAQs.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 | import characterx from "../images/characterx.png";
4 | import charactery from "../images/charactery.png";
5 | ---
6 |
7 |
8 |
9 | What is [character]'s [race, sex, gender, etc]?
10 |
11 |
12 | Our character creation process has two main goals:
13 |
14 |
15 | Creating a diverse cast of characters
16 |
17 | Providing characters that are exciting and dynamic, but still blank
18 | slates for the community to build on and identify with
19 |
20 |
21 |
22 |
23 |
24 | Since these characters are anthropomorphized versions of software and
25 | development concepts, they are not constrained by our concepts of race,
26 | sex, gender, ethnicity, country of origin, and religion. While we are
27 | developing some characters with specific communities in mind, they can be
28 | anything to anyone. We invite people to play around with them as they see
29 | fit!
30 |
31 |
32 | Our desire to not make fan creators feel constrained by specific pronouns
33 | posed a challenge when assigning our own defaults. Official materials
34 | currently use he/him pronouns for the characters, as a callback to the
35 | genres that inspired us which avoids singling out any character’s
36 | preferred gender expression. We encourage the community to use whatever
37 | pronouns they prefer within their own versions of Localhost HQ. We’ll be
38 | exploring other ways to handle this issue in the future.
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | Even though the characters aren't from the real world, you took
47 | inspiration from something. Do you use sensitivity readers?
48 |
49 |
50 |
51 | Although the volunteers and collaborators working on The Fujoshi Guide to
52 | Web Development are diverse, we don't have a broad enough cross-section to
53 | cover all axes of marginalization. To that end, we do extensive research
54 | and work with sensitivity consultants when exploring character traits,
55 | relationships, and design.
56 |
57 |
58 |
59 | You can see a current list of the consultants we've worked with during the
60 | production of the demo in the credits. They include:
61 |
62 |
63 | A sensitivity reader from the Mi'kmaq tribe for CSS.
64 | A sensitivity reader from the deaf community, also for CSS.
65 |
66 |
67 |
68 |
69 | We are committed to continuing to increase the FujoGuide cast's diversity,
70 | and have additional characters in various stages of development that could
71 | not fit in this first release. If you're interested in helping as a
72 | sensitivity reader, please contact our lead Essential Randomness through
73 | Kickstarter to let us know what you would like to read for.
74 |
75 |
76 |
77 |
78 |
79 |
80 | Do you have any other characters?
81 |
82 |
83 | When we were first working on character design, we didn't actually know
84 | what our first volume would cover, so we discussed and began developing
85 | many gijinka who did not make it into Volume 0, like the two hotties
86 | below.
87 |
88 |
89 |
93 |
97 |
98 |
99 | We can't go into many details because they will be featured in future
100 | volumes, but know that there are so, so many more hot anime boys waiting
101 | for you.
102 |
103 |
104 |
105 |
106 |
165 |
--------------------------------------------------------------------------------
/src/components/Header.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Nav from "./Nav.astro";
3 |
4 | interface Props {
5 | multiLine?: boolean;
6 | }
7 |
8 | const props = Astro.props;
9 | ---
10 |
11 |
25 |
26 |
50 |
--------------------------------------------------------------------------------
/src/components/Nav.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Icon } from "astro-icon/components";
3 |
4 | const url = Astro.url.pathname;
5 | ---
6 |
7 |
8 |
37 |
38 |
39 |
84 |
--------------------------------------------------------------------------------
/src/components/OgTags.astro:
--------------------------------------------------------------------------------
1 | ---
2 | const themeColor = "#c29fc9";
3 |
4 | const url = "https://fujoweb.dev";
5 | const image = "https://fujoweb.dev/images/og-card.png";
6 |
7 | interface Props {
8 | description?: string;
9 | title?: string;
10 | }
11 |
12 | const {
13 | title = "The Fujoshi Guide to Web Development — Fully Funded on Kickstarter",
14 | description = "The Fujoshi Guide to Web Development is an upcoming series of instructional zines about coding featuring anthropomorphizations of programming languages and concepts.",
15 | } = Astro.props;
16 | ---
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | {title}
33 |
--------------------------------------------------------------------------------
/src/components/SalesSignup.astro:
--------------------------------------------------------------------------------
1 | ---
2 | const props = Astro.props;
3 | ---
4 |
5 |
6 |
Sign up here to be notified when the guide is available for purchase:
7 |
23 |
24 | Your email has been added to our list. We look forward to sharing The Fujoshi Guide to Web Development
26 | with you!
27 |
28 |
29 |
30 |
79 |
--------------------------------------------------------------------------------
/src/components/Socials.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Icon } from "astro-icon/components";
3 | ---
4 |
5 |
6 |
7 |
10 |
11 |
12 |
16 |
17 |
18 |
21 |
22 |
23 |
26 |
27 |
28 |
31 |
32 |
33 |
36 |
37 |
38 |
39 |
59 |
--------------------------------------------------------------------------------
/src/components/TeamMemberCard.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import type { ImageMetadata } from "astro";
3 |
4 | import { Icon } from "astro-icon/components";
5 | import type { SocialsData } from "../lib/socials-transformer";
6 | import type { CollectionEntry } from "astro:content";
7 | import type { Project } from "../content/config";
8 |
9 | interface Props {
10 | memberId: string;
11 | name: string;
12 | avatar: ImageMetadata;
13 | roles: CollectionEntry<"team">["data"]["roles"];
14 | project?: Project | undefined;
15 | contacts: SocialsData[];
16 | }
17 |
18 | const props = Astro.props;
19 | ---
20 |
21 |
22 |
26 | Roles
27 |
28 | {
29 | props.project ? (
30 |
31 | {props.roles[props.project].map((role) => (
32 |
33 |
34 | {typeof role == "string"
35 | ? role
36 | : `${role.role} (${role.details})`}
37 |
38 | ))}
39 |
40 | ) : (
41 | Object.keys(props.roles).map(
42 | // @ts-expect-error
43 | (project: Project) =>
44 | !!props.roles[project].length && (
45 |
46 | {project}:{" "}
47 |
48 | {props.roles[project].map((role) => (
49 |
50 | {" "}
51 | {typeof role == "string"
52 | ? role
53 | : `${role.role} (${role.details})`}
54 |
55 | ))}
56 |
57 |
58 | )
59 | )
60 | )
61 | }
62 |
63 | Contacts
64 |
83 |
84 |
209 |
--------------------------------------------------------------------------------
/src/content/characters/aria.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: ARIA
3 | order: 60
4 | image: ./profiles/aria.png
5 | icon: ./icons/aria.png
6 | home: browserland
7 | likes:
8 | - Escapades
9 | - Acting
10 | - HTML-senpai
11 | dislikes:
12 | - The bourgeoisie
13 | - Prolonged silence
14 | - Pineapple
15 | tropes:
16 | - name: Ladykiller in love
17 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/LadykillerInLove
18 | - name: Large ham
19 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/LargeHam
20 | - name: Translator buddy
21 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/TranslatorBuddy
22 | trivia: While his full name is WAI-ARIA, most refer to him simply as ARIA. Incidentally, it means "air" in Italian.
23 | ---
24 |
25 | Born to a rich family, ARIA's life was upended when he was sent to work among Browserland's plebs. Smitten by HTML and his work ethic, he's now his most loyal colleague, and a cup ramen connoisseur.
26 |
27 | His constant talking and his intuitive empathy make him the spokesperson of the HTML/CSS/ARIA trio. His generous allowance also bankrolls their adventures.
28 |
--------------------------------------------------------------------------------
/src/content/characters/boba-tan.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Boba-tan
3 | order: 0
4 | image: ./profiles/boba-tan.png
5 | icon: ./icons/boba-tan.png
6 | home: the real world
7 | likes:
8 | - Programming
9 | - Yaoi
10 | - Boba
11 | dislikes:
12 | - Bullies
13 | - Bigotry
14 | - Boredom
15 | tropes:
16 | - name: Yaoi Fangirl
17 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/YaoiFangirl
18 | - name: Genki Girl
19 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/GenkiGirl
20 | - name: New Job as the Plot Demands
21 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/NewJobAsThePlotDemands
22 | # - name: Laborious Laziness
23 | # url: https://tvtropes.org/pmwiki/pmwiki.php/Main/LaboriousLaziness
24 | trivia: Boba-tan was created to be BobaBoard's mascot, but has held many jobs throughout her career. Her ethnicity is Chilean.
25 | ---
26 |
27 | After getting isekai'd to a world where programming concepts are
28 | anthropomorphized as hot fictional characters, Boba-tan has now embarked on an
29 | exilarating journey to learn all she can about web development.
30 |
31 | Kind, enthusiastic, intense and a bit weird (but, unless you're fictional, generally
32 | harmless), Boba-tan represents the best a fujoshi can be.
33 |
--------------------------------------------------------------------------------
/src/content/characters/css.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: CSS
3 | order: 40
4 | image: ./profiles/css.png
5 | icon: ./icons/css.png
6 | home: browserland
7 | likes:
8 | - Arts & crafts
9 | - Shopkeeping
10 | - Dressing up HTML
11 | dislikes:
12 | - Itchy fabrics
13 | - Tidying up
14 | - Credit card chargebacks
15 | tropes:
16 | - name: The fashionista
17 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/TheFashionista
18 | - name: Eccentric artist
19 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/EccentricArtist
20 | - name: Keet
21 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/Keet
22 | trivia: CSS's math prowess is as keen as his fashion sense. It has to be`:` standard orgs keep adding ways to measure and color page elements.
23 | ---
24 |
25 | The creative force of Browserland, CSS honed his fashion sense by dressing his childhood friend HTML in extravagant clothes (a hobby he still maintains).
26 |
27 | While he made a career out of providing the web with the flourish he needs, he grows his creative skills by running an online shop on the side. Being deaf, he often communicates via sign language.
28 |
--------------------------------------------------------------------------------
/src/content/characters/git.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Git
3 | order: 10
4 | image: ./profiles/git.png
5 | icon: ./icons/git.png
6 | home: localhost
7 | likes:
8 | - Gossip
9 | - Junk Food
10 | - People’s attention
11 | dislikes:
12 | - Physical exercise
13 | - Desserts
14 | - GitHub’s attention
15 | tropes:
16 | - name: Fake Cutie
17 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/TheFakeCutie
18 | - name: The Prima Donna
19 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/ThePrimaDonna
20 | - name: Angel/Devil Ship
21 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/AngelDevilShipping
22 | trivia: Git (the technology) will officially be 18 on April 7th, 2023. This equals `10010` years old in programming years.
23 | ---
24 |
25 | `Localhost HQ`’s resident catboy is as cute as he is changeable. Kind and sweet on the surface, his friendly demeanor can easily turn catty when provoked out of strangers’ sight.
26 |
27 | Despite his moodiness, Git's photographic memory makes him a powerful ally to those who learn how to tame him.
28 |
--------------------------------------------------------------------------------
/src/content/characters/github.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: GitHub
3 | order: 20
4 | image: ./profiles/github.png
5 | icon: ./icons/github.png
6 | home: localhost
7 | likes:
8 | - Floating around
9 | - Showing up uninvited
10 | - Git
11 | dislikes:
12 | - Boredom
13 | - Spicy food
14 | - Being rejected
15 | tropes:
16 | - name: Combat Tentacles
17 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/CombatTentacles
18 | - name: Harmless Villain
19 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/HarmlessVillain
20 | - name: Angel/Devil Ship
21 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/AngelDevilShipping
22 | trivia: Cloud-based characters can instantly materialize wherever a web connection exists. Kinda like Castiel.
23 | ---
24 |
25 | Corrupted by the evil tendrils of capitalism the Cloud, GitHub is Git’s online counterpart. Materializing near Git every chance he gets, their psychic connection drives his obsessive behavior.
26 |
27 | Despite his villainous demeanor, GitHub is a good team player who loves social gatherings — not that he’d want anyone to know that.
28 |
--------------------------------------------------------------------------------
/src/content/characters/html.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: HTML
3 | order: 50
4 | image: ./profiles/html.png
5 | icon: ./icons/html.png
6 | home: browserland
7 | likes:
8 | - Music
9 | - Endlessly scrolling
10 | - Memes
11 | dislikes:
12 | - Talking
13 | - Waking up early
14 | - OSHA violations
15 | tropes:
16 | - name: The quiet one
17 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/TheQuietOne
18 | - name: New job as plot demands
19 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/NewJobAsThePlotDemands
20 | - name: Suppressed rage
21 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/SuppressedRage
22 | trivia: It takes an average of 5 artists to get his face right. And even then, they might accidentally lose his headphones.
23 | ---
24 |
25 | The hardest worker in all of Browserland, HTML shows up wherever there's a (web) job to be done. Quiet, dependable, and overworked, he somehow always manages to appear professional.
26 |
27 | While he'd much rather spend time scrolling the web and listening to music, he can't help being dragged into CSS and ARIA's neverending shenanigans.
28 |
--------------------------------------------------------------------------------
/src/content/characters/icons/aria.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/icons/aria.png
--------------------------------------------------------------------------------
/src/content/characters/icons/boba-tan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/icons/boba-tan.png
--------------------------------------------------------------------------------
/src/content/characters/icons/css.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/icons/css.png
--------------------------------------------------------------------------------
/src/content/characters/icons/git.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/icons/git.png
--------------------------------------------------------------------------------
/src/content/characters/icons/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/icons/github.png
--------------------------------------------------------------------------------
/src/content/characters/icons/html.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/icons/html.png
--------------------------------------------------------------------------------
/src/content/characters/icons/terminal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/icons/terminal.png
--------------------------------------------------------------------------------
/src/content/characters/profiles/aria.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/profiles/aria.png
--------------------------------------------------------------------------------
/src/content/characters/profiles/boba-tan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/profiles/boba-tan.png
--------------------------------------------------------------------------------
/src/content/characters/profiles/css.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/profiles/css.png
--------------------------------------------------------------------------------
/src/content/characters/profiles/git.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/profiles/git.png
--------------------------------------------------------------------------------
/src/content/characters/profiles/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/profiles/github.png
--------------------------------------------------------------------------------
/src/content/characters/profiles/html.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/profiles/html.png
--------------------------------------------------------------------------------
/src/content/characters/profiles/terminal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/characters/profiles/terminal.png
--------------------------------------------------------------------------------
/src/content/characters/terminal.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Terminal
3 | order: 30
4 | image: ./profiles/terminal.png
5 | icon: ./icons/terminal.png
6 | home: localhost
7 | likes:
8 | - Taking care of HQ
9 | - Keeping sharp
10 | - Cats
11 | dislikes:
12 | - Noise and chaos
13 | - Bad hosts
14 | - Ill-behaved catboys
15 | tropes:
16 | - name: Secret badass
17 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/HiddenBadass
18 | - name: Eccentric mentor
19 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/EccentricMentor
20 | - name: Harem nanny
21 | url: https://tvtropes.org/pmwiki/pmwiki.php/Main/HaremNanny
22 | trivia: Also known as shell. Any resemblance to Revolver Ocelot is completely accidental.
23 | ---
24 |
25 | The most important member and live-in maid-pa of localhost HQ, Terminal is always ready to gently nudge beginners toward new adventures.
26 |
27 | While some of his syntax might be dated, age gives no sign of slowing him down. Quick, powerful, and performant, his abilities are feared by beginners and revered by experts.
28 |
--------------------------------------------------------------------------------
/src/content/config.ts:
--------------------------------------------------------------------------------
1 | import { defineCollection, z } from "astro:content";
2 | import {
3 | socialsSchema,
4 | transformSocial,
5 | type SocialsData,
6 | } from "../lib/socials-transformer";
7 |
8 | const Volume0Issue1Role = z.enum([
9 | "Technical Writer",
10 | "Scenario Writer",
11 | "Beta Reading Coordinator",
12 | "Beta Reader",
13 | "Proofreader",
14 | "Artist",
15 | "Tasks Coordinator",
16 | "Communications",
17 | "Character Designer",
18 | "Additional Coding",
19 | "Data Collection & Entry",
20 | ]);
21 |
22 | const Role = | z.ZodString = z.ZodString>(
23 | roleType: T | z.ZodString = z.string()
24 | ) =>
25 | z.union([
26 | roleType,
27 | z.object({
28 | role: roleType,
29 | details: z.string(),
30 | }),
31 | ]);
32 |
33 | const roles = z.object({
34 | "Volume 0 Kickstarter": Role().array().default([]),
35 | "Volume 0": Role().array().default([]),
36 | Website: Role().array().default([]),
37 | "Volume 0 Issue 1": Role(Volume0Issue1Role).array().default([]),
38 | });
39 |
40 | const teamCollection = defineCollection({
41 | type: "data",
42 | schema: (tools) =>
43 | z.object({
44 | name: z.string(),
45 | avatar: tools.image(),
46 | roles,
47 | contacts: socialsSchema
48 | .array()
49 | .default([])
50 | .transform(
51 | (contacts) => contacts.map(transformSocial) as Array
52 | ),
53 | }),
54 | });
55 |
56 | export type Project = keyof typeof roles.shape;
57 |
58 | const characterCollection = defineCollection({
59 | type: "content",
60 | schema: ({ image }) =>
61 | z.object({
62 | name: z.string(),
63 | image: image(),
64 | icon: image(),
65 | home: z.enum(["localhost", "browserland", "the real world"]),
66 | likes: z.string().array(),
67 | dislikes: z.string().array(),
68 | tropes: z
69 | .union([
70 | z.string(),
71 | z.object({
72 | name: z.string(),
73 | url: z.string().url(),
74 | }),
75 | ])
76 | .array(),
77 | trivia: z.string(),
78 | order: z.number(),
79 | }),
80 | });
81 |
82 | export const collections = {
83 | team: teamCollection,
84 | characters: characterCollection,
85 | };
86 |
--------------------------------------------------------------------------------
/src/content/team/avatars/8190.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/8190.png
--------------------------------------------------------------------------------
/src/content/team/avatars/brokemycrown.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/brokemycrown.jpg
--------------------------------------------------------------------------------
/src/content/team/avatars/citro.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/citro.webp
--------------------------------------------------------------------------------
/src/content/team/avatars/cmdonovann.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/cmdonovann.png
--------------------------------------------------------------------------------
/src/content/team/avatars/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/default.png
--------------------------------------------------------------------------------
/src/content/team/avatars/elendraug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/elendraug.png
--------------------------------------------------------------------------------
/src/content/team/avatars/elf-herself.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/elf-herself.png
--------------------------------------------------------------------------------
/src/content/team/avatars/enigmalea.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/enigmalea.png
--------------------------------------------------------------------------------
/src/content/team/avatars/ererifan195.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/ererifan195.jpg
--------------------------------------------------------------------------------
/src/content/team/avatars/essential-randomness.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/essential-randomness.png
--------------------------------------------------------------------------------
/src/content/team/avatars/foxinboots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/foxinboots.png
--------------------------------------------------------------------------------
/src/content/team/avatars/ikam177.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/ikam177.jpg
--------------------------------------------------------------------------------
/src/content/team/avatars/kiwipon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/kiwipon.png
--------------------------------------------------------------------------------
/src/content/team/avatars/leedie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/leedie.png
--------------------------------------------------------------------------------
/src/content/team/avatars/merelydovely.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/merelydovely.png
--------------------------------------------------------------------------------
/src/content/team/avatars/michelle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/michelle.png
--------------------------------------------------------------------------------
/src/content/team/avatars/pamuya.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/pamuya.png
--------------------------------------------------------------------------------
/src/content/team/avatars/riazaia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/riazaia.png
--------------------------------------------------------------------------------
/src/content/team/avatars/rudy-tuesday.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/rudy-tuesday.png
--------------------------------------------------------------------------------
/src/content/team/avatars/secret-final-boss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/secret-final-boss.png
--------------------------------------------------------------------------------
/src/content/team/avatars/sgt-spank.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/sgt-spank.jpg
--------------------------------------------------------------------------------
/src/content/team/avatars/slogbait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/slogbait.png
--------------------------------------------------------------------------------
/src/content/team/avatars/spillingdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/spillingdown.png
--------------------------------------------------------------------------------
/src/content/team/avatars/the-bi-ballerina.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/the-bi-ballerina.png
--------------------------------------------------------------------------------
/src/content/team/avatars/thunder-the-wolf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/thunder-the-wolf.jpg
--------------------------------------------------------------------------------
/src/content/team/avatars/tovanish.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/tovanish.png
--------------------------------------------------------------------------------
/src/content/team/avatars/vcat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/vcat.jpg
--------------------------------------------------------------------------------
/src/content/team/avatars/wiredferret.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/wiredferret.png
--------------------------------------------------------------------------------
/src/content/team/avatars/ymkse.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/ymkse.jpg
--------------------------------------------------------------------------------
/src/content/team/avatars/yuu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/content/team/avatars/yuu.png
--------------------------------------------------------------------------------
/src/content/team/brokemycrown.yaml:
--------------------------------------------------------------------------------
1 | name: brokemycrown
2 | avatar: ./avatars/brokemycrown.jpg
3 | roles:
4 | Volume 0 Kickstarter:
5 | - art director
6 | - Artist
7 | - role: character designer
8 | details: Git & GitHub
9 | Volume 0:
10 | - role: character designer
11 | details: Git & GitHub
12 | - role: Artist
13 | details: Full-body Git
14 | - beta reader
15 | contacts:
16 | - https://linktr.ee/reanimatedheart
17 | - https://www.patreon.com/reanimatedheartvn
18 | - https://ko-fi.com/brokemycrown
19 | - https://www.tumblr.com/doubledeadstudio
20 | - https://twitter.com/DoubleDeadSt
21 | - https://www.inprnt.com/gallery/brokemycrown/
22 |
--------------------------------------------------------------------------------
/src/content/team/candle.yaml:
--------------------------------------------------------------------------------
1 | name: Candle
2 | avatar: "./avatars/default.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Additional Research, Feedback, Development, and Assistance
6 |
--------------------------------------------------------------------------------
/src/content/team/citro.yaml:
--------------------------------------------------------------------------------
1 | name: Citro
2 | avatar: "./avatars/citro.webp"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - QA Testing
6 | - Additional Research, Feedback, Development, and Assistance
7 | Volume 0 Issue 1:
8 | - Beta Reader
9 |
10 | contacts:
11 | - https://blorbo.social/@citro
12 |
--------------------------------------------------------------------------------
/src/content/team/cmdonovann.yaml:
--------------------------------------------------------------------------------
1 | name: CMDonovann
2 | avatar: "./avatars/cmdonovann.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - role: character designer
6 | details: NPM & Yarn
7 | - QA Testing
8 | - Additional Research, Feedback, Development, and Assistance
9 | Volume 0 Issue 1:
10 | - Beta Reader
11 | contacts:
12 | - https://cmdonovann.neocities.org
13 | - https://cmdonovann.tumblr.com
14 |
--------------------------------------------------------------------------------
/src/content/team/codeargent.yaml:
--------------------------------------------------------------------------------
1 | name: Argent
2 | avatar: "./avatars/default.png"
3 | roles:
4 | Volume 0 Issue 1:
5 | - Beta Reader
6 |
--------------------------------------------------------------------------------
/src/content/team/elendraug.yaml:
--------------------------------------------------------------------------------
1 | name: Elendraug
2 | avatar: "./avatars/elendraug.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - QA Testing
6 | - Additional Research, Feedback, Development, and Assistance
7 | Volume 0:
8 | - Beta Reader
9 | Website:
10 | - Data entry
11 | Volume 0 Issue 1:
12 | - Data Collection & Entry
13 | - Beta Reader
14 | contacts:
15 | - https://elendraug.neocities.org
16 |
--------------------------------------------------------------------------------
/src/content/team/elf-herself.yaml:
--------------------------------------------------------------------------------
1 | name: Elf Herself
2 | avatar: "./avatars/elf-herself.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Lead Research
6 | Website:
7 | - Copy Writer
8 | contacts:
9 | - https://elf.dreamwidth.org
10 | - https://elfherself.bsky.social
11 | # - elf_herself at Discord
12 |
--------------------------------------------------------------------------------
/src/content/team/enigmalea.yaml:
--------------------------------------------------------------------------------
1 | name: enigmalea
2 | avatar: "./avatars/enigmalea.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Project Organizing
6 | - Technical Writer
7 | - Editor
8 | - QA Testing
9 | Volume 0:
10 | - Project Organizing
11 | - Technical Writer
12 | - Editor
13 | - Beta wrangler
14 | Volume 0 Issue 1:
15 | - Technical Writer
16 | - Beta Reading Coordinator
17 | - Additional Coding
18 | Website:
19 | - Maintainer
20 | - Coder
21 | - Copy Writer
22 | contacts:
23 | - https://enigmalea.quest
24 | - https://enigmalea.tumblr.com
25 | - https://enigmalea.bsky.social
26 | - url: https://easymode.im/@enigmalea
27 | platform: firefish
28 | username: enigmalea
29 | - https://archiveofourown.org/users/enigmalea
30 | - https://github.com/enigmalea
31 | - https://enigmalea.dreamwidth.org
32 | - https://ko-fi.com/enigmalea
33 |
--------------------------------------------------------------------------------
/src/content/team/ererifan195.yaml:
--------------------------------------------------------------------------------
1 | name: ererifan195
2 | avatar: "./avatars/ererifan195.jpg"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Artist
6 | contacts:
7 | - https://bsky.app/profile/ererifan915.bsky.social
8 | - https://ereriren.neocities.org
9 |
--------------------------------------------------------------------------------
/src/content/team/essential-randomness.yaml:
--------------------------------------------------------------------------------
1 | name: essential-randomness
2 | avatar: "./avatars/essential-randomness.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - project lead
6 | - writer
7 | - merch designer
8 | - graphic design
9 | Volume 0:
10 | - project lead
11 | - technical and scenario writer
12 | - the person who talks with the lawyers
13 | Volume 0 Issue 1:
14 | - Technical Writer
15 | - Scenario Writer
16 | - role: Artist
17 | details: Beta Sketches
18 | Website:
19 | - web mistress
20 | - coder
21 | - copy writer
22 |
23 | contacts:
24 | - https://essentialrandomness.com
25 | - https://essential-randomness.tumblr.com
26 | - https://twitter.com/essentialrandom
27 | - https://essentialrandom.bsky.social
28 | - url: https://indiepocalypse.social/@essentialrandom
29 | platform: mastodon
30 | username: essentialrandom
31 | - https://github.com/essential-randomness
32 | - https://patreon.com/essentialrandomness
33 | - https://ko-fi.com/essentialrandomness
34 |
--------------------------------------------------------------------------------
/src/content/team/foxinboots.yaml:
--------------------------------------------------------------------------------
1 | name: foxinboots
2 | avatar: ./avatars/foxinboots.png
3 | roles:
4 | Volume 0:
5 | - Additional coding
6 | contacts:
7 | - https://thefoxinboots.tumblr.com/
8 | - https://twitter.com/thefoxinboots
9 | - https://www.instagram.com/foxinboots/
10 | - https://bsky.app/profile/foxinboots.bsky.social
11 |
--------------------------------------------------------------------------------
/src/content/team/ikam177.yaml:
--------------------------------------------------------------------------------
1 | name: ikam177
2 | avatar: "./avatars/ikam177.jpg"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Artist
6 | Volume 0 Issue 1:
7 | - role: Artist
8 | details: Boba-tan in Screen
9 | contacts:
10 | - https://amkitakk.com
11 | - https://twitter.com/ikam177
12 | - url: https://blorbo.social/@AmkiTakk
13 | platform: mastodon
14 | username: AmkiTakk
15 | - https://ikam177.tumblr.com
16 |
--------------------------------------------------------------------------------
/src/content/team/kiwipon.yaml:
--------------------------------------------------------------------------------
1 | name: kiwipon
2 | avatar: "./avatars/kiwipon.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Artist
6 | Volume 0 Issue 1:
7 | - role: Artist
8 | details: We Can Do It!
9 | contacts:
10 | - https://twitter.com/kiwi_pon
11 | - https://www.instagram.com/kiwipon
12 | - https://www.patriciaviarts.com
13 |
--------------------------------------------------------------------------------
/src/content/team/leedie.yaml:
--------------------------------------------------------------------------------
1 | name: Leedie
2 | avatar: ./avatars/leedie.png
3 | roles:
4 | Website:
5 | - Data collector
6 | Volume 0 Issue 1:
7 | - Tasks Coordinator
8 | contacts:
9 | - https://twitter.com/pyhpyjka/
10 | - https://tarantasina.tumblr.com/
11 |
--------------------------------------------------------------------------------
/src/content/team/marinehaddock.yaml:
--------------------------------------------------------------------------------
1 | name: MarineHaddock
2 | avatar: "./avatars/default.png"
3 | roles:
4 | Volume 0 Issue 1:
5 | - Beta Reader
6 |
--------------------------------------------------------------------------------
/src/content/team/merelydovely.yaml:
--------------------------------------------------------------------------------
1 | name: Dove
2 | avatar: ./avatars/merelydovely.png
3 | roles:
4 | Website:
5 | - Copy Writer
6 | Volume 0 Issue 1:
7 | - Communications
8 | - Beta Reader
9 | contacts:
10 | - https://twitter.com/merelydovely/
11 | - https://archiveofourown.org/users/merelydovely
12 | - https://merelydovely.bsky.social
13 |
--------------------------------------------------------------------------------
/src/content/team/michelle.yaml:
--------------------------------------------------------------------------------
1 | name: Michelle
2 | avatar: "./avatars/michelle.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - QA Testing
6 | - Additional Research, Feedback, Development, and Assistance
7 | contacts:
8 | - https://mizunotic.neocities.org
9 | - https://www.tumblr.com/mizunotic
10 |
--------------------------------------------------------------------------------
/src/content/team/moon.yaml:
--------------------------------------------------------------------------------
1 | name: Moon (AdmiralExclipse)
2 | avatar: "./avatars/default.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Sensitivity Reading
6 |
--------------------------------------------------------------------------------
/src/content/team/mori.yaml:
--------------------------------------------------------------------------------
1 | name: Mori
2 | avatar: "./avatars/default.png"
3 | roles:
4 | Volume 0 Issue 1:
5 | - Beta Reader
6 |
--------------------------------------------------------------------------------
/src/content/team/pamuya.yaml:
--------------------------------------------------------------------------------
1 | name: Pamuya
2 | avatar: "./avatars/pamuya.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Additional Research, Feedback, Development, and Assistance
6 | contacts:
7 | - https://twitter.com/PamuyaBlue
8 | - https://PamuyaBlue.bsky.social
9 | - https://www.tumblr.com/pamuyablue
10 | - https://www.furaffinity.net/user/pamuya-the-blue
11 | - https://archiveofourown.org/users/PamuyaBlucat
12 |
--------------------------------------------------------------------------------
/src/content/team/playerprophet.yaml:
--------------------------------------------------------------------------------
1 | name: playerprophet
2 | avatar: "./avatars/default.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Additional Research, Feedback, Development, and Assistance
6 | Volume 0:
7 | - Beta Reading Coordinator
8 | contacts:
9 | - https://playerprophet.com
10 |
--------------------------------------------------------------------------------
/src/content/team/ria.yaml:
--------------------------------------------------------------------------------
1 | name: ria
2 | avatar: ./avatars/riazaia.png
3 | roles:
4 | Volume 0:
5 | - Additional coding
6 | Volume 0 Issue 1:
7 | - Additional Coding
8 | contacts:
9 | - https://github.com/riazaia
10 |
--------------------------------------------------------------------------------
/src/content/team/rudy-tuesday.yaml:
--------------------------------------------------------------------------------
1 | name: rudy tuesday
2 | avatar: "./avatars/rudy-tuesday.png"
3 | roles:
4 | Website:
5 | - Coder
6 | Volume 0 Issue 1:
7 | - Beta Reader
8 | contacts:
9 | - https://rudytues.day
10 |
--------------------------------------------------------------------------------
/src/content/team/secret-final-boss.yaml:
--------------------------------------------------------------------------------
1 | name: Secret Final Boss
2 | avatar: "./avatars/secret-final-boss.png"
3 | roles:
4 | Volume 0 Issue 1:
5 | - Proofreader
6 | - Beta Reader
7 |
--------------------------------------------------------------------------------
/src/content/team/sgt-spank.yaml:
--------------------------------------------------------------------------------
1 | name: sgt-spank
2 | avatar: "./avatars/sgt-spank.jpg"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - artist
6 | - role: character designer
7 | details: ARIA
8 | Volume 0:
9 | - role: character designer
10 | details: ARIA
11 | Volume 0 Issue 1:
12 | - role: Artist
13 | details: Catboy Bathwater Git
14 | contacts:
15 | - https://bsky.app/profile/sgt-spank.bsky.social
16 | - https://twitter.com/sgtspank
17 | - https://www.tumblr.com/sgt-spank
18 |
--------------------------------------------------------------------------------
/src/content/team/slogbait.yaml:
--------------------------------------------------------------------------------
1 | name: slogbait
2 | avatar: "./avatars/slogbait.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Project Organizing
6 | - Additional Art & Layout
7 |
--------------------------------------------------------------------------------
/src/content/team/spillingdown.yaml:
--------------------------------------------------------------------------------
1 | name: spillingdown
2 | avatar: "./avatars/spillingdown.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - artist
6 | - role: character designer
7 | details: Terminal
8 | Volume 0:
9 | - role: character designer
10 | details: Terminal
11 | contacts:
12 | - https://mappapapa.neocities.org
13 | - url: https://mappapapa.neocities.org/comm/
14 | icon: "lucide:store"
15 | username: mappapapa
16 | - url: https://blorbo.social/@spillingdown
17 | platform: mastodon
18 | username: spillingdown
19 |
--------------------------------------------------------------------------------
/src/content/team/the-bi-ballerina.yaml:
--------------------------------------------------------------------------------
1 | name: the-bi-ballerina
2 | avatar: "./avatars/the-bi-ballerina.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Social Media & Marketing
6 | contacts:
7 | - https://thebiballerina.tumblr.com
8 | - https://thebiballerina.dreamwidth.org
9 | - url: https://fandom.ink/@thebiballerina
10 | platform: mastodon
11 | username: thebiballerina
12 |
--------------------------------------------------------------------------------
/src/content/team/thunder-the-wolf.yaml:
--------------------------------------------------------------------------------
1 | name: Thunder the Wolf
2 | avatar: "./avatars/thunder-the-wolf.jpg"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Additional Research, Feedback, Development, and Assistance
6 | Volume 0 Issue 1:
7 | - Beta Reader
8 | contacts:
9 | - https://thunder-the-ranger-wolf.tumblr.com
10 |
--------------------------------------------------------------------------------
/src/content/team/tovanish.yaml:
--------------------------------------------------------------------------------
1 | name: tovanish
2 | avatar: "./avatars/tovanish.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Additional Research, Feedback, Development, and Assistance
6 | contacts:
7 | - https://tovanish.bsky.social
8 |
--------------------------------------------------------------------------------
/src/content/team/vcat.yaml:
--------------------------------------------------------------------------------
1 | name: vCat
2 | avatar: "./avatars/vcat.jpg"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Additional Research, Feedback, Development, and Assistance
6 | contacts:
7 | - https://virtuouscat.dev
8 | - https://github.com/virtuous-cat
9 |
--------------------------------------------------------------------------------
/src/content/team/wiredferret.yaml:
--------------------------------------------------------------------------------
1 | name: wiredferret
2 | avatar: "./avatars/wiredferret.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Technical Writer
6 | - Editor
7 | contacts:
8 | - https://heidiwaterhouse.com
9 | - https://wiredferret.bsky.social
10 | - url: https://hachyderm.io/@wiredferret
11 | platform: mastodon
12 | username: wiredferret
13 |
--------------------------------------------------------------------------------
/src/content/team/ymkse.yaml:
--------------------------------------------------------------------------------
1 | name: ymkse
2 | avatar: "./avatars/ymkse.jpg"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - artist
6 | - role: character designer
7 | details: HTML & CSS
8 | Volume 0:
9 | - role: character designer
10 | details: HTML & CSS
11 | Volume 0 Issue 1:
12 | - role: Artist
13 | details: Cover & HTML Maid
14 | contacts:
15 | - https://bsky.app/profile/ymkse.bsky.social
16 | - https://twitter.com/ymkse_art
17 | - https://ymkse.carrd.co/
18 | - https://ymkse.tumblr.com/
19 | - https://ko-fi.com/emi_ymkse
20 |
--------------------------------------------------------------------------------
/src/content/team/yuu.yaml:
--------------------------------------------------------------------------------
1 | name: yuu
2 | avatar: "./avatars/yuu.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - QA Testing
6 | - Lead Research
7 | Volume 0 Issue 1:
8 | - Beta Reader
9 | - Proofreader
10 | contacts:
11 | - https://where.yuu.gay/
12 |
--------------------------------------------------------------------------------
/src/content/team/zzz8190.yaml:
--------------------------------------------------------------------------------
1 | name: "8190"
2 | avatar: "./avatars/8190.png"
3 | roles:
4 | Volume 0 Kickstarter:
5 | - Additional Research, Feedback, Development, and Assistance
6 | contacts:
7 | - https://verygood.pictures/8190/entry
8 |
--------------------------------------------------------------------------------
/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
--------------------------------------------------------------------------------
/src/images/bobawip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/images/bobawip.png
--------------------------------------------------------------------------------
/src/images/characterx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/images/characterx.png
--------------------------------------------------------------------------------
/src/images/charactery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/images/charactery.png
--------------------------------------------------------------------------------
/src/images/error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/images/error.png
--------------------------------------------------------------------------------
/src/images/git-intro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FujoWebDev/fujowebdev/b4026a1202cda1fe86ad737b048ebdb74d87c585/src/images/git-intro.png
--------------------------------------------------------------------------------
/src/layouts/PageLayout.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Header from "../components/Header.astro";
3 | import { ViewTransitions } from "astro:transitions";
4 | import OgTags from "../components/OgTags.astro";
5 | import Socials from "../components/Socials.astro";
6 |
7 | interface Props {
8 | pageTitle?: string;
9 | pageDescription?: string;
10 | multiLineHeader?: boolean;
11 | }
12 |
13 | const {
14 | multiLineHeader,
15 | pageTitle = "The Fujoshi Guide to Web Development – Fully funded on Kickstarter",
16 | pageDescription,
17 | } = Astro.props;
18 | ---
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
142 |
147 |
153 |
159 |
160 |
165 |
166 |
167 |
168 |
169 |
Want to learn to use a Terminal (and beyond)? Find free guides at
learn.fujoweb.dev , now in beta!
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
201 |
202 |
203 |
--------------------------------------------------------------------------------
/src/lib/socials-transformer.ts:
--------------------------------------------------------------------------------
1 | import { z } from "astro:content";
2 | import { type ProfileMatch, SocialLinks } from "social-links";
3 |
4 | export const socialsSchema = z.union([
5 | z.string().url(),
6 | z.object({
7 | icon: z.string().optional(),
8 | platform: z.string().optional(),
9 | url: z.string().url(),
10 | username: z.string().optional(),
11 | }),
12 | ]);
13 | export type SocialsSchema = z.infer;
14 |
15 | export type SocialsData = {
16 | icon: string | null;
17 | url: string;
18 | username: string | null;
19 | platform: WEBSITE_TYPES;
20 | };
21 |
22 | export type WEBSITE_TYPES =
23 | | "github"
24 | | "tumblr"
25 | | "twitter"
26 | | "npm"
27 | | "web"
28 | | "bsky"
29 | | "twitch"
30 | | "mastodon"
31 | | "dreamwidth"
32 | | "ko-fi"
33 | | "patreon"
34 | | "youtube"
35 | | "kickstarter"
36 | | "inprnt"
37 | | "neocities";
38 |
39 | export const transformSocial = (social: SocialsSchema) => {
40 | if (typeof social == "string") {
41 | return extractSocialData({ url: social });
42 | }
43 | const { icon, url, platform, username } = social;
44 | const data = extractSocialData({ url });
45 |
46 | return {
47 | ...data,
48 | icon:
49 | icon ??
50 | (platform === undefined
51 | ? data.icon
52 | : getSocialIcon(platform as WEBSITE_TYPES)),
53 | url,
54 | platform,
55 | username,
56 | };
57 | };
58 |
59 | const socialLinks = new SocialLinks();
60 | const tumblrMatches: ProfileMatch[] = [
61 | {
62 | match: "https?://([a-z0-9-]+).tumblr.com/?",
63 | // TODO: more may be necessary for things like extracting usernames
64 | group: 1,
65 | },
66 | {
67 | match: "https?://www.tumblr.com/([a-z0-9-]+)",
68 | // TODO: more may be necessary for things like extracting usernames
69 | group: 1,
70 | },
71 | ];
72 | socialLinks.addProfile("tumblr", tumblrMatches);
73 | const kofiMatches: ProfileMatch[] = [
74 | {
75 | match: "https?://ko-fi.com/([a-z0-9-_]+)",
76 | group: 1,
77 | },
78 | ];
79 | socialLinks.addProfile("ko-fi", kofiMatches);
80 |
81 | const inprntMatches: ProfileMatch[] = [
82 | {
83 | match: "https?://(?:www.)?inprnt.com/gallery/([a-z0-9-]+)/?",
84 | group: 1,
85 | },
86 | ];
87 | socialLinks.addProfile("inprnt", inprntMatches);
88 |
89 | const neocitiesMatches: ProfileMatch[] = [
90 | {
91 | match: "https?://([a-z0-9-]+).neocities.org",
92 | group: 1,
93 | },
94 | ];
95 | socialLinks.addProfile("neocities", neocitiesMatches);
96 |
97 | const blueSkyMatches: ProfileMatch[] = [
98 | {
99 | match: "https?://([a-z0-9-]+).bsky.social",
100 | group: 1,
101 | },
102 | ];
103 | socialLinks.addProfile("bsky", blueSkyMatches);
104 |
105 | const ao3Matches: ProfileMatch[] = [
106 | {
107 | match: "https?://archiveofourown.org/users/([a-z0-9-]+)",
108 | group: 1,
109 | },
110 | ];
111 | socialLinks.addProfile("archiveofourown", ao3Matches);
112 |
113 | const dreamwidthMatches: ProfileMatch[] = [
114 | {
115 | match: "https?://([a-z0-9-]+).dreamwidth.org",
116 | group: 1,
117 | },
118 | ];
119 | socialLinks.addProfile("dreamwidth", dreamwidthMatches);
120 |
121 | const furaffinityMatches: ProfileMatch[] = [
122 | {
123 | match: "https?://www.furaffinity.net/user/([a-z0-9-]+)",
124 | group: 1,
125 | },
126 | ];
127 | socialLinks.addProfile("furaffinity", furaffinityMatches);
128 |
129 | const carrdMatches: ProfileMatch[] = [
130 | {
131 | match: "https?://([a-z0-9-]+).carrd.co/?",
132 | group: 1,
133 | },
134 | ];
135 | socialLinks.addProfile("carrd", carrdMatches);
136 |
137 | const getSocialIcon = (platform: WEBSITE_TYPES) => {
138 | if (platform === "inprnt") {
139 | return "lucide:shopping-bag";
140 | }
141 | if (platform === "neocities") {
142 | return "lucide:cat";
143 | }
144 | if (platform === "bsky") {
145 | return "simple-icons:bluesky";
146 | }
147 | if (platform === "dreamwidth") {
148 | return "simple-icons:livejournal";
149 | }
150 | return "simple-icons:" + platform.replaceAll("-", "");
151 | };
152 |
153 | export const extractSocialData = ({ url }: { url: string }): SocialsData => {
154 | const lowerUrl = url.toLowerCase();
155 | const socialLinkAttempt = socialLinks.detectProfile(lowerUrl);
156 | if (socialLinkAttempt) {
157 | return {
158 | url,
159 | platform: socialLinkAttempt as WEBSITE_TYPES,
160 | username: socialLinks.getProfileId(socialLinkAttempt, lowerUrl),
161 | icon: getSocialIcon(socialLinkAttempt as WEBSITE_TYPES),
162 | };
163 | }
164 | // If you cannot find it, return the original url
165 | return { url, platform: "web", username: null, icon: null };
166 | };
167 |
--------------------------------------------------------------------------------
/src/pages/404.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import PageLayout from "../layouts/PageLayout.astro";
3 | import { Image } from "astro:assets";
4 | import Error from "../images/error.png";
5 | import { Icon } from "astro-icon/components";
6 |
7 | const description =
8 | "The page you are looking for could not be found. Please check the URL and try again.";
9 | ---
10 |
11 |
15 |
33 |
66 |
67 |
--------------------------------------------------------------------------------
/src/pages/characters.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import PageLayout from "../layouts/PageLayout.astro";
3 | import CharacterCard from "../components/CharacterCard.astro";
4 | import FAQs from "../components/FAQs.astro";
5 |
6 | import { getCollection } from "astro:content";
7 | import { parse } from "marked";
8 | import { Image } from "astro:assets";
9 |
10 | const characters = (await getCollection("characters")).toSorted(
11 | (a, b) => a.data.order - b.data.order
12 | );
13 | ---
14 |
15 |
16 |
17 | Our characters
18 |
19 |
20 | The Fujoshi Guide to Web Development features gijinka (anthropomorphizations)
22 | of programming languages and concepts. Each of our characters is engineered from the ground up to cater to "transformative"
24 | fandom—that is, people who create fanfiction, fanart, meta, and much more.
25 |
26 |
27 |
28 | {
29 | characters.map(async (character) => {
30 | return (
31 |
32 |
33 |
37 |
38 |
39 | );
40 | })
41 | }
42 |
43 |
44 |
45 |
46 | {
47 | characters
48 | .filter((c) => c.data.home == "the real world")
49 | .map(async (character) => {
50 | const renderedBody = await character.render();
51 | return (
52 |
60 |
61 |
62 | );
63 | })
64 | }
65 |
66 |
67 |
68 | Localhost is where the characters that reside on your own computer live.
69 | While GitHub theoretically comes from the Cloud, he's often following
70 | Git around and (much to Terminal's chagrin) is an almost-permanent
71 | fixture of the place.
72 |
73 |
74 | {
75 | characters
76 | .filter((c) => c.data.home == "localhost")
77 | .map(async (character) => {
78 | const renderedBody = await character.render();
79 | return (
80 |
88 |
89 |
90 | );
91 | })
92 | }
93 |
94 |
95 |
96 |
97 |
98 | Browserland characters are responsible for bringing the web as we know
99 | it to life. Always hard at work to display any website in its full
100 | glory, Browserland's most famous trio (HTML, CSS & ARIA) is inseparable.
101 |
102 |
103 | {
104 | characters
105 | .filter((c) => c.data.home == "browserland")
106 | .map(async (character) => {
107 | const renderedBody = await character.render();
108 | return (
109 |
117 |
118 |
119 | );
120 | })
121 | }
122 |
123 |
124 |
128 |
129 |
130 |
172 |
--------------------------------------------------------------------------------
/src/pages/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import PageLayout from "../layouts/PageLayout.astro";
3 | import SalesSignup from "../components/SalesSignup.astro";
4 | import { Icon } from "astro-icon/components";
5 | ---
6 |
7 |
8 |
9 |
10 |
14 |
15 | The project
16 |
17 | The Fujoshi Guide to Web Development is an upcoming series of instructional
19 | zines about coding. Our mission is to empower more people (especially from fandom spaces) to
21 | actively create the internet they want to inhabit. Each zine features gijinka–that
22 | is, anthropomorphizations– of programming languages and concepts.
23 |
24 |
25 | The Fujoshi Guide aims to fill the gap between beginner tutorials
26 | and professional web development resources. Beginner tutorials ignore many
27 | of the techniques crucial to modern web development, while professional resources
28 | are so dense they are unapproachable to the average fan. As a result, many
29 | capable potential developers abandon their programming dreams.
30 |
31 |
32 |
33 | Our cunning plan to fix this? Tantalize our readers with irresistible characters who just happen to be willing to teach them to code,
36 | easing them past any aversion with entertaining stories and exercises.
37 |
38 |
39 |
40 | Volume 0: Git & GitHub
41 |
42 | The Fujoshi Guide starts off by teaching two skills that most guides
43 | don’t cover until far too late, if ever: how to maintain your code and how
44 | to collaborate on coding projects. Armed with this knowledge, you can gain
45 | access to the wider world of web development tools and start creating the web
46 | you want to see.
47 |
48 |
49 | Volume Zero covers the basics of:
50 |
51 | Git
52 | GitHub
53 | Open source development
54 | Command line interface (“Terminal”)
55 |
56 |
57 |
58 |
62 | See our original pitch on
66 |
71 |
72 |
73 |
123 |
124 |
--------------------------------------------------------------------------------
/src/pages/team/[member].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import type { GetStaticPaths } from "astro";
3 | import { type CollectionEntry, getCollection, getEntry } from "astro:content";
4 | import PageLayout from "../../layouts/PageLayout.astro";
5 | import TeamMemberCard from "../../components/TeamMemberCard.astro";
6 |
7 | export const getStaticPaths: GetStaticPaths = async () => {
8 | const team = await getCollection("team");
9 | return team.map((member, index) => {
10 | return {
11 | params: {
12 | member: member.id,
13 | },
14 | props: {
15 | next: index < team.length - 1 ? team[index + 1].id : null,
16 | previous: index > 0 ? team[index - 1].id : null,
17 | },
18 | };
19 | });
20 | };
21 |
22 | const { member } = Astro.params;
23 | const { previous, next } = Astro.props;
24 |
25 | const memberEntry = await getEntry(
26 | "team",
27 | member as CollectionEntry<"team">["id"]
28 | );
29 | ---
30 |
31 |
32 |
33 |
60 |
61 |
101 |
--------------------------------------------------------------------------------
/src/pages/team/[project].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import type { GetStaticPaths } from "astro";
3 | import { getCollection, type CollectionEntry } from "astro:content";
4 | import type { Project } from "../../content/config";
5 | import PageLayout from "../../layouts/PageLayout.astro";
6 | import TeamMemberCard from "../../components/TeamMemberCard.astro";
7 |
8 | export const getStaticPaths: GetStaticPaths = async () => {
9 | const PROJECTS: Project[] = [];
10 |
11 | const team = await getCollection("team");
12 |
13 | team.map((member) => {
14 | const memberProjects = member.data.roles;
15 | for (const project of Object.keys(memberProjects) as Project[]) {
16 | if (!PROJECTS.includes(project)) {
17 | PROJECTS.push(project);
18 | }
19 | }
20 | });
21 |
22 | return PROJECTS.map((project) => {
23 | return {
24 | params: {
25 | project: project,
26 | },
27 | };
28 | });
29 | };
30 |
31 | const { project } = Astro.params as { project: Project };
32 |
33 | if (!project || typeof project === "number") return;
34 |
35 | const memberEntries = await getCollection("team", ({ data }) => {
36 | return data.roles[project] && data.roles[project].length;
37 | });
38 | ---
39 |
40 |
41 |
42 | {project}
43 |
44 | {
45 | memberEntries.map((memberEntry) => {
46 | return (
47 |
58 | );
59 | })
60 | }
61 |
62 |
63 |
94 |
--------------------------------------------------------------------------------
/src/pages/team/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection, type CollectionEntry } from "astro:content";
3 | import type { Project } from "../../content/config";
4 | import PageLayout from "../../layouts/PageLayout.astro";
5 | import TeamMemberCard from "../../components/TeamMemberCard.astro";
6 |
7 | const team = await getCollection("team");
8 |
9 | const PROJECTS: Record[] }> = {};
10 |
11 | team.forEach((member) => {
12 | for (const project of Object.keys(member.data.roles) as Project[]) {
13 | if (!PROJECTS[project]) {
14 | PROJECTS[project] = {
15 | members: [] as CollectionEntry<"team">[],
16 | };
17 | }
18 | if (member.data.roles[project] && member.data.roles[project].length > 0) {
19 | PROJECTS[project].members.push(member);
20 | }
21 | }
22 | });
23 |
24 | const projectsArray = Object.keys(PROJECTS).map((proj) => ({
25 | name: proj as Project,
26 | url: proj.replace(/\s/g, "-").toLowerCase(),
27 | members: PROJECTS[proj].members,
28 | }));
29 | ---
30 |
31 |
32 |
33 |
34 | Whether for one single adventure or as part of our continued efforts, these
35 | are the people whose hard work makes FujoGuide possible.
36 |
37 |
38 | {
39 | projectsArray.map((project, index) => {
40 | // Exclude from members with card people that have exclusively done beta reading
41 | const membersWithCard = project.members.filter(
42 | (member) =>
43 | member.data.roles[project.name]?.length !== 1 ||
44 | member.data.roles[project.name]?.[0] !== "Beta Reader"
45 | );
46 | const betaReaders = project.members.filter((member) =>
47 | member.data.roles[project.name]?.includes("Beta Reader")
48 | );
49 |
50 | return (
51 | <>
52 |
58 |
{project.name}
59 |
60 | {membersWithCard.map((memberEntry) => {
61 | return (
62 |
73 | );
74 | })}
75 | {betaReaders.length > 0 && (
76 |
77 |
...and our heroic beta readers:
78 | {betaReaders.map((reader) => reader.data.name).join(", ")}
79 |
80 | )}
81 |
82 | >
83 | );
84 | })
85 | }
86 |
87 |
88 |
152 |
--------------------------------------------------------------------------------
/src/pages/volume-0.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import PageLayout from "../layouts/PageLayout.astro";
3 | import SalesSignup from "../components/SalesSignup.astro";
4 | import GitIntro from "../images/git-intro.png";
5 | import { Image } from "astro:assets";
6 | ---
7 |
8 |
9 |
10 |
11 | The Fujoshi Guide to Web Development is structured in issues with a
13 | single learning focus, which are then collected into volumes –similarly to a manga or comic. Featured in our first Kickstarter, Volume
15 | 0 collects our inaugural issues introducing Git, GitHub and open source
16 | development.
17 |
18 |
19 |
20 |
Want your own copy?
21 |
22 |
23 |
24 | Issue 1 – Using Git locally
25 |
26 |
27 |
28 | Boba-tan learns how Git can help make tracking your code changes and
29 | sorting through different versions of a codebase a breeze–no matter the
30 | size of your wardrobe!
31 |
32 |
33 |
Topics
34 |
35 | What is version control (Git)?
36 | The commit cycle
37 | Navigating and manipulating code history
38 |
39 |
The scenario
40 |
41 | Meet Git and learn about his most fundamental commands through a
42 | dress-up game involving his friends: CSS, HTML, ARIA, and Boba-tan.
43 |
44 |
Current status
45 |
Preview released! Full issue coming soon
46 |
47 |
48 |
49 |
50 | Issue 2 – Using Git(Hub) in the cloud
51 |
52 |
53 |
54 | When Boba-tan's laptop breaks in the middle of her latest project, Git
55 | and GitHub team up to save the day by combining their powers to back up
56 | code to the cloud, help her continue working, and prevent future
57 | disasters.
58 |
59 |
60 |
Topics
61 |
62 | Uploading code to remotes
63 | Cloning a repository
64 | Creating branches
65 | Merging changes
66 |
67 |
The scenario
68 |
69 | Explore how to avoid losing your code and work on changes in parallel by
70 | using the combined power of Git and GitHub to recover and improve
71 | Boba-tan's lost Blorbo Shrine.
72 |
73 |
Current status
74 |
Early draft ready, writing in progress
75 |
76 |
77 | Issue 3 – Open Source Collaboration
78 |
79 | Work in progress, check back later
80 |
Topics
81 |
82 | Forking repositories
83 | The pull request process
84 | Opening issues
85 | …and more
86 |
87 |
The scenario
88 |
Work in progress, check back later
89 |
Current status
90 |
Brainstorming content and scenario
91 |
92 |
93 |
94 |
157 |
158 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "astro/tsconfigs/strict"
3 | }
4 |
--------------------------------------------------------------------------------